diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c21664a..8113083 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "name": "devopster-cli", + "name": "devopster", "build": { "dockerfile": "../Dockerfile", "target": "devcontainer", diff --git a/.github/workflows/auto-fill-pr.yml b/.github/workflows/auto-fill-pr.yml index 8ae9149..68d3ccd 100644 --- a/.github/workflows/auto-fill-pr.yml +++ b/.github/workflows/auto-fill-pr.yml @@ -28,9 +28,11 @@ jobs: # ── Commits ── COMMITS=$(git log --pretty=format:"- %s" "${BASE_SHA}..${HEAD_SHA}" 2>/dev/null || echo "- (unable to read commits)") - echo "commits<> "$GITHUB_OUTPUT" - echo "$COMMITS" >> "$GITHUB_OUTPUT" - echo "EOF_COMMITS" >> "$GITHUB_OUTPUT" + { + echo "commits<> "$GITHUB_OUTPUT" # ── Diff stat ── DIFFSTAT=$(git diff --stat "${BASE_SHA}..${HEAD_SHA}" 2>/dev/null | tail -1 || echo "") @@ -49,7 +51,7 @@ jobs: DIRS=$(echo "$DIR_FILES" | sed 's|/.*||' | sort -u) while IFS= read -r dir; do [ -z "$dir" ] && continue - COUNT=$(echo "$DIR_FILES" | grep "^${dir}/" | wc -l | tr -d ' ') + COUNT=$(echo "$DIR_FILES" | grep -c "^${dir}/" | tr -d ' ') NAMES=$(echo "$DIR_FILES" | grep "^${dir}/" | sed "s|^${dir}/||" | head -8 | tr '\n' ', ' | sed 's/,$//' | sed 's/,/, /g') FILE_SUMMARY="${FILE_SUMMARY}- \`${dir}/\`: ${COUNT} file(s) — ${NAMES}"$'\n' done <<< "$DIRS" @@ -65,9 +67,11 @@ jobs: TOTAL=$(echo "$FILES" | wc -l | tr -d ' ') FILE_SUMMARY="${FILE_SUMMARY}- **Total:** ${TOTAL} file(s)" fi - echo "files<> "$GITHUB_OUTPUT" - echo "$FILE_SUMMARY" >> "$GITHUB_OUTPUT" - echo "EOF_FILES" >> "$GITHUB_OUTPUT" + { + echo "files<> "$GITHUB_OUTPUT" # ── Linked issues ── ISSUES=$(git log --pretty=format:"%s %b" "${BASE_SHA}..${HEAD_SHA}" 2>/dev/null \ @@ -77,9 +81,11 @@ jobs: # ── Compact diff for AI (truncated to 12000 chars to fit context) ── DIFF=$(git diff "${BASE_SHA}..${HEAD_SHA}" -- . ':!package-lock.json' ':!*.svg' 2>/dev/null | head -c 12000 || echo "") - echo "diff<> "$GITHUB_OUTPUT" - echo "$DIFF" >> "$GITHUB_OUTPUT" - echo "EOF_DIFF" >> "$GITHUB_OUTPUT" + { + echo "diff<> "$GITHUB_OUTPUT" - name: Generate AI summary id: ai @@ -287,6 +293,9 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | + cat > pr_body.md <<'EOF_PR_BODY' + ${{ steps.ai.outputs.body }} + EOF_PR_BODY gh pr edit "${{ github.event.pull_request.number }}" \ --repo "${{ github.repository }}" \ - --body "${{ steps.ai.outputs.body }}" \ No newline at end of file + --body-file pr_body.md \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a6b717f..9dc50b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,6 @@ on: - "src-tauri/**" - "frontend/**" - "Dockerfile" - - ".github/workflows/ci.yml" pull_request: paths: - "Cargo.toml" @@ -21,7 +20,9 @@ on: - "src-tauri/**" - "frontend/**" - "Dockerfile" - - ".github/workflows/ci.yml" + workflow_dispatch: + schedule: + - cron: '30 3 * * *' concurrency: group: ci-${{ github.ref }} @@ -29,7 +30,7 @@ concurrency: jobs: quick-rust-check: - if: github.event_name == 'pull_request' + if: github.event_name == 'pull_request' || github.ref_name == 'test' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -45,7 +46,7 @@ jobs: run: cargo clippy --all-targets --all-features -- -D warnings container-preflight: - if: github.event_name != 'pull_request' + if: (github.event_name == 'push' && github.ref_name == 'main') || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -55,14 +56,14 @@ jobs: run: | docker buildx build \ --target devcontainer \ - --tag devopster-cli-devcontainer \ + --tag devopster-devcontainer \ --cache-from type=gha,scope=devcontainer \ --cache-to type=gha,mode=max,scope=devcontainer \ --load \ . - name: Run build in container - run: docker run --rm -w /workspaces/devopster-cli devopster-cli-devcontainer cargo build --locked + run: docker run --rm -w /workspaces/devopster devopster-devcontainer cargo build --locked - name: Run tests in container - run: docker run --rm -w /workspaces/devopster-cli devopster-cli-devcontainer cargo test --locked + run: docker run --rm -w /workspaces/devopster devopster-devcontainer cargo test --locked - name: Run lint in container - run: docker run --rm -w /workspaces/devopster-cli devopster-cli-devcontainer cargo clippy --all-targets --all-features -- -D warnings + run: docker run --rm -w /workspaces/devopster devopster-devcontainer cargo clippy --all-targets --all-features -- -D warnings diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index 6d36287..f3aeae1 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -8,7 +8,6 @@ on: paths: - "docs/**" - "assets/**" - - ".github/workflows/deploy-pages.yml" workflow_dispatch: permissions: diff --git a/.github/workflows/desktop-app.yml b/.github/workflows/desktop-app.yml index a005ae6..7cc05c0 100644 --- a/.github/workflows/desktop-app.yml +++ b/.github/workflows/desktop-app.yml @@ -18,7 +18,6 @@ on: - "src-tauri/**" - "frontend/**" - "assets/**" - - ".github/workflows/desktop-app.yml" push: tags: - "v*" @@ -42,13 +41,68 @@ concurrency: cancel-in-progress: true jobs: + pr-fast-check: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-unknown-linux-gnu + + - name: Linux deps for Tauri smoke check + run: | + sudo apt-get update + sudo apt-get install -y \ + libglib2.0-dev \ + libgtk-3-dev \ + libwebkit2gtk-4.1-dev \ + libsoup-3.0-dev \ + pkg-config + + - name: Cache Rust build artifacts + uses: Swatinem/rust-cache@v2 + with: + shared-key: pr-fast-x86_64-unknown-linux-gnu + workspaces: | + . -> target + src-tauri -> target + + - name: Build + run: cargo build --locked + + - name: Test + run: cargo test --locked + + - name: Lint + run: cargo clippy --all-targets --all-features -- -D warnings + + - name: Tauri smoke compile + run: cargo check --manifest-path src-tauri/Cargo.toml + build: + if: github.event_name != 'pull_request' name: ${{ matrix.label }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - include: ${{ fromJSON(github.event_name == 'pull_request' && '[{"label":"linux-x64","os":"ubuntu-latest","target":"x86_64-unknown-linux-gnu"}]' || '[{"label":"macos-arm64","os":"macos-14","target":"aarch64-apple-darwin"},{"label":"macos-x64","os":"macos-13","target":"x86_64-apple-darwin"},{"label":"linux-x64","os":"ubuntu-latest","target":"x86_64-unknown-linux-gnu"},{"label":"windows-x64","os":"windows-latest","target":"x86_64-pc-windows-msvc"}]') }} + include: + - label: macos-arm64 + os: macos-14 + target: aarch64-apple-darwin + - label: macos-x64 + os: macos-latest + target: x86_64-apple-darwin + - label: linux-x64 + os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - label: windows-x64 + os: windows-latest + target: x86_64-pc-windows-msvc steps: - name: Checkout @@ -72,7 +126,10 @@ jobs: build-essential \ curl \ wget \ - file + file \ + libglib2.0-dev \ + libgio2.0-cil-dev \ + pkg-config - name: Cache Rust build artifacts uses: Swatinem/rust-cache@v2 @@ -211,7 +268,7 @@ jobs: echo "No macOS app bundle or DMG directory to repack." exit 0 fi - APP_PATH=$(ls "$APP_DIR"/*.app 2>/dev/null | head -n 1 || true) + APP_PATH=$(find "$APP_DIR" -maxdepth 1 -name '*.app' | head -n 1 || true) if [ -z "$APP_PATH" ]; then echo "No .app bundle found to repack." exit 0 @@ -221,12 +278,16 @@ jobs: [ -f "$dmg" ] || continue echo "Repacking DMG with signed app: $dmg" RW_DIR="$(mktemp -d /tmp/devopster-dmg-rw-XXXXXX)" + if [ -z "$RW_DIR" ] || [ ! -d "$RW_DIR" ]; then + echo "RW_DIR was not set or directory does not exist. Aborting." + exit 1 + fi RW_DMG="$RW_DIR/rw-image.dmg" hdiutil convert -format UDRW -o "$RW_DMG" "$dmg" MOUNT=$(hdiutil attach -nobrowse "$RW_DMG" | awk '/Volumes/ {print $3; exit}') if [ -z "$MOUNT" ]; then echo "Failed to mount writable DMG." - rm -rf "$RW_DIR" + rm -rf "${RW_DIR:?}" exit 1 fi rm -rf "$MOUNT/$APP_NAME" @@ -234,7 +295,7 @@ jobs: sync hdiutil detach "$MOUNT" hdiutil convert -format UDZO -o "$dmg" -ov "$RW_DMG" - rm -rf "$RW_DIR" + rm -rf "${RW_DIR:?}" done - name: Verify DMG contains signed app @@ -341,13 +402,13 @@ jobs: fi CLI_ROOT="target/${{ matrix.target }}/release" if [ "${{ runner.os }}" = "Linux" ] && [ -f "$CLI_ROOT/devopster" ]; then - tar -czf dist/devopster-cli-linux-x86_64.tar.gz -C "$CLI_ROOT" devopster + tar -czf dist/devopster-linux-x86_64.tar.gz -C "$CLI_ROOT" devopster elif [ "${{ runner.os }}" = "Windows" ] && [ -f "$CLI_ROOT/devopster.exe" ]; then - cp "$CLI_ROOT/devopster.exe" dist/devopster-cli-windows-x86_64.exe + cp "$CLI_ROOT/devopster.exe" dist/devopster-windows-x86_64.exe elif [ "${{ matrix.target }}" = "aarch64-apple-darwin" ] && [ -f "$CLI_ROOT/devopster" ]; then - tar -czf dist/devopster-cli-macos-arm64.tar.gz -C "$CLI_ROOT" devopster + tar -czf dist/devopster-macos-arm64.tar.gz -C "$CLI_ROOT" devopster elif [ "${{ matrix.target }}" = "x86_64-apple-darwin" ] && [ -f "$CLI_ROOT/devopster" ]; then - tar -czf dist/devopster-cli-macos-x86_64.tar.gz -C "$CLI_ROOT" devopster + tar -czf dist/devopster-macos-x86_64.tar.gz -C "$CLI_ROOT" devopster fi ls -la dist || true @@ -403,14 +464,14 @@ jobs: |---|---|---| | **macOS** | `*.dmg` | Recommended. Drag `DevOpster.app` to `/Applications` or `~/Applications` | | **macOS** | `*.app.tar.gz` | Advanced/manual extraction | - | **macOS CLI** | `devopster-cli-macos-*.tar.gz` | Extract and run `./devopster` | + | **macOS CLI** | `devopster-macos-*.tar.gz` | Extract and run `./devopster` | | **Windows** | `*-setup.exe` | Recommended NSIS installer | | **Windows** | `*.msi` | MSI deployment/install option | - | **Windows CLI** | `devopster-cli-windows-x86_64.exe` | Run directly from terminal/PowerShell | + | **Windows CLI** | `devopster-windows-x86_64.exe` | Run directly from terminal/PowerShell | | **Linux** | `*.AppImage` | `chmod +x DevOpster*.AppImage && ./DevOpster*.AppImage` | | **Linux** | `*.deb` | `sudo apt install ./DevOpster*.deb` | | **Linux** | `*.rpm` | `sudo rpm -i DevOpster*.rpm` | - | **Linux CLI** | `devopster-cli-linux-x86_64.tar.gz` | Extract and run `./devopster` | + | **Linux CLI** | `devopster-linux-x86_64.tar.gz` | Extract and run `./devopster` | ### macOS trust and verification diff --git a/.github/workflows/use-visitor-counter.yml b/.github/workflows/use-visitor-counter.yml index 3baaf96..c049ec8 100644 --- a/.github/workflows/use-visitor-counter.yml +++ b/.github/workflows/use-visitor-counter.yml @@ -49,7 +49,7 @@ jobs: TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | BRANCH="${{ github.ref_name }}" - git remote set-url origin https://x-access-token:${TOKEN}@github.com/${{ github.repository }} + git remote set-url origin "https://x-access-token:${TOKEN}@github.com/${GITHUB_REPOSITORY}" HAS_CHANGES=false if ! git diff --quiet || ! git diff --cached --quiet || [ -n "$(git ls-files --others --exclude-standard)" ]; then HAS_CHANGES=true diff --git a/.github/workflows/workflow-lint.yml b/.github/workflows/workflow-lint.yml new file mode 100644 index 0000000..4b00bf6 --- /dev/null +++ b/.github/workflows/workflow-lint.yml @@ -0,0 +1,30 @@ +name: Workflow Lint + +on: + pull_request: + paths: + - ".github/workflows/**" + push: + branches: + - main + - test + paths: + - ".github/workflows/**" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: workflow-lint-${{ github.ref }} + cancel-in-progress: true + +jobs: + actionlint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Run actionlint + uses: rhysd/actionlint@v1.7.12 diff --git a/.gitignore b/.gitignore index c4e40f7..698bfc0 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ Thumbs.db # Editor and local workspace files .idea/ .fleet/ +.vscode/ # Container and temporary files *.tmp diff --git a/Cargo.lock b/Cargo.lock index 2a3dfe2..31f24d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -181,7 +181,7 @@ dependencies = [ ] [[package]] -name = "devopster-cli" +name = "devopster" version = "0.1.0" dependencies = [ "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 49f040b..b0f0efe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,10 @@ [package] -name = "devopster-cli" +name = "devopster" version = "0.1.0" edition = "2021" description = "Cross-platform GitOps CLI for managing organization repositories across GitHub, Azure DevOps, and GitLab." license = "AGPL-3.0-or-later" -repository = "https://github.com/MicrosoftCloudEssentials-LearningHub/devopster-cli" +repository = "https://github.com/Cloud2BR/devopster" rust-version = "1.85" [[bin]] diff --git a/DEPLOYMENT_STRATEGY.md b/DEPLOYMENT_STRATEGY.md index 9322169..8430682 100644 --- a/DEPLOYMENT_STRATEGY.md +++ b/DEPLOYMENT_STRATEGY.md @@ -6,22 +6,22 @@ This document outlines the deployment strategy for DevOpster, using GitHub Pages | Branch | Environment | Purpose | URL | |--------|-------------|---------|-----| -| `main` | **Production** | Stable, production-ready release | `https://cloud2br.github.io/devopster-cli/` | -| `test` | **Testing** | Pre-release, testing, and staging | `https://cloud2br.github.io/devopster-cli/test/` | +| `main` | **Production** | Stable, production-ready release | `https://cloud2br.github.io/devopster/` | +| `test` | **Testing** | Pre-release, testing, and staging | `https://cloud2br.github.io/devopster/test/` | ## Deployment Flow ### Main Branch (Production) - **Trigger**: Push to `main` branch - **Deployment Target**: Root of GitHub Pages -- **URL**: `https://cloud2br.github.io/devopster-cli/` +- **URL**: `https://cloud2br.github.io/devopster/` - **Use Case**: Production-ready releases, stable documentation, and validated features - **Review**: Requires Pull Request review before merge to main ### Test Branch (Testing) - **Trigger**: Push to `test` branch - **Deployment Target**: `/test/` subdirectory of GitHub Pages -- **URL**: `https://cloud2br.github.io/devopster-cli/test/` +- **URL**: `https://cloud2br.github.io/devopster/test/` - **Use Case**: Pre-release testing, experimental features, and staging validations - **Review**: Can accept direct pushes or PRs for rapid iteration diff --git a/Dockerfile b/Dockerfile index c32de6f..49d40a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,7 +38,7 @@ RUN ARCH=$(dpkg --print-architecture) \ && dpkg -i /tmp/glab.deb \ && rm /tmp/glab.deb -WORKDIR /workspaces/devopster-cli +WORKDIR /workspaces/devopster COPY . . RUN cargo fetch diff --git a/README.md b/README.md index e013975..da88f7d 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,9 @@ Releases are built by the **Unified App Release (CLI + GUI)** workflow. Current release outputs include: -- macOS: `DevOpster__arm64.dmg`, `DevOpster__arm64.app.tar.gz`, `devopster-cli-macos-arm64.tar.gz` (plus Intel variants when enabled) -- Windows: `DevOpster__x64-setup.exe`, `DevOpster__x64_en-US.msi`, `devopster-cli-windows-x86_64.exe` -- Linux: `DevOpster__amd64.deb`, `DevOpster__amd64.AppImage`, `DevOpster--1.x86_64.rpm`, `devopster-cli-linux-x86_64.tar.gz` +- macOS: `DevOpster__arm64.dmg`, `DevOpster__arm64.app.tar.gz`, `devopster-macos-arm64.tar.gz` (plus Intel variants when enabled) +- Windows: `DevOpster__x64-setup.exe`, `DevOpster__x64_en-US.msi`, `devopster-windows-x86_64.exe` +- Linux: `DevOpster__amd64.deb`, `DevOpster__amd64.AppImage`, `DevOpster--1.x86_64.rpm`, `devopster-linux-x86_64.tar.gz` DevOpster publishes one unified release stream (`v*` tags or manual dispatch with publish enabled) that includes both GUI installers and standalone CLI artifacts. Download from GitHub Releases and choose either the desktop installer (`.dmg`, `-setup.exe`/`.msi`, `.deb`/`.AppImage`/`.rpm`) or the standalone CLI artifact for your platform. @@ -93,8 +93,8 @@ Documentation and install guides are deployed to GitHub Pages with a dual-enviro | Branch | Environment | URL | |--------|-------------|-----| -| `main` | **Production** | https://cloud2br.github.io/devopster-cli/ | -| `test` | **Testing** | https://cloud2br.github.io/devopster-cli/test/ | +| `main` | **Production** | https://cloud2br.github.io/devopster/ | +| `test` | **Testing** | https://cloud2br.github.io/devopster/test/ | **Deployment Flow:** - **Main branch** (production): Merged, tested, production-ready documentation. Deployed to root. diff --git a/docs/assets/releases/latest.json b/docs/assets/releases/latest.json index 14f67d2..44ba27d 100644 --- a/docs/assets/releases/latest.json +++ b/docs/assets/releases/latest.json @@ -8,32 +8,32 @@ { "name": "DevOpster_0.1.0_aarch64.dmg", "size": 9011724, - "browser_download_url": "https://github.com/Cloud2BR/devopster-cli/releases/download/desktop-v0.1.0/DevOpster_0.1.0_aarch64.dmg" + "browser_download_url": "https://github.com/Cloud2BR/devopster/releases/download/desktop-v0.1.0/DevOpster_0.1.0_aarch64.dmg" }, { "name": "DevOpster_0.1.0_x64-setup.exe", "size": 4718592, - "browser_download_url": "https://github.com/Cloud2BR/devopster-cli/releases/download/desktop-v0.1.0/DevOpster_0.1.0_x64-setup.exe" + "browser_download_url": "https://github.com/Cloud2BR/devopster/releases/download/desktop-v0.1.0/DevOpster_0.1.0_x64-setup.exe" }, { "name": "DevOpster_0.1.0_x64_en-US.msi", "size": 6815744, - "browser_download_url": "https://github.com/Cloud2BR/devopster-cli/releases/download/desktop-v0.1.0/DevOpster_0.1.0_x64_en-US.msi" + "browser_download_url": "https://github.com/Cloud2BR/devopster/releases/download/desktop-v0.1.0/DevOpster_0.1.0_x64_en-US.msi" }, { "name": "DevOpster_0.1.0_amd64.AppImage", "size": 79913984, - "browser_download_url": "https://github.com/Cloud2BR/devopster-cli/releases/download/desktop-v0.1.0/DevOpster_0.1.0_amd64.AppImage" + "browser_download_url": "https://github.com/Cloud2BR/devopster/releases/download/desktop-v0.1.0/DevOpster_0.1.0_amd64.AppImage" }, { "name": "DevOpster_0.1.0_amd64.deb", "size": 7549952, - "browser_download_url": "https://github.com/Cloud2BR/devopster-cli/releases/download/desktop-v0.1.0/DevOpster_0.1.0_amd64.deb" + "browser_download_url": "https://github.com/Cloud2BR/devopster/releases/download/desktop-v0.1.0/DevOpster_0.1.0_amd64.deb" }, { "name": "DevOpster-0.1.0-1.x86_64.rpm", "size": 7549952, - "browser_download_url": "https://github.com/Cloud2BR/devopster-cli/releases/download/desktop-v0.1.0/DevOpster-0.1.0-1.x86_64.rpm" + "browser_download_url": "https://github.com/Cloud2BR/devopster/releases/download/desktop-v0.1.0/DevOpster-0.1.0-1.x86_64.rpm" } ] } diff --git a/docs/index.html b/docs/index.html index afb12ea..0390918 100644 --- a/docs/index.html +++ b/docs/index.html @@ -17,7 +17,7 @@ - + @@ -33,8 +33,8 @@ - - + + @@ -43,7 +43,7 @@ - + @@ -775,11 +775,11 @@

DevOpster

@@ -910,7 +910,7 @@

macOS

Best for end users who want the normal drag-to-Applications install flow.

- Download for macOS + Download for macOS
Gatekeeper: if macOS shows "Not Opened", open System Settings → Privacy & Security and click Open Anyway, then open the DMG again. @@ -935,7 +935,7 @@

Windows

Best for Windows users who want a normal installer. The EXE or MSI installs DevOpster into the usual Windows location and adds the normal shortcuts.

- Download for Windows + Download for Windows

SmartScreen: if Windows shows a warning, click More info and then Run anyway. After setup finishes, launch DevOpster from the Start menu or desktop shortcut. @@ -957,7 +957,7 @@

Linux

Choose the package style that matches your distro and whether you want a portable build.

- Download for Linux + Download for Linux

Linux tip: AppImage builds usually need chmod +x before running. DEB builds install cleanly with sudo apt install ./file.deb. RPM: sudo rpm -i ./file.rpm. @@ -1049,7 +1049,7 @@

Quick start

  • Clone and bootstrap -
    git clone https://github.com/Cloud2BR/devopster-cli.git && cd devopster-cli && devopster dev-env
    +
    git clone https://github.com/Cloud2BR/devopster.git && cd devopster && devopster dev-env
  • @@ -1137,7 +1137,7 @@

    Owner / Organization

    @@ -1284,7 +1284,7 @@

    Owner / Organization

    }) .catch(function () { // Fallback to live API in case snapshot is unavailable. - return fetch('https://api.github.com/repos/Cloud2BR/devopster-cli/releases?per_page=20', { cache: 'no-store' }) + return fetch('https://api.github.com/repos/Cloud2BR/devopster/releases?per_page=20', { cache: 'no-store' }) .then(function (r) { return r.ok ? r.json() : Promise.reject(new Error('Release API failed')); }) .then(function (releases) { var rel = selectPreferredRelease(releases); @@ -1293,7 +1293,7 @@

    Owner / Organization

    }) .catch(function () { if (statusEl) { - statusEl.innerHTML = 'No release artifacts found yet. Open GitHub Releases.'; + statusEl.innerHTML = 'No release artifacts found yet. Open GitHub Releases.'; } }); diff --git a/docs/site.webmanifest b/docs/site.webmanifest index c174573..1e9038a 100644 --- a/docs/site.webmanifest +++ b/docs/site.webmanifest @@ -2,9 +2,9 @@ "name": "DevOpster", "short_name": "DevOpster", "description": "Cross-platform DevOps CLI and desktop app for repository governance across GitHub, Azure DevOps, and GitLab.", - "id": "/devopster-cli/", - "start_url": "/devopster-cli/", - "scope": "/devopster-cli/", + "id": "/devopster/", + "start_url": "/devopster/", + "scope": "/devopster/", "display": "standalone", "background_color": "#001d4a", "theme_color": "#001d4a", diff --git a/frontend/index.html b/frontend/index.html index 0e3534d..a842fd2 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -38,7 +38,7 @@ diff --git a/scripts/container.sh b/scripts/container.sh index bc3fdba..fedebe5 100755 --- a/scripts/container.sh +++ b/scripts/container.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash set -euo pipefail -IMAGE_DEVCONTAINER="devopster-cli-devcontainer" -IMAGE_DEV="devopster-cli-dev" -WORKDIR="/workspaces/devopster-cli" +IMAGE_DEVCONTAINER="devopster-devcontainer" +IMAGE_DEV="devopster-dev" +WORKDIR="/workspaces/devopster" usage() { cat <<'EOF' diff --git a/scripts/install-macos-app.sh b/scripts/install-macos-app.sh index c5ce8ca..472ed3f 100755 --- a/scripts/install-macos-app.sh +++ b/scripts/install-macos-app.sh @@ -12,8 +12,8 @@ Usage: Examples: ./install-macos-app.sh ./install-macos-app.sh "$HOME/Downloads/DevOpster__.dmg" - ./install-macos-app.sh "/Volumes/devopster-cli/DevOpster.app" - ./install-macos-app.sh "/Volumes/devopster-cli/DevOpster.app" "$HOME/Applications" + ./install-macos-app.sh "/Volumes/devopster/DevOpster.app" + ./install-macos-app.sh "/Volumes/devopster/DevOpster.app" "$HOME/Applications" Behavior: - SOURCE_APP_PATH can be a mounted DevOpster.app path or a .dmg file. diff --git a/scripts/setup.ps1 b/scripts/setup.ps1 index 8d718d6..ccae021 100644 --- a/scripts/setup.ps1 +++ b/scripts/setup.ps1 @@ -114,7 +114,7 @@ if ($LASTEXITCODE -ne 0) { # ── Build image and open shell ──────────────────────────────────────────────── Write-Info "Building devopster container image..." -docker build --target dev -t devopster-cli-dev . +docker build --target dev -t devopster-dev . $openFile = Join-Path $PWD.Path '.devopster_open_url' $browserJob = Start-BrowserWatcher -Path $openFile @@ -146,9 +146,9 @@ Write-Success 'Starting Docker runtime.' try { $dockerArgs += @( '-v', "${env:USERPROFILE}\.config\devopster:/root/.config/devopster", - '-v', "${PWD}:/workspaces/devopster-cli", - '-w', '/workspaces/devopster-cli', - 'devopster-cli-dev' + '-v', "${PWD}:/workspaces/devopster", + '-w', '/workspaces/devopster', + 'devopster-dev' ) + $dockerCommand & docker @dockerArgs diff --git a/scripts/setup.sh b/scripts/setup.sh index 3c34a0d..c8852b8 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -93,7 +93,7 @@ success "Docker ready: $(docker --version)" # ── Build image ────────────────────────────────────────────────────────────── info "Building devopster container image..." -docker build --target dev -t devopster-cli-dev . +docker build --target dev -t devopster-dev . # ── Host browser proxy ─────────────────────────────────────────────────────── # devopster writes a URL to .devopster_open_url (inside the mounted workspace) @@ -146,7 +146,7 @@ fi success "Starting Docker runtime — browser links will still open on the host when needed." docker "${docker_args[@]}" \ -v "$HOME/.config/devopster:/root/.config/devopster" \ - -v "$(pwd):/workspaces/devopster-cli" \ - -w /workspaces/devopster-cli \ - devopster-cli-dev \ + -v "$(pwd):/workspaces/devopster" \ + -w /workspaces/devopster \ + devopster-dev \ "${docker_command[@]}" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 05a48fc..ea78d6d 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,4 +1,4 @@ -# Standalone package (not part of the root devopster-cli workspace). +# Standalone package (not part of the root devopster workspace). # Building this app does not require building the CLI crate as a workspace member; # the CLI is supplied as a sidecar binary at runtime. [workspace] @@ -9,7 +9,7 @@ version = "0.1.0" edition = "2021" description = "DevOpster desktop application (Tauri shell around the devopster CLI)." license = "AGPL-3.0-or-later" -repository = "https://github.com/Cloud2BR/devopster-cli" +repository = "https://github.com/Cloud2BR/devopster" rust-version = "1.85" [lib] diff --git a/src-tauri/README.md b/src-tauri/README.md index 53256c2..2543a8e 100644 --- a/src-tauri/README.md +++ b/src-tauri/README.md @@ -31,11 +31,12 @@ by `tauri.conf.json`. ## Build the sidecar + The desktop app expects a `devopster` binary alongside it. For local dev, build the CLI from the workspace root: ```bash -cargo build -p devopster-cli --release +cargo build -p devopster --release ``` Then copy it where Tauri expects the sidecar (per target triple): diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 397fe15..e7d57e8 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -40,7 +40,7 @@ "longDescription": "Cross-platform desktop app for repository governance across GitHub, Azure DevOps, and GitLab.", "copyright": "Copyright (c) 2026 Cloud2BR", "publisher": "Cloud2BR", - "homepage": "https://cloud2br.github.io/devopster-cli/", + "homepage": "https://cloud2br.github.io/devopster/", "externalBin": ["binaries/devopster"], "macOS": { "minimumSystemVersion": "10.15", diff --git a/src/ai/mod.rs b/src/ai/mod.rs index f10dbff..97a0e48 100644 --- a/src/ai/mod.rs +++ b/src/ai/mod.rs @@ -45,7 +45,7 @@ struct ChatChoice { fn make_client() -> Result { Client::builder() - .user_agent("devopster-cli/0.1") + .user_agent("devopster/0.1") .build() .context("failed to build HTTP client") } @@ -57,8 +57,8 @@ async fn copilot_token(github_token: &str) -> Option { let resp = client .get(TOKEN_EXCHANGE_URL) .header("Authorization", format!("token {github_token}")) - .header("Editor-Version", "devopster-cli/0.1") - .header("Editor-Plugin-Version", "devopster-cli/0.1") + .header("Editor-Version", "devopster/0.1") + .header("Editor-Plugin-Version", "devopster/0.1") .send() .await .ok()?; @@ -77,7 +77,7 @@ async fn complete(token: &str, system: &str, user: &str) -> Result { let resp = client .post(COMPLETIONS_URL) .header("Authorization", format!("Bearer {token}")) - .header("Copilot-Integration-Id", "devopster-cli") + .header("Copilot-Integration-Id", "devopster") .json(&ChatRequest { model: "gpt-4o".into(), messages: vec![ diff --git a/src/cli/container_runtime.rs b/src/cli/container_runtime.rs index f0da967..05146c6 100644 --- a/src/cli/container_runtime.rs +++ b/src/cli/container_runtime.rs @@ -35,7 +35,7 @@ pub fn build_dev_image(image: &str) -> Result<()> { pub fn run_in_dev_container(image: &str, command: &str, interactive: bool) -> Result<()> { let current_dir = env::current_dir().context("failed to read current directory")?; let current_dir = current_dir.to_string_lossy().to_string(); - let container_workspace = "/workspaces/devopster-cli"; + let container_workspace = "/workspaces/devopster"; let home = env::var("HOME") .or_else(|_| env::var("USERPROFILE")) .context("could not resolve HOME/USERPROFILE for config mount")?; diff --git a/src/cli/dev.rs b/src/cli/dev.rs index d9625f5..441a56d 100644 --- a/src/cli/dev.rs +++ b/src/cli/dev.rs @@ -10,7 +10,7 @@ pub struct DevCommand { pub action: DevAction, /// Docker image tag used for containerized developer tasks - #[arg(long, default_value = "devopster-cli-dev")] + #[arg(long, default_value = "devopster-dev")] pub image: String, /// Skip rebuilding the container image before executing task(s) diff --git a/src/cli/dev_env.rs b/src/cli/dev_env.rs index 0ddb7fa..38ca21c 100644 --- a/src/cli/dev_env.rs +++ b/src/cli/dev_env.rs @@ -7,7 +7,7 @@ use crate::ui; #[derive(Debug, Args)] pub struct DevEnvCommand { /// Docker image tag used for the local developer container - #[arg(long, default_value = "devopster-cli-dev")] + #[arg(long, default_value = "devopster-dev")] pub image: String, /// Skip rebuilding the container image before launch diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 6ec3285..09b95f0 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -189,7 +189,7 @@ async fn run_interactive_launcher(config_path: &str) -> Result<()> { 0 => { run_command( Commands::DevEnv(dev_env::DevEnvCommand { - image: "devopster-cli-dev".to_string(), + image: "devopster-dev".to_string(), no_build: false, no_onboarding: false, }), @@ -201,7 +201,7 @@ async fn run_interactive_launcher(config_path: &str) -> Result<()> { run_command( Commands::Dev(dev::DevCommand { action: dev::DevAction::Verify, - image: "devopster-cli-dev".to_string(), + image: "devopster-dev".to_string(), no_build: false, }), config_path, diff --git a/src/provider/azure_devops.rs b/src/provider/azure_devops.rs index f26acae..99bce9d 100644 --- a/src/provider/azure_devops.rs +++ b/src/provider/azure_devops.rs @@ -218,7 +218,7 @@ fn build_client(config: &AzureDevOpsConfig) -> Result { Client::builder() .default_headers(headers) - .user_agent("devopster-cli") + .user_agent("devopster") .build() .context("failed to build Azure DevOps HTTP client") } diff --git a/src/provider/github.rs b/src/provider/github.rs index 154f878..ed363b1 100644 --- a/src/provider/github.rs +++ b/src/provider/github.rs @@ -533,7 +533,7 @@ fn build_client(config: &GitHubConfig) -> Result { Client::builder() .default_headers(headers) - .user_agent("devopster-cli") + .user_agent("devopster") .build() .context("failed to build GitHub HTTP client") } diff --git a/src/provider/gitlab.rs b/src/provider/gitlab.rs index c5c619e..7c2d8b1 100644 --- a/src/provider/gitlab.rs +++ b/src/provider/gitlab.rs @@ -347,7 +347,7 @@ fn build_client(config: &GitLabConfig) -> Result { Client::builder() .default_headers(headers) - .user_agent("devopster-cli") + .user_agent("devopster") .build() .context("failed to build GitLab HTTP client") }