shiptrail 0.1.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 (382) hide show
  1. shiptrail-0.1.0/.gitattributes +4 -0
  2. shiptrail-0.1.0/.github/workflows/baselines.yml +34 -0
  3. shiptrail-0.1.0/.github/workflows/ci.yml +117 -0
  4. shiptrail-0.1.0/.github/workflows/dashboard.yml +49 -0
  5. shiptrail-0.1.0/.github/workflows/release.yml +75 -0
  6. shiptrail-0.1.0/.gitignore +17 -0
  7. shiptrail-0.1.0/AGENTS.md +26 -0
  8. shiptrail-0.1.0/CHANGELOG.md +17 -0
  9. shiptrail-0.1.0/LICENSE +21 -0
  10. shiptrail-0.1.0/PKG-INFO +201 -0
  11. shiptrail-0.1.0/README.md +187 -0
  12. shiptrail-0.1.0/install.py +58 -0
  13. shiptrail-0.1.0/pyproject.toml +63 -0
  14. shiptrail-0.1.0/shiptrail/backlog.md +3 -0
  15. shiptrail-0.1.0/shiptrail/config.json +113 -0
  16. shiptrail-0.1.0/src/shiptrail/__init__.py +8 -0
  17. shiptrail-0.1.0/src/shiptrail/api/__init__.py +1 -0
  18. shiptrail-0.1.0/src/shiptrail/api/app.py +506 -0
  19. shiptrail-0.1.0/src/shiptrail/api/streams.py +138 -0
  20. shiptrail-0.1.0/src/shiptrail/cli.py +425 -0
  21. shiptrail-0.1.0/src/shiptrail/dashboard_dist/THIRD_PARTY_NOTICES.txt +6511 -0
  22. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  23. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  24. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  25. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  26. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  27. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  28. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  29. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  30. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  31. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  32. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  33. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  34. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  35. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  36. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  37. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  38. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  39. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  40. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  41. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  42. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
  43. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
  44. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
  45. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
  46. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
  47. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
  48. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
  49. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
  50. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
  51. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
  52. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
  53. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
  54. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
  55. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
  56. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
  57. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
  58. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
  59. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
  60. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  61. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  62. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  63. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  64. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  65. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  66. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
  67. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
  68. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
  69. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
  70. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
  71. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
  72. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
  73. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
  74. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
  75. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
  76. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
  77. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
  78. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/index-CFxUIJrK.css +1 -0
  79. shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/index-jGh4BLlJ.js +202 -0
  80. shiptrail-0.1.0/src/shiptrail/dashboard_dist/index.html +13 -0
  81. shiptrail-0.1.0/src/shiptrail/engine/__init__.py +1 -0
  82. shiptrail-0.1.0/src/shiptrail/engine/activity.py +36 -0
  83. shiptrail-0.1.0/src/shiptrail/engine/adapters/__init__.py +15 -0
  84. shiptrail-0.1.0/src/shiptrail/engine/adapters/base.py +110 -0
  85. shiptrail-0.1.0/src/shiptrail/engine/adapters/codex.py +295 -0
  86. shiptrail-0.1.0/src/shiptrail/engine/adapters/opencode.py +322 -0
  87. shiptrail-0.1.0/src/shiptrail/engine/backlog.py +182 -0
  88. shiptrail-0.1.0/src/shiptrail/engine/catalog.py +145 -0
  89. shiptrail-0.1.0/src/shiptrail/engine/changes.py +139 -0
  90. shiptrail-0.1.0/src/shiptrail/engine/config.py +388 -0
  91. shiptrail-0.1.0/src/shiptrail/engine/crash.py +11 -0
  92. shiptrail-0.1.0/src/shiptrail/engine/db.py +97 -0
  93. shiptrail-0.1.0/src/shiptrail/engine/gitops.py +312 -0
  94. shiptrail-0.1.0/src/shiptrail/engine/library.py +83 -0
  95. shiptrail-0.1.0/src/shiptrail/engine/locking.py +50 -0
  96. shiptrail-0.1.0/src/shiptrail/engine/migrations/machine/0001_init.sql +15 -0
  97. shiptrail-0.1.0/src/shiptrail/engine/migrations/repo/0001_init.sql +89 -0
  98. shiptrail-0.1.0/src/shiptrail/engine/packet.py +307 -0
  99. shiptrail-0.1.0/src/shiptrail/engine/pipeline.py +516 -0
  100. shiptrail-0.1.0/src/shiptrail/engine/ports.py +154 -0
  101. shiptrail-0.1.0/src/shiptrail/engine/registry.py +87 -0
  102. shiptrail-0.1.0/src/shiptrail/engine/reports.py +98 -0
  103. shiptrail-0.1.0/src/shiptrail/engine/roles.py +210 -0
  104. shiptrail-0.1.0/src/shiptrail/engine/runtime.py +600 -0
  105. shiptrail-0.1.0/src/shiptrail/engine/scaffold.py +449 -0
  106. shiptrail-0.1.0/src/shiptrail/engine/scheduler.py +228 -0
  107. shiptrail-0.1.0/src/shiptrail/engine/supervisor.py +837 -0
  108. shiptrail-0.1.0/src/shiptrail/engine/usage.py +52 -0
  109. shiptrail-0.1.0/src/shiptrail/engine/versioning.py +106 -0
  110. shiptrail-0.1.0/src/shiptrail/engine/winjob.py +197 -0
  111. shiptrail-0.1.0/src/shiptrail/paths.py +30 -0
  112. shiptrail-0.1.0/src/shiptrail/roles/README.md +22 -0
  113. shiptrail-0.1.0/src/shiptrail/roles/approver.md +56 -0
  114. shiptrail-0.1.0/src/shiptrail/roles/builder.md +85 -0
  115. shiptrail-0.1.0/src/shiptrail/roles/fast-approver.md +64 -0
  116. shiptrail-0.1.0/src/shiptrail/roles/reviewer-code.md +53 -0
  117. shiptrail-0.1.0/src/shiptrail/roles/reviewer-security.md +52 -0
  118. shiptrail-0.1.0/src/shiptrail/roles/reviewer-ui.md +59 -0
  119. shiptrail-0.1.0/src/shiptrail/roles/reviewer-ux.md +60 -0
  120. shiptrail-0.1.0/src/shiptrail/roles/spec-writer.md +65 -0
  121. shiptrail-0.1.0/src/shiptrail/run_cli.py +355 -0
  122. shiptrail-0.1.0/src/shiptrail/service.py +262 -0
  123. shiptrail-0.1.0/src/shiptrail/templates/AGENTS.starter.md +26 -0
  124. shiptrail-0.1.0/src/shiptrail/templates/SKILL.claude.md +23 -0
  125. shiptrail-0.1.0/src/shiptrail/templates/SKILL.codex.md +23 -0
  126. shiptrail-0.1.0/src/shiptrail/templates/SKILL.opencode.md +23 -0
  127. shiptrail-0.1.0/src/shiptrail/templates/backlog.md +3 -0
  128. shiptrail-0.1.0/src/shiptrail/templates/config.json +209 -0
  129. shiptrail-0.1.0/tests/engine_harness.py +256 -0
  130. shiptrail-0.1.0/tests/fake_cli.py +187 -0
  131. shiptrail-0.1.0/tests/fixtures/bench-job.json +16 -0
  132. shiptrail-0.1.0/tests/fixtures/claude/README.md +12 -0
  133. shiptrail-0.1.0/tests/fixtures/claude/auth.jsonl +3 -0
  134. shiptrail-0.1.0/tests/fixtures/claude/auth.meta.json +26 -0
  135. shiptrail-0.1.0/tests/fixtures/claude/auth.stderr +0 -0
  136. shiptrail-0.1.0/tests/fixtures/claude/cache1.jsonl +4 -0
  137. shiptrail-0.1.0/tests/fixtures/claude/cache1.meta.json +27 -0
  138. shiptrail-0.1.0/tests/fixtures/claude/cache1.stderr +0 -0
  139. shiptrail-0.1.0/tests/fixtures/claude/cache2.jsonl +4 -0
  140. shiptrail-0.1.0/tests/fixtures/claude/cache2.meta.json +27 -0
  141. shiptrail-0.1.0/tests/fixtures/claude/cache2.stderr +0 -0
  142. shiptrail-0.1.0/tests/fixtures/claude/denial.jsonl +9 -0
  143. shiptrail-0.1.0/tests/fixtures/claude/denial.meta.json +27 -0
  144. shiptrail-0.1.0/tests/fixtures/claude/denial.stderr +0 -0
  145. shiptrail-0.1.0/tests/fixtures/claude/kill.jsonl +4 -0
  146. shiptrail-0.1.0/tests/fixtures/claude/kill.meta.json +27 -0
  147. shiptrail-0.1.0/tests/fixtures/claude/kill.stderr +0 -0
  148. shiptrail-0.1.0/tests/fixtures/claude/long.jsonl +4 -0
  149. shiptrail-0.1.0/tests/fixtures/claude/long.meta.json +25 -0
  150. shiptrail-0.1.0/tests/fixtures/claude/long.stderr +0 -0
  151. shiptrail-0.1.0/tests/fixtures/claude/resume.jsonl +4 -0
  152. shiptrail-0.1.0/tests/fixtures/claude/resume.meta.json +27 -0
  153. shiptrail-0.1.0/tests/fixtures/claude/resume.stderr +0 -0
  154. shiptrail-0.1.0/tests/fixtures/claude/success.jsonl +4 -0
  155. shiptrail-0.1.0/tests/fixtures/claude/success.meta.json +25 -0
  156. shiptrail-0.1.0/tests/fixtures/claude/success.stderr +0 -0
  157. shiptrail-0.1.0/tests/fixtures/codex/README.md +17 -0
  158. shiptrail-0.1.0/tests/fixtures/codex/auth.jsonl +14 -0
  159. shiptrail-0.1.0/tests/fixtures/codex/auth.meta.json +23 -0
  160. shiptrail-0.1.0/tests/fixtures/codex/auth.stderr +8 -0
  161. shiptrail-0.1.0/tests/fixtures/codex/cache-short1.jsonl +4 -0
  162. shiptrail-0.1.0/tests/fixtures/codex/cache-short1.meta.json +26 -0
  163. shiptrail-0.1.0/tests/fixtures/codex/cache-short1.stderr +0 -0
  164. shiptrail-0.1.0/tests/fixtures/codex/cache-short2.jsonl +4 -0
  165. shiptrail-0.1.0/tests/fixtures/codex/cache-short2.meta.json +26 -0
  166. shiptrail-0.1.0/tests/fixtures/codex/cache-short2.stderr +0 -0
  167. shiptrail-0.1.0/tests/fixtures/codex/cache1.jsonl +0 -0
  168. shiptrail-0.1.0/tests/fixtures/codex/cache1.meta.json +24 -0
  169. shiptrail-0.1.0/tests/fixtures/codex/cache1.stderr +1 -0
  170. shiptrail-0.1.0/tests/fixtures/codex/cache2.jsonl +0 -0
  171. shiptrail-0.1.0/tests/fixtures/codex/cache2.meta.json +24 -0
  172. shiptrail-0.1.0/tests/fixtures/codex/cache2.stderr +1 -0
  173. shiptrail-0.1.0/tests/fixtures/codex/denial-escalated.jsonl +6 -0
  174. shiptrail-0.1.0/tests/fixtures/codex/denial-escalated.meta.json +26 -0
  175. shiptrail-0.1.0/tests/fixtures/codex/denial-escalated.stderr +0 -0
  176. shiptrail-0.1.0/tests/fixtures/codex/denial-home.jsonl +4 -0
  177. shiptrail-0.1.0/tests/fixtures/codex/denial-home.meta.json +26 -0
  178. shiptrail-0.1.0/tests/fixtures/codex/denial-home.stderr +1 -0
  179. shiptrail-0.1.0/tests/fixtures/codex/denial-trusted.jsonl +7 -0
  180. shiptrail-0.1.0/tests/fixtures/codex/denial-trusted.meta.json +26 -0
  181. shiptrail-0.1.0/tests/fixtures/codex/denial-trusted.stderr +0 -0
  182. shiptrail-0.1.0/tests/fixtures/codex/denial.jsonl +7 -0
  183. shiptrail-0.1.0/tests/fixtures/codex/denial.meta.json +21 -0
  184. shiptrail-0.1.0/tests/fixtures/codex/denial.stderr +0 -0
  185. shiptrail-0.1.0/tests/fixtures/codex/developer.jsonl +4 -0
  186. shiptrail-0.1.0/tests/fixtures/codex/developer.meta.json +24 -0
  187. shiptrail-0.1.0/tests/fixtures/codex/developer.stderr +0 -0
  188. shiptrail-0.1.0/tests/fixtures/codex/long.jsonl +6 -0
  189. shiptrail-0.1.0/tests/fixtures/codex/long.meta.json +22 -0
  190. shiptrail-0.1.0/tests/fixtures/codex/long.stderr +0 -0
  191. shiptrail-0.1.0/tests/fixtures/codex/prepend.jsonl +4 -0
  192. shiptrail-0.1.0/tests/fixtures/codex/prepend.meta.json +22 -0
  193. shiptrail-0.1.0/tests/fixtures/codex/prepend.stderr +0 -0
  194. shiptrail-0.1.0/tests/fixtures/codex/success.jsonl +4 -0
  195. shiptrail-0.1.0/tests/fixtures/codex/success.meta.json +22 -0
  196. shiptrail-0.1.0/tests/fixtures/codex/success.stderr +0 -0
  197. shiptrail-0.1.0/tests/fixtures/codex/system.jsonl +0 -0
  198. shiptrail-0.1.0/tests/fixtures/codex/system.meta.json +25 -0
  199. shiptrail-0.1.0/tests/fixtures/codex/system.stderr +1 -0
  200. shiptrail-0.1.0/tests/fixtures/opencode/README.md +55 -0
  201. shiptrail-0.1.0/tests/fixtures/opencode/deny.jsonl +5 -0
  202. shiptrail-0.1.0/tests/fixtures/opencode/deny.meta.json +19 -0
  203. shiptrail-0.1.0/tests/fixtures/opencode/deny.stderr +0 -0
  204. shiptrail-0.1.0/tests/fixtures/opencode/error-model.jsonl +1 -0
  205. shiptrail-0.1.0/tests/fixtures/opencode/error-model.meta.json +19 -0
  206. shiptrail-0.1.0/tests/fixtures/opencode/error-model.stderr +0 -0
  207. shiptrail-0.1.0/tests/fixtures/opencode/error-variant.jsonl +1 -0
  208. shiptrail-0.1.0/tests/fixtures/opencode/error-variant.meta.json +19 -0
  209. shiptrail-0.1.0/tests/fixtures/opencode/error-variant.stderr +0 -0
  210. shiptrail-0.1.0/tests/fixtures/opencode/resume.jsonl +1 -0
  211. shiptrail-0.1.0/tests/fixtures/opencode/resume.meta.json +23 -0
  212. shiptrail-0.1.0/tests/fixtures/opencode/resume.stderr +0 -0
  213. shiptrail-0.1.0/tests/fixtures/opencode/shell.jsonl +5 -0
  214. shiptrail-0.1.0/tests/fixtures/opencode/shell.meta.json +21 -0
  215. shiptrail-0.1.0/tests/fixtures/opencode/shell.stderr +0 -0
  216. shiptrail-0.1.0/tests/fixtures/opencode/text.jsonl +1 -0
  217. shiptrail-0.1.0/tests/fixtures/opencode/text.meta.json +21 -0
  218. shiptrail-0.1.0/tests/fixtures/opencode/text.stderr +0 -0
  219. shiptrail-0.1.0/tests/fixtures/opencode/tool.jsonl +6 -0
  220. shiptrail-0.1.0/tests/fixtures/opencode/tool.meta.json +21 -0
  221. shiptrail-0.1.0/tests/fixtures/opencode/tool.stderr +0 -0
  222. shiptrail-0.1.0/tests/fixtures/opencode/write.jsonl +5 -0
  223. shiptrail-0.1.0/tests/fixtures/opencode/write.meta.json +19 -0
  224. shiptrail-0.1.0/tests/fixtures/opencode/write.stderr +0 -0
  225. shiptrail-0.1.0/tests/test_catalog.py +166 -0
  226. shiptrail-0.1.0/tests/test_engine_api.py +924 -0
  227. shiptrail-0.1.0/tests/test_engine_codex_adapter.py +533 -0
  228. shiptrail-0.1.0/tests/test_engine_config.py +417 -0
  229. shiptrail-0.1.0/tests/test_engine_db.py +124 -0
  230. shiptrail-0.1.0/tests/test_engine_gitops.py +419 -0
  231. shiptrail-0.1.0/tests/test_engine_opencode_adapter.py +515 -0
  232. shiptrail-0.1.0/tests/test_engine_packet.py +321 -0
  233. shiptrail-0.1.0/tests/test_engine_pipeline.py +687 -0
  234. shiptrail-0.1.0/tests/test_engine_ports.py +588 -0
  235. shiptrail-0.1.0/tests/test_engine_reports.py +104 -0
  236. shiptrail-0.1.0/tests/test_engine_roles.py +219 -0
  237. shiptrail-0.1.0/tests/test_engine_streams.py +233 -0
  238. shiptrail-0.1.0/tests/test_engine_supervisor.py +725 -0
  239. shiptrail-0.1.0/tests/test_engine_upgrade.py +72 -0
  240. shiptrail-0.1.0/tests/test_engine_usage.py +63 -0
  241. shiptrail-0.1.0/tests/test_init_providers.py +213 -0
  242. shiptrail-0.1.0/tests/test_install.py +47 -0
  243. shiptrail-0.1.0/tests/test_library.py +62 -0
  244. shiptrail-0.1.0/tests/test_registry.py +134 -0
  245. shiptrail-0.1.0/tests/test_release_pipeline.py +110 -0
  246. shiptrail-0.1.0/tests/test_run_cli.py +459 -0
  247. shiptrail-0.1.0/tests/test_sandbox_bench.py +121 -0
  248. shiptrail-0.1.0/tests/test_sandbox_engine.py +128 -0
  249. shiptrail-0.1.0/tools/release_artifacts.py +64 -0
  250. shiptrail-0.1.0/tools/release_fake_cli.py +55 -0
  251. shiptrail-0.1.0/tools/release_smoke.py +191 -0
  252. shiptrail-0.1.0/tools/sandbox-fixture/CLAUDE.md +37 -0
  253. shiptrail-0.1.0/tools/sandbox-fixture/index.html +23 -0
  254. shiptrail-0.1.0/tools/sandbox-fixture/package.json +1 -0
  255. shiptrail-0.1.0/tools/sandbox-fixture/src/app.js +57 -0
  256. shiptrail-0.1.0/tools/sandbox-fixture/src/style.css +43 -0
  257. shiptrail-0.1.0/tools/sandbox-fixture/src/todos.js +17 -0
  258. shiptrail-0.1.0/tools/sandbox-fixture/test/todos.test.js +24 -0
  259. shiptrail-0.1.0/tools/sandbox.py +724 -0
  260. shiptrail-0.1.0/tools/upgrade_smoke.py +187 -0
  261. shiptrail-0.1.0/uv.lock +562 -0
  262. shiptrail-0.1.0/web/components.json +23 -0
  263. shiptrail-0.1.0/web/e2e/README.md +34 -0
  264. shiptrail-0.1.0/web/e2e/baselines/linux/board.png +0 -0
  265. shiptrail-0.1.0/web/e2e/baselines/linux/job-detail.png +0 -0
  266. shiptrail-0.1.0/web/e2e/baselines/linux/overview.png +0 -0
  267. shiptrail-0.1.0/web/e2e/baselines/linux/pipeline.png +0 -0
  268. shiptrail-0.1.0/web/e2e/baselines/win32/board.png +0 -0
  269. shiptrail-0.1.0/web/e2e/baselines/win32/job-detail.png +0 -0
  270. shiptrail-0.1.0/web/e2e/baselines/win32/overview.png +0 -0
  271. shiptrail-0.1.0/web/e2e/baselines/win32/pipeline.png +0 -0
  272. shiptrail-0.1.0/web/e2e/dashboard.spec.ts +355 -0
  273. shiptrail-0.1.0/web/e2e/fixtures.ts +87 -0
  274. shiptrail-0.1.0/web/e2e/screenshot.css +14 -0
  275. shiptrail-0.1.0/web/e2e_server.py +74 -0
  276. shiptrail-0.1.0/web/eslint.config.mjs +38 -0
  277. shiptrail-0.1.0/web/index.html +12 -0
  278. shiptrail-0.1.0/web/licenses/README.md +18 -0
  279. shiptrail-0.1.0/web/licenses/headless-tree.txt +21 -0
  280. shiptrail-0.1.0/web/licenses/react-remove-scroll-bar.txt +21 -0
  281. shiptrail-0.1.0/web/licenses/shadcn-ui.txt +21 -0
  282. shiptrail-0.1.0/web/licenses/victory-vendor.txt +30 -0
  283. shiptrail-0.1.0/web/package-lock.json +7803 -0
  284. shiptrail-0.1.0/web/package.json +64 -0
  285. shiptrail-0.1.0/web/playwright.config.ts +22 -0
  286. shiptrail-0.1.0/web/prettier.config.mjs +22 -0
  287. shiptrail-0.1.0/web/scripts/dev-proxy.ts +48 -0
  288. shiptrail-0.1.0/web/scripts/notices.mjs +56 -0
  289. shiptrail-0.1.0/web/src/App.tsx +8 -0
  290. shiptrail-0.1.0/web/src/factory.css +34 -0
  291. shiptrail-0.1.0/web/src/features/activity/ActivityLog.tsx +163 -0
  292. shiptrail-0.1.0/web/src/features/backlog/Backlog.tsx +340 -0
  293. shiptrail-0.1.0/web/src/features/backlog/BacklogKanban.tsx +124 -0
  294. shiptrail-0.1.0/web/src/features/backlog/model.ts +68 -0
  295. shiptrail-0.1.0/web/src/features/board/ActivityLine.tsx +42 -0
  296. shiptrail-0.1.0/web/src/features/board/Board.tsx +70 -0
  297. shiptrail-0.1.0/web/src/features/board/CompactPipeline.tsx +36 -0
  298. shiptrail-0.1.0/web/src/features/board/FactorySummary.tsx +56 -0
  299. shiptrail-0.1.0/web/src/features/board/JobCard.tsx +83 -0
  300. shiptrail-0.1.0/web/src/features/board/StartFeature.tsx +59 -0
  301. shiptrail-0.1.0/web/src/features/board/board.test.tsx +407 -0
  302. shiptrail-0.1.0/web/src/features/board/model.test.ts +27 -0
  303. shiptrail-0.1.0/web/src/features/board/model.ts +197 -0
  304. shiptrail-0.1.0/web/src/features/job/ChangesView.tsx +136 -0
  305. shiptrail-0.1.0/web/src/features/job/JobDetail.tsx +393 -0
  306. shiptrail-0.1.0/web/src/features/job/JobHeader.tsx +57 -0
  307. shiptrail-0.1.0/web/src/features/job/LogView.tsx +301 -0
  308. shiptrail-0.1.0/web/src/features/job/PauseBanner.tsx +95 -0
  309. shiptrail-0.1.0/web/src/features/job/ReportView.test.tsx +66 -0
  310. shiptrail-0.1.0/web/src/features/job/ReportView.tsx +58 -0
  311. shiptrail-0.1.0/web/src/features/job/ReviewerCards.tsx +74 -0
  312. shiptrail-0.1.0/web/src/features/job/StageDetails.tsx +67 -0
  313. shiptrail-0.1.0/web/src/features/job/Timeline.tsx +35 -0
  314. shiptrail-0.1.0/web/src/features/job/UsagePanel.tsx +40 -0
  315. shiptrail-0.1.0/web/src/features/job/intervention.ts +169 -0
  316. shiptrail-0.1.0/web/src/features/job/log-lines.ts +66 -0
  317. shiptrail-0.1.0/web/src/features/job/pipeline/GroupFrame.tsx +11 -0
  318. shiptrail-0.1.0/web/src/features/job/pipeline/PipelineEdge.tsx +36 -0
  319. shiptrail-0.1.0/web/src/features/job/pipeline/PipelineNode.tsx +95 -0
  320. shiptrail-0.1.0/web/src/features/job/pipeline/PipelineView.test.tsx +106 -0
  321. shiptrail-0.1.0/web/src/features/job/pipeline/PipelineView.tsx +117 -0
  322. shiptrail-0.1.0/web/src/features/job/pipeline/layout.test.ts +50 -0
  323. shiptrail-0.1.0/web/src/features/job/pipeline/layout.ts +125 -0
  324. shiptrail-0.1.0/web/src/features/job/report-url.ts +5 -0
  325. shiptrail-0.1.0/web/src/features/job/use-log-entries.ts +93 -0
  326. shiptrail-0.1.0/web/src/features/job/use-now.ts +13 -0
  327. shiptrail-0.1.0/web/src/features/jobs/JobsList.tsx +134 -0
  328. shiptrail-0.1.0/web/src/features/overview/Overview.tsx +264 -0
  329. shiptrail-0.1.0/web/src/features/overview/model.test.ts +27 -0
  330. shiptrail-0.1.0/web/src/features/overview/model.ts +88 -0
  331. shiptrail-0.1.0/web/src/features/pipelines/PipelinesPage.tsx +167 -0
  332. shiptrail-0.1.0/web/src/features/repositories/RepositoriesPage.tsx +60 -0
  333. shiptrail-0.1.0/web/src/features/settings/ChoiceSelect.tsx +65 -0
  334. shiptrail-0.1.0/web/src/features/settings/DirtyGuard.tsx +22 -0
  335. shiptrail-0.1.0/web/src/features/settings/MachineSettings.tsx +92 -0
  336. shiptrail-0.1.0/web/src/features/settings/PipelineEditor.tsx +416 -0
  337. shiptrail-0.1.0/web/src/features/settings/PipelineManager.tsx +158 -0
  338. shiptrail-0.1.0/web/src/features/settings/PipelineSettingsForm.tsx +265 -0
  339. shiptrail-0.1.0/web/src/features/settings/RepoSettings.tsx +33 -0
  340. shiptrail-0.1.0/web/src/features/settings/model.test.tsx +394 -0
  341. shiptrail-0.1.0/web/src/features/settings/model.ts +361 -0
  342. shiptrail-0.1.0/web/src/features/settings/providers.test.ts +70 -0
  343. shiptrail-0.1.0/web/src/features/settings/providers.ts +72 -0
  344. shiptrail-0.1.0/web/src/features/usage/UsagePage.tsx +247 -0
  345. shiptrail-0.1.0/web/src/lib/api.ts +546 -0
  346. shiptrail-0.1.0/web/src/lib/format.test.ts +29 -0
  347. shiptrail-0.1.0/web/src/lib/format.ts +34 -0
  348. shiptrail-0.1.0/web/src/lib/query.ts +12 -0
  349. shiptrail-0.1.0/web/src/lib/reducer.test.ts +119 -0
  350. shiptrail-0.1.0/web/src/lib/reducer.ts +33 -0
  351. shiptrail-0.1.0/web/src/lib/sse.test.ts +111 -0
  352. shiptrail-0.1.0/web/src/lib/sse.ts +166 -0
  353. shiptrail-0.1.0/web/src/main.tsx +17 -0
  354. shiptrail-0.1.0/web/src/router.ts +77 -0
  355. shiptrail-0.1.0/web/src/shell.tsx +320 -0
  356. shiptrail-0.1.0/web/src/styles.css +391 -0
  357. shiptrail-0.1.0/web/src/ui/LICENSE +21 -0
  358. shiptrail-0.1.0/web/src/ui/SOURCE.md +6 -0
  359. shiptrail-0.1.0/web/src/ui/confirm-dialog.tsx +68 -0
  360. shiptrail-0.1.0/web/src/ui/page-header.tsx +30 -0
  361. shiptrail-0.1.0/web/src/ui/page-shell.tsx +25 -0
  362. shiptrail-0.1.0/web/src/ui/primitives/badge.tsx +28 -0
  363. shiptrail-0.1.0/web/src/ui/primitives/button.tsx +126 -0
  364. shiptrail-0.1.0/web/src/ui/primitives/card.tsx +34 -0
  365. shiptrail-0.1.0/web/src/ui/primitives/context-menu.tsx +59 -0
  366. shiptrail-0.1.0/web/src/ui/primitives/dialog.tsx +98 -0
  367. shiptrail-0.1.0/web/src/ui/primitives/dropdown-menu.tsx +74 -0
  368. shiptrail-0.1.0/web/src/ui/primitives/field-control.ts +11 -0
  369. shiptrail-0.1.0/web/src/ui/primitives/input.tsx +22 -0
  370. shiptrail-0.1.0/web/src/ui/primitives/select.tsx +35 -0
  371. shiptrail-0.1.0/web/src/ui/primitives/sheet.tsx +55 -0
  372. shiptrail-0.1.0/web/src/ui/primitives/skeleton.tsx +7 -0
  373. shiptrail-0.1.0/web/src/ui/primitives/tabs.tsx +42 -0
  374. shiptrail-0.1.0/web/src/ui/primitives/tooltip.tsx +27 -0
  375. shiptrail-0.1.0/web/src/ui/primitives/tree-focus.ts +18 -0
  376. shiptrail-0.1.0/web/src/ui/settings-section.tsx +112 -0
  377. shiptrail-0.1.0/web/src/ui/status-text.ts +173 -0
  378. shiptrail-0.1.0/web/src/ui/status.tsx +33 -0
  379. shiptrail-0.1.0/web/src/ui/utils.ts +60 -0
  380. shiptrail-0.1.0/web/tsconfig.e2e.json +5 -0
  381. shiptrail-0.1.0/web/tsconfig.json +23 -0
  382. shiptrail-0.1.0/web/vite.config.ts +26 -0
@@ -0,0 +1,4 @@
1
+ # Keep LF line endings in the repo and on checkout, whatever core.autocrlf says.
2
+ * text=auto eol=lf
3
+ *.png binary
4
+ *.jpg binary
@@ -0,0 +1,34 @@
1
+ name: Update Linux baselines
2
+ on:
3
+ workflow_dispatch:
4
+ permissions: {}
5
+ jobs:
6
+ baselines:
7
+ permissions:
8
+ contents: read
9
+ runs-on: ubuntu-24.04
10
+ timeout-minutes: 15
11
+ steps:
12
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
13
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
14
+ with:
15
+ node-version: '22'
16
+ cache: npm
17
+ cache-dependency-path: web/package-lock.json
18
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
19
+ with:
20
+ python-version: '3.11'
21
+ - run: uv sync --locked
22
+ - run: npm ci
23
+ working-directory: web
24
+ - run: npx playwright install --with-deps chromium
25
+ working-directory: web
26
+ - run: npm run build
27
+ working-directory: web
28
+ - run: npm run e2e:update
29
+ working-directory: web
30
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
31
+ with:
32
+ name: linux-baselines
33
+ path: web/e2e/baselines/linux/
34
+ retention-days: 7
@@ -0,0 +1,117 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_call:
8
+
9
+ permissions: {}
10
+
11
+ # A newer push to the same branch or PR replaces the older run; tag (release) runs never cancel.
12
+ concurrency:
13
+ group: ci-${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: ${{ github.ref_type == 'branch' }}
15
+
16
+ jobs:
17
+ python:
18
+ permissions:
19
+ contents: read
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ os: [ubuntu-24.04, windows-latest, macos-latest]
24
+ python: ['3.11', '3.12', '3.13']
25
+ runs-on: ${{ matrix.os }}
26
+ timeout-minutes: 20
27
+ steps:
28
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
29
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
30
+ with:
31
+ python-version: ${{ matrix.python }}
32
+ - run: uv lock --check
33
+ - run: uv sync --locked
34
+ - run: uv run --locked pytest
35
+
36
+ web:
37
+ permissions:
38
+ contents: read
39
+ runs-on: ubuntu-24.04
40
+ timeout-minutes: 15
41
+ defaults:
42
+ run:
43
+ working-directory: web
44
+ steps:
45
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
46
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
47
+ with:
48
+ node-version: '22'
49
+ cache: npm
50
+ cache-dependency-path: web/package-lock.json
51
+ - run: npm ci
52
+ - run: npm run typecheck
53
+ - run: npm run lint
54
+ - run: npm test
55
+ - run: npm run build
56
+
57
+ dashboard:
58
+ uses: ./.github/workflows/dashboard.yml
59
+ permissions:
60
+ contents: read
61
+
62
+ package:
63
+ needs: [python, web, dashboard]
64
+ permissions:
65
+ contents: read
66
+ runs-on: ubuntu-24.04
67
+ timeout-minutes: 15
68
+ steps:
69
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
70
+ with:
71
+ fetch-depth: 0
72
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
73
+ with:
74
+ python-version: '3.11'
75
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
76
+ with:
77
+ node-version: '22'
78
+ cache: npm
79
+ cache-dependency-path: web/package-lock.json
80
+ - run: npm ci
81
+ working-directory: web
82
+ - run: npm run build
83
+ working-directory: web
84
+ - run: uv build
85
+ - run: python tools/release_artifacts.py dist
86
+ - name: Validate tagged changelog before publishing
87
+ if: startsWith(github.ref, 'refs/tags/')
88
+ env:
89
+ RELEASE_TAG: ${{ github.ref_name }}
90
+ run: python tools/release_artifacts.py dist --tag "$RELEASE_TAG" --notes release-notes.md
91
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
92
+ with:
93
+ name: distributions
94
+ path: dist/
95
+ if-no-files-found: error
96
+
97
+ smoke:
98
+ needs: package
99
+ permissions:
100
+ contents: read
101
+ strategy:
102
+ fail-fast: false
103
+ matrix:
104
+ os: [ubuntu-24.04, windows-latest]
105
+ runs-on: ${{ matrix.os }}
106
+ timeout-minutes: 15
107
+ steps:
108
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
109
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
110
+ with:
111
+ python-version: '3.11'
112
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
113
+ with:
114
+ name: distributions
115
+ path: dist
116
+ - run: uv run --no-project --python 3.11 python tools/release_smoke.py dist
117
+ - run: uv run --no-project --python 3.11 python tools/upgrade_smoke.py dist
@@ -0,0 +1,49 @@
1
+ name: Dashboard E2E
2
+ on:
3
+ workflow_call:
4
+ permissions: {}
5
+ jobs:
6
+ dashboard:
7
+ permissions:
8
+ contents: read
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ os: [ubuntu-24.04, windows-latest]
13
+ runs-on: ${{ matrix.os }}
14
+ timeout-minutes: 15
15
+ steps:
16
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
17
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
18
+ with:
19
+ node-version: '22'
20
+ cache: npm
21
+ cache-dependency-path: web/package-lock.json
22
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
23
+ with:
24
+ python-version: '3.11'
25
+ - run: uv sync --locked
26
+ - run: uv run --locked yapf --diff web/e2e_server.py tests/fake_cli.py
27
+ - run: uv run --locked pytest tests/test_engine_api.py tests/test_engine_streams.py
28
+ - run: npm ci
29
+ working-directory: web
30
+ - run: npx playwright install --with-deps chromium
31
+ working-directory: web
32
+ - run: npm run typecheck
33
+ working-directory: web
34
+ - run: npm run lint
35
+ working-directory: web
36
+ - run: npm test
37
+ working-directory: web
38
+ - run: npm run build
39
+ working-directory: web
40
+ - run: npm run e2e
41
+ working-directory: web
42
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
43
+ if: failure()
44
+ with:
45
+ name: dashboard-failure-${{ matrix.os }}
46
+ path: |
47
+ web/test-results/
48
+ web/playwright-report/
49
+ retention-days: 7
@@ -0,0 +1,75 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ['v*']
6
+
7
+ permissions: {}
8
+
9
+ concurrency:
10
+ group: release-${{ github.ref }}
11
+ cancel-in-progress: false
12
+
13
+ jobs:
14
+ ci:
15
+ uses: ./.github/workflows/ci.yml
16
+ permissions:
17
+ contents: read
18
+
19
+ publish:
20
+ needs: ci
21
+ runs-on: ubuntu-24.04
22
+ timeout-minutes: 10
23
+ environment:
24
+ name: ${{ contains(github.ref_name, 'rc') && 'testpypi' || 'pypi' }}
25
+ permissions:
26
+ actions: read
27
+ id-token: write
28
+ steps:
29
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
30
+ with:
31
+ name: distributions
32
+ path: artifacts
33
+ - name: Select distribution files (checksums are release assets)
34
+ run: |
35
+ mkdir dist
36
+ cp artifacts/*.whl artifacts/*.tar.gz dist/
37
+ - name: Publish candidate to TestPyPI
38
+ if: contains(github.ref_name, 'rc')
39
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
40
+ with:
41
+ repository-url: https://test.pypi.org/legacy/
42
+ - name: Publish stable release to PyPI
43
+ if: ${{ !contains(github.ref_name, 'rc') }}
44
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
45
+
46
+ release:
47
+ needs: publish
48
+ runs-on: ubuntu-24.04
49
+ timeout-minutes: 10
50
+ permissions:
51
+ actions: read
52
+ contents: write
53
+ id-token: write
54
+ attestations: write
55
+ steps:
56
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
57
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
58
+ with:
59
+ name: distributions
60
+ path: dist
61
+ - uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3
62
+ with:
63
+ subject-checksums: dist/SHA256SUMS
64
+ - name: Extract changelog notes
65
+ env:
66
+ RELEASE_TAG: ${{ github.ref_name }}
67
+ run: python tools/release_artifacts.py dist --tag "$RELEASE_TAG" --notes release-notes.md
68
+ - name: Create GitHub Release
69
+ env:
70
+ GH_TOKEN: ${{ github.token }}
71
+ RELEASE_TAG: ${{ github.ref_name }}
72
+ run: |
73
+ args=()
74
+ if [[ "$RELEASE_TAG" == *rc* ]]; then args+=(--prerelease); fi
75
+ gh release create "$RELEASE_TAG" dist/*.whl dist/*.tar.gz dist/SHA256SUMS --verify-tag --title "$RELEASE_TAG" --notes-file release-notes.md "${args[@]}"
@@ -0,0 +1,17 @@
1
+ # Runtime state of factory runs
2
+ /shiptrail/jobs/
3
+ *.tmp
4
+
5
+ # Local factory installation
6
+ /.claude/
7
+
8
+ # Python
9
+ __pycache__/
10
+ *.pyc
11
+ .venv/
12
+ .pytest_cache/
13
+ /dist/
14
+ /src/shiptrail/dashboard_dist/
15
+ /web/node_modules/
16
+ /web/test-results/
17
+ /web/playwright-report/
@@ -0,0 +1,26 @@
1
+ # Working on shiptrail
2
+
3
+ Use Python 3.11+ and the development environment from `uv sync --locked`.
4
+
5
+ ## Python formatting
6
+
7
+ YAPF is the Python formatter for this repository. Its pinned version and style live in
8
+ `pyproject.toml` (PEP 8, four spaces, 100 columns).
9
+
10
+ Before testing and committing Python changes, format each Python file you created or
11
+ modified, then check those same files:
12
+
13
+ ```powershell
14
+ uv run --locked yapf --in-place path/to/file.py path/to/other.py
15
+ uv run --locked yapf --diff path/to/file.py path/to/other.py
16
+ ```
17
+
18
+ The check must exit zero. Run the relevant tests after formatting. Preserve fixture
19
+ contents used as test evidence; do not reformat files under `tests/fixtures/`.
20
+
21
+ For an explicitly requested repository-wide formatting pass:
22
+
23
+ ```powershell
24
+ uv run --locked yapf --in-place --recursive .
25
+ uv run --locked yapf --diff --recursive .
26
+ ```
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - 2026-10-18
4
+
5
+ First release under the Shiptrail name. Shiptrail runs a configurable pipeline of Claude Code,
6
+ Codex and OpenCode agents against a repository, with a local dashboard.
7
+
8
+ - `shiptrail init` sets up any folder, detects the installed tools and writes the project's
9
+ `shiptrail/` folder, starter instructions and in-chat shortcuts.
10
+ - The dashboard covers the command center, jobs, backlog, pipelines with a machine-wide
11
+ library, activity, usage and repository settings.
12
+ - `shiptrail upgrade` keeps a repository's engine range and shortcuts in step with the
13
+ installed engine.
14
+
15
+ ## [0.1.0rc1] - 2026-10-18
16
+
17
+ Release candidate for 0.1.0; no `shiptrail upgrade` needed.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Danijel
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.
@@ -0,0 +1,201 @@
1
+ Metadata-Version: 2.5
2
+ Name: shiptrail
3
+ Version: 0.1.0
4
+ Summary: A deterministic engine for local coding agents
5
+ License-File: LICENSE
6
+ Requires-Python: >=3.11
7
+ Requires-Dist: fastapi<1,>=0.115
8
+ Requires-Dist: platformdirs<5,>=4
9
+ Requires-Dist: psutil<8,>=6
10
+ Requires-Dist: pydantic<3,>=2.9
11
+ Requires-Dist: pyyaml<7,>=6
12
+ Requires-Dist: uvicorn<1,>=0.30
13
+ Description-Content-Type: text/markdown
14
+
15
+ # Shiptrail
16
+
17
+ Shiptrail runs a configurable pipeline of Claude Code, Codex, and OpenCode agents against
18
+ your repository. Each job gets its own branch and worktree. The engine stores job state, streams
19
+ logs to a local dashboard, and either merges a verified result or pauses with a clear request
20
+ for you.
21
+
22
+ ## Requirements
23
+
24
+ - Python 3.11+ and [uv](https://docs.astral.sh/uv/getting-started/installation/).
25
+ - Git. A new folder is set up by `shiptrail init`; an existing repository can use any branch.
26
+ - Claude Code, Codex, or OpenCode CLI, signed in. Install the client you select in the pipeline.
27
+ - Optional: [agent-browser](https://github.com/vercel-labs/agent-browser) for browser checks:
28
+ `npm install -g agent-browser && agent-browser install`. `shiptrail doctor` reports it but does
29
+ not require it.
30
+
31
+ ## Install
32
+
33
+ Install the engine once per machine:
34
+
35
+ ```bash
36
+ uv tool install shiptrail
37
+ ```
38
+
39
+ Release candidate, from TestPyPI, until the stable release is published:
40
+
41
+ ```bash
42
+ uv tool install --default-index https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ shiptrail
43
+ ```
44
+
45
+ If uv is not installed, `install.py` is an optional bootstrap. It prints uv's official
46
+ installation instructions and asks before running the official installer, then installs the
47
+ engine:
48
+
49
+ ```powershell
50
+ python install.py
51
+ ```
52
+
53
+ Pass `--target path/to/your-project` to also run `shiptrail init` in that folder.
54
+
55
+ ## Quick start
56
+
57
+ Start from any folder, empty or not:
58
+
59
+ ```bash
60
+ cd path/to/your-project
61
+ shiptrail init
62
+ shiptrail doctor
63
+ shiptrail start "build a todo app"
64
+ ```
65
+
66
+ `shiptrail init` looks for Claude Code, Codex and OpenCode on your machine, shows the plan, and
67
+ asks once before it changes anything. With one usable tool it uses that tool without asking.
68
+ With several it asks which one the pipeline should start on (Enter takes the first):
69
+
70
+ ```text
71
+ Found Claude Code, Codex and OpenCode.
72
+ Which tool should the pipeline use by default?
73
+ 1) Claude Code
74
+ 2) Codex
75
+ 3) OpenCode
76
+ 4) Mixed: the template's choice for each stage
77
+ You can change any stage later on the Pipelines page. [1]:
78
+ Plan for C:\path\to\your-project:
79
+ would create: git repository on main
80
+ would write: AGENTS.md (starter; edit the TODO lines)
81
+ would write: CLAUDE.md (imports AGENTS.md for Claude Code)
82
+ would commit: AGENTS.md, CLAUDE.md as the first commit on main
83
+ would write: shiptrail/config.json
84
+ would write: shiptrail/backlog.md
85
+ would write: .claude/skills/shiptrail/SKILL.md
86
+ would write: .agents/skills/shiptrail/SKILL.md
87
+ would write: .opencode/skills/shiptrail/SKILL.md
88
+ would update: .gitignore
89
+ Continue? [Y/n]
90
+ ```
91
+
92
+ The answer sets the tool every stage starts on; each stage can use a different tool afterwards, on
93
+ the Pipelines page. "Mixed" keeps the template's tool for each stage and moves a stage to your
94
+ first tool when its own is not installed. `init` installs the in-chat shortcut (`/shiptrail` or
95
+ `$shiptrail`) for every tool it found. If none is installed it stops and says how to install one;
96
+ `--provider claude|codex|opencode|both` skips detection, for scripts.
97
+
98
+ What init does:
99
+
100
+ - **No git repository:** creates one on `main` and makes a first commit with the starter
101
+ instructions file. If git has no name or email configured, it stops and prints the two
102
+ `git config` commands to run.
103
+ - **Existing repository:** uses its current branch as the base branch and records it in
104
+ `shiptrail/config.json`. Nothing is renamed.
105
+ - **No `AGENTS.md` or `CLAUDE.md`:** writes a starter with `TODO` lines. With Claude Code alone that is
106
+ `CLAUDE.md`. When other tools share the project it is `AGENTS.md`, plus a `CLAUDE.md` that imports
107
+ it, so every tool reads the same instructions. Edit them to describe
108
+ your install, dev server and checks. If the folder has a `package.json` with `dev`, `test`,
109
+ `build` or `lint` scripts, those commands are filled in.
110
+
111
+ Then commit the shiptrail files (`shiptrail/`, the skill wrapper and `.gitignore`) before the first
112
+ job. The engine never pushes to a remote.
113
+
114
+ Run `shiptrail --help` for the commands, or `shiptrail <command> --help` for one of them.
115
+
116
+ ## Use it
117
+
118
+ Start work with the skill command from your client:
119
+
120
+ ```text
121
+ /shiptrail Add a dark mode toggle to settings (Claude Code)
122
+ $shiptrail Add a dark mode toggle to settings (Codex)
123
+ ```
124
+
125
+ Other commands:
126
+
127
+ | Command | What it does |
128
+ |---|---|
129
+ | `shiptrail start "<title>"` | Queue a job from the title |
130
+ | `shiptrail status` | List jobs and any that need you |
131
+ | `shiptrail approve <job-id>` | Approve a finished job and merge it into the base branch |
132
+ | `shiptrail rework <job-id> "<note>"` | Send a job back to the builder with a note |
133
+ | `shiptrail resume <job-id>` / `shiptrail stop <job-id>` | Resume or stop a job |
134
+ | `shiptrail delete <job-id>` | Delete a job, its worktree and its branch |
135
+ | `shiptrail doctor` | Check tools, logins and ports, with a fix for each problem |
136
+ | `shiptrail dashboard` | Open this repository's dashboard |
137
+
138
+ You can also add work to `shiptrail/backlog.md` or the dashboard backlog, then start it with
139
+ `shiptrail next`.
140
+
141
+ ## Define your pipeline
142
+
143
+ Edit the pipelines in `shiptrail/config.json` or use Dashboard Settings. Full runs a spec,
144
+ builder, parallel reviewers, and approval. Fast uses the shorter implementation and approval
145
+ flow. Configure roles, providers, model and effort per execution, retry limits, and merge
146
+ policy. Jobs retain a snapshot of their pipeline and role instructions, so later settings
147
+ changes affect new jobs only.
148
+
149
+ In the pipeline editor, Role, Model and Effort are dropdowns. Roles are the built-in ones plus any in
150
+ `shiptrail/roles/`. Models and efforts are read from your installed tools, `codex debug models` and
151
+ `opencode models`, which only list metadata and never call a model. The answers are cached for ten
152
+ minutes. Claude Code has no such command, so it offers its aliases. If a tool is missing or does not
153
+ answer, the dropdown falls back to built-in choices and says why. "Custom..." accepts any other value.
154
+ A saved model that is not in a tool's list is kept and flagged.
155
+
156
+ ## When a job needs you
157
+
158
+ Jobs pause when an agent is blocked, a review requests changes beyond the retry limit, the
159
+ approver escalates a product or risk decision, or the merge policy requires your review.
160
+ `shiptrail status` and the dashboard show the reason and the reports to inspect. Resolve the
161
+ request in the branch, then resume or rework the job. The engine never pushes to a remote.
162
+
163
+ ## The dashboard
164
+
165
+ Run `shiptrail dashboard` to open the dashboard for this repository, or `shiptrail serve --open` to
166
+ start the service and open it. By default the URL is `http://127.0.0.1:5099/`. The dashboard shows
167
+ jobs across registered repositories, pipeline steps, reports, timeline, logs and usage. It also
168
+ supports backlog management, repository and machine settings, and job actions such as stop,
169
+ resume, approve, rework and delete. The service listens on localhost only.
170
+
171
+ ## What a job leaves behind
172
+
173
+ The repository keeps its configuration and backlog in `shiptrail/`. `shiptrail/backlog.md` keeps
174
+ its plain line format; backlog priority and status are committed beside it in the sidecar
175
+ `shiptrail/backlog.meta.json`, which may be deleted safely (items fall back to normal priority
176
+ and ready status). Job state, reports,
177
+ attempt logs and archived outputs live under `shiptrail/jobs/<job-id>/`; worktrees are kept
178
+ beside the repository until merged or deleted. The exact report set depends on the pipeline.
179
+ The machine registry and service state live in the user data directory (or `SHIPTRAIL_HOME`).
180
+
181
+ ## Customising
182
+
183
+ Built-in roles ship with the engine. To customize a role for one repository, run
184
+ `shiptrail eject <role>` and edit the resulting file in `shiptrail/roles/`. The dashboard Settings
185
+ page edits pipeline configuration; machine settings control provider executable paths
186
+ (`cli.claude`, `cli.codex`, `cli.opencode`), concurrency and available ports. Ejected roles
187
+ remain repository-local and can be compared with the built-in version using
188
+ `shiptrail eject <role> --diff`.
189
+
190
+ ## Working on this repo
191
+
192
+ Set up the development environment with `uv sync --locked`. The Python suite runs with
193
+ `uv run --locked pytest`, or in parallel with `uv run --locked pytest -n 4` (about a minute, against
194
+ about six serially). Tests that touch the fixed sandbox port range are kept on one worker.
195
+
196
+ The dashboard lives in `web/`: run `npm ci`, then `npm run build` to rebuild the bundle the
197
+ engine serves, and `npm run typecheck`, `npm run lint`, `npm test` and `npm run e2e` to check it.
198
+
199
+ ## License
200
+
201
+ See [LICENSE](LICENSE).