taskops-cli 0.5.3__tar.gz → 0.5.5__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 (295) hide show
  1. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/CHANGELOG.md +51 -15
  2. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/PKG-INFO +1 -1
  3. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/smoke.sh +74 -14
  4. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/_version.py +1 -1
  5. taskops_cli-0.5.5/src/taskops/ui/app.js +61 -0
  6. taskops_cli-0.5.5/ui/smoke/sections/worktree-page-range.tsx +73 -0
  7. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/pages/WorktreeDiff.tsx +25 -7
  8. taskops_cli-0.5.3/src/taskops/ui/app.js +0 -61
  9. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.claude/settings.json +0 -0
  10. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.gitattributes +0 -0
  11. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.github/workflows/ci.yml +0 -0
  12. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.github/workflows/workflow.yml +0 -0
  13. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.gitignore +0 -0
  14. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.mcp.json +0 -0
  15. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/board/cache.sqlite +0 -0
  16. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/board/cache.sqlite-shm +0 -0
  17. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/board/cache.sqlite-wal +0 -0
  18. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/board/events.jsonl +0 -0
  19. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/board/live.sqlite +0 -0
  20. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/board/live.sqlite-shm +0 -0
  21. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/board/live.sqlite-wal +0 -0
  22. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/board.json +0 -0
  23. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/reports/lifecycle-chapter.html +0 -0
  24. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/reports/reports-chapter.html +0 -0
  25. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/.taskops/ui.lock +0 -0
  26. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ARCHITECTURE.md +0 -0
  27. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/CLAUDE.md +0 -0
  28. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/README.md +0 -0
  29. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/pyproject.toml +0 -0
  30. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/__init__.py +0 -0
  31. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/_clock.py +0 -0
  32. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/_errors.py +0 -0
  33. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/_ids.py +0 -0
  34. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/_json.py +0 -0
  35. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/_locate.py +0 -0
  36. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/_wire.py +0 -0
  37. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/board.py +0 -0
  38. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/__init__.py +0 -0
  39. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/__main__.py +0 -0
  40. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/admin.py +0 -0
  41. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/claude.py +0 -0
  42. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/commands.py +0 -0
  43. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/enrol.py +0 -0
  44. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/github.py +0 -0
  45. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/gitremote.py +0 -0
  46. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/grants.py +0 -0
  47. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/hooks.py +0 -0
  48. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/main.py +0 -0
  49. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/operate.py +0 -0
  50. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/paging.py +0 -0
  51. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/parser.py +0 -0
  52. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/pull.py +0 -0
  53. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/push.py +0 -0
  54. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/remote.py +0 -0
  55. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/rm.py +0 -0
  56. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/serving.py +0 -0
  57. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/team.py +0 -0
  58. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/watch.py +0 -0
  59. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/window.py +0 -0
  60. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/cli/wording.py +0 -0
  61. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/__init__.py +0 -0
  62. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/actors.py +0 -0
  63. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/challenge.py +0 -0
  64. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/chapters.py +0 -0
  65. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/event.py +0 -0
  66. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/forge.py +0 -0
  67. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/graph.py +0 -0
  68. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/holding.py +0 -0
  69. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/hours.py +0 -0
  70. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/kinds.py +0 -0
  71. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/machine.py +0 -0
  72. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/mentions.py +0 -0
  73. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/replay.py +0 -0
  74. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/reports.py +0 -0
  75. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/review.py +0 -0
  76. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/scope.py +0 -0
  77. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/seams.py +0 -0
  78. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/core/types.py +0 -0
  79. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/__init__.py +0 -0
  80. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/bare.py +0 -0
  81. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/bind.py +0 -0
  82. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/catchup.py +0 -0
  83. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/claudefiles.py +0 -0
  84. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/diff.py +0 -0
  85. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/install.py +0 -0
  86. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/landing.py +0 -0
  87. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/onward.py +0 -0
  88. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/patch.py +0 -0
  89. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/remote.py +0 -0
  90. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/run.py +0 -0
  91. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/sig.py +0 -0
  92. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/trailer.py +0 -0
  93. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/gitwork/trees.py +0 -0
  94. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/__init__.py +0 -0
  95. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/admin.py +0 -0
  96. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/auth.py +0 -0
  97. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/feed.py +0 -0
  98. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/gitbody.py +0 -0
  99. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/gitdoor.py +0 -0
  100. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/gitpack.py +0 -0
  101. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/grants.py +0 -0
  102. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/handler.py +0 -0
  103. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/ingest.py +0 -0
  104. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/login.py +0 -0
  105. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/members.py +0 -0
  106. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/mounts.py +0 -0
  107. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/page.py +0 -0
  108. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/removal.py +0 -0
  109. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/repos.py +0 -0
  110. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/routes.py +0 -0
  111. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/rpc.py +0 -0
  112. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/scoped.py +0 -0
  113. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/server.py +0 -0
  114. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/stale.py +0 -0
  115. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/static.py +0 -0
  116. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/upstream.py +0 -0
  117. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/http/watcher.py +0 -0
  118. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/identity.py +0 -0
  119. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/__init__.py +0 -0
  120. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/__main__.py +0 -0
  121. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/activity.py +0 -0
  122. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/before.py +0 -0
  123. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/boards.py +0 -0
  124. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/boardview.py +0 -0
  125. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/brief.py +0 -0
  126. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/chapter.py +0 -0
  127. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/dossier.py +0 -0
  128. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/fields.py +0 -0
  129. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/gitmoves.py +0 -0
  130. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/hello.py +0 -0
  131. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/integrate.py +0 -0
  132. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/orders.py +0 -0
  133. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/render.py +0 -0
  134. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/schema.py +0 -0
  135. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/server.py +0 -0
  136. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/thread.py +0 -0
  137. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/mcp/tools.py +0 -0
  138. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/py.typed +0 -0
  139. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/session.py +0 -0
  140. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/__init__.py +0 -0
  141. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/cache.py +0 -0
  142. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/creds.py +0 -0
  143. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/handover.py +0 -0
  144. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/live.py +0 -0
  145. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/log.py +0 -0
  146. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/mirroring.py +0 -0
  147. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/pubkeys.py +0 -0
  148. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/reviews.py +0 -0
  149. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/server.py +0 -0
  150. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/store/stores.py +0 -0
  151. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/ui/index.html +0 -0
  152. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/ui/style.css +0 -0
  153. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/__init__.py +0 -0
  154. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_args.py +0 -0
  155. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_cards.py +0 -0
  156. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_chapter.py +0 -0
  157. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_context.py +0 -0
  158. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_facts.py +0 -0
  159. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_mentions.py +0 -0
  160. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_rows.py +0 -0
  161. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_stories.py +0 -0
  162. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_waiting.py +0 -0
  163. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/_windows.py +0 -0
  164. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/activity.py +0 -0
  165. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/assign.py +0 -0
  166. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/card.py +0 -0
  167. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/events.py +0 -0
  168. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/filed.py +0 -0
  169. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/plan.py +0 -0
  170. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/project.py +0 -0
  171. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/pulse.py +0 -0
  172. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/record.py +0 -0
  173. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/report.py +0 -0
  174. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/review.py +0 -0
  175. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/take.py +0 -0
  176. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/src/taskops/verbs/update.py +0 -0
  177. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/__init__.py +0 -0
  178. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/conftest.py +0 -0
  179. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_architecture.py +0 -0
  180. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_claude.py +0 -0
  181. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_core.py +0 -0
  182. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_git.py +0 -0
  183. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_mcp.py +0 -0
  184. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_mirror.py +0 -0
  185. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_report.py +0 -0
  186. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_store.py +0 -0
  187. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_topology.py +0 -0
  188. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_ui.py +0 -0
  189. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_verbs.py +0 -0
  190. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/test_window.py +0 -0
  191. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/tests/ui_harness.js +0 -0
  192. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/build.mjs +0 -0
  193. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/index.html +0 -0
  194. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/package-lock.json +0 -0
  195. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/package.json +0 -0
  196. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/fixture.json +0 -0
  197. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/main.tsx +0 -0
  198. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/run.mjs +0 -0
  199. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/actors-window-filter.tsx +0 -0
  200. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/actors.tsx +0 -0
  201. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/all-chapters-scope.tsx +0 -0
  202. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/board-columns.tsx +0 -0
  203. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/board-flow-view.tsx +0 -0
  204. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/board-motion-and-avatars.tsx +0 -0
  205. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/board-root-mount.tsx +0 -0
  206. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/card-diff-range.tsx +0 -0
  207. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/chapter-completion-derivation.tsx +0 -0
  208. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/chapter-landed.tsx +0 -0
  209. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/chapter-story-grid.tsx +0 -0
  210. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/chapters-open.tsx +0 -0
  211. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/comment-box.tsx +0 -0
  212. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/comment-toasts-model.tsx +0 -0
  213. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/comment-toasts-stack.tsx +0 -0
  214. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/diff-page.tsx +0 -0
  215. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/dossier.tsx +0 -0
  216. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/event-stream.tsx +0 -0
  217. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/feed-reconnect.tsx +0 -0
  218. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/forge-links.tsx +0 -0
  219. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/forge-opens-the-board.tsx +0 -0
  220. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/git-diff.tsx +0 -0
  221. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/hosted-window.tsx +0 -0
  222. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/monitor-panes.tsx +0 -0
  223. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/overlay-escape.tsx +0 -0
  224. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/report-markdown.tsx +0 -0
  225. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/report-sandbox.tsx +0 -0
  226. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/reviewing-skew.tsx +0 -0
  227. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/section.ts +0 -0
  228. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/swarm-topology.tsx +0 -0
  229. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/thread-closing-note.tsx +0 -0
  230. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections/worktrees-index.tsx +0 -0
  231. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/smoke/sections.mjs +0 -0
  232. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/App.tsx +0 -0
  233. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/client.ts +0 -0
  234. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/completed.ts +0 -0
  235. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/actors/Daysheet.tsx +0 -0
  236. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/actors/DevPanel.tsx +0 -0
  237. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/board/CardTile.tsx +0 -0
  238. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/board/Column.tsx +0 -0
  239. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/board/ViewToggle.tsx +0 -0
  240. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/board/flip.ts +0 -0
  241. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/board/useFlip.ts +0 -0
  242. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/card/CommentBox.tsx +0 -0
  243. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/card/Drawer.tsx +0 -0
  244. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/card/Patch.tsx +0 -0
  245. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/card/Sections.tsx +0 -0
  246. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/card/Thread.tsx +0 -0
  247. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/card/split.ts +0 -0
  248. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/card/tokens.ts +0 -0
  249. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/chrome/AvatarStack.tsx +0 -0
  250. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/chrome/Header.tsx +0 -0
  251. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/chrome/KpiRail.tsx +0 -0
  252. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/chrome/MilestonePicker.tsx +0 -0
  253. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/chrome/TabNav.tsx +0 -0
  254. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/flow/FlowView.tsx +0 -0
  255. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/flow/layout.ts +0 -0
  256. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/Chapter.tsx +0 -0
  257. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/DependencyChain.tsx +0 -0
  258. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/EditSurface.tsx +0 -0
  259. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/EventStream.tsx +0 -0
  260. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/LeaseHealth.tsx +0 -0
  261. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/LiveLeases.tsx +0 -0
  262. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/Mentions.tsx +0 -0
  263. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/Pane.tsx +0 -0
  264. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/Swarm.tsx +0 -0
  265. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/Throughput.tsx +0 -0
  266. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/monitor/panels.ts +0 -0
  267. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/reports/ReportFrame.tsx +0 -0
  268. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/shared/Avatar.tsx +0 -0
  269. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/shared/Markdown.tsx +0 -0
  270. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/shared/Overlay.tsx +0 -0
  271. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/shared/Segmented.tsx +0 -0
  272. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/shared/overlayStack.ts +0 -0
  273. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/story/ChapterStory.tsx +0 -0
  274. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/story/stats.ts +0 -0
  275. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/toasts/ToastStack.tsx +0 -0
  276. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/toasts/model.ts +0 -0
  277. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/components/toasts/useToasts.ts +0 -0
  278. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/format.ts +0 -0
  279. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/hoursWindow.ts +0 -0
  280. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/links.tsx +0 -0
  281. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/main.tsx +0 -0
  282. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/markdown.ts +0 -0
  283. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/pages/Actors.tsx +0 -0
  284. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/pages/Board.tsx +0 -0
  285. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/pages/Monitor.tsx +0 -0
  286. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/pages/Reports.tsx +0 -0
  287. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/pages/Worktrees.tsx +0 -0
  288. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/theme/theme.ts +0 -0
  289. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/theme/tokens.css +0 -0
  290. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/types.ts +0 -0
  291. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/useBoard.ts +0 -0
  292. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/src/useEvents.ts +0 -0
  293. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/styles/index.css +0 -0
  294. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/ui/tsconfig.json +0 -0
  295. {taskops_cli-0.5.3 → taskops_cli-0.5.5}/uv.lock +0 -0
@@ -3,28 +3,64 @@
3
3
  The source of truth for release notes — GitHub Releases are extracted from
4
4
  here, never written twice.
5
5
 
6
- ## 0.5.3 — the Files-changed pane renders for a landed card
6
+ ## 0.5.5 — the Worktrees page renders too (it was never the drawer)
7
+
8
+ The failure reported since 0.5.0 was always on the WORKTREES page, and three
9
+ chapters fixed the card drawer instead — the drawer was verified, declared
10
+ working, and the page nobody had rendered kept asking
11
+ `compare/ms%2F<chapter>...tk-<id>`. Both branches of a landed card are pruned
12
+ when its chapter lands, so on every landed card the page drew a refusal over
13
+ work sitting in the trunk. Verifying a neighbour is not verifying.
14
+
15
+ - **`pages/WorktreeDiff.tsx` takes its range from `links.tsx::cardRange`** — the
16
+ same rule the drawer uses, never a second one that can drift: the card's
17
+ recorded commits, base = the oldest commit's PARENT. A tree with nothing
18
+ recorded keeps the two branch tips, which is right for a live tree whose work
19
+ is not committed yet and where the branch is the only handle there is.
20
+ - **Pinned on the rendered PAGE** (`ui/smoke/sections/worktree-page-range.tsx`),
21
+ read off its `data-range`, with the call-site mutation measured red — the
22
+ previous section pinned the rule one layer below the call site and a call-site
23
+ mutation was green while production stayed broken.
24
+ - **The history that was missing is on the host now**: 91 card branches and 19
25
+ chapter branches, pushed at the tips the board recorded, plus two cards whose
26
+ oldest commit was not an ancestor of their newest (rebased in their day) and
27
+ so needed its own ref. Audited across every card on the board: 87 of 89 render
28
+ a real diff on both surfaces, and the two that do not have no commit recorded
29
+ at all — there is nothing to diff, and their refusal is literally true.
30
+
31
+ ## 0.5.4 — the Files-changed pane renders for a landed card
32
+
33
+ **0.5.3 is withdrawn in all but name.** It carries this release's source fix but
34
+ the PREVIOUS release's committed UI bundle, so a hosted page served by it still
35
+ asks for branch names and the pane stays empty. The cause is worth writing down:
36
+ the version bump, the changelog and the tag were made while the shell was still
37
+ inside a card's worktree after a conflict resolution, so `v0.5.3` points at that
38
+ card's branch — which holds `links.tsx::cardRange` but not the chapter-closing
39
+ rebuild of `src/taskops/ui/app.js`. Every gate passed there, because that tree
40
+ was internally consistent; what was missing was the rest of the chapter. A
41
+ release is cut from the trunk, and the check that catches this is comparing the
42
+ bundle a host SERVES against the one the tag committed — which is now a deploy
43
+ step, not a habit.
7
44
 
8
45
  - **The pane asked for two branch names, and a landed card has neither.**
9
46
  0.5.2 made the HEAD durable — the card's newest recorded sha instead of its
10
- branch — and stopped there. The BASE stayed the chapter's branch name, and
11
- for every card that landed before this host became the board's remote that
12
- branch was pruned on the forge, so the compare refused and the pane was
13
- empty while the commits sat in the trunk. Reported live on tk-bffa26.
47
+ branch — and stopped there. The BASE stayed the chapter's branch name, and for
48
+ every card that landed before this host became the board's remote that branch
49
+ was pruned on the forge, so the compare refused and the pane was empty while
50
+ the commits sat in the trunk. Reported live on tk-bffa26 and tk-c37061.
14
51
  - **The range now comes from the card's own commits, both ends**
15
52
  (`ui/src/links.tsx::cardRange`): one recorded commit goes through the commit
16
53
  door, which already diffs a commit against its first parent; several become
17
54
  `compare/<oldest>^...<newest>`. The base is the oldest commit's PARENT, not
18
- the oldest commit — `git diff` is exclusive of its base, so `<oldest>...<newest>`
19
- answers 200 with that commit's own changes silently missing, which is a pane
20
- that looks complete and is not. No server change was needed: `<sha>^` already
21
- passed the ref shape and resolves through `^{commit}`.
22
- - **Pinned where it broke.** The pane renders the route it asked for, and a
23
- smoke section reads that route off the rendered component — the previous
24
- attempt was pinned one layer below the call site, so a call-site mutation
25
- went green while the pane stayed broken. `smoke.sh` now derives the same
26
- route from the LIVE card payload and asserts the first commit's files are in
27
- the answer.
55
+ the oldest commit — `git diff` is exclusive of its base, so
56
+ `<oldest>...<newest>` answers 200 with that commit's own changes silently
57
+ missing, which is a pane that looks complete and is not. No server change was
58
+ needed: `<sha>^` already passed the ref shape and resolves through `^{commit}`.
59
+ - **Pinned where it broke.** The pane renders the route it asked for and a smoke
60
+ section reads that route off the rendered component — the previous attempt was
61
+ pinned one layer below the call site, so a call-site mutation went green while
62
+ the pane stayed broken. `smoke.sh` derives the same route from the LIVE card
63
+ payload and asserts the first commit's files are in the answer.
28
64
  - **"so them was never pushed here"** — the host's missing-ref refusal had a
29
65
  plural substitution in a subject slot. The number now runs through the whole
30
66
  sentence, and both forms are pinned as bytes.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: taskops-cli
3
- Version: 0.5.3
3
+ Version: 0.5.5
4
4
  Summary: A shared work board for teams of coding agents, with a human who decides.
5
5
  Project-URL: Repository, https://github.com/bernatch22/taskops
6
6
  License-Expression: MIT
@@ -15,7 +15,7 @@
15
15
  # (`tests/test_topology.py`), against a host it created.
16
16
  #
17
17
  # sh smoke.sh # the author's host, defaults below
18
- # sh smoke.sh <host> <public-board> <private-board> <card-branch> <landed-branch>
18
+ # sh smoke.sh <host> <public-board> <private-board> <card-branch> <landed-card> <reported-card>
19
19
  #
20
20
  # Every assertion is here because it FAILED once, in production, against a real
21
21
  # reader — the comment above each one says which report it comes from. Nothing
@@ -37,6 +37,10 @@ BRANCH=${4:-tk-32d2ba}
37
37
  # the fault that turned the pull mirror inside out (§16, 2026-08-31). The host
38
38
  # holds the history now and never prunes, so this ref must answer forever.
39
39
  LANDED=${5:-tk-dfaff7}
40
+ # The card the Files-changed pane was reported blank on (2026-08-31): two
41
+ # recorded commits, so it exercises the RANGE arm of the rule below, not the
42
+ # single-commit door.
43
+ REPORTED=${6:-tk-bffa26}
40
44
 
41
45
  BASE="https://$HOST"
42
46
  C="curl -sS -m 15"
@@ -228,18 +232,74 @@ code=$(printf %s "$got" | sed -n '1s/[^ ]* \([0-9][0-9]*\).*/\1/p')
228
232
  "HTTP $code — a private board is not world-clonable"
229
233
  pass "GET /$PRIVATE/repo.git upload-pack (anonymous)" "HTTP 401"
230
234
 
231
- # ── (h) a LANDED card still renders its diff ─────────────────────────────────
232
- # Reported 2026-08-31 against the pull mirror, and the reason this chapter
233
- # exists: `tk-dfaff7`'s branch was pruned on the forge when its chapter landed,
234
- # so the board — whose git was a --mirror of the forge — lost the diff of work
235
- # that is intact in the trunk. The host holds the history now and refuses ref
236
- # deletions, so this URL must answer for the life of the board.
237
- head_ln "a card whose branch was pruned on the forge"
238
- body=$($C "$BASE/$BOARD/api/git/commit/$LANDED") || fail "GET git/commit/$LANDED" "no answer"
239
- case $body in
240
- *'"patch"'*) pass "GET /$BOARD/api/git/commit/$LANDED" \
241
- "a diff ($(printf %s "$body" | wc -c | tr -d ' ') bytes)" ;;
242
- *) fail "GET git/commit/$LANDED" "no diff: $(printf %s "$body" | head -c 300)" ;;
243
- esac
235
+ # ── (h) the Files-changed pane's OWN range, for the two reported cards ───────
236
+ # This section REPLACES the one that asked `git/commit/<the landed card's branch
237
+ # name>` (written 2026-08-30 for the pull mirror). That assertion is not
238
+ # recoverable and must not come back: `tk-dfaff7`'s branch was pruned on the
239
+ # forge before this host became the board's remote, so the ref was never pushed
240
+ # here and the host — which prunes nothing — has nothing to serve under that
241
+ # name. Asking a landed card for its BRANCH was the fault itself, in the smoke
242
+ # as much as in the pane.
243
+ # Reported 2026-08-31 on tk-bffa26: the pane asked
244
+ # compare(base=ms/promotion-survives-its-own-confi, head=tk-bffa26) and the
245
+ # milestone branch does not exist on the host — pruned before the host became
246
+ # the remote — so a landed card showed nothing while its diff sat right there
247
+ # (proven on tk-dfaff7, whose recorded commit answers 45898 bytes through the
248
+ # commit door). This chapter moved the pane onto the card's OWN recorded
249
+ # commits, so the assertion has to ask what the pane asks and derive it the same
250
+ # way, or it would go green against a broken pane.
251
+ #
252
+ # `links.tsx::cardRange` is the rule, verbatim: no sha → nothing to assert; ONE
253
+ # recorded commit → `git/commit/<sha>`, which the door already diffs against its
254
+ # first parent; SEVERAL → `git/compare/<oldest>^...<newest>`, the base being the
255
+ # OLDEST commit's PARENT because git diff excludes its base. `gitRoute`
256
+ # percent-encodes each ref (`^` → %5E) and leaves `...` literal, since the
257
+ # separator is the route's grammar and not part of either ref.
258
+ #
259
+ # python3 reads the shas and nothing else does the arithmetic: the payload
260
+ # carries `sha` in more places than `commits` (the history and the merge record
261
+ # among them), so a grep over the whole body picks the wrong first and last ref
262
+ # and would pass on a range no pane ever asks for.
263
+ head_ln "the pane's own range, for both reported cards"
264
+ for card in "$LANDED" "$REPORTED"; do
265
+ payload=$($C -X POST "$BASE/$BOARD/api/rpc" -H 'Content-Type: application/json' \
266
+ -d "{\"verb\": \"card\", \"args\": {\"task\": \"$card\"}}") \
267
+ || fail "POST card $card" "no answer"
268
+ # route on the first line, the first commit's own files on the rest — one read
269
+ # of the payload, and the same read the pane does.
270
+ asked=$(printf %s "$payload" | python3 -c '
271
+ import json, sys, urllib.parse
272
+ data = json.load(sys.stdin).get("data") or {}
273
+ shas = [c["sha"] for c in (data.get("commits") or []) if isinstance(c.get("sha"), str) and c["sha"]]
274
+ if not shas:
275
+ sys.exit("no recorded commit")
276
+ q = urllib.parse.quote
277
+ route = ("git/commit/" + q(shas[-1], safe="") if len(shas) == 1
278
+ else "git/compare/" + q(shas[0] + "^", safe="") + "..." + q(shas[-1], safe=""))
279
+ print(route)
280
+ for name in (data["commits"][0].get("files") or []):
281
+ print(name)
282
+ ') || fail "card $card" "could not derive the pane's range"
283
+ route=$(printf %s "$asked" | sed -n 1p)
284
+ body=$($C "$BASE/$BOARD/api/$route") || fail "GET $route" "no answer ($card)"
285
+ case $body in
286
+ *'"patch": "diff'*|*'"patch":"diff'*)
287
+ pass "GET /$BOARD/api/$route" \
288
+ "$card renders ($(printf %s "$body" | wc -c | tr -d ' ') bytes)" ;;
289
+ *) fail "GET $route" "$card: no patch: $(printf %s "$body" | head -c 300)" ;;
290
+ esac
291
+ # THE dropped-base assertion: with the base at the newest commit (or at a
292
+ # branch tip) the answer is still a patch — it is just the wrong one. Only the
293
+ # FIRST commit's own files prove the range reaches back to where it started.
294
+ printf '%s\n' "$asked" | sed -n '2,$p' | while read -r name; do
295
+ [ -n "$name" ] || continue
296
+ case $body in
297
+ *"\"$name\""*) : ;;
298
+ *) fail "GET $route" "$card: $name — the first commit's file is missing from stat: the base was dropped" ;;
299
+ esac
300
+ done || exit 1
301
+ pass "the first commit's files are in stat" \
302
+ "$card: $(printf '%s\n' "$asked" | sed -n '2,$p' | wc -l | tr -d ' ') file(s) from $(printf %s "$asked" | sed -n 2p)"
303
+ done
244
304
 
245
305
  printf '\nall green — %s, board %s\n' "$HOST" "$BOARD"
@@ -1,4 +1,4 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  __title__ = "taskops"
4
- __version__ = "0.5.3" # single source of truth; pyproject reads it dynamically
4
+ __version__ = "0.5.5" # single source of truth; pyproject reads it dynamically