@coldic3/slipway 1.0.0
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.
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/dist/slipway.mjs +1928 -0
- package/docker/compose.yaml +29 -0
- package/gitea/public/assets/css/slipway.css +75 -0
- package/gitea/public/assets/img/apple-touch-icon.png +0 -0
- package/gitea/public/assets/img/favicon.png +0 -0
- package/gitea/public/assets/img/favicon.svg +14 -0
- package/gitea/public/assets/img/logo.png +0 -0
- package/gitea/public/assets/img/logo.svg +12 -0
- package/gitea/public/assets/js/slipway-head.js +8 -0
- package/gitea/public/assets/js/slipway.js +13 -0
- package/gitea/templates/base/footer_content.tmpl +4 -0
- package/gitea/templates/custom/extra_links.tmpl +1 -0
- package/gitea/templates/custom/footer.tmpl +1 -0
- package/gitea/templates/custom/header.tmpl +5 -0
- package/gitea/templates/repo/header/fork.tmpl +0 -0
- package/gitea/templates/repo/header/star.tmpl +0 -0
- package/gitea/templates/repo/header/watch.tmpl +0 -0
- package/gitea/templates/user/auth/signin.tmpl +14 -0
- package/package.json +67 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Slipway's optional Docker runtime (`slipway up --docker`, ADR 0002). Run it through the slipway CLI: it generates the
|
|
2
|
+
# settings env file and the branding copy, and passes these variables:
|
|
3
|
+
# SLIPWAY_PROJECT compose project name (default: slipway)
|
|
4
|
+
# SLIPWAY_PORT host port, bound to 127.0.0.1 only (security invariant)
|
|
5
|
+
# SLIPWAY_GITEA_ENV generated GITEA__section__KEY settings (src/runtime/settings.ts)
|
|
6
|
+
# SLIPWAY_GITEA_CUSTOM Slipway's Gitea branding (a copy in ~/.slipway/gitea/custom)
|
|
7
|
+
name: ${SLIPWAY_PROJECT:-slipway}
|
|
8
|
+
|
|
9
|
+
services:
|
|
10
|
+
gitea:
|
|
11
|
+
image: gitea/gitea:28.3.0-rootless
|
|
12
|
+
restart: unless-stopped
|
|
13
|
+
ports:
|
|
14
|
+
- "127.0.0.1:${SLIPWAY_PORT:?run this through slipway up --docker}:3000"
|
|
15
|
+
env_file:
|
|
16
|
+
- ${SLIPWAY_GITEA_ENV:?run this through slipway up --docker}
|
|
17
|
+
volumes:
|
|
18
|
+
- gitea-data:/var/lib/gitea
|
|
19
|
+
- ${SLIPWAY_GITEA_CUSTOM:?run this through slipway up --docker}:/var/lib/gitea/custom:ro
|
|
20
|
+
- gitea-config:/etc/gitea
|
|
21
|
+
healthcheck:
|
|
22
|
+
test: ["CMD", "curl", "-fsS", "http://localhost:3000/api/healthz"]
|
|
23
|
+
interval: 5s
|
|
24
|
+
timeout: 3s
|
|
25
|
+
retries: 30
|
|
26
|
+
|
|
27
|
+
volumes:
|
|
28
|
+
gitea-data:
|
|
29
|
+
gitea-config:
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* Slipway palette on top of gitea-dark: neutral dark gray + amber accent (ADR 0001). */
|
|
2
|
+
:root {
|
|
3
|
+
--dd-gray-950: #141517;
|
|
4
|
+
--dd-gray-900: #1b1d20;
|
|
5
|
+
--dd-gray-850: #222428;
|
|
6
|
+
--dd-gray-800: #2a2d31;
|
|
7
|
+
--dd-gray-700: #3a3d42;
|
|
8
|
+
--dd-ink: #eceef1;
|
|
9
|
+
--dd-ink-muted: #a9aeb5;
|
|
10
|
+
--dd-amber: #f2a43a;
|
|
11
|
+
--dd-amber-dark: #d98a1f;
|
|
12
|
+
|
|
13
|
+
--color-body: var(--dd-gray-900);
|
|
14
|
+
--color-box-body: var(--dd-gray-850);
|
|
15
|
+
--color-box-body-highlight: var(--dd-gray-800);
|
|
16
|
+
--color-box-header: var(--dd-gray-800);
|
|
17
|
+
--color-nav-bg: var(--dd-gray-950);
|
|
18
|
+
--color-nav-hover-bg: var(--dd-gray-800);
|
|
19
|
+
--color-header-wrapper: var(--dd-gray-900);
|
|
20
|
+
--color-footer: var(--dd-gray-950);
|
|
21
|
+
--color-secondary: var(--dd-gray-700);
|
|
22
|
+
--color-secondary-bg: var(--dd-gray-850);
|
|
23
|
+
--color-input-background: var(--dd-gray-950);
|
|
24
|
+
--color-input-border: var(--dd-gray-700);
|
|
25
|
+
--color-menu: var(--dd-gray-850);
|
|
26
|
+
--color-card: var(--dd-gray-850);
|
|
27
|
+
--color-text: var(--dd-ink);
|
|
28
|
+
--color-text-light: var(--dd-ink-muted);
|
|
29
|
+
--color-primary: var(--dd-amber);
|
|
30
|
+
--color-primary-contrast: var(--dd-gray-950);
|
|
31
|
+
--color-primary-dark-1: var(--dd-amber-dark);
|
|
32
|
+
--color-primary-light-1: #f5b65f;
|
|
33
|
+
--color-primary-alpha-20: rgba(242, 164, 58, 0.2);
|
|
34
|
+
--color-primary-alpha-30: rgba(242, 164, 58, 0.3);
|
|
35
|
+
--color-accent: var(--dd-amber);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Navigation: only Slipway's things (Pull requests, Repositories, user menu). */
|
|
39
|
+
#navbar a.item[href$="/explore/repos"]:not(.slipway-repos-link),
|
|
40
|
+
#navbar a.item[href$="/milestones"],
|
|
41
|
+
#navbar a.item[href$="/issues"],
|
|
42
|
+
#navbar a.item[href$="/explore/organizations"],
|
|
43
|
+
#navbar a.item[href="https://docs.gitea.com"],
|
|
44
|
+
#navbar a.item[href$="/notifications"],
|
|
45
|
+
#navbar .item[data-tooltip-content="Create…"],
|
|
46
|
+
#navbar .item[data-tooltip-content="Create..."],
|
|
47
|
+
#navbar a.item[href$="/repo/create"],
|
|
48
|
+
#navbar a.item[href$="/repo/migrate"],
|
|
49
|
+
#navbar a.item[href$="/org/create"],
|
|
50
|
+
.user-menu a.item[href$="?tab=stars"],
|
|
51
|
+
.user-menu a.item[href*="docs.gitea.com"] { display: none !important; }
|
|
52
|
+
|
|
53
|
+
/* Sign-in page (style A). */
|
|
54
|
+
.slipway-signin { background: var(--dd-gray-900); min-height: 100%; }
|
|
55
|
+
.slipway-hero { text-align: center; color: var(--dd-ink); padding-top: 2rem; }
|
|
56
|
+
.slipway-hero h1 { margin: 0.5rem 0 0.25rem; font-size: 2rem; letter-spacing: 0.02em; color: var(--dd-ink); }
|
|
57
|
+
.slipway-hero p { margin: 0; color: var(--dd-ink-muted); }
|
|
58
|
+
.slipway-signin .ui.attached.segment, .slipway-signin .ui.top.attached.header { background: var(--dd-gray-850); border-color: var(--dd-gray-700); }
|
|
59
|
+
.slipway-signin .ui.primary.button { background: var(--dd-amber); color: var(--dd-gray-950); font-weight: 700; }
|
|
60
|
+
|
|
61
|
+
/* PR page: the merge box only keeps Slipway's note. */
|
|
62
|
+
.pull-merge-box .merge-section > .item:not(.slipway-promote-note) { display: none !important; }
|
|
63
|
+
.slipway-promote-note { color: var(--dd-ink-muted); }
|
|
64
|
+
|
|
65
|
+
.slipway-footer { color: var(--dd-ink-muted); }
|
|
66
|
+
|
|
67
|
+
/* Sign-in: no password reset (mail is off), no duplicate "Sign In" in the top bar. Passkeys are off in app.ini. */
|
|
68
|
+
.slipway-signin a[href$="/user/forgot_password"],
|
|
69
|
+
#navbar a.item[href$="/user/login"] { display: none !important; }
|
|
70
|
+
|
|
71
|
+
/* "Repositories" (explore) page: only the repo list, no users/organizations tabs. */
|
|
72
|
+
.page-content.explore .explore-tabs a.item[href$="/explore/users"],
|
|
73
|
+
.page-content.explore .explore-tabs a.item[href$="/explore/organizations"],
|
|
74
|
+
.page-content.explore a.item[href$="/explore/users"],
|
|
75
|
+
.page-content.explore a.item[href$="/explore/organizations"] { display: none !important; }
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" class="slipway-logo">
|
|
2
|
+
<rect width="64" height="64" rx="14" fill="#1b1d20"/>
|
|
3
|
+
<g transform="translate(4 3) scale(0.875)">
|
|
4
|
+
<!-- hull resting on dock blocks -->
|
|
5
|
+
<path d="M6 29 H58 L50.5 42 H13.5 Z" fill="#f2a43a"/>
|
|
6
|
+
<rect x="21" y="16" width="22" height="13" rx="2.5" fill="#e8f1fb"/>
|
|
7
|
+
<rect x="25" y="19.5" width="4" height="4" rx="1" fill="#2a2d31"/>
|
|
8
|
+
<rect x="35" y="19.5" width="4" height="4" rx="1" fill="#2a2d31"/>
|
|
9
|
+
<rect x="12" y="45" width="8" height="8" rx="1" fill="#9aa1aa"/>
|
|
10
|
+
<rect x="28" y="45" width="8" height="8" rx="1" fill="#9aa1aa"/>
|
|
11
|
+
<rect x="44" y="45" width="8" height="8" rx="1" fill="#9aa1aa"/>
|
|
12
|
+
<path d="M3 56 H61" stroke="#9aa1aa" stroke-width="3" stroke-linecap="round"/>
|
|
13
|
+
</g>
|
|
14
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" class="slipway-logo" role="img" aria-label="Slipway">
|
|
2
|
+
<title>Slipway</title>
|
|
3
|
+
<!-- hull resting on dock blocks -->
|
|
4
|
+
<path d="M6 29 H58 L50.5 42 H13.5 Z" fill="#f2a43a"/>
|
|
5
|
+
<rect x="21" y="16" width="22" height="13" rx="2.5" fill="#e8f1fb"/>
|
|
6
|
+
<rect x="25" y="19.5" width="4" height="4" rx="1" fill="#2a2d31"/>
|
|
7
|
+
<rect x="35" y="19.5" width="4" height="4" rx="1" fill="#2a2d31"/>
|
|
8
|
+
<rect x="12" y="45" width="8" height="8" rx="1" fill="#9aa1aa"/>
|
|
9
|
+
<rect x="28" y="45" width="8" height="8" rx="1" fill="#9aa1aa"/>
|
|
10
|
+
<rect x="44" y="45" width="8" height="8" rx="1" fill="#9aa1aa"/>
|
|
11
|
+
<path d="M3 56 H61" stroke="#9aa1aa" stroke-width="3" stroke-linecap="round"/>
|
|
12
|
+
</svg>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Slipway: signed-in visitors of the home page go straight to the pull request list.
|
|
2
|
+
(function () {
|
|
3
|
+
var signed = document.querySelector('meta[name="slipway-signed-in"]');
|
|
4
|
+
var sub = (document.querySelector('meta[name="slipway-sub-url"]') || {}).content || '';
|
|
5
|
+
if (signed && signed.content === '1' && (location.pathname === sub + '/' || location.pathname === sub)) {
|
|
6
|
+
location.replace(sub + '/pulls');
|
|
7
|
+
}
|
|
8
|
+
})();
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Slipway: the merge box in a PR is replaced by a short note (merging happens on GitHub after promotion).
|
|
2
|
+
(function () {
|
|
3
|
+
function addNote() {
|
|
4
|
+
const box = document.querySelector('.pull-merge-box .merge-section');
|
|
5
|
+
if (!box || box.querySelector('.slipway-promote-note')) return;
|
|
6
|
+
const note = document.createElement('div');
|
|
7
|
+
note.className = 'item slipway-promote-note';
|
|
8
|
+
note.textContent = 'Approved PRs are promoted to GitHub from your Claude session.';
|
|
9
|
+
box.prepend(note);
|
|
10
|
+
}
|
|
11
|
+
addNote();
|
|
12
|
+
new MutationObserver(addNote).observe(document.body, { childList: true, subtree: true });
|
|
13
|
+
})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{if .IsSigned}}<a class="item slipway-repos-link{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">Repositories</a>{{end}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<script src="{{AssetUrlPrefix}}/js/slipway.js?v=f190837090" defer></script>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{{/* Slipway branding (ADR 0001): palette + trimmed UI, and signed-in home → the PR list. Inline scripts are blocked by CSP. */}}
|
|
2
|
+
<link rel="stylesheet" href="{{AssetUrlPrefix}}/css/slipway.css?v=e13e51a4ea">
|
|
3
|
+
<meta name="slipway-signed-in" content="{{if .IsSigned}}1{{else}}0{{end}}">
|
|
4
|
+
<meta name="slipway-sub-url" content="{{AppSubUrl}}">
|
|
5
|
+
<script src="{{AssetUrlPrefix}}/js/slipway-head.js?v=3519157e92"></script>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{{template "base/head" .}}
|
|
2
|
+
<div role="main" aria-label="{{.Title}}" class="page-content user signin slipway-signin{{if .LinkAccountMode}} icon{{end}}">
|
|
3
|
+
<div class="ui middle very relaxed page grid">
|
|
4
|
+
<div class="column tw-flex tw-flex-col tw-gap-4 tw-max-w-2xl tw-m-auto">
|
|
5
|
+
<div class="slipway-hero">
|
|
6
|
+
<img src="{{AssetUrlPrefix}}/img/logo.svg" width="72" height="72" alt="">
|
|
7
|
+
<h1>Slipway</h1>
|
|
8
|
+
<p>Review AI pull requests, then launch them to GitHub</p>
|
|
9
|
+
</div>
|
|
10
|
+
{{template "user/auth/signin_inner" .}}
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
{{template "base/footer" .}}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@coldic3/slipway",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A local review station for AI-agent pull requests: review in a local Gitea, promote the approved commits to GitHub",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"code-review",
|
|
8
|
+
"pull-requests",
|
|
9
|
+
"gitea",
|
|
10
|
+
"github",
|
|
11
|
+
"claude-code",
|
|
12
|
+
"mcp"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/coldic3/slipway#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/coldic3/slipway/issues"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/coldic3/slipway.git"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "Kevin Kaniaburka",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"bin": {
|
|
26
|
+
"slipway": "dist/slipway.mjs"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist/slipway.mjs",
|
|
30
|
+
"gitea/",
|
|
31
|
+
"docker/compose.yaml"
|
|
32
|
+
],
|
|
33
|
+
"os": [
|
|
34
|
+
"darwin",
|
|
35
|
+
"linux"
|
|
36
|
+
],
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=22"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"slipway": "tsx src/cli.ts",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
46
|
+
"test": "npm run test:unit && npm run test:functional",
|
|
47
|
+
"test:unit": "vitest run tests/unit",
|
|
48
|
+
"test:functional": "vitest run tests/functional",
|
|
49
|
+
"test:e2e": "playwright test",
|
|
50
|
+
"test:all": "npm test && npm run test:e2e",
|
|
51
|
+
"build:plugin": "node scripts/build-plugin.mjs",
|
|
52
|
+
"build:brand": "node scripts/build-brand.mjs && node scripts/stamp-assets.mjs",
|
|
53
|
+
"build": "npm run build:cli && npm run build:plugin",
|
|
54
|
+
"build:cli": "node scripts/build-cli.mjs",
|
|
55
|
+
"prepack": "npm run build:cli"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@modelcontextprotocol/sdk": "^1.32.2",
|
|
59
|
+
"@playwright/test": "^1.65.0",
|
|
60
|
+
"@types/node": "^26.6.6",
|
|
61
|
+
"esbuild": "^0.28.2",
|
|
62
|
+
"tsx": "^4.23.15",
|
|
63
|
+
"typescript": "^5.9.3",
|
|
64
|
+
"vitest": "^5.1.0",
|
|
65
|
+
"zod": "^4.6.7"
|
|
66
|
+
}
|
|
67
|
+
}
|