Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
2555b00
chore: remove gpui project files
etchebarne Jun 13, 2026
4fdb89d
init: entry point
etchebarne Jun 13, 2026
ea28caf
chore: setup crate structure
etchebarne Jun 13, 2026
0b49c73
feat(core): add base tree logic
etchebarne Jun 13, 2026
6c167ba
chore: restructure with rust backend and qt frontend with ipc communi…
etchebarne Jun 14, 2026
f34953d
chore: restructure with gtk on c
etchebarne Jun 14, 2026
caca646
feat: add workspaces, panes and tabs
etchebarne Jun 15, 2026
05a10e3
fix: preserve pane focus and protect ipc socket
etchebarne Jun 15, 2026
0876fd5
refactor: split desktop ipc and ui modules
etchebarne Jun 15, 2026
5db5be1
refactor: own pane split ratios in core
etchebarne Jun 15, 2026
a285192
feat: persist server state in sqlite
etchebarne Jun 15, 2026
5b0f62b
feat: add blank tab starter
etchebarne Jun 15, 2026
c204c49
feat: add file tree tab
etchebarne Jun 15, 2026
6487acf
fix: ignore empty file tree clicks
etchebarne Jun 15, 2026
4ce2dfd
feat: add file tree mutations
etchebarne Jun 18, 2026
d6ec1af
chore: setup electron project
etchebarne Jul 5, 2026
fd7d39d
feat: add layout border and header
etchebarne Jul 5, 2026
dc81840
feat: add workspace list
etchebarne Jul 5, 2026
299dd8f
feat: add custom header
etchebarne Jul 5, 2026
0168acc
chore: remove title from buttongroup
etchebarne Jul 5, 2026
89a55a7
feat: add tabs and panes ui
etchebarne Jul 5, 2026
827b877
fix: stabilize pane resizing
etchebarne Jul 5, 2026
6f44167
chore: update empty workspace copy
etchebarne Jul 5, 2026
420be54
style: enable dark tab theme
etchebarne Jul 5, 2026
3441224
chore: remove titles
etchebarne Jul 5, 2026
1b14a06
feat: add tab content registry
etchebarne Jul 6, 2026
39181d6
feat: add workspace state store
etchebarne Jul 6, 2026
cd2edbf
feat: add file tree tab
etchebarne Jul 6, 2026
82c40d9
feat: add file tree filesystem actions
etchebarne Jul 6, 2026
d29466f
fix: lift file tree context menu
etchebarne Jul 6, 2026
6a598c8
chore: move assets to desktop project and set electron icon
etchebarne Jul 6, 2026
19f8c79
feat: add linux release packaging
etchebarne Jul 6, 2026
59dfad7
style: align tab strip padding
etchebarne Jul 6, 2026
8f45d17
fix: theme file tree accent
etchebarne Jul 6, 2026
9c853d4
chore: remove settings tab
etchebarne Jul 6, 2026
0c18482
fix: move tabs between pane tab groups
etchebarne Jul 6, 2026
48f55ca
fix: lazily load large file tree directories
etchebarne Jul 6, 2026
e9e2bb8
fix: scroll overflowing pane tabs
etchebarne Jul 7, 2026
88e0322
fix: hide git directory in file tree
etchebarne Jul 7, 2026
fdcea9f
feat: add terminal tab
etchebarne Jul 7, 2026
afff16d
fix: align xterm canvas addon version
etchebarne Jul 7, 2026
085b9fb
feat: keep alive terminal tabs
etchebarne Jul 7, 2026
fc257a9
fix: hide terminal scrollbar
etchebarne Jul 7, 2026
9ee2a86
feat: add git tab
etchebarne Jul 7, 2026
7396d5d
feat: add git stash manager
etchebarne Jul 7, 2026
b42d1ce
feat: add git toolbar tooltips
etchebarne Jul 7, 2026
73149ee
feat: handle uninitialized git repositories
etchebarne Jul 7, 2026
580251a
feat: improve git branch dialog
etchebarne Jul 7, 2026
540e4f7
fix: truncate git branch button
etchebarne Jul 7, 2026
cf2c796
chore: remove lang icons
etchebarne Jul 7, 2026
7a7ff95
feat: use shadcn git checkboxes
etchebarne Jul 9, 2026
c79b905
chore: upgrade desktop to typescript 7
etchebarne Jul 9, 2026
c89600e
chore: disable vulkan
etchebarne Jul 9, 2026
6fc099e
fix: debounce terminal resize
etchebarne Jul 9, 2026
a9d4df5
feat: add git diff tabs
etchebarne Jul 9, 2026
a38bcfb
feat: close tabs with middle click
etchebarne Jul 9, 2026
2b04e95
fix: animate file tree context menus
etchebarne Jul 9, 2026
f17abb4
feat: add desktop ui zoom shortcuts
etchebarne Jul 9, 2026
e1afb1d
refactor: group tab core logic
etchebarne Jul 9, 2026
5d73845
refactor: tighten core and ipc boundaries
etchebarne Jul 9, 2026
ae8d5f0
refactor: make state persistence transactional
etchebarne Jul 9, 2026
ec63856
feat: add editor tabs
etchebarne Jul 10, 2026
07df91a
feat: refresh git views on workspace changes
etchebarne Jul 10, 2026
741eb87
fix: prevent git tree checkbox overlap
etchebarne Jul 10, 2026
03e989d
feat: show git sync commit counts
etchebarne Jul 10, 2026
843a6e1
feat: manage git remotes and tags
etchebarne Jul 10, 2026
332a9ad
ci: automate linux releases
etchebarne Jul 10, 2026
04c0811
feat: add backend-driven editor settings
etchebarne Jul 10, 2026
89334b5
feat: add editable Monaco diffs
etchebarne Jul 10, 2026
ab88a88
fix: refresh clean tabs on external changes
etchebarne Jul 10, 2026
e336075
feat: show file icons in editor tabs
etchebarne Jul 10, 2026
150e390
feat: switch terminal shells
etchebarne Jul 10, 2026
63ae98a
chore: update icons
etchebarne Jul 10, 2026
d7b6284
feat: improve file tree navigation
etchebarne Jul 10, 2026
a8e1e5f
feat: show git changes in file tree and editors
etchebarne Jul 11, 2026
2a14e67
fix: improve file tree status and renaming
etchebarne Jul 11, 2026
a6bc5bb
fix: make bottom git panel the same height as the terminal bottom panel
etchebarne Jul 11, 2026
2990f5f
feat: add workspace search and persist window state
etchebarne Jul 11, 2026
ee1851b
feat: add appearance zoom setting
etchebarne Jul 11, 2026
f0cdcdf
feat: add managed language tooling
etchebarne Jul 11, 2026
53799b0
feat: complete language tooling features
etchebarne Jul 12, 2026
6e1fa70
feat: support lsp resource operations
etchebarne Jul 12, 2026
af8e29e
ci: enforce IPC route boundaries
etchebarne Jul 12, 2026
6f544b7
refactor: generate IPC contracts
etchebarne Jul 12, 2026
3a59211
fix: require workspace trust consent
etchebarne Jul 12, 2026
f346d8a
refactor: move durability into core application
etchebarne Jul 12, 2026
abe25ef
refactor: centralize workspace edit coordination
etchebarne Jul 12, 2026
cb2d4aa
refactor: centralize document lifecycle
etchebarne Jul 12, 2026
d996aed
refactor: resolve language tooling in core
etchebarne Jul 12, 2026
d3e538d
refactor: open editor locations atomically
etchebarne Jul 12, 2026
1f042d5
refactor: resolve git decorations in core
etchebarne Jul 12, 2026
e51d743
refactor: expose resolved settings
etchebarne Jul 12, 2026
2995abb
refactor: centralize document save policy
etchebarne Jul 12, 2026
da295df
fix: preserve state during application shutdown
etchebarne Jul 12, 2026
460f07f
fix: prevent redirected middle-click paste
etchebarne Jul 12, 2026
facea7a
fix: harden production lifecycle
etchebarne Jul 13, 2026
79bb039
refactor: organize core state modules
etchebarne Jul 13, 2026
889a061
fix: list nested untracked files
etchebarne Jul 13, 2026
864d047
Merge pull request #5 from etchebarne/experimental/electron
etchebarne Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
123 changes: 61 additions & 62 deletions .github/workflows/aur-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,75 @@ on:
release:
types: [published]

concurrency:
group: aur-${{ github.event.release.tag_name }}
cancel-in-progress: false

jobs:
aur-publish-bin:
aur-publish:
runs-on: ubuntu-latest
permissions:
contents: read

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.release.tag_name }}

- name: Get version from tag
id: version
run: echo "pkgver=${GITHUB_EVENT_RELEASE_TAG_NAME#v}" >> "$GITHUB_OUTPUT"
- name: Resolve release version
id: release
env:
GITHUB_EVENT_RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
run: |
if [[ ! "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Release tag must have the form vX.Y.Z: $RELEASE_TAG" >&2
exit 1
fi

- name: Get tarball checksum
id: checksum
echo "version=${RELEASE_TAG#v}" >> "$GITHUB_OUTPUT"

- name: Calculate package checksums
id: checksums
env:
RELEASE_TAG: ${{ github.event.release.tag_name }}
VERSION: ${{ steps.release.outputs.version }}
run: |
curl -sL "https://github.com/${{ github.repository }}/releases/download/${{ github.event.release.tag_name }}/kosmos-linux-x86_64.tar.gz" -o kosmos.tar.gz
echo "sha256=$(sha256sum kosmos.tar.gz | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
curl --fail --location --silent --show-error \
"https://github.com/${{ github.repository }}/releases/download/${RELEASE_TAG}/Kosmos-${VERSION}-x86_64.AppImage" \
--output Kosmos.AppImage
curl --fail --location --silent --show-error \
"https://raw.githubusercontent.com/${{ github.repository }}/${RELEASE_TAG}/desktop/assets/icon/icon-512.png" \
--output kosmos-512.png
curl --fail --location --silent --show-error \
"https://raw.githubusercontent.com/${{ github.repository }}/${RELEASE_TAG}/LICENSE" \
--output LICENSE

{
echo "appimage=$(sha256sum Kosmos.AppImage | cut -d ' ' -f 1)"
echo "icon=$(sha256sum kosmos-512.png | cut -d ' ' -f 1)"
echo "license=$(sha256sum LICENSE | cut -d ' ' -f 1)"
} >> "$GITHUB_OUTPUT"

- name: Update PKGBUILD
env:
VERSION: ${{ steps.release.outputs.version }}
APPIMAGE_SHA256: ${{ steps.checksums.outputs.appimage }}
ICON_SHA256: ${{ steps.checksums.outputs.icon }}
LICENSE_SHA256: ${{ steps.checksums.outputs.license }}
run: |
cd aur/kosmos-bin
sed -i "s/^pkgver=.*/pkgver=${{ steps.version.outputs.pkgver }}/" PKGBUILD
sed -i "s/^pkgrel=.*/pkgrel=1/" PKGBUILD
sed -i "s/^sha256sums=.*/sha256sums=('${{ steps.checksum.outputs.sha256 }}')/" PKGBUILD
sed -i "s/^pkgver=.*/pkgver=${VERSION}/" aur/kosmos-bin/PKGBUILD
sed -i "s/^pkgrel=.*/pkgrel=1/" aur/kosmos-bin/PKGBUILD
sed -i \
"s/^sha256sums=.*/sha256sums=('${APPIMAGE_SHA256}' '${ICON_SHA256}' '${LICENSE_SHA256}')/" \
aur/kosmos-bin/PKGBUILD

- name: Publish to AUR
env:
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
VERSION: ${{ steps.release.outputs.version }}
run: |
mkdir -p ~/.ssh
echo "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur
printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur
chmod 600 ~/.ssh/aur
ssh-keyscan -t rsa,ecdsa,ed25519 aur.archlinux.org >> ~/.ssh/known_hosts
cat >> ~/.ssh/config <<'SSH'
Expand All @@ -48,58 +84,21 @@ jobs:
git clone ssh://aur@aur.archlinux.org/kosmos-bin.git aur-repo
cp aur/kosmos-bin/PKGBUILD aur-repo/PKGBUILD

cd aur-repo
docker run --rm -v "$PWD:/pkg" -e HOST_UID="$(id -u)" archlinux:base bash -c \
'pacman -Sy --noconfirm pacman-contrib && useradd -m builder && chown -R builder /pkg && runuser -u builder -- bash -c "cd /pkg && makepkg --printsrcinfo > .SRCINFO" && chown -R $HOST_UID /pkg'
docker run --rm \
-v "$PWD/aur-repo:/pkg" \
-e HOST_UID="$(id -u)" \
archlinux:base \
bash -c 'pacman -Sy --noconfirm pacman-contrib && useradd -m builder && chown -R builder /pkg && runuser -u builder -- bash -c "cd /pkg && makepkg --printsrcinfo > .SRCINFO" && chown -R "$HOST_UID" /pkg'

cd aur-repo
git config user.name "Martin Etchebarne"
git config user.email "martin@etchebarne.net"
git add PKGBUILD .SRCINFO
git diff --cached --quiet && echo "No changes to commit" || git commit -m "Update to ${{ steps.version.outputs.pkgver }}"
git push

aur-publish-src:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.release.tag_name }}

- name: Get version from tag
id: version
run: echo "pkgver=${GITHUB_EVENT_RELEASE_TAG_NAME#v}" >> "$GITHUB_OUTPUT"
env:
GITHUB_EVENT_RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}

- name: Update PKGBUILD
run: |
cd aur/kosmos
sed -i "s/^pkgver=.*/pkgver=${{ steps.version.outputs.pkgver }}/" PKGBUILD
sed -i "s/^pkgrel=.*/pkgrel=1/" PKGBUILD

- name: Publish to AUR
env:
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
run: |
mkdir -p ~/.ssh
echo "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur
chmod 600 ~/.ssh/aur
ssh-keyscan -t rsa,ecdsa,ed25519 aur.archlinux.org >> ~/.ssh/known_hosts
cat >> ~/.ssh/config <<'SSH'
Host aur.archlinux.org
IdentityFile ~/.ssh/aur
User aur
SSH
if git diff --cached --quiet; then
echo "AUR package is already up to date"
exit 0
fi

git clone ssh://aur@aur.archlinux.org/kosmos.git aur-repo
cp aur/kosmos/PKGBUILD aur-repo/PKGBUILD

cd aur-repo
docker run --rm -v "$PWD:/pkg" -e HOST_UID="$(id -u)" archlinux:base bash -c \
'pacman -Sy --noconfirm pacman-contrib && useradd -m builder && chown -R builder /pkg && runuser -u builder -- bash -c "cd /pkg && makepkg --printsrcinfo > .SRCINFO" && chown -R $HOST_UID /pkg'

git config user.name "Martin Etchebarne"
git config user.email "martin@etchebarne.net"
git add PKGBUILD .SRCINFO
git diff --cached --quiet && echo "No changes to commit" || git commit -m "Update to ${{ steps.version.outputs.pkgver }}"
git commit -m "Update to ${VERSION}"
git push
56 changes: 56 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Checks

on:
pull_request:
push:
branches:
- main

permissions:
contents: read

concurrency:
group: checks-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
verify:
runs-on: ubuntu-22.04

steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2

- uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt

- uses: swatinem/rust-cache@v2

- name: Install desktop dependencies
run: bun install --cwd desktop --frozen-lockfile

- name: Check layer boundaries
run: bash scripts/check-boundaries.sh

- name: Check Rust formatting
run: cargo fmt --all -- --check

- name: Lint Rust workspace
run: cargo clippy --workspace --all-targets -- -D warnings

- name: Test Rust workspace
run: cargo test --workspace

- name: Check IPC contract generation
run: bun run --cwd desktop check:ipc

- name: Typecheck desktop
run: bun run --cwd desktop typecheck

- name: Test desktop
run: bun run --cwd desktop test

- name: Build desktop
run: bun run --cwd desktop build
143 changes: 90 additions & 53 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,92 +7,129 @@ on:
workflow_dispatch:
inputs:
tag:
description: "Tag to build and release (e.g. v0.1.0)"
description: "Tag to build and release (for example, v0.1.0)"
required: true

concurrency:
group: release-${{ github.event.inputs.tag || github.ref_name }}
cancel-in-progress: false

jobs:
release:
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: write

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
ref: ${{ github.event.inputs.tag || github.ref }}

- name: Resolve tag
id: tag
run: echo "tag=${{ github.event.inputs.tag || github.ref_name }}" >> "$GITHUB_OUTPUT"
- uses: oven-sh/setup-bun@v2

- name: Install build dependencies
- name: Validate release version
id: release
env:
RELEASE_TAG: ${{ github.event.inputs.tag || github.ref_name }}
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential pkg-config gettext-base llvm clang libclang-dev curl rpm desktop-file-utils \
libssl-dev libfontconfig-dev libxkbcommon-dev \
libxcb1-dev libxkbcommon-x11-dev \
libwayland-dev libvulkan-dev
if [[ ! "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Release tag must have the form vX.Y.Z: $RELEASE_TAG" >&2
exit 1
fi

- uses: mlugg/setup-zig@v2
with:
version: 0.16.0
version="${RELEASE_TAG#v}"
desktop_version="$(bun -e 'console.log(require("./desktop/package.json").version)')"
core_version="$(awk -F '"' '/^version = "/ { print $2; exit }' core/Cargo.toml)"
server_version="$(awk -F '"' '/^version = "/ { print $2; exit }' server/Cargo.toml)"

for package_version in "$desktop_version" "$core_version" "$server_version"; do
if [[ "$package_version" != "$version" ]]; then
echo "Tag $RELEASE_TAG does not match package version $package_version" >&2
exit 1
fi
done

echo "tag=$RELEASE_TAG" >> "$GITHUB_OUTPUT"
echo "version=$version" >> "$GITHUB_OUTPUT"

- name: Install AppImage tooling
- name: Install system dependencies
run: |
curl -fsSL \
https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage \
-o /tmp/appimagetool
chmod +x /tmp/appimagetool
sudo mv /tmp/appimagetool /usr/local/bin/appimagetool
sudo apt-get update
sudo apt-get install -y rpm

- uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt

- uses: swatinem/rust-cache@v2

- name: Bundle
- name: Install desktop dependencies
run: bun install --cwd desktop --frozen-lockfile

- name: Test Rust workspace
run: cargo test --workspace

- name: Lint Rust workspace
run: cargo clippy --workspace --all-targets -- -D warnings

- name: Check Rust formatting
run: cargo fmt --all -- --check

- name: Typecheck desktop
run: bun run --cwd desktop typecheck

- name: Test desktop
run: bun run --cwd desktop test

- name: Build Linux packages
run: ./scripts/bundle-linux.sh

- name: Package deb and rpm
run: ./scripts/package-linux-deb-rpm.sh
- name: Verify release artifacts
env:
VERSION: ${{ steps.release.outputs.version }}
run: |
artifacts=(
"desktop/release/Kosmos-${VERSION}-x86_64.AppImage"
"desktop/release/Kosmos-${VERSION}-amd64.deb"
"desktop/release/Kosmos-${VERSION}-x86_64.rpm"
)

for artifact in "${artifacts[@]}"; do
test -f "$artifact" || {
echo "Missing release artifact: $artifact" >&2
exit 1
}
done

- name: Package AppImage
run: ./scripts/package-linux-appimage.sh
(
cd desktop/release
sha256sum \
"Kosmos-${VERSION}-x86_64.AppImage" \
"Kosmos-${VERSION}-amd64.deb" \
"Kosmos-${VERSION}-x86_64.rpm" \
> SHA256SUMS
)

- name: Create GitHub release
- name: Create draft GitHub release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG: ${{ steps.release.outputs.tag }}
VERSION: ${{ steps.release.outputs.version }}
run: |
tag="${{ steps.tag.outputs.tag }}"
version="${tag#v}"
arch="$(uname -m)"
case "$arch" in
x86_64|amd64)
bundle_arch="x86_64"
deb_arch="amd64"
rpm_arch="x86_64"
appimage_arch="x86_64"
;;
*)
echo "Unsupported release architecture: $arch" >&2
exit 1
;;
esac
artifacts=(
"target/release/kosmos-linux-${bundle_arch}.tar.gz"
"target/release/kosmos_${version}_${deb_arch}.deb"
"target/release/kosmos-${version}-1.${rpm_arch}.rpm"
"target/release/Kosmos-${version}-${appimage_arch}.AppImage"
scripts/install.sh
scripts/uninstall.sh
"desktop/release/Kosmos-${VERSION}-x86_64.AppImage"
"desktop/release/Kosmos-${VERSION}-amd64.deb"
"desktop/release/Kosmos-${VERSION}-x86_64.rpm"
"desktop/release/SHA256SUMS"
)

if gh release view "$tag" >/dev/null 2>&1; then
gh release upload "$tag" "${artifacts[@]}" --clobber
if gh release view "$RELEASE_TAG" >/dev/null 2>&1; then
gh release upload "$RELEASE_TAG" "${artifacts[@]}" --clobber
else
gh release create "$tag" \
--title "Kosmos $tag" \
gh release create "$RELEASE_TAG" \
--title "Kosmos $RELEASE_TAG" \
--draft \
--generate-notes \
--verify-tag \
"${artifacts[@]}"
fi
Loading
Loading