Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
8d30dd9
chore: migrate actions to central repo
JheisonMB Apr 10, 2026
153e64c
ci: add workflow_dispatch trigger
JheisonMB Jun 11, 2026
aca7ebb
feat: add status command and default to wizard
JheisonMB Jun 11, 2026
1396bc8
feat: add config scope support and idempotency detection
JheisonMB Jun 11, 2026
8e6425f
feat: wizard shows current state and allows removal
JheisonMB Jun 11, 2026
d46069e
feat: use picker for custom hook type selection
JheisonMB Jun 11, 2026
e2a12ff
test: add tests for new functionality
JheisonMB Jun 11, 2026
b73aca3
docs: update README with new features
JheisonMB Jun 11, 2026
447ab10
fix: address code review issues
JheisonMB Jun 11, 2026
5189639
feat: add builds module for saving and reusing configurations
JheisonMB Jun 12, 2026
21fb39f
feat: integrate builds into wizard
JheisonMB Jun 12, 2026
42aa9f4
refactor: improve build name validation, hook detection, and Windows …
JheisonMB Jun 12, 2026
6828101
chore: apply cargo fmt
JheisonMB Jun 12, 2026
c33d06d
Merge pull request #12 from UniverLab/feature/status-and-wizard-impro…
JheisonMB Jun 12, 2026
89637ad
docs: add docs folder and align readme with univerlab system
JheisonMB Jun 12, 2026
6da8dfd
docs: add automated demo recording and regenerate gif
JheisonMB Jun 12, 2026
03a6256
chore: move demo recording scripts to the workspace scripts folder
JheisonMB Jun 14, 2026
36a60a8
docs: add gitkit demo recording
JheisonMB Jun 25, 2026
7cdb989
refactor: flatten nesting in get_installed_hooks, get_all_git_configs…
JheisonMB Jun 28, 2026
57fb8bb
chore: add MIT LICENSE file declared in Cargo.toml
JheisonMB Jul 1, 2026
7ae4696
feat(install): verify SHA256 checksum of downloaded archive
JheisonMB Jul 1, 2026
85cf7f5
chore(demo): update demo artifacts with new recording
JheisonMB Jul 3, 2026
b43df86
chore: add *.mp4 and .mimocode/ to gitignore
JheisonMB Jul 9, 2026
e7e6d83
Merge pull request #13 from UniverLab/docs/initial-docs
JheisonMB Jul 10, 2026
d706e4b
chore: bump version to 0.4.0, track Cargo.lock
JheisonMB Jul 10, 2026
34203db
Merge pull request #16 from UniverLab/chore/fix-ci
JheisonMB Jul 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 3 additions & 95 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,100 +2,8 @@ name: CI

on:
pull_request:
branches:
- develop
- main

permissions:
contents: read

env:
CARGO_TERM_COLOR: always
workflow_dispatch:

jobs:
check:
name: Check, Test & Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}

- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}

- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}

- name: Cargo fmt
run: cargo fmt --check

- name: Cargo build
run: cargo build --release

- name: Cargo test
run: cargo test

- name: Cargo clippy
run: cargo clippy --all-targets -- -D warnings

publish-check:
name: Publish Check (dry-run)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}

- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}

- name: Cargo publish dry-run
run: cargo publish --dry-run

main-pr-checks:
name: Main PR Requirements
if: github.base_ref == 'main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Check version bump
run: |
CURRENT_VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
echo "Version in Cargo.toml: $CURRENT_VERSION"
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$LAST_TAG" ]; then
echo "✅ First release (no previous tags)"
else
LAST_VERSION=${LAST_TAG#v}
echo "Last tag version: $LAST_VERSION"
if [ "$CURRENT_VERSION" = "$LAST_VERSION" ]; then
echo "❌ Version in Cargo.toml must be bumped for PRs to main"
exit 1
fi
echo "✅ Version bumped correctly"
fi
rust-ci:
uses: UniverLab/workflows/.github/workflows/rust-ci.yml@main
216 changes: 8 additions & 208 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,218 +2,18 @@ name: Release

on:
pull_request:
branches:
- main
types:
- closed
paths:
- Cargo.toml
branches: [main]
types: [closed]
paths: [Cargo.toml]
workflow_dispatch:

permissions:
contents: write

env:
CARGO_TERM_COLOR: always

jobs:
create-tag:
name: Create Release Tag
release:
if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.version.outputs.tag }}
version: ${{ steps.version.outputs.version }}
created: ${{ steps.create.outputs.created }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Get version from Cargo.toml
id: version
run: |
VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/' | tr -d '\r' | xargs)
TAG="v${VERSION}"
echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "tag=${TAG}" >> $GITHUB_OUTPUT

- name: Check if tag already exists
id: check_tag
run: |
TAG=${{ steps.version.outputs.tag }}
if git rev-parse "$TAG" >/dev/null 2>&1; then
echo "exists=true" >> $GITHUB_OUTPUT
echo "Tag $TAG already exists, skipping"
else
echo "exists=false" >> $GITHUB_OUTPUT
fi

- name: Create and push tag
id: create
run: |
if [ "${{ steps.check_tag.outputs.exists }}" = "true" ]; then
echo "created=false" >> $GITHUB_OUTPUT
echo "Tag already exists — skipping release"
exit 0
fi
TAG=${{ steps.version.outputs.tag }}
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag -a "$TAG" -m "Release $TAG"
git push origin "$TAG"
echo "created=true" >> $GITHUB_OUTPUT
echo "Tag $TAG created and pushed"

build:
name: Build ${{ matrix.target }}
needs: create-tag
if: needs.create-tag.outputs.created == 'true'
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-unknown-linux-musl
os: ubuntu-latest
archive: tar.gz
- target: aarch64-apple-darwin
os: macos-latest
archive: tar.gz
- target: x86_64-apple-darwin
os: macos-latest
archive: tar.gz
- target: x86_64-pc-windows-msvc
os: windows-latest
archive: zip

steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.create-tag.outputs.tag }}

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}

- name: Install musl tools (Linux)
if: matrix.target == 'x86_64-unknown-linux-musl'
run: sudo apt-get update && sudo apt-get install -y musl-tools

- name: Build release binary
run: cargo build --release --target ${{ matrix.target }}

- name: Package (unix)
if: matrix.archive == 'tar.gz'
run: |
cd target/${{ matrix.target }}/release
tar czf "../../../gitkit-${{ needs.create-tag.outputs.tag }}-${{ matrix.target }}.tar.gz" gitkit
cd ../../..

- name: Package (windows)
if: matrix.archive == 'zip'
shell: pwsh
run: |
cd target/${{ matrix.target }}/release
Compress-Archive -Path gitkit.exe -DestinationPath "../../../gitkit-${{ needs.create-tag.outputs.tag }}-${{ matrix.target }}.zip"
cd ../../..

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: gitkit-${{ matrix.target }}
path: gitkit-${{ needs.create-tag.outputs.tag }}-${{ matrix.target }}.*

github-release:
name: Create GitHub Release
needs: [create-tag, build]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: true

- name: Create release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.create-tag.outputs.tag }}
generate_release_notes: true
files: artifacts/*

approve:
name: Awaiting Manual Approval
needs: github-release
runs-on: ubuntu-latest
environment:
name: production
steps:
- name: Approval granted
run: echo "Release approved for publishing to crates.io"

ensure-owners:
name: Ensure crates.io owners
needs: create-tag
if: needs.create-tag.outputs.created == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.create-tag.outputs.tag }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Add crates.io owners (best-effort)
env:
TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
OWNERS: github:univerlab:owners
run: |
set -eu
if [ -z "$TOKEN" ]; then
echo "No cargo token found in CARGO_REGISTRY_TOKEN; skipping owners update"
exit 0
fi
CRATE_NAME=$(grep '^name = ' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/' | tr -d '\r')
echo "crate=$CRATE_NAME"
for owner in $(echo "$OWNERS" | tr ',' ' '); do
echo "Adding owner: $owner"
cargo owner --token "$TOKEN" --add "$owner" || echo "cargo owner failed for $owner (continuing)"
done

publish:
name: Publish to crates.io
needs: [create-tag, approve, ensure-owners]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.create-tag.outputs.tag }}

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Check if stable release
id: version_check
run: |
VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/' | xargs)
if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "is_stable=true" >> $GITHUB_OUTPUT
echo "Version $VERSION is stable — will publish"
else
echo "is_stable=false" >> $GITHUB_OUTPUT
echo "Version $VERSION is prerelease/dev — skipping publish"
fi

- name: Cargo publish
if: steps.version_check.outputs.is_stable == 'true'
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cargo publish --allow-dirty

- name: Skipped prerelease
if: steps.version_check.outputs.is_stable == 'false'
run: echo "⏭️ Skipped crates.io publish for prerelease version"
uses: UniverLab/workflows/.github/workflows/rust-release.yml@main
with:
binary-name: gitkit
secrets: inherit
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
/target
Cargo.lock
*.swp
*.swo
*~
Expand All @@ -18,3 +17,5 @@ skills-lock.json
# already existing elements were commented out

#/target
*.mp4
.mimocode/
Loading
Loading