shikiru-cli 0.2.0__tar.gz

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 (703) hide show
  1. shikiru_cli-0.2.0/.github/ISSUE_TEMPLATE/bug_report.yml +33 -0
  2. shikiru_cli-0.2.0/.github/ISSUE_TEMPLATE/feature_request.yml +24 -0
  3. shikiru_cli-0.2.0/.github/pull_request_template.md +12 -0
  4. shikiru_cli-0.2.0/.github/workflows/ci.yml +104 -0
  5. shikiru_cli-0.2.0/.github/workflows/release.yml +136 -0
  6. shikiru_cli-0.2.0/.gitignore +14 -0
  7. shikiru_cli-0.2.0/.python-version +1 -0
  8. shikiru_cli-0.2.0/AGENTS.md +11 -0
  9. shikiru_cli-0.2.0/CLAUDE.md +1 -0
  10. shikiru_cli-0.2.0/CONTRIBUTING.md +113 -0
  11. shikiru_cli-0.2.0/LICENSE +21 -0
  12. shikiru_cli-0.2.0/PKG-INFO +428 -0
  13. shikiru_cli-0.2.0/README.md +405 -0
  14. shikiru_cli-0.2.0/SECURITY.md +21 -0
  15. shikiru_cli-0.2.0/docs/assets/shikiru-dashboard.gif +0 -0
  16. shikiru_cli-0.2.0/docs/design/references/cli-output-examples.html +2222 -0
  17. shikiru_cli-0.2.0/docs/design/references/dashboard-example.html +2683 -0
  18. shikiru_cli-0.2.0/docs/design.md +403 -0
  19. shikiru_cli-0.2.0/docs/plans/periodic-push-and-squash.md +124 -0
  20. shikiru_cli-0.2.0/docs/plans/quota-and-task-usage.md +107 -0
  21. shikiru_cli-0.2.0/docs/plans/release-and-deployment.md +89 -0
  22. shikiru_cli-0.2.0/docs/plans/release-automation.md +128 -0
  23. shikiru_cli-0.2.0/docs/plans/release-simplification.md +124 -0
  24. shikiru_cli-0.2.0/docs/plans/release-workflow.md +191 -0
  25. shikiru_cli-0.2.0/docs/plans/test-robustness.md +168 -0
  26. shikiru_cli-0.2.0/docs/plans/test-suite-audit.md +251 -0
  27. shikiru_cli-0.2.0/docs/plans/test-suite-speed.md +38 -0
  28. shikiru_cli-0.2.0/pyproject.toml +361 -0
  29. shikiru_cli-0.2.0/scripts/release-readiness-smoke.sh +583 -0
  30. shikiru_cli-0.2.0/scripts/release_notes.py +172 -0
  31. shikiru_cli-0.2.0/src/shikiru/__init__.py +1 -0
  32. shikiru_cli-0.2.0/src/shikiru/__main__.py +8 -0
  33. shikiru_cli-0.2.0/src/shikiru/agents/__init__.py +3 -0
  34. shikiru_cli-0.2.0/src/shikiru/agents/contracts.py +590 -0
  35. shikiru_cli-0.2.0/src/shikiru/agents/registry.py +87 -0
  36. shikiru_cli-0.2.0/src/shikiru/agents/sdk/__init__.py +17 -0
  37. shikiru_cli-0.2.0/src/shikiru/agents/sdk/reset_time.py +137 -0
  38. shikiru_cli-0.2.0/src/shikiru/agents/sdk/turn.py +335 -0
  39. shikiru_cli-0.2.0/src/shikiru/agents/settings.py +151 -0
  40. shikiru_cli-0.2.0/src/shikiru/agents/testing/__init__.py +26 -0
  41. shikiru_cli-0.2.0/src/shikiru/agents/testing/contract_suite.py +653 -0
  42. shikiru_cli-0.2.0/src/shikiru/agents/testing/resume.py +15 -0
  43. shikiru_cli-0.2.0/src/shikiru/bootstrap.py +1277 -0
  44. shikiru_cli-0.2.0/src/shikiru/cli/__init__.py +1 -0
  45. shikiru_cli-0.2.0/src/shikiru/cli/app.py +770 -0
  46. shikiru_cli-0.2.0/src/shikiru/cli/context.py +63 -0
  47. shikiru_cli-0.2.0/src/shikiru/cli/render.py +1475 -0
  48. shikiru_cli-0.2.0/src/shikiru/cli/report.py +156 -0
  49. shikiru_cli-0.2.0/src/shikiru/cli/session_prompt.py +63 -0
  50. shikiru_cli-0.2.0/src/shikiru/cli/view.py +131 -0
  51. shikiru_cli-0.2.0/src/shikiru/clock.py +41 -0
  52. shikiru_cli-0.2.0/src/shikiru/config/__init__.py +8 -0
  53. shikiru_cli-0.2.0/src/shikiru/config/defaults.toml +131 -0
  54. shikiru_cli-0.2.0/src/shikiru/config/loader.py +178 -0
  55. shikiru_cli-0.2.0/src/shikiru/config/settings.py +392 -0
  56. shikiru_cli-0.2.0/src/shikiru/dashboard/__init__.py +3 -0
  57. shikiru_cli-0.2.0/src/shikiru/dashboard/actions_list.py +799 -0
  58. shikiru_cli-0.2.0/src/shikiru/dashboard/activity.py +150 -0
  59. shikiru_cli-0.2.0/src/shikiru/dashboard/app.py +1765 -0
  60. shikiru_cli-0.2.0/src/shikiru/dashboard/blocker_evidence.py +122 -0
  61. shikiru_cli-0.2.0/src/shikiru/dashboard/blocker_rows.py +84 -0
  62. shikiru_cli-0.2.0/src/shikiru/dashboard/briefing_view.py +871 -0
  63. shikiru_cli-0.2.0/src/shikiru/dashboard/contract.py +1086 -0
  64. shikiru_cli-0.2.0/src/shikiru/dashboard/covered.py +32 -0
  65. shikiru_cli-0.2.0/src/shikiru/dashboard/detail.py +1209 -0
  66. shikiru_cli-0.2.0/src/shikiru/dashboard/detail_fold.py +244 -0
  67. shikiru_cli-0.2.0/src/shikiru/dashboard/detail_hint.py +68 -0
  68. shikiru_cli-0.2.0/src/shikiru/dashboard/details_list_view.py +150 -0
  69. shikiru_cli-0.2.0/src/shikiru/dashboard/diagnostics.py +80 -0
  70. shikiru_cli-0.2.0/src/shikiru/dashboard/diagnostics_sections.py +186 -0
  71. shikiru_cli-0.2.0/src/shikiru/dashboard/evidence_table.py +123 -0
  72. shikiru_cli-0.2.0/src/shikiru/dashboard/extra_details.py +214 -0
  73. shikiru_cli-0.2.0/src/shikiru/dashboard/fault_guidance.py +216 -0
  74. shikiru_cli-0.2.0/src/shikiru/dashboard/fold_bodies.py +276 -0
  75. shikiru_cli-0.2.0/src/shikiru/dashboard/help_keys.py +166 -0
  76. shikiru_cli-0.2.0/src/shikiru/dashboard/help_screen.py +204 -0
  77. shikiru_cli-0.2.0/src/shikiru/dashboard/interaction.py +17 -0
  78. shikiru_cli-0.2.0/src/shikiru/dashboard/ladder_editor.py +544 -0
  79. shikiru_cli-0.2.0/src/shikiru/dashboard/live_settings.py +62 -0
  80. shikiru_cli-0.2.0/src/shikiru/dashboard/motion.py +368 -0
  81. shikiru_cli-0.2.0/src/shikiru/dashboard/orchestration_fields.py +201 -0
  82. shikiru_cli-0.2.0/src/shikiru/dashboard/palette.py +1606 -0
  83. shikiru_cli-0.2.0/src/shikiru/dashboard/palette_app.py +89 -0
  84. shikiru_cli-0.2.0/src/shikiru/dashboard/palette_drafts.py +33 -0
  85. shikiru_cli-0.2.0/src/shikiru/dashboard/resolution.py +573 -0
  86. shikiru_cli-0.2.0/src/shikiru/dashboard/resolution_view.py +302 -0
  87. shikiru_cli-0.2.0/src/shikiru/dashboard/row_list.py +256 -0
  88. shikiru_cli-0.2.0/src/shikiru/dashboard/section_rows.py +173 -0
  89. shikiru_cli-0.2.0/src/shikiru/dashboard/services.py +665 -0
  90. shikiru_cli-0.2.0/src/shikiru/dashboard/session_history.py +402 -0
  91. shikiru_cli-0.2.0/src/shikiru/dashboard/shikiru_init_ascii_art.txt +40 -0
  92. shikiru_cli-0.2.0/src/shikiru/dashboard/task_picker.py +358 -0
  93. shikiru_cli-0.2.0/src/shikiru/dashboard/tick.py +59 -0
  94. shikiru_cli-0.2.0/src/shikiru/dashboard/timeline_filter.py +129 -0
  95. shikiru_cli-0.2.0/src/shikiru/dashboard/timeline_section.py +385 -0
  96. shikiru_cli-0.2.0/src/shikiru/dashboard/usage_body.py +269 -0
  97. shikiru_cli-0.2.0/src/shikiru/dashboard/views.py +2314 -0
  98. shikiru_cli-0.2.0/src/shikiru/dashboard/wizard.py +1389 -0
  99. shikiru_cli-0.2.0/src/shikiru/domain/__init__.py +1 -0
  100. shikiru_cli-0.2.0/src/shikiru/domain/acceptance.py +130 -0
  101. shikiru_cli-0.2.0/src/shikiru/domain/activity.py +28 -0
  102. shikiru_cli-0.2.0/src/shikiru/domain/attempts.py +333 -0
  103. shikiru_cli-0.2.0/src/shikiru/domain/briefing.py +257 -0
  104. shikiru_cli-0.2.0/src/shikiru/domain/commands.py +219 -0
  105. shikiru_cli-0.2.0/src/shikiru/domain/decisions.py +231 -0
  106. shikiru_cli-0.2.0/src/shikiru/domain/docker.py +262 -0
  107. shikiru_cli-0.2.0/src/shikiru/domain/engine_uptime.py +87 -0
  108. shikiru_cli-0.2.0/src/shikiru/domain/escalation.py +194 -0
  109. shikiru_cli-0.2.0/src/shikiru/domain/escalation_evidence.py +186 -0
  110. shikiru_cli-0.2.0/src/shikiru/domain/escalation_panel.py +144 -0
  111. shikiru_cli-0.2.0/src/shikiru/domain/events.py +71 -0
  112. shikiru_cli-0.2.0/src/shikiru/domain/evidence_export.py +89 -0
  113. shikiru_cli-0.2.0/src/shikiru/domain/faults.py +86 -0
  114. shikiru_cli-0.2.0/src/shikiru/domain/feedback.py +180 -0
  115. shikiru_cli-0.2.0/src/shikiru/domain/feedback_rounds.py +172 -0
  116. shikiru_cli-0.2.0/src/shikiru/domain/fencing.py +31 -0
  117. shikiru_cli-0.2.0/src/shikiru/domain/ladder.py +102 -0
  118. shikiru_cli-0.2.0/src/shikiru/domain/ladder_text.py +44 -0
  119. shikiru_cli-0.2.0/src/shikiru/domain/levels.py +44 -0
  120. shikiru_cli-0.2.0/src/shikiru/domain/motion.py +199 -0
  121. shikiru_cli-0.2.0/src/shikiru/domain/packet_evidence.py +377 -0
  122. shikiru_cli-0.2.0/src/shikiru/domain/pushes.py +47 -0
  123. shikiru_cli-0.2.0/src/shikiru/domain/quota_blocks.py +44 -0
  124. shikiru_cli-0.2.0/src/shikiru/domain/quota_waits.py +219 -0
  125. shikiru_cli-0.2.0/src/shikiru/domain/recovery.py +194 -0
  126. shikiru_cli-0.2.0/src/shikiru/domain/reports.py +498 -0
  127. shikiru_cli-0.2.0/src/shikiru/domain/results.py +217 -0
  128. shikiru_cli-0.2.0/src/shikiru/domain/runs.py +85 -0
  129. shikiru_cli-0.2.0/src/shikiru/domain/scheduling.py +231 -0
  130. shikiru_cli-0.2.0/src/shikiru/domain/status_tasks.py +40 -0
  131. shikiru_cli-0.2.0/src/shikiru/domain/steps.py +325 -0
  132. shikiru_cli-0.2.0/src/shikiru/domain/tasks.py +174 -0
  133. shikiru_cli-0.2.0/src/shikiru/domain/timeline.py +208 -0
  134. shikiru_cli-0.2.0/src/shikiru/domain/timeline_phrases.py +271 -0
  135. shikiru_cli-0.2.0/src/shikiru/domain/versions.py +18 -0
  136. shikiru_cli-0.2.0/src/shikiru/domain/workflow.py +372 -0
  137. shikiru_cli-0.2.0/src/shikiru/engine/__init__.py +0 -0
  138. shikiru_cli-0.2.0/src/shikiru/engine/acceptance.py +90 -0
  139. shikiru_cli-0.2.0/src/shikiru/engine/agents.py +61 -0
  140. shikiru_cli-0.2.0/src/shikiru/engine/cosmetic_decorator.py +99 -0
  141. shikiru_cli-0.2.0/src/shikiru/engine/daemon.py +409 -0
  142. shikiru_cli-0.2.0/src/shikiru/engine/dependency.py +37 -0
  143. shikiru_cli-0.2.0/src/shikiru/engine/escalation_filing.py +110 -0
  144. shikiru_cli-0.2.0/src/shikiru/engine/escalations.py +401 -0
  145. shikiru_cli-0.2.0/src/shikiru/engine/events.py +285 -0
  146. shikiru_cli-0.2.0/src/shikiru/engine/evidence.py +81 -0
  147. shikiru_cli-0.2.0/src/shikiru/engine/fault_reporter.py +144 -0
  148. shikiru_cli-0.2.0/src/shikiru/engine/feedback.py +577 -0
  149. shikiru_cli-0.2.0/src/shikiru/engine/feedback_audit.py +80 -0
  150. shikiru_cli-0.2.0/src/shikiru/engine/feedback_intake.py +95 -0
  151. shikiru_cli-0.2.0/src/shikiru/engine/feedback_snapshot.py +148 -0
  152. shikiru_cli-0.2.0/src/shikiru/engine/flow.py +87 -0
  153. shikiru_cli-0.2.0/src/shikiru/engine/handlers/__init__.py +33 -0
  154. shikiru_cli-0.2.0/src/shikiru/engine/handlers/base.py +148 -0
  155. shikiru_cli-0.2.0/src/shikiru/engine/handlers/engine.py +24 -0
  156. shikiru_cli-0.2.0/src/shikiru/engine/handlers/escalations.py +174 -0
  157. shikiru_cli-0.2.0/src/shikiru/engine/handlers/operator.py +81 -0
  158. shikiru_cli-0.2.0/src/shikiru/engine/handlers/tasks.py +237 -0
  159. shikiru_cli-0.2.0/src/shikiru/engine/history.py +128 -0
  160. shikiru_cli-0.2.0/src/shikiru/engine/integration.py +1234 -0
  161. shikiru_cli-0.2.0/src/shikiru/engine/integration_turns.py +337 -0
  162. shikiru_cli-0.2.0/src/shikiru/engine/layout_guard.py +362 -0
  163. shikiru_cli-0.2.0/src/shikiru/engine/lifecycle.py +60 -0
  164. shikiru_cli-0.2.0/src/shikiru/engine/monitor.py +317 -0
  165. shikiru_cli-0.2.0/src/shikiru/engine/notification_delivery.py +124 -0
  166. shikiru_cli-0.2.0/src/shikiru/engine/notification_feed.py +57 -0
  167. shikiru_cli-0.2.0/src/shikiru/engine/notifier.py +91 -0
  168. shikiru_cli-0.2.0/src/shikiru/engine/pull_request_closing.py +117 -0
  169. shikiru_cli-0.2.0/src/shikiru/engine/push_service.py +177 -0
  170. shikiru_cli-0.2.0/src/shikiru/engine/quota_probe_threads.py +79 -0
  171. shikiru_cli-0.2.0/src/shikiru/engine/quota_reconciler.py +210 -0
  172. shikiru_cli-0.2.0/src/shikiru/engine/quota_schedule.py +24 -0
  173. shikiru_cli-0.2.0/src/shikiru/engine/quota_waits.py +102 -0
  174. shikiru_cli-0.2.0/src/shikiru/engine/reconcile.py +91 -0
  175. shikiru_cli-0.2.0/src/shikiru/engine/recovery.py +284 -0
  176. shikiru_cli-0.2.0/src/shikiru/engine/retention.py +102 -0
  177. shikiru_cli-0.2.0/src/shikiru/engine/root_preparation.py +86 -0
  178. shikiru_cli-0.2.0/src/shikiru/engine/scheduler.py +320 -0
  179. shikiru_cli-0.2.0/src/shikiru/engine/session_guard.py +46 -0
  180. shikiru_cli-0.2.0/src/shikiru/engine/sessions.py +95 -0
  181. shikiru_cli-0.2.0/src/shikiru/engine/signalled.py +75 -0
  182. shikiru_cli-0.2.0/src/shikiru/engine/step_runner.py +140 -0
  183. shikiru_cli-0.2.0/src/shikiru/engine/supervisor.py +101 -0
  184. shikiru_cli-0.2.0/src/shikiru/engine/takeover.py +223 -0
  185. shikiru_cli-0.2.0/src/shikiru/engine/task_facts.py +46 -0
  186. shikiru_cli-0.2.0/src/shikiru/engine/tick_guard.py +95 -0
  187. shikiru_cli-0.2.0/src/shikiru/engine/titles.py +297 -0
  188. shikiru_cli-0.2.0/src/shikiru/engine/transitions.py +79 -0
  189. shikiru_cli-0.2.0/src/shikiru/engine/turn_context.py +206 -0
  190. shikiru_cli-0.2.0/src/shikiru/engine/turn_execution.py +30 -0
  191. shikiru_cli-0.2.0/src/shikiru/engine/turn_loop.py +230 -0
  192. shikiru_cli-0.2.0/src/shikiru/engine/turn_processes.py +79 -0
  193. shikiru_cli-0.2.0/src/shikiru/engine/turns.py +457 -0
  194. shikiru_cli-0.2.0/src/shikiru/errors.py +144 -0
  195. shikiru_cli-0.2.0/src/shikiru/helper/__init__.py +3 -0
  196. shikiru_cli-0.2.0/src/shikiru/helper/helper.py +182 -0
  197. shikiru_cli-0.2.0/src/shikiru/helper/models.py +11 -0
  198. shikiru_cli-0.2.0/src/shikiru/mcp/__init__.py +1 -0
  199. shikiru_cli-0.2.0/src/shikiru/mcp/server.py +196 -0
  200. shikiru_cli-0.2.0/src/shikiru/operator/__init__.py +33 -0
  201. shikiru_cli-0.2.0/src/shikiru/operator/attachment.py +24 -0
  202. shikiru_cli-0.2.0/src/shikiru/operator/commands.py +319 -0
  203. shikiru_cli-0.2.0/src/shikiru/operator/detectors.py +374 -0
  204. shikiru_cli-0.2.0/src/shikiru/operator/doctor.py +351 -0
  205. shikiru_cli-0.2.0/src/shikiru/operator/events.py +57 -0
  206. shikiru_cli-0.2.0/src/shikiru/operator/evidence_export.py +498 -0
  207. shikiru_cli-0.2.0/src/shikiru/operator/evidence_writer.py +78 -0
  208. shikiru_cli-0.2.0/src/shikiru/operator/lifecycle.py +294 -0
  209. shikiru_cli-0.2.0/src/shikiru/operator/plugin_checks.py +194 -0
  210. shikiru_cli-0.2.0/src/shikiru/operator/probe.py +287 -0
  211. shikiru_cli-0.2.0/src/shikiru/operator/queries.py +1601 -0
  212. shikiru_cli-0.2.0/src/shikiru/operator/services.py +36 -0
  213. shikiru_cli-0.2.0/src/shikiru/operator/sessions.py +378 -0
  214. shikiru_cli-0.2.0/src/shikiru/operator/strip_views.py +162 -0
  215. shikiru_cli-0.2.0/src/shikiru/operator/timeline.py +416 -0
  216. shikiru_cli-0.2.0/src/shikiru/operator/toml_text.py +62 -0
  217. shikiru_cli-0.2.0/src/shikiru/palette.py +18 -0
  218. shikiru_cli-0.2.0/src/shikiru/paths.py +91 -0
  219. shikiru_cli-0.2.0/src/shikiru/plugins/__init__.py +0 -0
  220. shikiru_cli-0.2.0/src/shikiru/plugins/agents/__init__.py +1 -0
  221. shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/__init__.py +5 -0
  222. shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/agent.py +251 -0
  223. shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/context.py +116 -0
  224. shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/headless.py +92 -0
  225. shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/hook.py +57 -0
  226. shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/model_catalog.py +105 -0
  227. shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/options.py +62 -0
  228. shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/turn.py +1018 -0
  229. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/__init__.py +5 -0
  230. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/agent.py +486 -0
  231. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/headless.py +166 -0
  232. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/home.py +14 -0
  233. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/model_catalog.py +128 -0
  234. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/options.py +94 -0
  235. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/quota.py +195 -0
  236. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/sandbox.py +31 -0
  237. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/sandbox_probe.py +97 -0
  238. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/turn.py +767 -0
  239. shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/usage.py +106 -0
  240. shikiru_cli-0.2.0/src/shikiru/plugins/agents/shared_settings.py +62 -0
  241. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/__init__.py +3 -0
  242. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/dialogue.py +144 -0
  243. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/disk.py +123 -0
  244. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/docker.py +225 -0
  245. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/escalations.py +402 -0
  246. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/faults.py +204 -0
  247. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/header.py +321 -0
  248. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/queue.py +1140 -0
  249. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/queue_hint.py +93 -0
  250. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/resources.py +105 -0
  251. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/strips.py +82 -0
  252. shikiru_cli-0.2.0/src/shikiru/plugins/widgets/usage.py +176 -0
  253. shikiru_cli-0.2.0/src/shikiru/private.py +94 -0
  254. shikiru_cli-0.2.0/src/shikiru/process.py +535 -0
  255. shikiru_cli-0.2.0/src/shikiru/prompts/__init__.py +3 -0
  256. shikiru_cli-0.2.0/src/shikiru/prompts/renderer.py +85 -0
  257. shikiru_cli-0.2.0/src/shikiru/prompts/templates/_base.md.j2 +17 -0
  258. shikiru_cli-0.2.0/src/shikiru/prompts/templates/_macros.md.j2 +61 -0
  259. shikiru_cli-0.2.0/src/shikiru/prompts/templates/conflicts.md.j2 +22 -0
  260. shikiru_cli-0.2.0/src/shikiru/prompts/templates/consult.md.j2 +5 -0
  261. shikiru_cli-0.2.0/src/shikiru/prompts/templates/continue.md.j2 +4 -0
  262. shikiru_cli-0.2.0/src/shikiru/prompts/templates/feedback_analysis.md.j2 +29 -0
  263. shikiru_cli-0.2.0/src/shikiru/prompts/templates/feedback_rework.md.j2 +33 -0
  264. shikiru_cli-0.2.0/src/shikiru/prompts/templates/feedback_verify.md.j2 +33 -0
  265. shikiru_cli-0.2.0/src/shikiru/prompts/templates/handoff.md.j2 +23 -0
  266. shikiru_cli-0.2.0/src/shikiru/prompts/templates/implement.md.j2 +13 -0
  267. shikiru_cli-0.2.0/src/shikiru/prompts/templates/plan.md.j2 +30 -0
  268. shikiru_cli-0.2.0/src/shikiru/prompts/templates/rework.md.j2 +13 -0
  269. shikiru_cli-0.2.0/src/shikiru/prompts/templates/triage.md.j2 +20 -0
  270. shikiru_cli-0.2.0/src/shikiru/prompts/templates/verify.md.j2 +29 -0
  271. shikiru_cli-0.2.0/src/shikiru/store/__init__.py +1 -0
  272. shikiru_cli-0.2.0/src/shikiru/store/commands.py +242 -0
  273. shikiru_cli-0.2.0/src/shikiru/store/database.py +297 -0
  274. shikiru_cli-0.2.0/src/shikiru/store/escalations.py +240 -0
  275. shikiru_cli-0.2.0/src/shikiru/store/events.py +213 -0
  276. shikiru_cli-0.2.0/src/shikiru/store/feedback.py +266 -0
  277. shikiru_cli-0.2.0/src/shikiru/store/migrations/001_initial.sql +63 -0
  278. shikiru_cli-0.2.0/src/shikiru/store/migrations/002_headless_turns.sql +31 -0
  279. shikiru_cli-0.2.0/src/shikiru/store/migrations/003_drop_command_handled_at.sql +1 -0
  280. shikiru_cli-0.2.0/src/shikiru/store/migrations/004_repo_base_ref.sql +3 -0
  281. shikiru_cli-0.2.0/src/shikiru/store/migrations/005_complexity_explicit.sql +3 -0
  282. shikiru_cli-0.2.0/src/shikiru/store/migrations/006_events_kind_index.sql +1 -0
  283. shikiru_cli-0.2.0/src/shikiru/store/migrations/007_notification_cursor.sql +1 -0
  284. shikiru_cli-0.2.0/src/shikiru/store/migrations/008_reported_usage.sql +1 -0
  285. shikiru_cli-0.2.0/src/shikiru/store/migrations/009_billing_declarations.sql +2 -0
  286. shikiru_cli-0.2.0/src/shikiru/store/migrations/010_canonical_quota_windows.sql +3 -0
  287. shikiru_cli-0.2.0/src/shikiru/store/migrations/012_drop_task_quota_evidence.sql +2 -0
  288. shikiru_cli-0.2.0/src/shikiru/store/migrations/013_push_targets.sql +7 -0
  289. shikiru_cli-0.2.0/src/shikiru/store/migrations/014_agent_block_time.sql +6 -0
  290. shikiru_cli-0.2.0/src/shikiru/store/migrations/015_repair_orphan_agent_blocks.sql +3 -0
  291. shikiru_cli-0.2.0/src/shikiru/store/migrations/016_feedback_rounds.sql +29 -0
  292. shikiru_cli-0.2.0/src/shikiru/store/migrations/017_feedback_round_comments.sql +5 -0
  293. shikiru_cli-0.2.0/src/shikiru/store/migrations/__init__.py +1 -0
  294. shikiru_cli-0.2.0/src/shikiru/store/notification_cursor.py +29 -0
  295. shikiru_cli-0.2.0/src/shikiru/store/pushes.py +117 -0
  296. shikiru_cli-0.2.0/src/shikiru/store/quotas.py +153 -0
  297. shikiru_cli-0.2.0/src/shikiru/store/reader.py +310 -0
  298. shikiru_cli-0.2.0/src/shikiru/store/retention.py +92 -0
  299. shikiru_cli-0.2.0/src/shikiru/store/runs.py +227 -0
  300. shikiru_cli-0.2.0/src/shikiru/store/tasks.py +949 -0
  301. shikiru_cli-0.2.0/src/shikiru/telemetry/__init__.py +1 -0
  302. shikiru_cli-0.2.0/src/shikiru/telemetry/disk.py +167 -0
  303. shikiru_cli-0.2.0/src/shikiru/telemetry/docker.py +164 -0
  304. shikiru_cli-0.2.0/src/shikiru/telemetry/resources.py +296 -0
  305. shikiru_cli-0.2.0/src/shikiru/tmux/__init__.py +3 -0
  306. shikiru_cli-0.2.0/src/shikiru/tmux/client.py +637 -0
  307. shikiru_cli-0.2.0/src/shikiru/tmux/decorator.py +225 -0
  308. shikiru_cli-0.2.0/src/shikiru/tmux/layout.py +200 -0
  309. shikiru_cli-0.2.0/src/shikiru/tmux/session.py +381 -0
  310. shikiru_cli-0.2.0/src/shikiru/ui/__init__.py +9 -0
  311. shikiru_cli-0.2.0/src/shikiru/ui/age.py +45 -0
  312. shikiru_cli-0.2.0/src/shikiru/ui/bubbles.py +41 -0
  313. shikiru_cli-0.2.0/src/shikiru/ui/compact.py +1209 -0
  314. shikiru_cli-0.2.0/src/shikiru/ui/console.py +49 -0
  315. shikiru_cli-0.2.0/src/shikiru/ui/fold.py +50 -0
  316. shikiru_cli-0.2.0/src/shikiru/ui/gated_static.py +117 -0
  317. shikiru_cli-0.2.0/src/shikiru/ui/gauge.py +40 -0
  318. shikiru_cli-0.2.0/src/shikiru/ui/glyphs.py +109 -0
  319. shikiru_cli-0.2.0/src/shikiru/ui/keys.py +57 -0
  320. shikiru_cli-0.2.0/src/shikiru/ui/live_interval.py +42 -0
  321. shikiru_cli-0.2.0/src/shikiru/ui/popup.py +311 -0
  322. shikiru_cli-0.2.0/src/shikiru/ui/quota_status.py +26 -0
  323. shikiru_cli-0.2.0/src/shikiru/ui/recent_window.py +78 -0
  324. shikiru_cli-0.2.0/src/shikiru/ui/screen.py +57 -0
  325. shikiru_cli-0.2.0/src/shikiru/ui/section.py +193 -0
  326. shikiru_cli-0.2.0/src/shikiru/ui/session.py +65 -0
  327. shikiru_cli-0.2.0/src/shikiru/ui/size.py +17 -0
  328. shikiru_cli-0.2.0/src/shikiru/ui/splash.py +42 -0
  329. shikiru_cli-0.2.0/src/shikiru/ui/status.py +47 -0
  330. shikiru_cli-0.2.0/src/shikiru/ui/status_strip.py +149 -0
  331. shikiru_cli-0.2.0/src/shikiru/ui/stream.py +152 -0
  332. shikiru_cli-0.2.0/src/shikiru/ui/strip.py +332 -0
  333. shikiru_cli-0.2.0/src/shikiru/ui/theme.py +83 -0
  334. shikiru_cli-0.2.0/src/shikiru/ui/tokens.py +51 -0
  335. shikiru_cli-0.2.0/src/shikiru/view_log.py +126 -0
  336. shikiru_cli-0.2.0/src/shikiru/workspace/__init__.py +3 -0
  337. shikiru_cli-0.2.0/src/shikiru/workspace/base_refs.py +160 -0
  338. shikiru_cli-0.2.0/src/shikiru/workspace/caches.py +136 -0
  339. shikiru_cli-0.2.0/src/shikiru/workspace/facts.py +118 -0
  340. shikiru_cli-0.2.0/src/shikiru/workspace/git.py +601 -0
  341. shikiru_cli-0.2.0/src/shikiru/workspace/github.py +744 -0
  342. shikiru_cli-0.2.0/src/shikiru/workspace/messages.py +107 -0
  343. shikiru_cli-0.2.0/src/shikiru/workspace/reports.py +145 -0
  344. shikiru_cli-0.2.0/src/shikiru/workspace/roots.py +180 -0
  345. shikiru_cli-0.2.0/tests/__init__.py +0 -0
  346. shikiru_cli-0.2.0/tests/conftest.py +137 -0
  347. shikiru_cli-0.2.0/tests/e2e/__init__.py +0 -0
  348. shikiru_cli-0.2.0/tests/e2e/budgets.py +51 -0
  349. shikiru_cli-0.2.0/tests/e2e/conftest.py +163 -0
  350. shikiru_cli-0.2.0/tests/e2e/diagnostics.py +182 -0
  351. shikiru_cli-0.2.0/tests/e2e/real_agent_config.py +9 -0
  352. shikiru_cli-0.2.0/tests/e2e/test_operator_fake_agent.py +237 -0
  353. shikiru_cli-0.2.0/tests/e2e/test_real_agents.py +1210 -0
  354. shikiru_cli-0.2.0/tests/e2e/watchdog.py +86 -0
  355. shikiru_cli-0.2.0/tests/fake_agent/pyproject.toml +19 -0
  356. shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/__init__.py +1 -0
  357. shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/agent.py +168 -0
  358. shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/headless.py +36 -0
  359. shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/py.typed +0 -0
  360. shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/script.py +175 -0
  361. shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/scripted.py +432 -0
  362. shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/turn_cli.py +336 -0
  363. shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/turns.py +295 -0
  364. shikiru_cli-0.2.0/tests/fixtures/agents/claude/README.md +70 -0
  365. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_background_result_compaction.jsonl +8 -0
  366. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_background_result_then_activity.jsonl +11 -0
  367. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_compact_ineffective.jsonl +3 -0
  368. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_compact_process.jsonl +4 -0
  369. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_compaction_failed.jsonl +2 -0
  370. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_context_failure.jsonl +2 -0
  371. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_context_failure.stderr.log +1 -0
  372. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_credit_exhausted.jsonl +2 -0
  373. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_hook_compact_live_redacted.jsonl +5 -0
  374. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_hook_continue_live_redacted.jsonl +4 -0
  375. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_hook_stop_live_redacted.jsonl +10 -0
  376. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_list_cost.jsonl +3 -0
  377. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_openrouter.jsonl +3 -0
  378. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_openrouter_live_redacted.jsonl +3 -0
  379. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_openrouter_report_live_redacted.jsonl +9 -0
  380. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_rate_limit.jsonl +3 -0
  381. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_rate_limit.stderr.log +1 -0
  382. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_rerun_success.jsonl +3 -0
  383. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_subscription.jsonl +6 -0
  384. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_tool_error.jsonl +5 -0
  385. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_unknown_error.jsonl +2 -0
  386. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_unknown_error.stderr.log +1 -0
  387. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_unrecognized_model.jsonl +2 -0
  388. shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_unrecognized_model.stderr.log +1 -0
  389. shikiru_cli-0.2.0/tests/fixtures/agents/codex/README.md +72 -0
  390. shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_first.jsonl +4 -0
  391. shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_midturn_compaction_live_redacted.jsonl +13 -0
  392. shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_model_change_turn_context_live_redacted.jsonl +4 -0
  393. shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_openrouter_live_redacted.jsonl +1 -0
  394. shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_rerun_compaction.jsonl +4 -0
  395. shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_resume_model_change.jsonl +8 -0
  396. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_context_failure.jsonl +3 -0
  397. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_empty.stderr.log +0 -0
  398. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_failed_command_incomplete.jsonl +3 -0
  399. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_first.jsonl +10 -0
  400. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_first.stderr.log +1 -0
  401. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_midturn_compaction_live_redacted.jsonl +28 -0
  402. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_model_capacity.jsonl +2 -0
  403. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_openrouter_live_redacted.jsonl +3 -0
  404. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_openrouter_live_redacted.stderr.log +1 -0
  405. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_rerun_success.jsonl +4 -0
  406. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_resume_model_change.jsonl +10 -0
  407. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_resume_model_change.stderr.log +0 -0
  408. shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_tool_outcomes.jsonl +10 -0
  409. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_compact_process.jsonl +2 -0
  410. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_compacted.jsonl +6 -0
  411. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_compacted.stderr.log +0 -0
  412. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_compaction_failed.jsonl +1 -0
  413. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_context_failure.jsonl +2 -0
  414. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_full.jsonl +6 -0
  415. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_full.stderr.log +0 -0
  416. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_quota_error.jsonl +2 -0
  417. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_quota_error.stderr.log +0 -0
  418. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_retry_context_failure.jsonl +2 -0
  419. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_retry_success.jsonl +4 -0
  420. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_threshold_reached.jsonl +4 -0
  421. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_unknown_error.jsonl +2 -0
  422. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_unknown_error.stderr.log +0 -0
  423. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_unmapped_error.jsonl +1 -0
  424. shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_unmapped_error.stderr.log +1 -0
  425. shikiru_cli-0.2.0/tests/fixtures/sample-project/.gitignore +2 -0
  426. shikiru_cli-0.2.0/tests/fixtures/sample-project/AGENTS.md +4 -0
  427. shikiru_cli-0.2.0/tests/fixtures/sample-project/CLAUDE.md +1 -0
  428. shikiru_cli-0.2.0/tests/fixtures/sample-project/pyproject.toml +11 -0
  429. shikiru_cli-0.2.0/tests/fixtures/sample-project/sample_project/__init__.py +2 -0
  430. shikiru_cli-0.2.0/tests/fixtures/sample-project/tasks/plan.md +25 -0
  431. shikiru_cli-0.2.0/tests/fixtures/sample-project/tasks/todo.md +8 -0
  432. shikiru_cli-0.2.0/tests/fixtures/sample-project/tests/__init__.py +0 -0
  433. shikiru_cli-0.2.0/tests/fixtures/sample-project/tests/test_sample_project.py +5 -0
  434. shikiru_cli-0.2.0/tests/integration/__init__.py +0 -0
  435. shikiru_cli-0.2.0/tests/integration/dashboard_wizard_support.py +753 -0
  436. shikiru_cli-0.2.0/tests/integration/test_actions_list.py +1075 -0
  437. shikiru_cli-0.2.0/tests/integration/test_agent_sdk_turn.py +1011 -0
  438. shikiru_cli-0.2.0/tests/integration/test_agents_registry.py +67 -0
  439. shikiru_cli-0.2.0/tests/integration/test_billing_declarations.py +206 -0
  440. shikiru_cli-0.2.0/tests/integration/test_claude_compaction.py +104 -0
  441. shikiru_cli-0.2.0/tests/integration/test_claude_headless_contract.py +1085 -0
  442. shikiru_cli-0.2.0/tests/integration/test_cli.py +22 -0
  443. shikiru_cli-0.2.0/tests/integration/test_cli_report.py +176 -0
  444. shikiru_cli-0.2.0/tests/integration/test_cli_restart.py +72 -0
  445. shikiru_cli-0.2.0/tests/integration/test_codex_headless_contract.py +1645 -0
  446. shikiru_cli-0.2.0/tests/integration/test_codex_sandbox_probe.py +67 -0
  447. shikiru_cli-0.2.0/tests/integration/test_codex_worktree_sandbox.py +97 -0
  448. shikiru_cli-0.2.0/tests/integration/test_config_ladder_round_trip.py +101 -0
  449. shikiru_cli-0.2.0/tests/integration/test_dashboard_app.py +5645 -0
  450. shikiru_cli-0.2.0/tests/integration/test_dashboard_bar_templates.py +396 -0
  451. shikiru_cli-0.2.0/tests/integration/test_dashboard_briefing.py +720 -0
  452. shikiru_cli-0.2.0/tests/integration/test_dashboard_diagnostics_panel.py +678 -0
  453. shikiru_cli-0.2.0/tests/integration/test_dashboard_disk_section.py +265 -0
  454. shikiru_cli-0.2.0/tests/integration/test_dashboard_docker_section.py +319 -0
  455. shikiru_cli-0.2.0/tests/integration/test_dashboard_escalation_follow.py +350 -0
  456. shikiru_cli-0.2.0/tests/integration/test_dashboard_fault_cards.py +142 -0
  457. shikiru_cli-0.2.0/tests/integration/test_dashboard_live_work.py +295 -0
  458. shikiru_cli-0.2.0/tests/integration/test_dashboard_motion.py +2066 -0
  459. shikiru_cli-0.2.0/tests/integration/test_dashboard_motion_skips.py +239 -0
  460. shikiru_cli-0.2.0/tests/integration/test_dashboard_palette.py +1268 -0
  461. shikiru_cli-0.2.0/tests/integration/test_dashboard_popup_focus.py +386 -0
  462. shikiru_cli-0.2.0/tests/integration/test_dashboard_quota_waits.py +577 -0
  463. shikiru_cli-0.2.0/tests/integration/test_dashboard_remaining_widgets.py +1538 -0
  464. shikiru_cli-0.2.0/tests/integration/test_dashboard_resolution.py +886 -0
  465. shikiru_cli-0.2.0/tests/integration/test_dashboard_results.py +397 -0
  466. shikiru_cli-0.2.0/tests/integration/test_dashboard_services.py +275 -0
  467. shikiru_cli-0.2.0/tests/integration/test_dashboard_settings_reload.py +250 -0
  468. shikiru_cli-0.2.0/tests/integration/test_dashboard_tab_stops.py +365 -0
  469. shikiru_cli-0.2.0/tests/integration/test_dashboard_task_detail.py +2835 -0
  470. shikiru_cli-0.2.0/tests/integration/test_dashboard_task_work.py +40 -0
  471. shikiru_cli-0.2.0/tests/integration/test_dashboard_usage_panel.py +646 -0
  472. shikiru_cli-0.2.0/tests/integration/test_dashboard_view_cache.py +159 -0
  473. shikiru_cli-0.2.0/tests/integration/test_dashboard_widgets.py +566 -0
  474. shikiru_cli-0.2.0/tests/integration/test_dashboard_wizard.py +386 -0
  475. shikiru_cli-0.2.0/tests/integration/test_dashboard_wizard_agents.py +370 -0
  476. shikiru_cli-0.2.0/tests/integration/test_dashboard_wizard_navigation.py +412 -0
  477. shikiru_cli-0.2.0/tests/integration/test_disk_sampler.py +184 -0
  478. shikiru_cli-0.2.0/tests/integration/test_docker_sampler.py +249 -0
  479. shikiru_cli-0.2.0/tests/integration/test_e2e_guards.py +247 -0
  480. shikiru_cli-0.2.0/tests/integration/test_e2e_results.py +126 -0
  481. shikiru_cli-0.2.0/tests/integration/test_engine_agents.py +21 -0
  482. shikiru_cli-0.2.0/tests/integration/test_engine_daemon.py +2409 -0
  483. shikiru_cli-0.2.0/tests/integration/test_engine_decomposition.py +188 -0
  484. shikiru_cli-0.2.0/tests/integration/test_engine_escalation_faults.py +246 -0
  485. shikiru_cli-0.2.0/tests/integration/test_engine_escalations.py +279 -0
  486. shikiru_cli-0.2.0/tests/integration/test_engine_evidence.py +45 -0
  487. shikiru_cli-0.2.0/tests/integration/test_engine_faults.py +610 -0
  488. shikiru_cli-0.2.0/tests/integration/test_engine_feedback.py +468 -0
  489. shikiru_cli-0.2.0/tests/integration/test_engine_feedback_landing.py +131 -0
  490. shikiru_cli-0.2.0/tests/integration/test_engine_feedback_recovery.py +307 -0
  491. shikiru_cli-0.2.0/tests/integration/test_engine_feedback_rounds.py +386 -0
  492. shikiru_cli-0.2.0/tests/integration/test_engine_flow.py +606 -0
  493. shikiru_cli-0.2.0/tests/integration/test_engine_flow_liveness.py +185 -0
  494. shikiru_cli-0.2.0/tests/integration/test_engine_flow_pinning.py +263 -0
  495. shikiru_cli-0.2.0/tests/integration/test_engine_holds.py +302 -0
  496. shikiru_cli-0.2.0/tests/integration/test_engine_hung_remote.py +105 -0
  497. shikiru_cli-0.2.0/tests/integration/test_engine_integration.py +1507 -0
  498. shikiru_cli-0.2.0/tests/integration/test_engine_layout.py +465 -0
  499. shikiru_cli-0.2.0/tests/integration/test_engine_monitor.py +310 -0
  500. shikiru_cli-0.2.0/tests/integration/test_engine_notification_delivery.py +282 -0
  501. shikiru_cli-0.2.0/tests/integration/test_engine_notifications.py +259 -0
  502. shikiru_cli-0.2.0/tests/integration/test_engine_pull_request.py +810 -0
  503. shikiru_cli-0.2.0/tests/integration/test_engine_push.py +703 -0
  504. shikiru_cli-0.2.0/tests/integration/test_engine_recovery.py +1086 -0
  505. shikiru_cli-0.2.0/tests/integration/test_engine_resources.py +19 -0
  506. shikiru_cli-0.2.0/tests/integration/test_engine_restart.py +738 -0
  507. shikiru_cli-0.2.0/tests/integration/test_engine_retention.py +325 -0
  508. shikiru_cli-0.2.0/tests/integration/test_engine_scheduler.py +1829 -0
  509. shikiru_cli-0.2.0/tests/integration/test_engine_sessions.py +245 -0
  510. shikiru_cli-0.2.0/tests/integration/test_engine_signals.py +96 -0
  511. shikiru_cli-0.2.0/tests/integration/test_engine_squash.py +774 -0
  512. shikiru_cli-0.2.0/tests/integration/test_engine_start_failure.py +112 -0
  513. shikiru_cli-0.2.0/tests/integration/test_engine_tick_guard.py +182 -0
  514. shikiru_cli-0.2.0/tests/integration/test_engine_titles.py +381 -0
  515. shikiru_cli-0.2.0/tests/integration/test_engine_turns.py +353 -0
  516. shikiru_cli-0.2.0/tests/integration/test_fake_agent_contract.py +504 -0
  517. shikiru_cli-0.2.0/tests/integration/test_fake_agent_environment.py +56 -0
  518. shikiru_cli-0.2.0/tests/integration/test_fake_agent_script_order.py +55 -0
  519. shikiru_cli-0.2.0/tests/integration/test_gated_static.py +115 -0
  520. shikiru_cli-0.2.0/tests/integration/test_git_mutation_cancel.py +133 -0
  521. shikiru_cli-0.2.0/tests/integration/test_github_feedback.py +462 -0
  522. shikiru_cli-0.2.0/tests/integration/test_helper.py +376 -0
  523. shikiru_cli-0.2.0/tests/integration/test_home_recent_window.py +469 -0
  524. shikiru_cli-0.2.0/tests/integration/test_import_contract_completeness.py +60 -0
  525. shikiru_cli-0.2.0/tests/integration/test_mcp_server.py +97 -0
  526. shikiru_cli-0.2.0/tests/integration/test_operator_cli.py +514 -0
  527. shikiru_cli-0.2.0/tests/integration/test_operator_doctor.py +515 -0
  528. shikiru_cli-0.2.0/tests/integration/test_operator_fault_status.py +164 -0
  529. shikiru_cli-0.2.0/tests/integration/test_operator_plugin_checks.py +138 -0
  530. shikiru_cli-0.2.0/tests/integration/test_operator_render.py +244 -0
  531. shikiru_cli-0.2.0/tests/integration/test_operator_services.py +676 -0
  532. shikiru_cli-0.2.0/tests/integration/test_operator_sessions.py +1733 -0
  533. shikiru_cli-0.2.0/tests/integration/test_operator_stop_wait.py +116 -0
  534. shikiru_cli-0.2.0/tests/integration/test_private_dirs.py +32 -0
  535. shikiru_cli-0.2.0/tests/integration/test_process.py +351 -0
  536. shikiru_cli-0.2.0/tests/integration/test_prompts_renderer.py +127 -0
  537. shikiru_cli-0.2.0/tests/integration/test_quota_reconciler.py +71 -0
  538. shikiru_cli-0.2.0/tests/integration/test_quota_visibility.py +605 -0
  539. shikiru_cli-0.2.0/tests/integration/test_reconcile_orphans.py +148 -0
  540. shikiru_cli-0.2.0/tests/integration/test_release_notes.py +232 -0
  541. shikiru_cli-0.2.0/tests/integration/test_release_workflow.py +63 -0
  542. shikiru_cli-0.2.0/tests/integration/test_resource_sampler_cpu.py +94 -0
  543. shikiru_cli-0.2.0/tests/integration/test_resource_sampler_identity.py +132 -0
  544. shikiru_cli-0.2.0/tests/integration/test_soak_smoke.py +53 -0
  545. shikiru_cli-0.2.0/tests/integration/test_store_commands.py +55 -0
  546. shikiru_cli-0.2.0/tests/integration/test_store_database.py +482 -0
  547. shikiru_cli-0.2.0/tests/integration/test_store_escalations.py +82 -0
  548. shikiru_cli-0.2.0/tests/integration/test_store_events.py +70 -0
  549. shikiru_cli-0.2.0/tests/integration/test_store_quotas.py +233 -0
  550. shikiru_cli-0.2.0/tests/integration/test_store_reader.py +198 -0
  551. shikiru_cli-0.2.0/tests/integration/test_store_runs.py +131 -0
  552. shikiru_cli-0.2.0/tests/integration/test_store_tasks.py +472 -0
  553. shikiru_cli-0.2.0/tests/integration/test_task_blocker_evidence.py +550 -0
  554. shikiru_cli-0.2.0/tests/integration/test_task_browser.py +1020 -0
  555. shikiru_cli-0.2.0/tests/integration/test_task_detail_bodies.py +1187 -0
  556. shikiru_cli-0.2.0/tests/integration/test_task_detail_folds.py +369 -0
  557. shikiru_cli-0.2.0/tests/integration/test_task_evidence_export.py +781 -0
  558. shikiru_cli-0.2.0/tests/integration/test_task_family_and_blockers.py +1109 -0
  559. shikiru_cli-0.2.0/tests/integration/test_task_picker.py +146 -0
  560. shikiru_cli-0.2.0/tests/integration/test_task_timeline.py +1211 -0
  561. shikiru_cli-0.2.0/tests/integration/test_tmux_decorator.py +341 -0
  562. shikiru_cli-0.2.0/tests/integration/test_tmux_layout.py +126 -0
  563. shikiru_cli-0.2.0/tests/integration/test_tmux_palette_binding.py +248 -0
  564. shikiru_cli-0.2.0/tests/integration/test_tmux_session.py +435 -0
  565. shikiru_cli-0.2.0/tests/integration/test_turn_ordering.py +81 -0
  566. shikiru_cli-0.2.0/tests/integration/test_turn_processes.py +145 -0
  567. shikiru_cli-0.2.0/tests/integration/test_version_from_tag.py +43 -0
  568. shikiru_cli-0.2.0/tests/integration/test_view.py +93 -0
  569. shikiru_cli-0.2.0/tests/integration/test_workspace_base_sync.py +193 -0
  570. shikiru_cli-0.2.0/tests/integration/test_workspace_caches.py +175 -0
  571. shikiru_cli-0.2.0/tests/integration/test_workspace_facts.py +175 -0
  572. shikiru_cli-0.2.0/tests/integration/test_workspace_messages.py +31 -0
  573. shikiru_cli-0.2.0/tests/integration/test_workspace_roots.py +338 -0
  574. shikiru_cli-0.2.0/tests/integration/test_workspace_walkthroughs.py +755 -0
  575. shikiru_cli-0.2.0/tests/soak/__init__.py +0 -0
  576. shikiru_cli-0.2.0/tests/soak/__main__.py +40 -0
  577. shikiru_cli-0.2.0/tests/soak/arena.py +283 -0
  578. shikiru_cli-0.2.0/tests/soak/chaos.py +214 -0
  579. shikiru_cli-0.2.0/tests/soak/driver.py +119 -0
  580. shikiru_cli-0.2.0/tests/soak/hook.py +28 -0
  581. shikiru_cli-0.2.0/tests/soak/hosting.py +75 -0
  582. shikiru_cli-0.2.0/tests/soak/invariants.py +386 -0
  583. shikiru_cli-0.2.0/tests/soak/model.py +120 -0
  584. shikiru_cli-0.2.0/tests/soak/operators.py +200 -0
  585. shikiru_cli-0.2.0/tests/soak/probe.py +48 -0
  586. shikiru_cli-0.2.0/tests/soak/processes.py +58 -0
  587. shikiru_cli-0.2.0/tests/soak/reporter.py +75 -0
  588. shikiru_cli-0.2.0/tests/soak/run.py +192 -0
  589. shikiru_cli-0.2.0/tests/soak/scenarios.py +218 -0
  590. shikiru_cli-0.2.0/tests/soak/supervisor.py +62 -0
  591. shikiru_cli-0.2.0/tests/support/README.md +40 -0
  592. shikiru_cli-0.2.0/tests/support/__init__.py +1 -0
  593. shikiru_cli-0.2.0/tests/support/actions.py +234 -0
  594. shikiru_cli-0.2.0/tests/support/cells.py +150 -0
  595. shikiru_cli-0.2.0/tests/support/cli_project.py +77 -0
  596. shikiru_cli-0.2.0/tests/support/clock.py +83 -0
  597. shikiru_cli-0.2.0/tests/support/comment_rule.py +79 -0
  598. shikiru_cli-0.2.0/tests/support/config.py +34 -0
  599. shikiru_cli-0.2.0/tests/support/dashboard.py +442 -0
  600. shikiru_cli-0.2.0/tests/support/e2e_attempts.py +25 -0
  601. shikiru_cli-0.2.0/tests/support/e2e_provenance.py +43 -0
  602. shikiru_cli-0.2.0/tests/support/engine.py +490 -0
  603. shikiru_cli-0.2.0/tests/support/engine_project.py +178 -0
  604. shikiru_cli-0.2.0/tests/support/entry_points.py +35 -0
  605. shikiru_cli-0.2.0/tests/support/escalations.py +291 -0
  606. shikiru_cli-0.2.0/tests/support/factories.py +205 -0
  607. shikiru_cli-0.2.0/tests/support/fake_gh.py +404 -0
  608. shikiru_cli-0.2.0/tests/support/fake_monitor_claude.py +260 -0
  609. shikiru_cli-0.2.0/tests/support/feedback_rounds.py +367 -0
  610. shikiru_cli-0.2.0/tests/support/flow.py +370 -0
  611. shikiru_cli-0.2.0/tests/support/git_repo.py +64 -0
  612. shikiru_cli-0.2.0/tests/support/github.py +257 -0
  613. shikiru_cli-0.2.0/tests/support/handshake.py +41 -0
  614. shikiru_cli-0.2.0/tests/support/literal_rule.py +236 -0
  615. shikiru_cli-0.2.0/tests/support/permissions.py +14 -0
  616. shikiru_cli-0.2.0/tests/support/process_tree.py +97 -0
  617. shikiru_cli-0.2.0/tests/support/project_dir.py +27 -0
  618. shikiru_cli-0.2.0/tests/support/quota_waits.py +68 -0
  619. shikiru_cli-0.2.0/tests/support/release_wait.py +282 -0
  620. shikiru_cli-0.2.0/tests/support/render.py +31 -0
  621. shikiru_cli-0.2.0/tests/support/resource_agent.py +163 -0
  622. shikiru_cli-0.2.0/tests/support/spawn_hook.py +125 -0
  623. shikiru_cli-0.2.0/tests/support/spawn_then_die.py +30 -0
  624. shikiru_cli-0.2.0/tests/support/store.py +95 -0
  625. shikiru_cli-0.2.0/tests/support/store_reader_process.py +42 -0
  626. shikiru_cli-0.2.0/tests/support/store_submit_process.py +29 -0
  627. shikiru_cli-0.2.0/tests/support/tmux.py +154 -0
  628. shikiru_cli-0.2.0/tests/support/waiting.py +214 -0
  629. shikiru_cli-0.2.0/tests/support/workspace.py +34 -0
  630. shikiru_cli-0.2.0/tests/support/xdist_workers.py +27 -0
  631. shikiru_cli-0.2.0/tests/unit/__init__.py +0 -0
  632. shikiru_cli-0.2.0/tests/unit/test_agent_model_choices.py +55 -0
  633. shikiru_cli-0.2.0/tests/unit/test_agent_settings.py +90 -0
  634. shikiru_cli-0.2.0/tests/unit/test_agents_contract_obligations.py +125 -0
  635. shikiru_cli-0.2.0/tests/unit/test_agents_contracts.py +67 -0
  636. shikiru_cli-0.2.0/tests/unit/test_agents_sdk_reset_time.py +159 -0
  637. shikiru_cli-0.2.0/tests/unit/test_claude_context.py +69 -0
  638. shikiru_cli-0.2.0/tests/unit/test_claude_model_catalog.py +76 -0
  639. shikiru_cli-0.2.0/tests/unit/test_claude_result_records.py +171 -0
  640. shikiru_cli-0.2.0/tests/unit/test_claude_usage.py +99 -0
  641. shikiru_cli-0.2.0/tests/unit/test_codex_capacity.py +235 -0
  642. shikiru_cli-0.2.0/tests/unit/test_codex_model_catalog.py +95 -0
  643. shikiru_cli-0.2.0/tests/unit/test_codex_quota_evidence.py +233 -0
  644. shikiru_cli-0.2.0/tests/unit/test_codex_turn_parser.py +444 -0
  645. shikiru_cli-0.2.0/tests/unit/test_codex_usage.py +33 -0
  646. shikiru_cli-0.2.0/tests/unit/test_comment_rule.py +38 -0
  647. shikiru_cli-0.2.0/tests/unit/test_config_loader.py +249 -0
  648. shikiru_cli-0.2.0/tests/unit/test_config_settings.py +185 -0
  649. shikiru_cli-0.2.0/tests/unit/test_domain_acceptance.py +111 -0
  650. shikiru_cli-0.2.0/tests/unit/test_domain_activity.py +45 -0
  651. shikiru_cli-0.2.0/tests/unit/test_domain_attempts.py +281 -0
  652. shikiru_cli-0.2.0/tests/unit/test_domain_briefing.py +150 -0
  653. shikiru_cli-0.2.0/tests/unit/test_domain_decisions.py +87 -0
  654. shikiru_cli-0.2.0/tests/unit/test_domain_docker.py +208 -0
  655. shikiru_cli-0.2.0/tests/unit/test_domain_engine_uptime.py +179 -0
  656. shikiru_cli-0.2.0/tests/unit/test_domain_escalation.py +137 -0
  657. shikiru_cli-0.2.0/tests/unit/test_domain_escalation_evidence.py +82 -0
  658. shikiru_cli-0.2.0/tests/unit/test_domain_escalation_panel.py +81 -0
  659. shikiru_cli-0.2.0/tests/unit/test_domain_faults.py +99 -0
  660. shikiru_cli-0.2.0/tests/unit/test_domain_feedback.py +270 -0
  661. shikiru_cli-0.2.0/tests/unit/test_domain_feedback_rounds.py +85 -0
  662. shikiru_cli-0.2.0/tests/unit/test_domain_fencing.py +57 -0
  663. shikiru_cli-0.2.0/tests/unit/test_domain_ladder.py +242 -0
  664. shikiru_cli-0.2.0/tests/unit/test_domain_levels.py +54 -0
  665. shikiru_cli-0.2.0/tests/unit/test_domain_motion.py +303 -0
  666. shikiru_cli-0.2.0/tests/unit/test_domain_pushes.py +71 -0
  667. shikiru_cli-0.2.0/tests/unit/test_domain_quota_blocks.py +98 -0
  668. shikiru_cli-0.2.0/tests/unit/test_domain_quota_waits.py +267 -0
  669. shikiru_cli-0.2.0/tests/unit/test_domain_recovery.py +305 -0
  670. shikiru_cli-0.2.0/tests/unit/test_domain_reports.py +222 -0
  671. shikiru_cli-0.2.0/tests/unit/test_domain_results.py +226 -0
  672. shikiru_cli-0.2.0/tests/unit/test_domain_runs.py +30 -0
  673. shikiru_cli-0.2.0/tests/unit/test_domain_scheduling.py +319 -0
  674. shikiru_cli-0.2.0/tests/unit/test_domain_status_tasks.py +124 -0
  675. shikiru_cli-0.2.0/tests/unit/test_domain_steps.py +461 -0
  676. shikiru_cli-0.2.0/tests/unit/test_domain_task_titles.py +42 -0
  677. shikiru_cli-0.2.0/tests/unit/test_domain_versions.py +24 -0
  678. shikiru_cli-0.2.0/tests/unit/test_domain_workflow.py +620 -0
  679. shikiru_cli-0.2.0/tests/unit/test_engine_feedback_snapshot.py +174 -0
  680. shikiru_cli-0.2.0/tests/unit/test_fake_clock.py +98 -0
  681. shikiru_cli-0.2.0/tests/unit/test_ladder_text.py +45 -0
  682. shikiru_cli-0.2.0/tests/unit/test_literal_rule.py +69 -0
  683. shikiru_cli-0.2.0/tests/unit/test_orchestration_fields.py +64 -0
  684. shikiru_cli-0.2.0/tests/unit/test_packet_evidence.py +127 -0
  685. shikiru_cli-0.2.0/tests/unit/test_process_identity.py +40 -0
  686. shikiru_cli-0.2.0/tests/unit/test_quota_normalization.py +91 -0
  687. shikiru_cli-0.2.0/tests/unit/test_task_timeline_parser.py +71 -0
  688. shikiru_cli-0.2.0/tests/unit/test_timeline_phrases.py +97 -0
  689. shikiru_cli-0.2.0/tests/unit/test_tmux_session_name.py +18 -0
  690. shikiru_cli-0.2.0/tests/unit/test_ui_age.py +38 -0
  691. shikiru_cli-0.2.0/tests/unit/test_ui_cpu_format.py +19 -0
  692. shikiru_cli-0.2.0/tests/unit/test_ui_glyphs.py +24 -0
  693. shikiru_cli-0.2.0/tests/unit/test_ui_keys.py +39 -0
  694. shikiru_cli-0.2.0/tests/unit/test_ui_recent_window.py +121 -0
  695. shikiru_cli-0.2.0/tests/unit/test_ui_size.py +21 -0
  696. shikiru_cli-0.2.0/tests/unit/test_ui_strip.py +152 -0
  697. shikiru_cli-0.2.0/tests/unit/test_usage_rows.py +121 -0
  698. shikiru_cli-0.2.0/tests/unit/test_view_log.py +16 -0
  699. shikiru_cli-0.2.0/tests/unit/test_view_tail.py +148 -0
  700. shikiru_cli-0.2.0/tests/unit/test_waiting_time_scale.py +23 -0
  701. shikiru_cli-0.2.0/tests/unit/test_workspace_slugify.py +9 -0
  702. shikiru_cli-0.2.0/tests/unit/test_xdist_workers.py +28 -0
  703. shikiru_cli-0.2.0/uv.lock +1152 -0
@@ -0,0 +1,33 @@
1
+ name: Bug report
2
+ description: Report a problem with Shikiru
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: >-
8
+ Do not paste secrets or private project content. State files, prompts and reports can contain
9
+ it; redact before posting.
10
+ - type: textarea
11
+ id: what-happened
12
+ attributes:
13
+ label: What happened?
14
+ validations:
15
+ required: true
16
+ - type: textarea
17
+ id: expected
18
+ attributes:
19
+ label: What did you expect?
20
+ validations:
21
+ required: true
22
+ - type: textarea
23
+ id: steps
24
+ attributes:
25
+ label: Steps to reproduce
26
+ description: The commands you ran, in order.
27
+ - type: textarea
28
+ id: environment
29
+ attributes:
30
+ label: Environment
31
+ description: Output of `shikiru --version` and `shikiru doctor`, and your operating system.
32
+ validations:
33
+ required: true
@@ -0,0 +1,24 @@
1
+ name: Feature request
2
+ description: Suggest a change to Shikiru
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: >-
8
+ Open this before starting anything larger than a small fix, so the approach can be agreed first.
9
+ - type: textarea
10
+ id: problem
11
+ attributes:
12
+ label: What problem does this solve?
13
+ validations:
14
+ required: true
15
+ - type: textarea
16
+ id: proposal
17
+ attributes:
18
+ label: Proposed behaviour
19
+ validations:
20
+ required: true
21
+ - type: textarea
22
+ id: alternatives
23
+ attributes:
24
+ label: Alternatives considered
@@ -0,0 +1,12 @@
1
+ ## Summary
2
+
3
+ <!-- What changes and why. Link the issue if there is one. -->
4
+
5
+ ## Quality gate
6
+
7
+ Result of `PYTEST_ADDOPTS='--dist=loadfile' uv run poe check` on this branch (green, or the failing check):
8
+
9
+ ## Checklist
10
+
11
+ - [ ] Commits follow Conventional Commits.
12
+ - [ ] `AGENTS.md` conventions are followed.
@@ -0,0 +1,104 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ check:
17
+ name: ${{ matrix.os }}
18
+ runs-on: ${{ matrix.os }}
19
+ timeout-minutes: 45
20
+ strategy:
21
+ fail-fast: false
22
+ max-parallel: 2
23
+ matrix:
24
+ os: [ubuntu-24.04, macos-15]
25
+ env:
26
+ PYTEST_ADDOPTS: --dist=loadfile --durations=15
27
+ SHIKIRU_TEST_CPUS_PER_WORKER: "1"
28
+ UV_NO_PROGRESS: "true"
29
+ NODE_OPTIONS: --max-old-space-size=1536
30
+ TERM: xterm-256color
31
+
32
+ steps:
33
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
34
+ with:
35
+ fetch-depth: 0
36
+ persist-credentials: false
37
+
38
+ - uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
39
+ with:
40
+ version: "0.12.5"
41
+ python-version: "3.14"
42
+ activate-environment: true
43
+ enable-cache: false
44
+
45
+ - name: Install required host tools
46
+ run: |
47
+ if [[ "$RUNNER_OS" == Linux ]]; then
48
+ sudo apt-get update
49
+ sudo apt-get install --yes \
50
+ bison build-essential ca-certificates curl git libevent-dev libncurses-dev pkg-config
51
+ TMUX_VERSION=3.5a
52
+ TMUX_SHA256=16216bd0877170dfcc64157085ba9013610b12b082548c7c9542cc0103198951
53
+ TMUX_ARCHIVE="$RUNNER_TEMP/tmux-$TMUX_VERSION.tar.gz"
54
+ TMUX_SOURCE="$RUNNER_TEMP/tmux-$TMUX_VERSION"
55
+ curl --fail --location --silent --show-error \
56
+ "https://github.com/tmux/tmux/releases/download/$TMUX_VERSION/tmux-$TMUX_VERSION.tar.gz" \
57
+ --output "$TMUX_ARCHIVE"
58
+ printf '%s %s\n' "$TMUX_SHA256" "$TMUX_ARCHIVE" | sha256sum --check
59
+ tar --extract --gzip --file "$TMUX_ARCHIVE" --directory "$RUNNER_TEMP"
60
+ cd "$TMUX_SOURCE"
61
+ ./configure --prefix=/usr/local
62
+ make -j2
63
+ sudo make install
64
+ else
65
+ brew install git tmux
66
+ fi
67
+
68
+ - name: Sync locked environment
69
+ run: uv sync --locked
70
+
71
+ - name: Check required host tool versions
72
+ run: |
73
+ uv run --locked python - <<'PY'
74
+ import asyncio
75
+
76
+ from shikiru.domain.versions import parse_version
77
+ from shikiru.operator.doctor import GIT_MINIMUM_VERSION, TMUX_MINIMUM_VERSION
78
+ from shikiru.process import SubprocessRunner
79
+
80
+ COMMAND_TIMEOUT = 5
81
+ REQUIREMENTS = (
82
+ ("git", "--version", GIT_MINIMUM_VERSION),
83
+ ("tmux", "-V", TMUX_MINIMUM_VERSION),
84
+ )
85
+
86
+ async def check_versions():
87
+ runner = SubprocessRunner()
88
+ for executable, flag, minimum in REQUIREMENTS:
89
+ result = await runner.run(
90
+ (executable, flag), timeout=COMMAND_TIMEOUT, check=True
91
+ )
92
+ version = parse_version(result.stdout)
93
+ if version is None or version < minimum:
94
+ raise SystemExit(f"{executable} must be at least {minimum}")
95
+ print(f"{executable}: {result.stdout.strip()}")
96
+
97
+ asyncio.run(check_versions())
98
+ PY
99
+
100
+ - name: Run quality gate
101
+ run: uv run --locked poe check
102
+
103
+ - name: Build and exercise package distributions
104
+ run: bash scripts/release-readiness-smoke.sh
@@ -0,0 +1,136 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions: {}
8
+
9
+ jobs:
10
+ check:
11
+ name: Check CI passed on the tagged commit
12
+ runs-on: ubuntu-24.04
13
+ timeout-minutes: 10
14
+ permissions:
15
+ contents: read
16
+ actions: read
17
+
18
+ steps:
19
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
20
+ with:
21
+ fetch-depth: 0
22
+ persist-credentials: false
23
+
24
+ - name: Check the tagged commit is on main and CI passed on it
25
+ env:
26
+ GH_TOKEN: ${{ github.token }}
27
+ GH_REPO: ${{ github.repository }}
28
+ run: |
29
+ if ! git merge-base --is-ancestor "$GITHUB_SHA" origin/main; then
30
+ echo "::error::the tag must point at a commit on main" >&2
31
+ exit 1
32
+ fi
33
+ passed="$(gh run list --workflow ci.yml --commit "$GITHUB_SHA" --json conclusion \
34
+ --jq 'any(.[]; .conclusion == "success")')"
35
+ if [[ "$passed" != true ]]; then
36
+ echo "::error::CI has not passed on this commit; wait for it and push the tag again" >&2
37
+ exit 1
38
+ fi
39
+
40
+ build:
41
+ name: Build the distributions
42
+ needs: check
43
+ runs-on: ubuntu-24.04
44
+ timeout-minutes: 15
45
+ env:
46
+ TAG: ${{ github.ref_name }}
47
+ UV_NO_PROGRESS: "true"
48
+
49
+ steps:
50
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
51
+ with:
52
+ fetch-depth: 0
53
+ persist-credentials: false
54
+
55
+ - uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
56
+ with:
57
+ version: "0.12.5"
58
+ python-version: "3.14"
59
+ enable-cache: false
60
+
61
+ - name: Build the distributions
62
+ run: uv build
63
+
64
+ - name: Check the build carries the tag's version
65
+ run: |
66
+ VERSION="${TAG#v}"
67
+ if [[ ! -f "dist/shikiru_cli-$VERSION-py3-none-any.whl" ]]; then
68
+ echo "::error::tag $TAG does not build as shikiru-cli $VERSION" >&2
69
+ exit 1
70
+ fi
71
+
72
+ - name: Upload the distributions
73
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
74
+ with:
75
+ name: dist
76
+ path: dist/
77
+ if-no-files-found: error
78
+
79
+ pypi:
80
+ name: Publish to PyPI
81
+ needs: build
82
+ runs-on: ubuntu-24.04
83
+ timeout-minutes: 10
84
+ environment:
85
+ name: pypi
86
+ permissions:
87
+ id-token: write
88
+
89
+ steps:
90
+ - name: Download the distributions
91
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
92
+ with:
93
+ name: dist
94
+ path: dist/
95
+
96
+ - name: Publish with trusted publishing
97
+ uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
98
+
99
+ github:
100
+ name: Create the GitHub release
101
+ needs: pypi
102
+ runs-on: ubuntu-24.04
103
+ timeout-minutes: 15
104
+ permissions:
105
+ contents: write
106
+ env:
107
+ TAG: ${{ github.ref_name }}
108
+
109
+ steps:
110
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
111
+ with:
112
+ fetch-depth: 0
113
+ persist-credentials: false
114
+
115
+ - name: Download the distributions
116
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
117
+ with:
118
+ name: dist
119
+ path: dist/
120
+
121
+ - name: Write the release notes
122
+ run: |
123
+ python3 scripts/release_notes.py "$TAG" --repo "$GITHUB_REPOSITORY" \
124
+ > "$RUNNER_TEMP/release-notes.md"
125
+
126
+ - name: Create the GitHub release
127
+ env:
128
+ GH_TOKEN: ${{ github.token }}
129
+ run: |
130
+ version="${TAG#v}"
131
+ prerelease=()
132
+ if [[ "${version%%.*}" == "0" ]]; then
133
+ prerelease+=(--prerelease)
134
+ fi
135
+ gh release create "$TAG" dist/* --verify-tag --title "$TAG" \
136
+ --notes-file "$RUNNER_TEMP/release-notes.md" "${prerelease[@]}"
@@ -0,0 +1,14 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ .mypy_cache/
5
+ .ruff_cache/
6
+ .pytest_cache/
7
+ .pytest-timeout/
8
+ .import_linter_cache/
9
+ .coverage
10
+ .coverage.*
11
+ htmlcov/
12
+ dist/
13
+ build/
14
+ *.egg-info/
@@ -0,0 +1 @@
1
+ 3.14
@@ -0,0 +1,11 @@
1
+ # Shikiru — Agent Conventions
2
+
3
+ - **Read first**: `docs/design.md`.
4
+ - **Conventions**: SOLID, KISS, YAGNI. One responsibility per class; pure functions in `domain`; constructor injection; no comments, clear names; docstrings only on public contracts and their implementations. No literals: tunables go in `defaults.toml`, protocol values in named constants. No silent fallbacks, no bare `except`. Build nothing beyond the task.
5
+ - **Tests**: behaviour over implementation. Unit tests only for `domain` rules, models and parsers; integration tests for the rest (real SQLite, git, tmux via `tmux_server`, fake agent). Wait with `wait_until`, time with `FakeClock`, never sleep. No mocks of our own classes, no snapshot spam. Coverage ≥ 80%.
6
+ - **Test value**: test domain rules and invariants, not the framework or data shape — no tests for pydantic features (frozen, extra, defaults), enum or constant listings, trivial wiring, or message/description wording. One table per rule. Integration tests assert observable behaviour at boundaries; coverage beyond the gate is not a goal.
7
+ - **Environment**: In each fresh worktree run `uv sync --locked`. Verify that Python imports and tool entrypoints resolve to this worktree. If a copied `.venv` points elsewhere, recreate it before verification.
8
+ - **Verification**: Match checks to the change. For documentation-only changes, including agent instructions, review the diff and run `git diff --check`; do not run application tests. For code or executable configuration changes, run relevant checks while developing, then `PYTEST_ADDOPTS='--dist=loadfile' uv run poe check` (the local worker count is half the CPU cores unless `SHIKIRU_TEST_CPUS_PER_WORKER` overrides the divisor; CI uses one worker per CPU, so do not pass `-n` locally) on the final changes before the final commit and completion report; it must be green. Repeat the full gate only when subsequent changes invalidate that result.
9
+ - **Execution**: Prefer foreground checks. For background commands, retain their process handle and log path, inspect their exit status, and check existing results when resuming. Do not rely solely on completion notifications or start duplicate checks.
10
+ - **Commits**: Conventional commits, one coherent change each. Separate independent refactorings; keep small supporting refactorings with the behavior they enable. The subject is what the release notes show, so write it for a user: `type(scope): what changed`. A change that breaks behavior, configuration or the schema marks the type with `!` or adds a `BREAKING CHANGE:` line to the body.
11
+
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -0,0 +1,113 @@
1
+ # Contributing to Shikiru
2
+
3
+ Thank you for helping. Before you start:
4
+
5
+ - Open an issue before anything larger than a small fix, so the approach can be agreed first.
6
+ - Read [AGENTS.md](AGENTS.md) and [the design](docs/design.md). Its conventions apply to people as
7
+ well as agents.
8
+ - Commit with [Conventional Commits](https://www.conventionalcommits.org/), one coherent change per
9
+ commit.
10
+ - Before you open a pull request, make sure the quality gate is green. Its result goes in the pull
11
+ request template.
12
+ - CI runs the same gate on Ubuntu and macOS.
13
+
14
+ ## Validate a checkout and a real project
15
+
16
+ ```sh
17
+ uv sync --locked
18
+ PYTEST_ADDOPTS='--dist=loadfile' uv run poe check
19
+ bash scripts/release-readiness-smoke.sh
20
+ ```
21
+
22
+ The quality gate covers formatting, lint, boundaries, types, unused-code checks and behavior tests.
23
+ Real Claude/Codex adapter code is tested offline using recorded protocol output and controlled
24
+ subprocesses: invocation, parsing, resumption, compaction, usage and failures. Engine integration
25
+ uses the fake-agent plugin with real Git, SQLite and private tmux. Live provider contracts and
26
+ real-agent end-to-end scenarios are opt-in and excluded from normal CI.
27
+ The package smoke builds wheel/sdist and exercises an isolated installed package with a fake agent,
28
+ a disposable HOME/repository and private tmux server; it makes no paid provider calls. GitHub CI
29
+ syncs the locked development environment and runs both checks with one test worker per available CPU
30
+ and job timeouts. The isolated installation resolves the built package's declared runtime
31
+ dependencies.
32
+ Automated checks do not establish reliability for every provider or real project.
33
+
34
+ ### Verify real agents
35
+
36
+ These checks use your authenticated agent CLIs and consume real provider usage. Run them locally
37
+ from the Shikiru checkout after `uv sync --locked`, with Git/tmux available and the agents you are
38
+ testing installed, authenticated and permitted to execute the scratch project's commands. Run
39
+ sequentially (`-n 0`); timeouts are not spending or RAM limits.
40
+
41
+ For a configured project's actual role ladders, start with `shikiru doctor --probe` in that project.
42
+ For automated adapter verification, choose model IDs supported by your account first:
43
+
44
+ - Claude contract tests accept `SHIKIRU_CLAUDE_LIVE_MODEL` and
45
+ `SHIKIRU_CLAUDE_LIVE_CHANGE_MODEL` for the initial and model-change checks. Set both to supported
46
+ models; the model-change check skips if no second model is configured.
47
+ - Codex contract tests currently use `_LIVE_MODEL`, `_LIVE_OTHER_MODEL` and `_EFFORT` in
48
+ [their test module](tests/integration/test_codex_headless_contract.py). Review/update those test
49
+ constants for your account; they are separate from project configuration and have no equivalent
50
+ model environment overrides.
51
+
52
+ Enable live checks only for the invocation below. Include just the test file for each agent you
53
+ have configured (both are shown):
54
+
55
+ ```sh
56
+ SHIKIRU_E2E=1 uv run pytest -n 0 --no-cov -k live \
57
+ tests/integration/test_claude_headless_contract.py \
58
+ tests/integration/test_codex_headless_contract.py
59
+ ```
60
+
61
+ These exercise report submission, measured usage, session/model resumption, stop/resume, structured
62
+ Helper answers and context compaction. The compaction check deliberately grows context and can
63
+ consume substantially more usage than a basic report check. Review skips as well as failures.
64
+
65
+ For complete workflow verification, review `REAL_AGENT`, `REAL_MODEL`, `REAL_EFFORT` and
66
+ `REAL_ROLE_LADDERS` in [real_agent_config.py](tests/e2e/real_agent_config.py); these configure all
67
+ roles in disposable fixture repositories, independently of your `.shikiru/config.toml`. Start
68
+ with one completion/integration scenario:
69
+
70
+ ```sh
71
+ SHIKIRU_E2E=1 uv run pytest -n 0 --no-cov \
72
+ tests/e2e/test_real_agents.py::test_real_agents_e1_completes_and_integrates
73
+ ```
74
+
75
+ Then run all six real-agent scenarios:
76
+
77
+ ```sh
78
+ SHIKIRU_E2E=1 uv run pytest -n 0 --no-cov tests/e2e/test_real_agents.py
79
+ ```
80
+
81
+ They cover completion/integration, next-turn Operator messages, planning with dependent parallel
82
+ tasks, MCP decision resolution, restart recovery and takeover/handback. Tests use private tmux
83
+ servers and disposable projects under `~/.cache/shikiru-e2e/`, with cleanup afterwards. Results go
84
+ to `build/e2e/`; failure diagnostics go to `build/e2e/diagnostics/`. The harness has per-attempt and
85
+ one-hour invocation time budgets and can retry an eligible failed scenario once, consuming
86
+ additional usage. Its parallel-work scenarios disable CPU/free-RAM dispatch gates; monitor your
87
+ host and account usage. See [budgets.py](tests/e2e/budgets.py) for the current limits. These paid
88
+ checks are excluded from normal CI and have not been run as part of this cleanup.
89
+
90
+ ### Check your own project
91
+
92
+ For a provider-backed check, clone a committed project into a fresh disposable directory, initialize
93
+ Shikiru, review its ladders and submit one small, reviewable change. While active, detach/reattach,
94
+ exercise a task pause and, where useful, Take over/Hand back; stop/start the engine to inspect
95
+ recovery. Confirm the resulting diff, tests and Git history. Use a model and account you are willing
96
+ to spend usage on; `doctor --probe` is also a live check.
97
+
98
+ ## Releasing
99
+
100
+ A release is the commit tagged `v<version>`; see [the design](docs/design.md#releases-and-deployment).
101
+ Push the tag on a commit of `main` whose CI has passed:
102
+
103
+ ```sh
104
+ git tag v<version> && git push origin v<version>
105
+ ```
106
+
107
+ The Release workflow does the rest. If a run fails, fix the cause on `main` and cut a new tag; a tag
108
+ is not moved.
109
+
110
+ The owner sets up publishing once. On pypi.org, add a pending publisher for the project `shikiru-cli`
111
+ with owner `ferrum-code-dev`, repository `shikiru`, workflow `release.yml` and environment `pypi`. On
112
+ GitHub, create the environment `pypi` in the repository settings. No PyPI token is stored in the
113
+ repository.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ferrum Code
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.