diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index 798ee94c9..6f41be053 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -105,7 +105,7 @@ jobs: - QML: undefined refs, missing imports, binding loops, bindings that never update, handlers on the wrong object, raw Flickable/ListView/ScrollView instead of the D* wrappers (DFlickable, DListView, DGridView). - Deprecated shims: added code that uses a deprecated type or imports a deprecated module. Every shim calls `Deprecation.type(` or `Deprecation.module(`; list them with `git grep -h -e "Deprecation.type(" -e "Deprecation.module(" origin/${{ steps.pr.outputs.base }} -- quickshell`, which gives the old and new name. Grep the base, not HEAD, since a PR branched before the rename has no shims. Flag it even when the rest of the file still uses old names on the PR's base; suggest the new name and a rebase if the base predates it. - Security: command injection, path traversal, unsafe file permissions, secrets in code. - - CONTRIBUTING.md rules: user-facing strings in `I18n.tr()` with translator context, reuse existing terms from quickshell/translations/en.json; en.json and template.json must not be touched in a PR; mocks under core/internal/mocks/ are regenerated not hand-edited; new dank-qml-common contract properties need the matching library change. + - CONTRIBUTING.md rules: user-facing strings in `I18n.tr()` with translator context, reuse existing terms from quickshell/translations/en.json; en.json and template.json must not be touched in a PR; mocks under core/internal/mocks/ are regenerated not hand-edited; new dux-qml-common contract properties need the matching library change. Don't flag style or naming (deprecated shims are not naming), pre-existing issues, anything a linter or compiler catches, speculative input-dependent problems, missing tests or docs, or refactor ideas. Not sure it's real: don't post it. diff --git a/.github/workflows/common-parity.yml b/.github/workflows/common-parity.yml index cdef1cac4..dae614d51 100644 --- a/.github/workflows/common-parity.yml +++ b/.github/workflows/common-parity.yml @@ -1,10 +1,10 @@ -name: Sync flake.lock to dank-qml-common +name: Sync flake.lock to dux-qml-common on: workflow_dispatch: push: paths: - - "dank-qml-common" + - "dux-qml-common" branches: - master - "stable-*" @@ -35,7 +35,7 @@ jobs: - name: Point flake input at the submodule commit run: | set -euo pipefail - submodule_rev=$(git ls-tree HEAD dank-qml-common --object-only) + submodule_rev=$(git ls-tree HEAD dux-qml-common --object-only) flake_rev=$(python3 -c "import json; print(json.load(open('flake.lock'))['nodes']['dank-qml-common']['locked']['rev'])") [ "$submodule_rev" = "$flake_rev" ] && { echo "flake.lock already matches $submodule_rev"; exit 0; } nix flake lock --override-input dank-qml-common "github:duxlabs-dev/dux-qml-common/$submodule_rev" @@ -52,6 +52,6 @@ jobs: git config user.name "dux-ci[bot]" git config user.email "344434142+dux-ci[bot]@users.noreply.github.com" git add flake.lock - git commit -m "nix: sync flake.lock to dank-qml-common submodule" + git commit -m "nix: sync flake.lock to dux-qml-common submodule" git pull --rebase origin ${{ github.ref_name }} git push https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git HEAD:${{ github.ref_name }} diff --git a/.github/workflows/qml-tests.yml b/.github/workflows/qml-tests.yml index e7e0ea174..65da4be3f 100644 --- a/.github/workflows/qml-tests.yml +++ b/.github/workflows/qml-tests.yml @@ -4,7 +4,7 @@ on: push: paths: - "quickshell/**" - - "dank-qml-common" + - "dux-qml-common" - "Makefile" - "core/Makefile" - "scripts/shell-test-excludes.txt" @@ -16,7 +16,7 @@ on: branches: [master, main, "stable-*"] paths: - "quickshell/**" - - "dank-qml-common" + - "dux-qml-common" - "Makefile" - "core/Makefile" - "scripts/shell-test-excludes.txt" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5df61536d..f75d7af87 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -354,13 +354,13 @@ jobs: # Replace the DCommon symlink with real submodule content for packaging rm quickshell/DCommon - cp -r dank-qml-common/DCommon quickshell/DCommon + cp -r dux-qml-common/DCommon quickshell/DCommon # Create full source tarball (GitHub tag archives never contain submodule content) VERSION_NUM=${TAG#v} tar --exclude='.git' \ --exclude='.github' \ - --exclude='dank-qml-common' \ + --exclude='dux-qml-common' \ --exclude='_release_assets' \ --exclude='_core_assets' \ --exclude='RELEASE_BODY.md' \ diff --git a/.gitmodules b/.gitmodules index e99d025bc..7210f4821 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "dank-qml-common"] - path = dank-qml-common + path = dux-qml-common url = https://github.com/duxlabs-dev/dux-qml-common.git branch = master diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 04886e5d2..0565cae48 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: entry: python3 quickshell/tests/run-qml.py language: system types: [] - files: ^(quickshell/|dank-qml-common$|Makefile$|core/Makefile$|scripts/shell-test-excludes\.txt$|flake\.nix$|\.pre-commit-config\.yaml$|\.github/workflows/(qml-tests|prek)\.yml$) + files: ^(quickshell/|dux-qml-common$|Makefile$|core/Makefile$|scripts/shell-test-excludes\.txt$|flake\.nix$|\.pre-commit-config\.yaml$|\.github/workflows/(qml-tests|prek)\.yml$) pass_filenames: false require_serial: true - repo: local diff --git a/AGENTS.md b/AGENTS.md index 648e37b1e..e09d1917a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,7 +6,7 @@ DMS is an open-source desktop shell for Wayland compositors on linux, built to w - core/ - Go. `cmd/dms` runs quickshell, CLI utilities, and the unix socket server the UI depends on. `cmd/dankinstall` is a separate installer TUI. - quickshell/ - the entire UI: Common/ (singletons, Theme, settings), Services/ (system and core access), Modules/ (bar, dock, lock, ...), Modals/, Widgets/ (shell-specific widgets and deprecated Dank* shims), PLUGINS/, translations/ -- dank-qml-common/ - submodule of shared QML widgets +- dux-qml-common/ - submodule of shared QML widgets - docs/, distro/ - IPC and theme docs, packaging ## Rules diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c6e59bb87..1ba3d49e2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ To contribute fork this repository, make your changes, and open a pull request. ## Setup -Clone with submodules — the shared widget library ([dank-qml-common](https://github.com/duxlabs-dev/dux-qml-common)) is vendored at `dank-qml-common/` and symlinked into `quickshell/DCommon`: +Clone with submodules — the shared widget library ([dux-qml-common](https://github.com/duxlabs-dev/dux-qml-common)) is vendored at `dux-qml-common/` and symlinked into `quickshell/DCommon`: ```bash git clone --recurse-submodules https://github.com/duxlabs-dev/dux-shell.git @@ -60,12 +60,12 @@ The Go core depends on [dankgo](https://github.com/duxlabs-dev/dux-go) for loggi go work init ./core ../dankgo ``` -## Shared widgets (dank-qml-common) +## Shared widgets (dux-qml-common) -Everything under `quickshell/DCommon/` (core widgets, the file browser, scroll physics, bundled fonts) is shared across the DMS suite and lives in the `dank-qml-common` submodule. It is a normal git worktree: +Everything under `quickshell/DCommon/` (core widgets, the file browser, scroll physics, bundled fonts) is shared across the DMS suite and lives in the `dux-qml-common` submodule. It is a normal git worktree: -1. Edit files under `dank-qml-common/` (or through the `quickshell/DCommon` symlink — same files) and test in the running shell; hot reload works as usual. For isolated widget work, the library is its own runnable config with a gallery: `qs -c dank-qml-common`. -2. Commit and PR those changes in the `dank-qml-common` repo: `cd dank-qml-common && git switch -c my-change`, push, open the PR there. +1. Edit files under `dux-qml-common/` (or through the `quickshell/DCommon` symlink — same files) and test in the running shell; hot reload works as usual. For isolated widget work, the library is its own runnable config with a gallery: `qs -c dux-qml-common`. +2. Commit and PR those changes in the `dux-qml-common` repo: `cd dux-qml-common && git switch -c my-change`, push, open the PR there. 3. Once merged, bump the pointer here: `make update-common` (updates the submodule and the nix flake input together), then commit alongside any DMS-side changes. If you only bump the submodule, CI syncs `flake.lock` to it automatically on master. The submodule URL in `.gitmodules` is HTTPS so CI and anonymous clones keep working. To push over SSH instead of being prompted for credentials, add a push rewrite to your git config — fetches stay HTTPS, pushes use SSH: @@ -158,7 +158,7 @@ Preferably, try to keep new terms to a minimum and re-use existing terms where p Don't re-extract the translations. `en.json` and `template.json` are synced with POEditor by a maintainer script, so running `extract_translations.py` in your PR just makes a diff that fights the next sync. Add your `I18n.tr()` calls and leave the catalogs alone. (`settings_search_index.json` is the exception, the pre-commit hook regenerates that one when you touch settings QML.) -Strings inside `quickshell/DCommon/` are owned by the dux-qml-common repo but stay in the DMS POEditor project — extraction here deliberately skips them, and `scripts/i18nsync.py sync` uploads the union of app terms and the submodule's terms instead (common terms carry the `dank-qml-common` tag). On download the sync splits the exports: app translations go to `quickshell/translations/poexports/`, common translations go to `dank-qml-common/DCommon/translations/poexports/` for you to commit in that repo and bump. At runtime `I18n` merges both catalogs (app terms win). Other apps (dankcalendar) keep their own POEditor projects and merge the `dank-qml-common`-tagged terms from the DMS project. +Strings inside `quickshell/DCommon/` are owned by the dux-qml-common repo but stay in the DMS POEditor project — extraction here deliberately skips them, and `scripts/i18nsync.py sync` uploads the union of app terms and the submodule's terms instead (common terms carry the `dux-qml-common` tag). On download the sync splits the exports: app translations go to `quickshell/translations/poexports/`, common translations go to `dux-qml-common/DCommon/translations/poexports/` for you to commit in that repo and bump. At runtime `I18n` merges both catalogs (app terms win). Other apps (dankcalendar) keep their own POEditor projects and merge the `dux-qml-common`-tagged terms from the DMS project. ### GO (`core` directory) diff --git a/Makefile b/Makefile index d38a8e6fa..d728be3b8 100644 --- a/Makefile +++ b/Makefile @@ -46,10 +46,10 @@ lint-qml: test-qml: QMLTESTRUNNER="$(QMLTESTRUNNER)" python3 quickshell/tests/run-qml.py -# Pull the latest dank-qml-common and pin it everywhere it is consumed +# Pull the latest dux-qml-common and pin it everywhere it is consumed # (submodule pointer + nix flake input). Commit both in one change. update-common: - git submodule update --remote --merge dank-qml-common + git submodule update --remote --merge dux-qml-common nix --extra-experimental-features 'nix-command flakes' flake update dank-qml-common # Installation targets diff --git a/README.md b/README.md index 9f0e06338..cdd3c0e6f 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ DMS is one piece of the suite. The rest lives in its own repos: - [dankcalendar](https://github.com/duxlabs-dev/dux-calendar) - Local, Google, Microsoft, and CalDAV calendars for the Dux desktop. - [dgop](https://github.com/duxlabs-dev/dux-gop) - System monitoring TUI and Go library; its library powers the process list and dashboard widgets inside the dms daemon. - [dsearch](https://github.com/duxlabs-dev/dux-search) - Fast file search that powers file results in the launcher. -- [dank-qml-common](https://github.com/duxlabs-dev/dux-qml-common) - Shared QML widgets and components used by DMS, dank-greeter, and dankcalendar. +- [dux-qml-common](https://github.com/duxlabs-dev/dux-qml-common) - Shared QML widgets and components used by DMS, dank-greeter, and dankcalendar. - [dankgo](https://github.com/duxlabs-dev/dux-go) - Common Go modules behind the single binary apps. ## Development diff --git a/distro/fedora/dms-git.spec b/distro/fedora/dms-git.spec index c9319f8e7..5f960b498 100644 --- a/distro/fedora/dms-git.spec +++ b/distro/fedora/dms-git.spec @@ -29,8 +29,8 @@ VCS: {{{ git_repo_vcs }}} Source0: {{{ git_repo_pack }}} Source1: https://go.dev/dl/go%{go_toolchain_version}.linux-amd64.tar.gz Source2: https://go.dev/dl/go%{go_toolchain_version}.linux-arm64.tar.gz -# git_repo_pack archives skip submodule content, so pack dank-qml-common separately -Source3: {{{ git_pack path=$GIT_ROOT/dank-qml-common dir_name=dank-qml-common source_name=dank-qml-common.tar.gz }}} +# git_repo_pack archives skip submodule content, so pack dux-qml-common separately +Source3: {{{ git_pack path=$GIT_ROOT/dux-qml-common dir_name=dux-qml-common source_name=dux-qml-common.tar.gz }}} BuildRequires: git-core BuildRequires: gzip @@ -74,7 +74,7 @@ Provides native DBus bindings, NetworkManager integration, and system utilities. %prep {{{ git_repo_setup_macro }}} -rm -rf dank-qml-common +rm -rf dux-qml-common tar -xzf %{SOURCE3} test -e quickshell/DCommon/Widgets/DIcon.qml || { echo "DCommon missing after submodule unpack"; exit 1; } diff --git a/dank-qml-common b/dux-qml-common similarity index 100% rename from dank-qml-common rename to dux-qml-common diff --git a/quickshell/DCommon b/quickshell/DCommon index a7e51860f..f44b67387 120000 --- a/quickshell/DCommon +++ b/quickshell/DCommon @@ -1 +1 @@ -../dank-qml-common/DCommon \ No newline at end of file +../dux-qml-common/DCommon \ No newline at end of file diff --git a/quickshell/PLUGINS/README.md b/quickshell/PLUGINS/README.md index 51b0d095c..373cdd697 100644 --- a/quickshell/PLUGINS/README.md +++ b/quickshell/PLUGINS/README.md @@ -35,7 +35,7 @@ Plugins are discovered from `~/.config/dms/plugins/` and managed by PluginServic - Lists built-in and plugin tabs and overview cards - Hosts plugin tabs in `DashTabHost.qml` and cards in `Overview/DashCardSlot.qml` -Many widgets are implemented in the shared [dank-qml-common](https://github.com/duxlabs-dev/dux-qml-common) library and re-exported by DMS. Plugins should keep importing `qs.Common`, `qs.Services`, `qs.Widgets`, and `qs.Modules.Plugins` — these remain the supported plugin API and are unaffected by where a widget is implemented. +Many widgets are implemented in the shared [dux-qml-common](https://github.com/duxlabs-dev/dux-qml-common) library and re-exported by DMS. Plugins should keep importing `qs.Common`, `qs.Services`, `qs.Widgets`, and `qs.Modules.Plugins` — these remain the supported plugin API and are unaffected by where a widget is implemented. ## Plugin Structure diff --git a/quickshell/PLUGINS/THEME_REFERENCE.md b/quickshell/PLUGINS/THEME_REFERENCE.md index 28c8af140..f4c1f86c1 100644 --- a/quickshell/PLUGINS/THEME_REFERENCE.md +++ b/quickshell/PLUGINS/THEME_REFERENCE.md @@ -48,7 +48,7 @@ Theme.fullRadius(width, height) Theme.buttonRadius(width, height, buttonHeight, pressed, true) ``` -Use `fullRadius()` for pills and round controls so lower strength values reduce their rounding. `cornerRadiusFull` remains available for compatibility. See the shared [shape reference](../../dank-qml-common/SHAPES.md) for component baselines. +Use `fullRadius()` for pills and round controls so lower strength values reduce their rounding. `cornerRadiusFull` remains available for compatibility. See the shared [shape reference](../../dux-qml-common/SHAPES.md) for component baselines. ## Colors diff --git a/quickshell/scripts/i18nsync.py b/quickshell/scripts/i18nsync.py index 8a98f7fe1..cc28702c3 100755 --- a/quickshell/scripts/i18nsync.py +++ b/quickshell/scripts/i18nsync.py @@ -15,10 +15,10 @@ POEXPORTS_DIR = REPO_ROOT / "translations" / "poexports" SYNC_STATE = REPO_ROOT / ".git" / "i18n_sync_state.json" TERM_RENAMES_JSON = REPO_ROOT / "translations" / "term_renames.json" -# dank-qml-common terms live in the same DMS POEditor project (tagged +# dux-qml-common terms live in the same DMS POEditor project (tagged # dank-qml-common); their translations ship inside the submodule so every # consumer gets them with the pointer. dankcalendar merges from this project. -COMMON_ROOT = REPO_ROOT.parent / "dank-qml-common" +COMMON_ROOT = REPO_ROOT.parent / "dux-qml-common" COMMON_EN_JSON = COMMON_ROOT / "translations" / "en.json" COMMON_POEXPORTS_DIR = COMMON_ROOT / "DCommon" / "translations" / "poexports" @@ -149,7 +149,7 @@ def json_changed(file_path, new_data): def load_common_entries(): if not COMMON_EN_JSON.exists(): - error("dank-qml-common submodule not initialized (git submodule update --init)") + error("dux-qml-common submodule not initialized (git submodule update --init)") with open(COMMON_EN_JSON) as f: entries = json.load(f) return [{**e, "tags": sorted(set(e.get("tags", [])) | {"dank-qml-common"})} for e in entries] @@ -398,7 +398,7 @@ def download_translations(api_token, project_id, common_keys, greeter_keys): info(f"No changes for {filename}") if write_if_changed(common_file, common_part): - success(f"Updated dank-qml-common {filename}") + success(f"Updated dux-qml-common {filename}") common_changed.append(filename) return any_changed, common_changed @@ -521,7 +521,7 @@ def main(): if prune: warn("--prune deletes every POEditor term missing from the local en.json, including its translations.") warn("The official plugin checkout is refreshed first, so pruning keeps official plugin terms.") - warn("dank-qml-common terms are included from the submodule, so pruning keeps them as long as the submodule is current.") + warn("dux-qml-common terms are included from the submodule, so pruning keeps them as long as the submodule is current.") warn("dms-greeter terms are fetched from POEditor and re-included, so pruning keeps them.") common_entries = load_common_entries() @@ -565,8 +565,8 @@ def main(): info("Already in sync") if common_files_changed: - info(f"dank-qml-common poexports updated: {', '.join(common_files_changed)}") - info("Commit those in dank-qml-common and bump the pointer here (make update-common).") + info(f"dux-qml-common poexports updated: {', '.join(common_files_changed)}") + info("Commit those in dux-qml-common and bump the pointer here (make update-common).") elif command == "local": info("Updating en.json locally (no POEditor sync)")