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.
- shiptrail-0.1.0/.gitattributes +4 -0
- shiptrail-0.1.0/.github/workflows/baselines.yml +34 -0
- shiptrail-0.1.0/.github/workflows/ci.yml +117 -0
- shiptrail-0.1.0/.github/workflows/dashboard.yml +49 -0
- shiptrail-0.1.0/.github/workflows/release.yml +75 -0
- shiptrail-0.1.0/.gitignore +17 -0
- shiptrail-0.1.0/AGENTS.md +26 -0
- shiptrail-0.1.0/CHANGELOG.md +17 -0
- shiptrail-0.1.0/LICENSE +21 -0
- shiptrail-0.1.0/PKG-INFO +201 -0
- shiptrail-0.1.0/README.md +187 -0
- shiptrail-0.1.0/install.py +58 -0
- shiptrail-0.1.0/pyproject.toml +63 -0
- shiptrail-0.1.0/shiptrail/backlog.md +3 -0
- shiptrail-0.1.0/shiptrail/config.json +113 -0
- shiptrail-0.1.0/src/shiptrail/__init__.py +8 -0
- shiptrail-0.1.0/src/shiptrail/api/__init__.py +1 -0
- shiptrail-0.1.0/src/shiptrail/api/app.py +506 -0
- shiptrail-0.1.0/src/shiptrail/api/streams.py +138 -0
- shiptrail-0.1.0/src/shiptrail/cli.py +425 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/THIRD_PARTY_NOTICES.txt +6511 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/index-CFxUIJrK.css +1 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/assets/index-jGh4BLlJ.js +202 -0
- shiptrail-0.1.0/src/shiptrail/dashboard_dist/index.html +13 -0
- shiptrail-0.1.0/src/shiptrail/engine/__init__.py +1 -0
- shiptrail-0.1.0/src/shiptrail/engine/activity.py +36 -0
- shiptrail-0.1.0/src/shiptrail/engine/adapters/__init__.py +15 -0
- shiptrail-0.1.0/src/shiptrail/engine/adapters/base.py +110 -0
- shiptrail-0.1.0/src/shiptrail/engine/adapters/codex.py +295 -0
- shiptrail-0.1.0/src/shiptrail/engine/adapters/opencode.py +322 -0
- shiptrail-0.1.0/src/shiptrail/engine/backlog.py +182 -0
- shiptrail-0.1.0/src/shiptrail/engine/catalog.py +145 -0
- shiptrail-0.1.0/src/shiptrail/engine/changes.py +139 -0
- shiptrail-0.1.0/src/shiptrail/engine/config.py +388 -0
- shiptrail-0.1.0/src/shiptrail/engine/crash.py +11 -0
- shiptrail-0.1.0/src/shiptrail/engine/db.py +97 -0
- shiptrail-0.1.0/src/shiptrail/engine/gitops.py +312 -0
- shiptrail-0.1.0/src/shiptrail/engine/library.py +83 -0
- shiptrail-0.1.0/src/shiptrail/engine/locking.py +50 -0
- shiptrail-0.1.0/src/shiptrail/engine/migrations/machine/0001_init.sql +15 -0
- shiptrail-0.1.0/src/shiptrail/engine/migrations/repo/0001_init.sql +89 -0
- shiptrail-0.1.0/src/shiptrail/engine/packet.py +307 -0
- shiptrail-0.1.0/src/shiptrail/engine/pipeline.py +516 -0
- shiptrail-0.1.0/src/shiptrail/engine/ports.py +154 -0
- shiptrail-0.1.0/src/shiptrail/engine/registry.py +87 -0
- shiptrail-0.1.0/src/shiptrail/engine/reports.py +98 -0
- shiptrail-0.1.0/src/shiptrail/engine/roles.py +210 -0
- shiptrail-0.1.0/src/shiptrail/engine/runtime.py +600 -0
- shiptrail-0.1.0/src/shiptrail/engine/scaffold.py +449 -0
- shiptrail-0.1.0/src/shiptrail/engine/scheduler.py +228 -0
- shiptrail-0.1.0/src/shiptrail/engine/supervisor.py +837 -0
- shiptrail-0.1.0/src/shiptrail/engine/usage.py +52 -0
- shiptrail-0.1.0/src/shiptrail/engine/versioning.py +106 -0
- shiptrail-0.1.0/src/shiptrail/engine/winjob.py +197 -0
- shiptrail-0.1.0/src/shiptrail/paths.py +30 -0
- shiptrail-0.1.0/src/shiptrail/roles/README.md +22 -0
- shiptrail-0.1.0/src/shiptrail/roles/approver.md +56 -0
- shiptrail-0.1.0/src/shiptrail/roles/builder.md +85 -0
- shiptrail-0.1.0/src/shiptrail/roles/fast-approver.md +64 -0
- shiptrail-0.1.0/src/shiptrail/roles/reviewer-code.md +53 -0
- shiptrail-0.1.0/src/shiptrail/roles/reviewer-security.md +52 -0
- shiptrail-0.1.0/src/shiptrail/roles/reviewer-ui.md +59 -0
- shiptrail-0.1.0/src/shiptrail/roles/reviewer-ux.md +60 -0
- shiptrail-0.1.0/src/shiptrail/roles/spec-writer.md +65 -0
- shiptrail-0.1.0/src/shiptrail/run_cli.py +355 -0
- shiptrail-0.1.0/src/shiptrail/service.py +262 -0
- shiptrail-0.1.0/src/shiptrail/templates/AGENTS.starter.md +26 -0
- shiptrail-0.1.0/src/shiptrail/templates/SKILL.claude.md +23 -0
- shiptrail-0.1.0/src/shiptrail/templates/SKILL.codex.md +23 -0
- shiptrail-0.1.0/src/shiptrail/templates/SKILL.opencode.md +23 -0
- shiptrail-0.1.0/src/shiptrail/templates/backlog.md +3 -0
- shiptrail-0.1.0/src/shiptrail/templates/config.json +209 -0
- shiptrail-0.1.0/tests/engine_harness.py +256 -0
- shiptrail-0.1.0/tests/fake_cli.py +187 -0
- shiptrail-0.1.0/tests/fixtures/bench-job.json +16 -0
- shiptrail-0.1.0/tests/fixtures/claude/README.md +12 -0
- shiptrail-0.1.0/tests/fixtures/claude/auth.jsonl +3 -0
- shiptrail-0.1.0/tests/fixtures/claude/auth.meta.json +26 -0
- shiptrail-0.1.0/tests/fixtures/claude/auth.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/claude/cache1.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/claude/cache1.meta.json +27 -0
- shiptrail-0.1.0/tests/fixtures/claude/cache1.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/claude/cache2.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/claude/cache2.meta.json +27 -0
- shiptrail-0.1.0/tests/fixtures/claude/cache2.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/claude/denial.jsonl +9 -0
- shiptrail-0.1.0/tests/fixtures/claude/denial.meta.json +27 -0
- shiptrail-0.1.0/tests/fixtures/claude/denial.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/claude/kill.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/claude/kill.meta.json +27 -0
- shiptrail-0.1.0/tests/fixtures/claude/kill.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/claude/long.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/claude/long.meta.json +25 -0
- shiptrail-0.1.0/tests/fixtures/claude/long.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/claude/resume.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/claude/resume.meta.json +27 -0
- shiptrail-0.1.0/tests/fixtures/claude/resume.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/claude/success.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/claude/success.meta.json +25 -0
- shiptrail-0.1.0/tests/fixtures/claude/success.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/README.md +17 -0
- shiptrail-0.1.0/tests/fixtures/codex/auth.jsonl +14 -0
- shiptrail-0.1.0/tests/fixtures/codex/auth.meta.json +23 -0
- shiptrail-0.1.0/tests/fixtures/codex/auth.stderr +8 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache-short1.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache-short1.meta.json +26 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache-short1.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache-short2.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache-short2.meta.json +26 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache-short2.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache1.jsonl +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache1.meta.json +24 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache1.stderr +1 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache2.jsonl +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache2.meta.json +24 -0
- shiptrail-0.1.0/tests/fixtures/codex/cache2.stderr +1 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-escalated.jsonl +6 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-escalated.meta.json +26 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-escalated.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-home.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-home.meta.json +26 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-home.stderr +1 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-trusted.jsonl +7 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-trusted.meta.json +26 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial-trusted.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial.jsonl +7 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial.meta.json +21 -0
- shiptrail-0.1.0/tests/fixtures/codex/denial.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/developer.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/codex/developer.meta.json +24 -0
- shiptrail-0.1.0/tests/fixtures/codex/developer.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/long.jsonl +6 -0
- shiptrail-0.1.0/tests/fixtures/codex/long.meta.json +22 -0
- shiptrail-0.1.0/tests/fixtures/codex/long.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/prepend.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/codex/prepend.meta.json +22 -0
- shiptrail-0.1.0/tests/fixtures/codex/prepend.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/success.jsonl +4 -0
- shiptrail-0.1.0/tests/fixtures/codex/success.meta.json +22 -0
- shiptrail-0.1.0/tests/fixtures/codex/success.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/system.jsonl +0 -0
- shiptrail-0.1.0/tests/fixtures/codex/system.meta.json +25 -0
- shiptrail-0.1.0/tests/fixtures/codex/system.stderr +1 -0
- shiptrail-0.1.0/tests/fixtures/opencode/README.md +55 -0
- shiptrail-0.1.0/tests/fixtures/opencode/deny.jsonl +5 -0
- shiptrail-0.1.0/tests/fixtures/opencode/deny.meta.json +19 -0
- shiptrail-0.1.0/tests/fixtures/opencode/deny.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/opencode/error-model.jsonl +1 -0
- shiptrail-0.1.0/tests/fixtures/opencode/error-model.meta.json +19 -0
- shiptrail-0.1.0/tests/fixtures/opencode/error-model.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/opencode/error-variant.jsonl +1 -0
- shiptrail-0.1.0/tests/fixtures/opencode/error-variant.meta.json +19 -0
- shiptrail-0.1.0/tests/fixtures/opencode/error-variant.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/opencode/resume.jsonl +1 -0
- shiptrail-0.1.0/tests/fixtures/opencode/resume.meta.json +23 -0
- shiptrail-0.1.0/tests/fixtures/opencode/resume.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/opencode/shell.jsonl +5 -0
- shiptrail-0.1.0/tests/fixtures/opencode/shell.meta.json +21 -0
- shiptrail-0.1.0/tests/fixtures/opencode/shell.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/opencode/text.jsonl +1 -0
- shiptrail-0.1.0/tests/fixtures/opencode/text.meta.json +21 -0
- shiptrail-0.1.0/tests/fixtures/opencode/text.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/opencode/tool.jsonl +6 -0
- shiptrail-0.1.0/tests/fixtures/opencode/tool.meta.json +21 -0
- shiptrail-0.1.0/tests/fixtures/opencode/tool.stderr +0 -0
- shiptrail-0.1.0/tests/fixtures/opencode/write.jsonl +5 -0
- shiptrail-0.1.0/tests/fixtures/opencode/write.meta.json +19 -0
- shiptrail-0.1.0/tests/fixtures/opencode/write.stderr +0 -0
- shiptrail-0.1.0/tests/test_catalog.py +166 -0
- shiptrail-0.1.0/tests/test_engine_api.py +924 -0
- shiptrail-0.1.0/tests/test_engine_codex_adapter.py +533 -0
- shiptrail-0.1.0/tests/test_engine_config.py +417 -0
- shiptrail-0.1.0/tests/test_engine_db.py +124 -0
- shiptrail-0.1.0/tests/test_engine_gitops.py +419 -0
- shiptrail-0.1.0/tests/test_engine_opencode_adapter.py +515 -0
- shiptrail-0.1.0/tests/test_engine_packet.py +321 -0
- shiptrail-0.1.0/tests/test_engine_pipeline.py +687 -0
- shiptrail-0.1.0/tests/test_engine_ports.py +588 -0
- shiptrail-0.1.0/tests/test_engine_reports.py +104 -0
- shiptrail-0.1.0/tests/test_engine_roles.py +219 -0
- shiptrail-0.1.0/tests/test_engine_streams.py +233 -0
- shiptrail-0.1.0/tests/test_engine_supervisor.py +725 -0
- shiptrail-0.1.0/tests/test_engine_upgrade.py +72 -0
- shiptrail-0.1.0/tests/test_engine_usage.py +63 -0
- shiptrail-0.1.0/tests/test_init_providers.py +213 -0
- shiptrail-0.1.0/tests/test_install.py +47 -0
- shiptrail-0.1.0/tests/test_library.py +62 -0
- shiptrail-0.1.0/tests/test_registry.py +134 -0
- shiptrail-0.1.0/tests/test_release_pipeline.py +110 -0
- shiptrail-0.1.0/tests/test_run_cli.py +459 -0
- shiptrail-0.1.0/tests/test_sandbox_bench.py +121 -0
- shiptrail-0.1.0/tests/test_sandbox_engine.py +128 -0
- shiptrail-0.1.0/tools/release_artifacts.py +64 -0
- shiptrail-0.1.0/tools/release_fake_cli.py +55 -0
- shiptrail-0.1.0/tools/release_smoke.py +191 -0
- shiptrail-0.1.0/tools/sandbox-fixture/CLAUDE.md +37 -0
- shiptrail-0.1.0/tools/sandbox-fixture/index.html +23 -0
- shiptrail-0.1.0/tools/sandbox-fixture/package.json +1 -0
- shiptrail-0.1.0/tools/sandbox-fixture/src/app.js +57 -0
- shiptrail-0.1.0/tools/sandbox-fixture/src/style.css +43 -0
- shiptrail-0.1.0/tools/sandbox-fixture/src/todos.js +17 -0
- shiptrail-0.1.0/tools/sandbox-fixture/test/todos.test.js +24 -0
- shiptrail-0.1.0/tools/sandbox.py +724 -0
- shiptrail-0.1.0/tools/upgrade_smoke.py +187 -0
- shiptrail-0.1.0/uv.lock +562 -0
- shiptrail-0.1.0/web/components.json +23 -0
- shiptrail-0.1.0/web/e2e/README.md +34 -0
- shiptrail-0.1.0/web/e2e/baselines/linux/board.png +0 -0
- shiptrail-0.1.0/web/e2e/baselines/linux/job-detail.png +0 -0
- shiptrail-0.1.0/web/e2e/baselines/linux/overview.png +0 -0
- shiptrail-0.1.0/web/e2e/baselines/linux/pipeline.png +0 -0
- shiptrail-0.1.0/web/e2e/baselines/win32/board.png +0 -0
- shiptrail-0.1.0/web/e2e/baselines/win32/job-detail.png +0 -0
- shiptrail-0.1.0/web/e2e/baselines/win32/overview.png +0 -0
- shiptrail-0.1.0/web/e2e/baselines/win32/pipeline.png +0 -0
- shiptrail-0.1.0/web/e2e/dashboard.spec.ts +355 -0
- shiptrail-0.1.0/web/e2e/fixtures.ts +87 -0
- shiptrail-0.1.0/web/e2e/screenshot.css +14 -0
- shiptrail-0.1.0/web/e2e_server.py +74 -0
- shiptrail-0.1.0/web/eslint.config.mjs +38 -0
- shiptrail-0.1.0/web/index.html +12 -0
- shiptrail-0.1.0/web/licenses/README.md +18 -0
- shiptrail-0.1.0/web/licenses/headless-tree.txt +21 -0
- shiptrail-0.1.0/web/licenses/react-remove-scroll-bar.txt +21 -0
- shiptrail-0.1.0/web/licenses/shadcn-ui.txt +21 -0
- shiptrail-0.1.0/web/licenses/victory-vendor.txt +30 -0
- shiptrail-0.1.0/web/package-lock.json +7803 -0
- shiptrail-0.1.0/web/package.json +64 -0
- shiptrail-0.1.0/web/playwright.config.ts +22 -0
- shiptrail-0.1.0/web/prettier.config.mjs +22 -0
- shiptrail-0.1.0/web/scripts/dev-proxy.ts +48 -0
- shiptrail-0.1.0/web/scripts/notices.mjs +56 -0
- shiptrail-0.1.0/web/src/App.tsx +8 -0
- shiptrail-0.1.0/web/src/factory.css +34 -0
- shiptrail-0.1.0/web/src/features/activity/ActivityLog.tsx +163 -0
- shiptrail-0.1.0/web/src/features/backlog/Backlog.tsx +340 -0
- shiptrail-0.1.0/web/src/features/backlog/BacklogKanban.tsx +124 -0
- shiptrail-0.1.0/web/src/features/backlog/model.ts +68 -0
- shiptrail-0.1.0/web/src/features/board/ActivityLine.tsx +42 -0
- shiptrail-0.1.0/web/src/features/board/Board.tsx +70 -0
- shiptrail-0.1.0/web/src/features/board/CompactPipeline.tsx +36 -0
- shiptrail-0.1.0/web/src/features/board/FactorySummary.tsx +56 -0
- shiptrail-0.1.0/web/src/features/board/JobCard.tsx +83 -0
- shiptrail-0.1.0/web/src/features/board/StartFeature.tsx +59 -0
- shiptrail-0.1.0/web/src/features/board/board.test.tsx +407 -0
- shiptrail-0.1.0/web/src/features/board/model.test.ts +27 -0
- shiptrail-0.1.0/web/src/features/board/model.ts +197 -0
- shiptrail-0.1.0/web/src/features/job/ChangesView.tsx +136 -0
- shiptrail-0.1.0/web/src/features/job/JobDetail.tsx +393 -0
- shiptrail-0.1.0/web/src/features/job/JobHeader.tsx +57 -0
- shiptrail-0.1.0/web/src/features/job/LogView.tsx +301 -0
- shiptrail-0.1.0/web/src/features/job/PauseBanner.tsx +95 -0
- shiptrail-0.1.0/web/src/features/job/ReportView.test.tsx +66 -0
- shiptrail-0.1.0/web/src/features/job/ReportView.tsx +58 -0
- shiptrail-0.1.0/web/src/features/job/ReviewerCards.tsx +74 -0
- shiptrail-0.1.0/web/src/features/job/StageDetails.tsx +67 -0
- shiptrail-0.1.0/web/src/features/job/Timeline.tsx +35 -0
- shiptrail-0.1.0/web/src/features/job/UsagePanel.tsx +40 -0
- shiptrail-0.1.0/web/src/features/job/intervention.ts +169 -0
- shiptrail-0.1.0/web/src/features/job/log-lines.ts +66 -0
- shiptrail-0.1.0/web/src/features/job/pipeline/GroupFrame.tsx +11 -0
- shiptrail-0.1.0/web/src/features/job/pipeline/PipelineEdge.tsx +36 -0
- shiptrail-0.1.0/web/src/features/job/pipeline/PipelineNode.tsx +95 -0
- shiptrail-0.1.0/web/src/features/job/pipeline/PipelineView.test.tsx +106 -0
- shiptrail-0.1.0/web/src/features/job/pipeline/PipelineView.tsx +117 -0
- shiptrail-0.1.0/web/src/features/job/pipeline/layout.test.ts +50 -0
- shiptrail-0.1.0/web/src/features/job/pipeline/layout.ts +125 -0
- shiptrail-0.1.0/web/src/features/job/report-url.ts +5 -0
- shiptrail-0.1.0/web/src/features/job/use-log-entries.ts +93 -0
- shiptrail-0.1.0/web/src/features/job/use-now.ts +13 -0
- shiptrail-0.1.0/web/src/features/jobs/JobsList.tsx +134 -0
- shiptrail-0.1.0/web/src/features/overview/Overview.tsx +264 -0
- shiptrail-0.1.0/web/src/features/overview/model.test.ts +27 -0
- shiptrail-0.1.0/web/src/features/overview/model.ts +88 -0
- shiptrail-0.1.0/web/src/features/pipelines/PipelinesPage.tsx +167 -0
- shiptrail-0.1.0/web/src/features/repositories/RepositoriesPage.tsx +60 -0
- shiptrail-0.1.0/web/src/features/settings/ChoiceSelect.tsx +65 -0
- shiptrail-0.1.0/web/src/features/settings/DirtyGuard.tsx +22 -0
- shiptrail-0.1.0/web/src/features/settings/MachineSettings.tsx +92 -0
- shiptrail-0.1.0/web/src/features/settings/PipelineEditor.tsx +416 -0
- shiptrail-0.1.0/web/src/features/settings/PipelineManager.tsx +158 -0
- shiptrail-0.1.0/web/src/features/settings/PipelineSettingsForm.tsx +265 -0
- shiptrail-0.1.0/web/src/features/settings/RepoSettings.tsx +33 -0
- shiptrail-0.1.0/web/src/features/settings/model.test.tsx +394 -0
- shiptrail-0.1.0/web/src/features/settings/model.ts +361 -0
- shiptrail-0.1.0/web/src/features/settings/providers.test.ts +70 -0
- shiptrail-0.1.0/web/src/features/settings/providers.ts +72 -0
- shiptrail-0.1.0/web/src/features/usage/UsagePage.tsx +247 -0
- shiptrail-0.1.0/web/src/lib/api.ts +546 -0
- shiptrail-0.1.0/web/src/lib/format.test.ts +29 -0
- shiptrail-0.1.0/web/src/lib/format.ts +34 -0
- shiptrail-0.1.0/web/src/lib/query.ts +12 -0
- shiptrail-0.1.0/web/src/lib/reducer.test.ts +119 -0
- shiptrail-0.1.0/web/src/lib/reducer.ts +33 -0
- shiptrail-0.1.0/web/src/lib/sse.test.ts +111 -0
- shiptrail-0.1.0/web/src/lib/sse.ts +166 -0
- shiptrail-0.1.0/web/src/main.tsx +17 -0
- shiptrail-0.1.0/web/src/router.ts +77 -0
- shiptrail-0.1.0/web/src/shell.tsx +320 -0
- shiptrail-0.1.0/web/src/styles.css +391 -0
- shiptrail-0.1.0/web/src/ui/LICENSE +21 -0
- shiptrail-0.1.0/web/src/ui/SOURCE.md +6 -0
- shiptrail-0.1.0/web/src/ui/confirm-dialog.tsx +68 -0
- shiptrail-0.1.0/web/src/ui/page-header.tsx +30 -0
- shiptrail-0.1.0/web/src/ui/page-shell.tsx +25 -0
- shiptrail-0.1.0/web/src/ui/primitives/badge.tsx +28 -0
- shiptrail-0.1.0/web/src/ui/primitives/button.tsx +126 -0
- shiptrail-0.1.0/web/src/ui/primitives/card.tsx +34 -0
- shiptrail-0.1.0/web/src/ui/primitives/context-menu.tsx +59 -0
- shiptrail-0.1.0/web/src/ui/primitives/dialog.tsx +98 -0
- shiptrail-0.1.0/web/src/ui/primitives/dropdown-menu.tsx +74 -0
- shiptrail-0.1.0/web/src/ui/primitives/field-control.ts +11 -0
- shiptrail-0.1.0/web/src/ui/primitives/input.tsx +22 -0
- shiptrail-0.1.0/web/src/ui/primitives/select.tsx +35 -0
- shiptrail-0.1.0/web/src/ui/primitives/sheet.tsx +55 -0
- shiptrail-0.1.0/web/src/ui/primitives/skeleton.tsx +7 -0
- shiptrail-0.1.0/web/src/ui/primitives/tabs.tsx +42 -0
- shiptrail-0.1.0/web/src/ui/primitives/tooltip.tsx +27 -0
- shiptrail-0.1.0/web/src/ui/primitives/tree-focus.ts +18 -0
- shiptrail-0.1.0/web/src/ui/settings-section.tsx +112 -0
- shiptrail-0.1.0/web/src/ui/status-text.ts +173 -0
- shiptrail-0.1.0/web/src/ui/status.tsx +33 -0
- shiptrail-0.1.0/web/src/ui/utils.ts +60 -0
- shiptrail-0.1.0/web/tsconfig.e2e.json +5 -0
- shiptrail-0.1.0/web/tsconfig.json +23 -0
- shiptrail-0.1.0/web/vite.config.ts +26 -0
|
@@ -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.
|
shiptrail-0.1.0/LICENSE
ADDED
|
@@ -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.
|
shiptrail-0.1.0/PKG-INFO
ADDED
|
@@ -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).
|