shikiru-cli 0.2.0__py3-none-any.whl

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 (319) hide show
  1. shikiru/__init__.py +1 -0
  2. shikiru/__main__.py +8 -0
  3. shikiru/agents/__init__.py +3 -0
  4. shikiru/agents/contracts.py +590 -0
  5. shikiru/agents/registry.py +87 -0
  6. shikiru/agents/sdk/__init__.py +17 -0
  7. shikiru/agents/sdk/reset_time.py +137 -0
  8. shikiru/agents/sdk/turn.py +335 -0
  9. shikiru/agents/settings.py +151 -0
  10. shikiru/agents/testing/__init__.py +26 -0
  11. shikiru/agents/testing/contract_suite.py +653 -0
  12. shikiru/agents/testing/resume.py +15 -0
  13. shikiru/bootstrap.py +1277 -0
  14. shikiru/cli/__init__.py +1 -0
  15. shikiru/cli/app.py +770 -0
  16. shikiru/cli/context.py +63 -0
  17. shikiru/cli/render.py +1475 -0
  18. shikiru/cli/report.py +156 -0
  19. shikiru/cli/session_prompt.py +63 -0
  20. shikiru/cli/view.py +131 -0
  21. shikiru/clock.py +41 -0
  22. shikiru/config/__init__.py +8 -0
  23. shikiru/config/defaults.toml +131 -0
  24. shikiru/config/loader.py +178 -0
  25. shikiru/config/settings.py +392 -0
  26. shikiru/dashboard/__init__.py +3 -0
  27. shikiru/dashboard/actions_list.py +799 -0
  28. shikiru/dashboard/activity.py +150 -0
  29. shikiru/dashboard/app.py +1765 -0
  30. shikiru/dashboard/blocker_evidence.py +122 -0
  31. shikiru/dashboard/blocker_rows.py +84 -0
  32. shikiru/dashboard/briefing_view.py +871 -0
  33. shikiru/dashboard/contract.py +1086 -0
  34. shikiru/dashboard/covered.py +32 -0
  35. shikiru/dashboard/detail.py +1209 -0
  36. shikiru/dashboard/detail_fold.py +244 -0
  37. shikiru/dashboard/detail_hint.py +68 -0
  38. shikiru/dashboard/details_list_view.py +150 -0
  39. shikiru/dashboard/diagnostics.py +80 -0
  40. shikiru/dashboard/diagnostics_sections.py +186 -0
  41. shikiru/dashboard/evidence_table.py +123 -0
  42. shikiru/dashboard/extra_details.py +214 -0
  43. shikiru/dashboard/fault_guidance.py +216 -0
  44. shikiru/dashboard/fold_bodies.py +276 -0
  45. shikiru/dashboard/help_keys.py +166 -0
  46. shikiru/dashboard/help_screen.py +204 -0
  47. shikiru/dashboard/interaction.py +17 -0
  48. shikiru/dashboard/ladder_editor.py +544 -0
  49. shikiru/dashboard/live_settings.py +62 -0
  50. shikiru/dashboard/motion.py +368 -0
  51. shikiru/dashboard/orchestration_fields.py +201 -0
  52. shikiru/dashboard/palette.py +1606 -0
  53. shikiru/dashboard/palette_app.py +89 -0
  54. shikiru/dashboard/palette_drafts.py +33 -0
  55. shikiru/dashboard/resolution.py +573 -0
  56. shikiru/dashboard/resolution_view.py +302 -0
  57. shikiru/dashboard/row_list.py +256 -0
  58. shikiru/dashboard/section_rows.py +173 -0
  59. shikiru/dashboard/services.py +665 -0
  60. shikiru/dashboard/session_history.py +402 -0
  61. shikiru/dashboard/shikiru_init_ascii_art.txt +40 -0
  62. shikiru/dashboard/task_picker.py +358 -0
  63. shikiru/dashboard/tick.py +59 -0
  64. shikiru/dashboard/timeline_filter.py +129 -0
  65. shikiru/dashboard/timeline_section.py +385 -0
  66. shikiru/dashboard/usage_body.py +269 -0
  67. shikiru/dashboard/views.py +2314 -0
  68. shikiru/dashboard/wizard.py +1389 -0
  69. shikiru/domain/__init__.py +1 -0
  70. shikiru/domain/acceptance.py +130 -0
  71. shikiru/domain/activity.py +28 -0
  72. shikiru/domain/attempts.py +333 -0
  73. shikiru/domain/briefing.py +257 -0
  74. shikiru/domain/commands.py +219 -0
  75. shikiru/domain/decisions.py +231 -0
  76. shikiru/domain/docker.py +262 -0
  77. shikiru/domain/engine_uptime.py +87 -0
  78. shikiru/domain/escalation.py +194 -0
  79. shikiru/domain/escalation_evidence.py +186 -0
  80. shikiru/domain/escalation_panel.py +144 -0
  81. shikiru/domain/events.py +71 -0
  82. shikiru/domain/evidence_export.py +89 -0
  83. shikiru/domain/faults.py +86 -0
  84. shikiru/domain/feedback.py +180 -0
  85. shikiru/domain/feedback_rounds.py +172 -0
  86. shikiru/domain/fencing.py +31 -0
  87. shikiru/domain/ladder.py +102 -0
  88. shikiru/domain/ladder_text.py +44 -0
  89. shikiru/domain/levels.py +44 -0
  90. shikiru/domain/motion.py +199 -0
  91. shikiru/domain/packet_evidence.py +377 -0
  92. shikiru/domain/pushes.py +47 -0
  93. shikiru/domain/quota_blocks.py +44 -0
  94. shikiru/domain/quota_waits.py +219 -0
  95. shikiru/domain/recovery.py +194 -0
  96. shikiru/domain/reports.py +498 -0
  97. shikiru/domain/results.py +217 -0
  98. shikiru/domain/runs.py +85 -0
  99. shikiru/domain/scheduling.py +231 -0
  100. shikiru/domain/status_tasks.py +40 -0
  101. shikiru/domain/steps.py +325 -0
  102. shikiru/domain/tasks.py +174 -0
  103. shikiru/domain/timeline.py +208 -0
  104. shikiru/domain/timeline_phrases.py +271 -0
  105. shikiru/domain/versions.py +18 -0
  106. shikiru/domain/workflow.py +372 -0
  107. shikiru/engine/__init__.py +0 -0
  108. shikiru/engine/acceptance.py +90 -0
  109. shikiru/engine/agents.py +61 -0
  110. shikiru/engine/cosmetic_decorator.py +99 -0
  111. shikiru/engine/daemon.py +409 -0
  112. shikiru/engine/dependency.py +37 -0
  113. shikiru/engine/escalation_filing.py +110 -0
  114. shikiru/engine/escalations.py +401 -0
  115. shikiru/engine/events.py +285 -0
  116. shikiru/engine/evidence.py +81 -0
  117. shikiru/engine/fault_reporter.py +144 -0
  118. shikiru/engine/feedback.py +577 -0
  119. shikiru/engine/feedback_audit.py +80 -0
  120. shikiru/engine/feedback_intake.py +95 -0
  121. shikiru/engine/feedback_snapshot.py +148 -0
  122. shikiru/engine/flow.py +87 -0
  123. shikiru/engine/handlers/__init__.py +33 -0
  124. shikiru/engine/handlers/base.py +148 -0
  125. shikiru/engine/handlers/engine.py +24 -0
  126. shikiru/engine/handlers/escalations.py +174 -0
  127. shikiru/engine/handlers/operator.py +81 -0
  128. shikiru/engine/handlers/tasks.py +237 -0
  129. shikiru/engine/history.py +128 -0
  130. shikiru/engine/integration.py +1234 -0
  131. shikiru/engine/integration_turns.py +337 -0
  132. shikiru/engine/layout_guard.py +362 -0
  133. shikiru/engine/lifecycle.py +60 -0
  134. shikiru/engine/monitor.py +317 -0
  135. shikiru/engine/notification_delivery.py +124 -0
  136. shikiru/engine/notification_feed.py +57 -0
  137. shikiru/engine/notifier.py +91 -0
  138. shikiru/engine/pull_request_closing.py +117 -0
  139. shikiru/engine/push_service.py +177 -0
  140. shikiru/engine/quota_probe_threads.py +79 -0
  141. shikiru/engine/quota_reconciler.py +210 -0
  142. shikiru/engine/quota_schedule.py +24 -0
  143. shikiru/engine/quota_waits.py +102 -0
  144. shikiru/engine/reconcile.py +91 -0
  145. shikiru/engine/recovery.py +284 -0
  146. shikiru/engine/retention.py +102 -0
  147. shikiru/engine/root_preparation.py +86 -0
  148. shikiru/engine/scheduler.py +320 -0
  149. shikiru/engine/session_guard.py +46 -0
  150. shikiru/engine/sessions.py +95 -0
  151. shikiru/engine/signalled.py +75 -0
  152. shikiru/engine/step_runner.py +140 -0
  153. shikiru/engine/supervisor.py +101 -0
  154. shikiru/engine/takeover.py +223 -0
  155. shikiru/engine/task_facts.py +46 -0
  156. shikiru/engine/tick_guard.py +95 -0
  157. shikiru/engine/titles.py +297 -0
  158. shikiru/engine/transitions.py +79 -0
  159. shikiru/engine/turn_context.py +206 -0
  160. shikiru/engine/turn_execution.py +30 -0
  161. shikiru/engine/turn_loop.py +230 -0
  162. shikiru/engine/turn_processes.py +79 -0
  163. shikiru/engine/turns.py +457 -0
  164. shikiru/errors.py +144 -0
  165. shikiru/helper/__init__.py +3 -0
  166. shikiru/helper/helper.py +182 -0
  167. shikiru/helper/models.py +11 -0
  168. shikiru/mcp/__init__.py +1 -0
  169. shikiru/mcp/server.py +196 -0
  170. shikiru/operator/__init__.py +33 -0
  171. shikiru/operator/attachment.py +24 -0
  172. shikiru/operator/commands.py +319 -0
  173. shikiru/operator/detectors.py +374 -0
  174. shikiru/operator/doctor.py +351 -0
  175. shikiru/operator/events.py +57 -0
  176. shikiru/operator/evidence_export.py +498 -0
  177. shikiru/operator/evidence_writer.py +78 -0
  178. shikiru/operator/lifecycle.py +294 -0
  179. shikiru/operator/plugin_checks.py +194 -0
  180. shikiru/operator/probe.py +287 -0
  181. shikiru/operator/queries.py +1601 -0
  182. shikiru/operator/services.py +36 -0
  183. shikiru/operator/sessions.py +378 -0
  184. shikiru/operator/strip_views.py +162 -0
  185. shikiru/operator/timeline.py +416 -0
  186. shikiru/operator/toml_text.py +62 -0
  187. shikiru/palette.py +18 -0
  188. shikiru/paths.py +91 -0
  189. shikiru/plugins/__init__.py +0 -0
  190. shikiru/plugins/agents/__init__.py +1 -0
  191. shikiru/plugins/agents/claude/__init__.py +5 -0
  192. shikiru/plugins/agents/claude/agent.py +251 -0
  193. shikiru/plugins/agents/claude/context.py +116 -0
  194. shikiru/plugins/agents/claude/headless.py +92 -0
  195. shikiru/plugins/agents/claude/hook.py +57 -0
  196. shikiru/plugins/agents/claude/model_catalog.py +105 -0
  197. shikiru/plugins/agents/claude/options.py +62 -0
  198. shikiru/plugins/agents/claude/turn.py +1018 -0
  199. shikiru/plugins/agents/codex/__init__.py +5 -0
  200. shikiru/plugins/agents/codex/agent.py +486 -0
  201. shikiru/plugins/agents/codex/headless.py +166 -0
  202. shikiru/plugins/agents/codex/home.py +14 -0
  203. shikiru/plugins/agents/codex/model_catalog.py +128 -0
  204. shikiru/plugins/agents/codex/options.py +94 -0
  205. shikiru/plugins/agents/codex/quota.py +195 -0
  206. shikiru/plugins/agents/codex/sandbox.py +31 -0
  207. shikiru/plugins/agents/codex/sandbox_probe.py +97 -0
  208. shikiru/plugins/agents/codex/turn.py +767 -0
  209. shikiru/plugins/agents/codex/usage.py +106 -0
  210. shikiru/plugins/agents/shared_settings.py +62 -0
  211. shikiru/plugins/widgets/__init__.py +3 -0
  212. shikiru/plugins/widgets/dialogue.py +144 -0
  213. shikiru/plugins/widgets/disk.py +123 -0
  214. shikiru/plugins/widgets/docker.py +225 -0
  215. shikiru/plugins/widgets/escalations.py +402 -0
  216. shikiru/plugins/widgets/faults.py +204 -0
  217. shikiru/plugins/widgets/header.py +321 -0
  218. shikiru/plugins/widgets/queue.py +1140 -0
  219. shikiru/plugins/widgets/queue_hint.py +93 -0
  220. shikiru/plugins/widgets/resources.py +105 -0
  221. shikiru/plugins/widgets/strips.py +82 -0
  222. shikiru/plugins/widgets/usage.py +176 -0
  223. shikiru/private.py +94 -0
  224. shikiru/process.py +535 -0
  225. shikiru/prompts/__init__.py +3 -0
  226. shikiru/prompts/renderer.py +85 -0
  227. shikiru/prompts/templates/_base.md.j2 +17 -0
  228. shikiru/prompts/templates/_macros.md.j2 +61 -0
  229. shikiru/prompts/templates/conflicts.md.j2 +22 -0
  230. shikiru/prompts/templates/consult.md.j2 +5 -0
  231. shikiru/prompts/templates/continue.md.j2 +4 -0
  232. shikiru/prompts/templates/feedback_analysis.md.j2 +29 -0
  233. shikiru/prompts/templates/feedback_rework.md.j2 +33 -0
  234. shikiru/prompts/templates/feedback_verify.md.j2 +33 -0
  235. shikiru/prompts/templates/handoff.md.j2 +23 -0
  236. shikiru/prompts/templates/implement.md.j2 +13 -0
  237. shikiru/prompts/templates/plan.md.j2 +30 -0
  238. shikiru/prompts/templates/rework.md.j2 +13 -0
  239. shikiru/prompts/templates/triage.md.j2 +20 -0
  240. shikiru/prompts/templates/verify.md.j2 +29 -0
  241. shikiru/store/__init__.py +1 -0
  242. shikiru/store/commands.py +242 -0
  243. shikiru/store/database.py +297 -0
  244. shikiru/store/escalations.py +240 -0
  245. shikiru/store/events.py +213 -0
  246. shikiru/store/feedback.py +266 -0
  247. shikiru/store/migrations/001_initial.sql +63 -0
  248. shikiru/store/migrations/002_headless_turns.sql +31 -0
  249. shikiru/store/migrations/003_drop_command_handled_at.sql +1 -0
  250. shikiru/store/migrations/004_repo_base_ref.sql +3 -0
  251. shikiru/store/migrations/005_complexity_explicit.sql +3 -0
  252. shikiru/store/migrations/006_events_kind_index.sql +1 -0
  253. shikiru/store/migrations/007_notification_cursor.sql +1 -0
  254. shikiru/store/migrations/008_reported_usage.sql +1 -0
  255. shikiru/store/migrations/009_billing_declarations.sql +2 -0
  256. shikiru/store/migrations/010_canonical_quota_windows.sql +3 -0
  257. shikiru/store/migrations/012_drop_task_quota_evidence.sql +2 -0
  258. shikiru/store/migrations/013_push_targets.sql +7 -0
  259. shikiru/store/migrations/014_agent_block_time.sql +6 -0
  260. shikiru/store/migrations/015_repair_orphan_agent_blocks.sql +3 -0
  261. shikiru/store/migrations/016_feedback_rounds.sql +29 -0
  262. shikiru/store/migrations/017_feedback_round_comments.sql +5 -0
  263. shikiru/store/migrations/__init__.py +1 -0
  264. shikiru/store/notification_cursor.py +29 -0
  265. shikiru/store/pushes.py +117 -0
  266. shikiru/store/quotas.py +153 -0
  267. shikiru/store/reader.py +310 -0
  268. shikiru/store/retention.py +92 -0
  269. shikiru/store/runs.py +227 -0
  270. shikiru/store/tasks.py +949 -0
  271. shikiru/telemetry/__init__.py +1 -0
  272. shikiru/telemetry/disk.py +167 -0
  273. shikiru/telemetry/docker.py +164 -0
  274. shikiru/telemetry/resources.py +296 -0
  275. shikiru/tmux/__init__.py +3 -0
  276. shikiru/tmux/client.py +637 -0
  277. shikiru/tmux/decorator.py +225 -0
  278. shikiru/tmux/layout.py +200 -0
  279. shikiru/tmux/session.py +381 -0
  280. shikiru/ui/__init__.py +9 -0
  281. shikiru/ui/age.py +45 -0
  282. shikiru/ui/bubbles.py +41 -0
  283. shikiru/ui/compact.py +1209 -0
  284. shikiru/ui/console.py +49 -0
  285. shikiru/ui/fold.py +50 -0
  286. shikiru/ui/gated_static.py +117 -0
  287. shikiru/ui/gauge.py +40 -0
  288. shikiru/ui/glyphs.py +109 -0
  289. shikiru/ui/keys.py +57 -0
  290. shikiru/ui/live_interval.py +42 -0
  291. shikiru/ui/popup.py +311 -0
  292. shikiru/ui/quota_status.py +26 -0
  293. shikiru/ui/recent_window.py +78 -0
  294. shikiru/ui/screen.py +57 -0
  295. shikiru/ui/section.py +193 -0
  296. shikiru/ui/session.py +65 -0
  297. shikiru/ui/size.py +17 -0
  298. shikiru/ui/splash.py +42 -0
  299. shikiru/ui/status.py +47 -0
  300. shikiru/ui/status_strip.py +149 -0
  301. shikiru/ui/stream.py +152 -0
  302. shikiru/ui/strip.py +332 -0
  303. shikiru/ui/theme.py +83 -0
  304. shikiru/ui/tokens.py +51 -0
  305. shikiru/view_log.py +126 -0
  306. shikiru/workspace/__init__.py +3 -0
  307. shikiru/workspace/base_refs.py +160 -0
  308. shikiru/workspace/caches.py +136 -0
  309. shikiru/workspace/facts.py +118 -0
  310. shikiru/workspace/git.py +601 -0
  311. shikiru/workspace/github.py +744 -0
  312. shikiru/workspace/messages.py +107 -0
  313. shikiru/workspace/reports.py +145 -0
  314. shikiru/workspace/roots.py +180 -0
  315. shikiru_cli-0.2.0.dist-info/METADATA +428 -0
  316. shikiru_cli-0.2.0.dist-info/RECORD +319 -0
  317. shikiru_cli-0.2.0.dist-info/WHEEL +4 -0
  318. shikiru_cli-0.2.0.dist-info/entry_points.txt +18 -0
  319. shikiru_cli-0.2.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,428 @@
1
+ Metadata-Version: 2.5
2
+ Name: shikiru-cli
3
+ Version: 0.2.0
4
+ Summary: Runs coding-agent tasks in tmux panes, orchestrated by an asyncio engine.
5
+ Project-URL: Homepage, https://github.com/ferrum-code-dev/shikiru
6
+ Project-URL: Source, https://github.com/ferrum-code-dev/shikiru
7
+ Project-URL: Issues, https://github.com/ferrum-code-dev/shikiru/issues
8
+ Project-URL: Changelog, https://github.com/ferrum-code-dev/shikiru/releases
9
+ Author: Ferrum Code
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: claude,codex,coding-agents,git-worktrees,orchestration,tmux
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Requires-Python: >=3.14
16
+ Requires-Dist: jinja2<3.2,>=3.1
17
+ Requires-Dist: mcp<2.0,>=1.26
18
+ Requires-Dist: psutil<8.0,>=7.0
19
+ Requires-Dist: pydantic<2.14,>=2.13
20
+ Requires-Dist: textual<6.4,>=6.3
21
+ Requires-Dist: typer<0.28,>=0.27
22
+ Description-Content-Type: text/markdown
23
+
24
+ # Shikiru (しきる)
25
+
26
+ [![Release](https://img.shields.io/github/v/release/ferrum-code-dev/shikiru?include_prereleases)](https://github.com/ferrum-code-dev/shikiru/releases)
27
+ [![License](https://img.shields.io/github/license/ferrum-code-dev/shikiru)](https://github.com/ferrum-code-dev/shikiru/blob/main/LICENSE)
28
+ [![CI](https://github.com/ferrum-code-dev/shikiru/actions/workflows/ci.yml/badge.svg)](https://github.com/ferrum-code-dev/shikiru/actions/workflows/ci.yml)
29
+
30
+ Shikiru coordinates coding agents through a defined development workflow: turn a request into
31
+ reviewed changes, integrate them, and ask you when a decision needs human judgment. It runs locally
32
+ with Git worktrees, a persistent engine and a terminal dashboard in tmux. Claude Code and Codex CLI
33
+ are built in; different agents and models can work on the same task in different roles.
34
+
35
+ To have routine escalations handled for you, and the rest forwarded to your phone, see the companion
36
+ service [shikiri-yaku](https://github.com/ferrum-code-dev/shikiri-yaku).
37
+
38
+ I designed and implemented Shikiru from my own experience developing software with AI agents. No
39
+ existing tool covered all the workflows I needed, so I built one that does.
40
+
41
+ ## How it works
42
+
43
+ ![Shikiru terminal dashboard](docs/assets/shikiru-dashboard.gif)
44
+
45
+ | Participant | Responsibility |
46
+ | --- | --- |
47
+ | **Operator** | You: submit requests, choose policy, inspect results, answer decisions and intervene. |
48
+ | **Leader** | An agent that triages requests, plans larger work, answers implementation questions and reviews changes. |
49
+ | **Implementer** | An agent that changes code, runs project checks, updates selected trackers and resolves integration conflicts. |
50
+ | **Helper** | A headless agent used to reconstruct missing structured reports or classify otherwise unrecognized agent failures. It does not run the development workflow. |
51
+ | **Engine** | Shikiru's deterministic coordinator: schedules tasks, validates reports, applies transitions, manages Git integration and records state. |
52
+
53
+ A request receives a task ID such as `T-1`, its own branch and a Git worktree. The Leader normally
54
+ triages it into one of two routes:
55
+
56
+ - **Implement:** the Implementer makes changes; the Leader accepts them, requests another iteration,
57
+ raises an Operator decision, or replaces the task with more suitable tasks.
58
+ - **Plan:** the Leader commits a plan and can create dependent follow-up tasks when the request asks
59
+ for execution. A request only to produce a plan can finish with the plan itself.
60
+
61
+ Accepted changes are rebased onto the configured base and integrated locally or through a GitHub
62
+ pull request. Conflicts go through bounded Implementer repair and Leader review. Requests needing
63
+ your input, exhausted recovery limits and unsafe integration conditions become **escalations**
64
+ (`E-1`, etc.) with context and applicable answers. Other eligible tasks can continue.
65
+
66
+ You can submit work with explicit mode, complexity, priority, dependencies or role/model choices.
67
+ Independent tasks run in parallel up to the configured slot limit; dependencies, pauses, resource
68
+ pressure and provider quota can delay dispatch. Each task retains reports, Git facts, agent sessions
69
+ and a timeline so you can understand both its result and how it got there.
70
+
71
+ ## Requirements and installation
72
+
73
+ - Python 3.14+ and uv; Git 2.45+ and tmux 3.5+.
74
+ - A single Git repository per project, initialized at its root with at least one commit.
75
+ Submodules and multi-repository projects are unsupported.
76
+ - Claude Code or Codex CLI installed and configured for your account.
77
+ - `gh` and an accessible GitHub remote if you choose pull-request integration.
78
+
79
+ ### Installation
80
+
81
+ ```sh
82
+ uv tool install shikiru-cli
83
+ shikiru --help
84
+ ```
85
+
86
+ The distribution is `shikiru-cli`; the command and the Python package are `shikiru`.
87
+
88
+ Before the first PyPI release, install the wheel from the latest release on the Releases page.
89
+ Never install a long-running copy with `--editable`: an editable install follows the working tree.
90
+ For development, see [From a checkout](CONTRIBUTING.md).
91
+
92
+ ### Updating
93
+
94
+ ```sh
95
+ uv tool upgrade shikiru-cli
96
+ ```
97
+
98
+ An engine keeps the code it was started with, so run `shikiru restart` in each project with a running
99
+ engine afterwards. `restart` refuses while a task runs unless `--force` is given.
100
+
101
+ Installations from before the rename (distribution `shikiru`) must switch once: the tool changed its
102
+ distribution name, and both provide the executable `shikiru`, so they cannot be installed together. Run
103
+ `uv tool uninstall shikiru`, then `uv tool install shikiru-cli`, then `shikiru restart` in each project
104
+ with a running engine.
105
+
106
+ ### Going back
107
+
108
+ ```sh
109
+ uv tool install shikiru-cli==<version>
110
+ ```
111
+
112
+ Replace `<version>` with the release to return to, then run `shikiru restart` in each project with a
113
+ running engine.
114
+
115
+ ### From a checkout
116
+
117
+ For development from a source checkout, follow [CONTRIBUTING.md](CONTRIBUTING.md).
118
+
119
+ macOS is the platform exercised locally. CI is configured for Ubuntu 24.04 and macOS 15; see
120
+ [workflow runs](https://github.com/ferrum-code-dev/shikiru/actions/workflows/ci.yml) for
121
+ platform-specific results.
122
+
123
+ ## Initialize and run
124
+
125
+ Start at the root of a committed project repository:
126
+
127
+ ```sh
128
+ cd /path/to/project
129
+ shikiru init
130
+ shikiru doctor
131
+ shikiru start
132
+ shikiru submit "Fix a small, specific issue and verify it"
133
+ shikiru attach
134
+ ```
135
+
136
+ The eight-step wizard checks the repository, builds role/model/effort ladders, lets you choose
137
+ tracker files and ignored cache paths, sets the orchestration limits, reviews each agent's options and
138
+ chooses the integration mode, then writes `.shikiru/config.toml` and runs Doctor. The Orchestration step sets the maximum parallel
139
+ tasks, the maximum passes per task, the maximum quota wait in seconds, the stall and tool timeouts
140
+ in seconds (the silence allowed before a turn is stopped as stalled, without and with a running
141
+ tool), the push interval in seconds (default 14400, four hours; 0 pushes after every local
142
+ integration), the host CPU percentage below which new tasks may start, and the free RAM in GB that must be
143
+ available before a new task starts. Each field starts at the project default, and Finish rejects an
144
+ out-of-range value by focusing that field before anything is written. The Agents step lists the
145
+ options each installed agent plugin offers (for the built-in Claude Code and Codex plugins: the
146
+ compaction threshold in percent, the billing declaration, left unset unless you choose one, and
147
+ extra CLI arguments split like a shell command line). They are written explicitly under
148
+ `[agents.<name>.options]` so you can edit them later; an invalid value focuses its field and
149
+ nothing is written. An agent plugin without the settings capability is named on that step and
150
+ keeps its own defaults. Available model and effort
151
+ choices come from agent plugins; where no authoritative catalog exists, Doctor cannot promise model
152
+ availability. Tracker and cache fields start empty: add only what you want Shikiru to use. Cancel
153
+ explicitly with the Cancel button; `Ctrl+F` briefly reveals the background artwork.
154
+
155
+ `shikiru init --yes` skips the wizard and writes editable defaults with model placeholders. Replace
156
+ them with models supported by your agent, review the config, and run Doctor before starting.
157
+ Ordinary `doctor` checks environment, config, plugins and state without running task turns;
158
+ `doctor --probe` additionally runs live agent-contract checks and can consume paid provider usage.
159
+
160
+ ## CLI
161
+
162
+ Project commands find the nearest `.shikiru/` above the current directory; use the global
163
+ `--project PATH` to select a project explicitly. `--help` on each command describes its arguments
164
+ and defaults; the root help also offers shell-completion setup and `--version`.
165
+
166
+ | Command | Use |
167
+ | --- | --- |
168
+ | `shikiru init` | Configure a repository through the wizard; `--yes` writes editable defaults. |
169
+ | `shikiru start` | Start or reuse its detached engine and ensure its tmux session; `--attach` enters it. |
170
+ | `shikiru stop` | Stop orchestration while keeping project state and tmux agent panes; `--kill-session` also closes that project's tmux session. |
171
+ | `shikiru restart` | Stop and start the engine so it runs the installed code; refuses while a task runs unless `--force`. |
172
+ | `shikiru submit "REQUEST"` | Queue work and return its allocated task ID. |
173
+ | `shikiru status` | Show engine/queue state, tasks, escalations, usage and quota; add `T-1` for one task or `--watch` for updates. |
174
+ | `shikiru ls` | List discovered project sessions; `--host HOST` queries an SSH host. |
175
+ | `shikiru attach` | Attach to the current project; outside a project, choose a numbered session. A project name selects it directly; `--host HOST` uses SSH. |
176
+ | `shikiru doctor` | Diagnose requirements, config, plugins and local state; `--probe` includes live checks. |
177
+ | `shikiru mcp` | Serve the project's operator tools over stdio to an MCP client. |
178
+
179
+ For example, skip triage for a known implementation, choose a complexity ladder and wait for
180
+ another task:
181
+
182
+ ```sh
183
+ shikiru submit --mode implement --complexity high --priority 10 --after T-1 "Implement the accepted design"
184
+ shikiru status T-2 --watch
185
+ shikiru --json status
186
+ shikiru --project /path/to/project --set orchestration.max_parallel=1 start
187
+ ```
188
+
189
+ `--after` is repeatable. `--leader` and `--implementer` pin a role using
190
+ `agent:model[:effort]`; obtain supported IDs from your installed agent and wizard. Global `--json`
191
+ provides machine-readable command results. Queue acknowledgement and a task ID mean the request
192
+ was recorded, not that the work finished; inspect status or the dashboard for the outcome.
193
+
194
+ Session discovery preserves healthy results alongside diagnostics for stale or unreadable project
195
+ state, with applicable repair commands. `ls` exits nonzero when discovery is incomplete. Deleting
196
+ `.shikiru/` loses its state; initialization creates new state, not a recovery of deleted tasks.
197
+ Shikiru permits one attached client per project session and refuses a second attachment rather
198
+ than changing the existing terminal. Detach that client before moving to another terminal.
199
+
200
+ ## Dashboard and Operator control
201
+
202
+ Home shows the engine, repository cleanliness, task queue, active work, decisions and usage.
203
+ Up/Down selects tasks; `f` filters status, `/` searches by ID or title, and `m` loads older tasks
204
+ when offered. Task details bring together the current briefing, results, dependencies and related
205
+ tasks, reports/Git evidence, event and agent activity, usage, sessions and workspace access.
206
+ Timelines support paging, following the latest entries and agent-activity filters by role/turn.
207
+ Use `?` for context-specific navigation help.
208
+
209
+ Open **Actions** with `Ctrl+P` or `F12` in the dashboard, or your tmux prefix followed by Space in
210
+ any Shikiru pane. Actions apply to the selected task and, where appropriate, a chosen role.
211
+ Availability depends on task/session state; **More…** exposes additional controls.
212
+
213
+ | Action | Effect |
214
+ | --- | --- |
215
+ | **Submit / Prioritize** | Add work or change its dispatch priority. |
216
+ | **Message** | Send guidance to a role at the start of its next turn. |
217
+ | **Take over / Hand back** | Stop automation for the task and open an existing role's agent session interactively in its pane. Hand back returns ownership to the engine, which continues with notice of your intervention. An existing pause remains until Resume. |
218
+ | **Pause / Pause now / Resume** | Hold after the current turn, interrupt immediately, or clear the pause. Pausing one task leaves other eligible tasks free to progress. |
219
+ | **Rung** | Select another agent/model/effort for that role from its next turn. A provider change uses a fresh session with handoff context. |
220
+ | **Open session** | Inspect recorded activity for a task role without taking ownership of its agent session. |
221
+ | **Retry** | Re-run the current step. |
222
+ | **Cancel** | Abandon the task while keeping its branch; unintegrated work can retain its worktree for inspection. |
223
+ | **Answer** | Resolve an escalation using an offered choice or written answer; retry, accept-as-is and cancel are available where applicable. |
224
+ | **Export** | Write retained task evidence as Markdown or JSON, with optional agent signals and explicit gaps for unavailable evidence. |
225
+ | **Command history / Diagnostics** | Inspect pending, applied or rejected commands, engine health, faults and resources. |
226
+ | **Start engine / Stop engine** | Control project orchestration from the dashboard. |
227
+
228
+ The task's tmux window provides role panes and a shell. Task details can open that workspace;
229
+ resuming the agent interactively through Take over is different from just viewing its output.
230
+ The default tmux prefix is `Ctrl+B`; prefix then `d` detaches without stopping the engine.
231
+ `shikiru attach` reconnects later.
232
+
233
+ Built-in widgets include usage/quota, host and process CPU/RAM, disk space and project/run sizes,
234
+ Docker container health/resource use, and engine faults. Docker is optional; unavailable samples
235
+ are reported. The configured widget list controls what is enabled; extended views are available
236
+ through Actions. Pane layouts, titles, refresh rates, warning thresholds and animation are
237
+ configurable.
238
+
239
+ ## Agents, ladders and recovery
240
+
241
+ A **rung** is one agent/model/effort choice. A **ladder** is an ordered list of rungs: it lets
242
+ Shikiru progress to another choice under its recovery/review policy, including a different provider.
243
+ Leader and Implementer have their own ladders. Implementer can additionally use `low`, `normal`
244
+ and `high` complexity ladders; an unspecified complexity ladder inherits its base ladder.
245
+
246
+ In `.shikiru/config.toml`, a rung can be written as a short string, `"agent:model"` or
247
+ `"agent:model:effort"`, or as an inline table, `{ agent, model, effort }` (effort optional).
248
+ Both forms can appear in one ladder, and existing table ladders keep loading unchanged:
249
+
250
+ ```toml
251
+ [roles.leader]
252
+ ladder = ["codex:gpt-6.1-sol:high", { agent = "claude", model = "claude-sonnet-5-5" }]
253
+ ```
254
+
255
+ The short form reads its third part as the effort, so a model or effort containing `:`, or an empty
256
+ effort, must use the table form. A malformed short entry, or one with an empty part, fails config
257
+ loading and names the entry. `init` and the wizard write the short form, and the table form for any
258
+ rung the short form cannot express.
259
+
260
+ Rejected implementations return for another review iteration, with a possible Implementer rung
261
+ increase. Provider unavailability gets bounded backoff/retries; quota can wait for a reset or move
262
+ to a later different-provider rung when the configured wait budget is exhausted. Stalls receive
263
+ limited continuation attempts. Authentication problems, unrecoverable failures and exhausted limits
264
+ request Operator attention rather than silently completing a task.
265
+
266
+ Helper has a separate ordered ladder. It tries later entries after failed calls or unusable
267
+ answers, within one total Helper timeout. Any rebuilt report must still pass validation; Helper
268
+ neither approves work nor decides the workflow. Agent session resumption and compaction are
269
+ provider-specific; automatic compaction thresholds are configurable per agent. Token counts,
270
+ context, costs, billing mode and quota are shown when supplied by
271
+ the agent; missing data stays unknown, and quota observations may be stale. A quota block is
272
+ revalidated periodically in the background (and on an Operator retry) against newer provider readings, without delaying other tasks or commands, so queued work
273
+ resumes when quota returns before the predicted reset. Quota reset times are shown in your local
274
+ timezone. A task waiting on quota shows an amber `⧗ quota` in its tmux window tab, and each agent
275
+ pane affected by the wait shows a `⧗ Quota blocked · next check …` (or `retry …`) strip above its
276
+ output until the wait ends.
277
+
278
+ ## Configuration and automation
279
+
280
+ Settings merge in this order: packaged defaults → `.shikiru/config.toml` → repeated global
281
+ `--set key.path=value` overrides for that invocation. Use the wizard for project choices and edit
282
+ the config for additional controls. An already-running engine keeps the settings it started with;
283
+ stop/start it to apply engine policy changes. When a new engine run starts, the dashboard re-reads
284
+ the config for slot counts, gauge thresholds, briefing and timeline display, animations, the palette
285
+ confirmation delay, and the disk, Docker and resource refresh intervals; timeouts, Docker scope, the
286
+ repository status cache, the motion timer and the widget list apply when the dashboard starts. An
287
+ invalid config keeps the last valid values and shows an alert in the header.
288
+
289
+ | Configuration area | Controls |
290
+ | --- | --- |
291
+ | `project`, `repo` | Project name, tracker files agents read/update, integration base/remote, ignored cache paths. |
292
+ | `roles`, `agents` | Role and complexity ladders, review escalation policy; plugin CLI arguments, compaction threshold and optional billing declaration. |
293
+ | `orchestration` | Parallel task slots, review iterations and local merge, local squash or pull-request integration; `pr_feedback` (`changes_requested` by default, or `any_comment`) chooses which PR reviews and comments start feedback rounds; `push_interval_seconds` (seconds between pushes of locally integrated bases, default 14400) and `remote_recheck_seconds` (seconds between pending remote checks and retries for an absent remote, default 60); the init wizard also sets the stall and tool timeouts, the quota, CPU and free-RAM limits below. |
294
+ | `orchestration.resources` | CPU/free-RAM gates for dispatch; these do not impose CPU/RAM limits on already-running agents. |
295
+ | `orchestration.quota_refresh` | `interval_seconds` between quota block revalidations (default 300) and `timeout_seconds` bounding each probe (default 30). |
296
+ | `orchestration.timeouts`, `.network`, `.faults`, `.retries` | Stall/tool/Helper/quota/integration/PR limits, remote polling, engine-fault retries, and configurable provider-unavailable retries. |
297
+ | `dashboard` | Widgets, pane splits/titles, animation, display/refresh limits and resource/quota warning thresholds. |
298
+ | `sessions`, `doctor`, `escalation` | SSH-query timeout, live-probe limits and the amount of attempted work summarized in decision context. |
299
+ | `notify` | Optional external notification command and timeout; receives a JSON event on stdin. |
300
+ | `logging`, `retention` | Engine log rotation and pruning horizons for finished run files, events and completed commands. |
301
+
302
+ **Integration:** `orchestration.integration = "merge"` rebases and applies accepted work to the
303
+ local base. `"squash"` ("Local squash and merge") lands the rebased task as a single commit parented
304
+ by the current base and carrying the task's complete tree; an empty task adds no commit. It shares
305
+ every local-merge guard. Task commits follow the target project's documented subject convention, or
306
+ Conventional Commits when none is documented, and carry a `Task: T-n` trailer; merge preserves them,
307
+ while squash uses the accepted whole-change subject and summary and adds the task ID and recovery
308
+ trailers. The Result and Results of a completed task show the landed commit's
309
+ SHA and subject, its destination and the integrated file and line totals, which stay accurate after
310
+ the task branch and worktree are cleaned up. `"pr"` pushes the task branch, opens/adopts a GitHub PR
311
+ and waits for it to merge;
312
+ conflicting/closed/failed or overdue PRs require recovery or a decision. After a merge, the local
313
+ base is fast-forwarded to the merged remote tip before the task is done. If it cannot be (local
314
+ commits the remote lacks, or uncommitted changes in files the merge changes), the task escalates as
315
+ integration blocked and leaves your work untouched; resolve it, then retry to finish the sync.
316
+ Shikiru does not bypass
317
+ repository review policy. With `orchestration.pr_feedback = "changes_requested"` (default) a newly
318
+ submitted changes-requested review, or a new reply in one of its inline discussions, starts a
319
+ feedback round. With `"any_comment"` a newly submitted review that has a body (commented, approved
320
+ or changes requested) and a new reply in any inline discussion start one too. In the wizard the
321
+ choice appears under Integration once "Pull request" is selected. A round works like this: the
322
+ Leader analyses it, the Implementer edits, the Leader verifies, and the engine pushes with a lease
323
+ and replies per item, then returns to the PR wait. Conversation comments, pending or dismissed
324
+ reviews, Shikiru's own replies and edits to handled reviews never start rounds, and Shikiru never dismisses reviews,
325
+ resolves threads, approves or merges. `orchestration.max_iterations` bounds attempts per batch. A
326
+ PR closed without merge escalates and keeps the branch and worktree; only an explicit Operator
327
+ retry opens a new PR. Dirty overlapping changes in the main checkout block local integration;
328
+ commit, move or otherwise resolve them before retrying.
329
+
330
+ **Pushes (merge and squash modes):** `orchestration.push_interval_seconds` (default `14400`, four hours; a
331
+ nonnegative whole number of seconds) controls when locally integrated work reaches `repo.remote`.
332
+ Integrations within an interval accumulate and the first one sets the deadline, so later ones do
333
+ not postpone it. `0` pushes after each successful local integration. Only the base branch is pushed,
334
+ never forced and never task branches or tags; a rejected or timed-out push raises an engine fault,
335
+ keeps the work pending and retries with backoff. A remote that is not configured is not pushed to
336
+ and raises no fault: the work stays pending and the remote is checked again after
337
+ `orchestration.remote_recheck_seconds` (default `60`, a positive whole number of seconds). A check
338
+ that itself fails is a fault like a failed push: it is retried with the same backoff and recovers
339
+ once the check succeeds. Pending work survives restarts. PR mode does not use this setting. Stop and restart the engine to load a changed value.
340
+
341
+ **Caches:** selected Git-ignored cache paths can be cloned into task worktrees using filesystem
342
+ copy-on-write. If unsupported, Shikiru warns and leaves caches uncloned; it does not silently make
343
+ an expensive ordinary copy. Trackers and caches are optional.
344
+
345
+ **Notifications:** tmux messages and an optional hook report completions, escalations, integration
346
+ waits, lost takeovers and engine faults. Urgent undelivered notifications survive restarts; a crash
347
+ can cause a duplicate delivery, so hooks should tolerate repeats.
348
+
349
+ **Provider retry timing:** `[orchestration.retries]` configures unavailable-agent retries in
350
+ seconds, with a multiplier and maximum delay. Defaults are 30 seconds, multiplier 4, 300 seconds
351
+ maximum and 3 retries (delays of 30, 120 and 300 seconds before ladder fallback). The retry count
352
+ may be zero and is limited to 20. Stop and restart the engine to load changed values. These settings
353
+ are separate from `[orchestration.faults]`, which controls engine tick retries.
354
+
355
+ **Automation and extensions:** CLI JSON supports scripts. MCP exposes status/task/escalation queries
356
+ (an escalation carries its packet plus parsed `question`, `agent_options` and `resolutions`),
357
+ session peeks, submission, prioritization, pause/resume/cancel/retry, rung changes, messages,
358
+ takeover/handback, escalation resolution and event waiting. It uses the same operator services and
359
+ command queue as the dashboard. Agent and widget plugins use Python entry points; the
360
+ [agent contract](src/shikiru/agents/contracts.py), [SDK](src/shikiru/agents/sdk/) and
361
+ [contract test kit](src/shikiru/agents/testing/) support additional agents. A plugin opts into the
362
+ wizard's Agents step by giving its agent a `settings()` method that returns
363
+ [`AgentSetting`](src/shikiru/agents/settings.py) entries (key, label, help, kind, default and
364
+ bounds or choices); the plugin's own factory still validates the resulting options. It can raise
365
+ [`AgentOptionsError`](src/shikiru/agents/settings.py) with the rejected option key so the wizard
366
+ focuses that field, or omit the key for an agent-wide rejection.
367
+
368
+ For exact fields and defaults, see [defaults.toml](src/shikiru/config/defaults.toml),
369
+ [settings validation](src/shikiru/config/settings.py), [Claude options](src/shikiru/plugins/agents/claude/options.py)
370
+ and [Codex options](src/shikiru/plugins/agents/codex/options.py). The [MCP tools](src/shikiru/mcp/server.py)
371
+ provide the automation contract.
372
+
373
+ ## Persistence, diagnosis and safety
374
+
375
+ The engine is independent of the terminal. Restart it with `shikiru start` to reload persisted
376
+ state, reconcile unfinished work and resume eligible tasks. Re-running `start` also ensures the
377
+ project's tmux session. Terminal detach, engine stop, task pause and task cancellation are distinct
378
+ operations: detaching changes only your connection; Stop interrupts engine-supervised turns and
379
+ ends orchestration while preserving state and the tmux session. Start reconciles and resumes
380
+ eligible work. Use task controls when you need to halt a specific task without stopping others.
381
+
382
+ | Project path | Contents |
383
+ | --- | --- |
384
+ | `.shikiru/config.toml` | Project settings. |
385
+ | `.shikiru/state.db` | Tasks, commands, events, sessions, decisions and recovery state. |
386
+ | `.shikiru/backups/` | Copies of `state.db` from before each schema migration; the newest three are kept. |
387
+ | `.shikiru/worktrees/` | Per-task Git checkouts. |
388
+ | `.shikiru/runs/` | Turn prompts, reports, collected facts, streams and logs. |
389
+ | `.shikiru/logs/engine.log` | Rotating engine diagnostics. |
390
+
391
+ Use Doctor for setup/state problems, status for progress and decisions, and dashboard Diagnostics
392
+ for live resource/fault information. Retention removes eligible finished evidence after configured
393
+ horizons while preserving unresolved work; export evidence you need to keep. Missing/corrupt state
394
+ is not repaired by deleting `.shikiru/`. To roll back after a migration, stop the engine and copy the
395
+ newest file from `.shikiru/backups/` over `state.db`.
396
+
397
+ Shikiru orchestrates agents; it does not sandbox them. Agents run as your user, inherit their CLI's
398
+ environment and may use your credentials. Use only repositories and hosts you trust.
399
+
400
+ - Claude Code defaults to `--permission-mode bypassPermissions`.
401
+ - Codex uses `workspace-write`, with the run directory, task worktree Git directory and shared
402
+ repository `.git` writable. Agents can affect shared Git refs, hooks and configuration.
403
+ - Worktrees separate task files, but do not enforce isolation from the main checkout or other
404
+ worktrees. Project instructions and notification commands also run with your privileges.
405
+ - State files are owner-only, not a security boundary against agents running as you. Prompts,
406
+ reports and exports can contain project-sensitive content; review them before sharing.
407
+
408
+ Review changes and commits before trusting them. Agent review and a valid report are not proof that
409
+ software is correct.
410
+
411
+ ## Shikiri-yaku
412
+
413
+ Shikiru stops and waits for a person when it raises an escalation.
414
+ [Shikiri-yaku](https://github.com/ferrum-code-dev/shikiri-yaku) is a companion background service that
415
+ takes that seat: it watches the escalations of your Shikiru projects, handles the routine ones (retries,
416
+ quota waits, engine restarts, approved tool installs) and forwards the rest to you in Telegram, where one
417
+ tap applies the answer. It talks to Shikiru only through `shikiru mcp` and the CLI, and keeps nothing in
418
+ your repositories. Its `doctor` checks that the installed Shikiru is compatible.
419
+
420
+ ## Contributing
421
+
422
+ Contributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for how to validate a checkout and a real project.
423
+
424
+ ## Design
425
+
426
+ [Design](docs/design.md) explains the architecture and invariants. The retained
427
+ [CLI examples](docs/design/references/cli-output-examples.html) and
428
+ [dashboard reference](docs/design/references/dashboard-example.html) show the interface direction.