Re-point paths for the ~ reorganisation (home-tidy)
Some checks are pending
dependency freshness / dependencies on newest stable (push) Waiting to run
file-length / file length <= 250 lines (push) Waiting to run
md-naming / markdown naming convention (push) Waiting to run
pre-commit / pre-commit (push) Waiting to run
Tests / test (push) Waiting to run
release-apk / release (APK) (push) Waiting to run

Also bumps Flutter 3.47.3, flutter_secure_storage 11.1.0, idb_shim 2.9.9,
mcp 2.2.0 and ruff 0.16.7 so the freshness gate lets this through.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AwtowrowDXx6ccmWVPkCaF
This commit is contained in:
Krzysztof Rudnicki 2026-09-11 19:53:03 +02:00
parent 058f806db7
commit b3aeb4f4b7
25 changed files with 67 additions and 67 deletions

2
.fvmrc
View File

@ -1,3 +1,3 @@
{
"flutter": "3.47.2"
"flutter": "3.47.3"
}

View File

@ -50,7 +50,7 @@ jobs:
- uses: subosito/flutter-action@v2
with:
flutter-version: 3.47.2
flutter-version: 3.47.3
channel: stable
cache: true

View File

@ -179,7 +179,7 @@ repos:
# unrelated commit never breaks; exits 1 rather than warning. No
# baseline and no allowlist -- those are suppressions. The exemption
# list (generated/vendored/data files) lives with the checker in
# ~/utils/file_length/config.py so the gate and the survey cannot
# ~/src/utils/file_length/config.py so the gate and the survey cannot
# disagree.
#
# Deliberately unfiltered: no types_or and no files. The cap applies to
@ -203,7 +203,7 @@ repos:
# Four markdown namespaces (README / CLAUDE* / DOCS* / TODO*), plus the
# rule that a TODO carries "REMOVE ME AFTER FINISH" and nothing else may.
# Shared gate in ~/utils owns the namespaces and the exemption list, so
# Shared gate in ~/src/utils owns the namespaces and the exemption list, so
# one repo's idea of a valid name cannot drift from every other repo's.
- id: md-naming
name: markdown naming convention

View File

@ -120,7 +120,7 @@ non-stdlib dependency must go into system Python's user site-packages:
Verify against `/usr/bin/python3 -c "import <dep>"`, not the dev venv.
Installing only into `.venv` caused a 3-day production outage (2026-06-19).
Run `install.sh` from a **durable** clone (`~/diet-guard`), never a scratch
Run `install.sh` from a **durable** clone (`~/src/diet-guard`), never a scratch
dir — it does `pip install -e`, so the clone must persist for `git pull` to
reach the running service.
@ -159,7 +159,7 @@ reach the running service.
`app/` builds for **Android** and **web** only. There is no `app/linux/` —
Flutter's GTK embedder manages ~20fps at 3840x2160 where the same Dart in
Chrome sustains ~144fps (`~/todo/docs/DOCS-desktop-performance-findings.md`). The
Chrome sustains ~144fps (`~/src/todo/docs/DOCS-desktop-performance-findings.md`). The
desktop app is the web build served by `bin/diet_guard_desktop.dart` in a
Chrome `--app` window.
@ -235,7 +235,7 @@ phone show both.
Chrome profile path.
- Don't exceed **250 lines** in any file. Enforced by the `file-length`
pre-commit hook and `.github/workflows/file-length.yml`; the cap and its
exemptions live in `~/utils/file_length/config.py`.
exemptions live in `~/src/utils/file_length/config.py`.
## Flutter/Dart AI rules

View File

@ -13,7 +13,7 @@ desktop, sharing one food log through GitHub-backed sync.
There is no `linux/` directory. Flutter's GTK embedder manages ~20fps at
3840x2160 -- measured on a stock `flutter create` counter app, so it is the
toolkit rather than this code -- where the same Dart rendered by Chrome
sustains ~144fps (`~/todo/docs/DOCS-desktop-performance-findings.md`). Running
sustains ~144fps (`~/src/todo/docs/DOCS-desktop-performance-findings.md`). Running
`flutter create --platforms linux` here would silently restore the slow path.
## Commands

View File

@ -10,7 +10,7 @@
#
# Icon PNGs are pre-rendered and committed under desktop/icons/, so this script
# needs no image tooling at run time. Regenerate them with:
# PYTHONPATH=~/testsAndMisc python3 -m python_pkg.app_icons \
# PYTHONPATH=~/src/testsAndMisc python3 -m python_pkg.app_icons \
# generate --app diet_guard_app --linux-out desktop/icons
# ============================================================================

View File

@ -2,7 +2,7 @@
///
/// The desktop app is a Flutter **web** build (Flutter's Linux embedder
/// manages only ~20fps at 4K, where the same Dart code in Chrome sustains
/// ~144fps -- see `~/todo/docs/desktop-performance-findings.md`), so it runs
/// ~144fps -- see `~/src/todo/docs/desktop-performance-findings.md`), so it runs
/// in a browser and cannot touch the filesystem. This process is the other
/// half of the desktop app:
///

View File

@ -9,7 +9,7 @@ library;
/// packaging and `bin/diet_guard_desktop.dart` must all use this value, and
/// the Chrome `--user-data-dir` must stay equally fixed for the same reason.
///
/// 8730 is `~/todo`'s wrapper and 8731 is `~/habit_stack`'s; this is the next
/// 8730 is `~/src/todo`'s wrapper and 8731 is `~/src/habit_stack`'s; this is the next
/// free one so all three can run at once.
const desktopWrapperPort = 8732;

View File

@ -1,4 +1,4 @@
/// Locally-stored GitHub sync configuration, ported from `~/todo`'s
/// Locally-stored GitHub sync configuration, ported from `~/src/todo`'s
/// `sync/sync_settings.dart`, including the OAuth device-flow fields: the
/// "Connect GitHub" button is the primary path, with a pasted PAT kept as a
/// manual fallback.

View File

@ -203,10 +203,10 @@ packages:
dependency: "direct main"
description:
name: flutter_secure_storage
sha256: "15e8c8fe269fdf7d469b23008ab3df521c8b826ed345820532364c31bdebace6"
sha256: "4540927d8b37e6cc47aaa2d17b6035a2d49049e2797cb19d2bdd299bff602c67"
url: "https://pub.dev"
source: hosted
version: "11.0.0"
version: "11.1.0"
flutter_secure_storage_darwin:
dependency: transitive
description:
@ -227,10 +227,10 @@ packages:
dependency: transitive
description:
name: flutter_secure_storage_platform_interface
sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6"
sha256: "4bc033841169d07f690d46d89dbc3f5305b6562820822445384c82e0866e2719"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "2.1.0"
flutter_secure_storage_web:
dependency: transitive
description:
@ -342,10 +342,10 @@ packages:
dependency: "direct main"
description:
name: idb_shim
sha256: e36a748165663a165e1f292e9d85af6e3aa087f6e2291d16f86b2035103b2950
sha256: "6a478bf0928fa954512f2a1e7e56f09e2fb2e3e7d183eb051a59b5d6b39ec16f"
url: "https://pub.dev"
source: hosted
version: "2.9.8"
version: "2.9.9"
image:
dependency: transitive
description:

View File

@ -2,7 +2,7 @@ name: diet_guard_app
description: "Companion phone app for diet_guard: log meals on the go."
publish_to: 'none'
version: 1.0.79+1
version: 1.0.80+1
environment:
sdk: ^3.12.2
@ -17,7 +17,7 @@ dependencies:
flutter:
sdk: flutter
flutter_local_notifications: 22.3.0
flutter_secure_storage: 11.0.0
flutter_secure_storage: 11.1.0
# One-tap sign-in for the sync account. App-side only: crdt_sync stays pure
# Dart so it keeps working on Linux desktop and headless.
@ -28,7 +28,7 @@ dependencies:
path: github_device_auth
google_sign_in: 7.2.0
http: 1.6.0
idb_shim: 2.9.8
idb_shim: 2.9.9
path: 1.9.1
path_provider: 2.1.6
permission_handler: 13.0.2
@ -64,7 +64,7 @@ flutter:
uses-material-design: true
# Launcher icon generation. Source art is produced by the shared generator:
# PYTHONPATH=~/testsAndMisc python3 -m python_pkg.app_icons generate --app <key>
# PYTHONPATH=~/src/testsAndMisc python3 -m python_pkg.app_icons generate --app <key>
# then run: dart run flutter_launcher_icons
flutter_launcher_icons:
android: true

View File

@ -160,7 +160,7 @@ void main() {
isTrue,
reason: 'The wrapper port changed. IndexedDB is keyed by origin, so a '
'new port looks like a different app with no history at all. '
'8730 is ~/todo and 8731 is ~/habit_stack; do not collide.',
'8730 is ~/src/todo and 8731 is ~/src/habit_stack; do not collide.',
);
});

View File

@ -89,7 +89,7 @@ GATE_LOCK_FILE: Path = DATA_DIR / ".gate.lock"
# --- Sync (cross-device log merge) ------------------------------------------
# GitHub is used purely as dumb file storage via the REST Contents API (not a
# git clone) -- mirrors ~/todo's sync transport. Each device pushes its own
# git clone) -- mirrors ~/src/todo's sync transport. Each device pushes its own
# full current log as one file under devices/<id>/food_log.json; merging
# happens client-side (see _sync_merge.py), never via git.
SYNC_REPO_OWNER: str = "kuhyx"

View File

@ -3,7 +3,7 @@
Split out so :mod:`._gatelock_ui` and :mod:`._gatelock_calendar` pick
``pady``/``padx``/``ipady`` values from one deliberate scale instead of
each row inventing its own gap -- see ``DESIGN_AUDIT_TODO.md``. Values are
the px steps from ``~/utils/unified-design-system/tokens.md``'s spacing
the px steps from ``~/src/utils/unified-design-system/tokens.md``'s spacing
scale, used directly as Tk pixel counts.
"""

View File

@ -6,7 +6,7 @@ own value per label -- see ``DESIGN_AUDIT_TODO.md``.
**These are Tk font sizes, and Tk encodes the unit in the sign: positive
means points, negative means pixels.** The design-system scale in
``~/utils/unified-design-system/tokens.md`` is in *pixels*, so every constant
``~/src/utils/unified-design-system/tokens.md`` is in *pixels*, so every constant
here is negative.
This module previously carried the positive values with a comment asserting

View File

@ -4,7 +4,7 @@ diet_guard's own on-disk ``food_log.json`` format is unchanged (a
:class:`~diet_guard._state.DayLog`: date string -> list of entry dicts) --
only the GitHub-synced wire format and the cross-device merge algorithm go
through ``crdt_sync``'s ``Record``/``Log``/``Hlc`` primitives, the same ones
every other kuhy app that syncs this way uses (see ``~/crdt-sync``).
every other kuhy app that syncs this way uses (see ``~/src/utils/crdt-sync``).
Split into three submodules for file size, along the same seams the tests
already use:

View File

@ -1,7 +1,7 @@
# AUR packaging
`PKGBUILD` here is the source of truth for the `diet-guard-app` AUR package.
The AUR checkout (`~/aur/diet-guard-app`) is a copy of this file plus a
The AUR checkout (`~/sdk/aur/diet-guard-app`) is a copy of this file plus a
generated `.SRCINFO`.
## Why the checksum can go stale
@ -35,8 +35,8 @@ the first packageable tag was `v1.0.1`.
git tag v1.2.3 && git push origin v1.2.3
# 3. sync + checksum + build + verify
cp packaging/aur/PKGBUILD ~/aur/diet-guard-app/PKGBUILD
cd ~/aur/diet-guard-app
cp packaging/aur/PKGBUILD ~/sdk/aur/diet-guard-app/PKGBUILD
cd ~/sdk/aur/diet-guard-app
# bump pkgver to match the tag, then:
updpkgsums
makepkg -Cf

View File

@ -1,12 +1,12 @@
# Session prompt: connection pooling in crdt_sync
Paste everything below the line into a fresh Claude Code session started in
`~/utils` (that is where the library lives — **not** `~/diet-guard`).
`~/src/utils` (that is where the library lives — **not** `~/src/diet-guard`).
---
Add HTTP connection pooling to the shared `crdt_sync` library at
`~/utils/crdt-sync`, then bump the tag and re-pin `~/diet-guard` to it.
`~/src/utils/crdt-sync`, then bump the tag and re-pin `~/src/diet-guard` to it.
## Why
@ -32,22 +32,22 @@ changed.
## Scope
**In scope**
1. Connection pooling in `~/utils/crdt-sync/crdt_sync/`, across exactly 9 call
1. Connection pooling in `~/src/utils/crdt-sync/crdt_sync/`, across exactly 9 call
sites in 3 files:
- `_github.py`: lines ~73, ~84 (get), ~163 (put), ~238 (delete)
- `_firebase.py`: ~189, ~319 (get), ~254 (put), ~300 (delete)
- `_firebase_auth.py`: ~290 (post)
2. A `timeout_seconds` keyword on `firebase_client_for` in `_config.py`
(see "Second fix" below).
3. Tag bump + re-pin `~/diet-guard/pyproject.toml` **and**
`~/diet-guard/requirements.txt` (both name the tag).
3. Tag bump + re-pin `~/src/diet-guard/pyproject.toml` **and**
`~/src/diet-guard/requirements.txt` (both name the tag).
**Out of scope — do not touch**
- The other consumers. `~/screen-locker` is already on `crdt-sync-v0.7.0`;
`~/leetcode-guard`, `~/build_your_x` and `~/wake-alarm` are on
- The other consumers. `~/src/screen-locker` is already on `crdt-sync-v0.7.0`;
`~/src/leetcode-guard`, `~/build_your_x` and `~/src/wake-alarm` are on
`crdt-sync-v0.5.1`. Leave every one of those pins alone and say so in your
final report.
- `~/diet-guard/diet_guard/_sync*.py` logic. That work is finished and
- `~/src/diet-guard/diet_guard/_sync*.py` logic. That work is finished and
committed; this task only re-pins the dependency.
## The constraint that decides the design
@ -93,7 +93,7 @@ note in your report that it can be simplified in a follow-up.
the underlying issue instead; do not add a suppression, and do not add one to
the ignore list without asking.
- 250-line cap per file, enforced by a hook.
- `~/diet-guard` has a `no local crdt_sync dependency_override` pre-commit hook
- `~/src/diet-guard` has a `no local crdt_sync dependency_override` pre-commit hook
that exists to stop a local path override leaking into a commit. Do not
defeat it — re-pin to a real pushed tag.
@ -102,7 +102,7 @@ note in your report that it can be simplified in a follow-up.
`diet-guard-gate.service` runs `/usr/bin/python`, not a venv. After re-pinning:
```bash
/usr/bin/python3 -m pip install --user --break-system-packages -e ~/diet-guard
/usr/bin/python3 -m pip install --user --break-system-packages -e ~/src/diet-guard
/usr/bin/python3 -c "import crdt_sync, sys; print(crdt_sync.__file__)"
```
@ -116,7 +116,7 @@ Verify against `/usr/bin/python3`, **never** the dev venv.
`RealUserStateWriteError` if a test tries to write there — that is a feature.
- A sync tick **pushes to a shared remote** that the phone also reads. Timing a
real `run_sync()` is fine (it is idempotent), but do not add throwaway writes.
- `~/utils` is a monorepo holding several packages. Stage narrowly —
- `~/src/utils` is a monorepo holding several packages. Stage narrowly —
`crdt-sync/` only — and note that `crdt-sync/tool/seed_session.py` is already
modified and `crdt-sync/firebase-debug.log` is untracked; both predate this
task, so leave them out of your commit.
@ -129,7 +129,7 @@ Verify against `/usr/bin/python3`, **never** the dev venv.
1. `crdt_sync` at 100% branch coverage, lint clean, with a near-zero test diff.
2. A pushed `crdt-sync-v0.8.0` tag.
3. `~/diet-guard` re-pinned in both `pyproject.toml` and `requirements.txt`,
3. `~/src/diet-guard` re-pinned in both `pyproject.toml` and `requirements.txt`,
830 tests still green at 100%.
4. Installed into `/usr/bin/python3`'s user site-packages and verified there.
5. A re-measured full tick, reported against the 7.6s / 27-request baseline

View File

@ -2,8 +2,8 @@
> "do dopamine-ux-diet-guard". It is self-contained -- it needs no context from
> any other session.
>
> Canonical copy: `~/utils/dopamine-ux/03-diet-guard.md` (source of truth; this is a
> distributed copy). Running order and cross-prompt rules: `~/utils/dopamine-ux/00-INDEX.md`.
> Canonical copy: `~/src/utils/dopamine-ux/03-diet-guard.md` (source of truth; this is a
> distributed copy). Running order and cross-prompt rules: `~/src/utils/dopamine-ux/00-INDEX.md`.
> Generated 2026-08-16 from a survey of this repo -- line numbers are accurate
> as of that date; **anchor on the symbol names, not the line numbers.**
@ -19,10 +19,10 @@ Do **both**, in the same session that completes the work:
Do not leave a finished prompt lying in the repo -- a stale prompt is
indistinguishable from a pending one, and the next session will re-run it.
2. **Log completion in the canonical index**, in `~/utils` (a *different* repo,
2. **Log completion in the canonical index**, in `~/src/utils` (a *different* repo,
so it needs its own commit):
```bash
cd ~/utils
cd ~/src/utils
# append to the "Completion log" table in dopamine-ux/00-INDEX.md:
# | 03-diet-guard.md | DONE <YYYY-MM-DD> | <impl commit sha> | <one-line note> |
git add dopamine-ux/00-INDEX.md
@ -64,7 +64,7 @@ the streak/progress reacting visibly rather than blinking into existence.
## where
Repo: `~/diet-guard`. Flutter app: `~/diet-guard/app` (package `diet_guard_app`).
Repo: `~/src/diet-guard`. Flutter app: `~/src/diet-guard/app` (package `diet_guard_app`).
Primary:
- `app/lib/screens/log_meal_screen.dart` — `_onLogMeal()` (line 122-168 as of
@ -136,7 +136,7 @@ Settings (for the sound opt-out in step 2):
and salience are fair game — the numbers are not.
- must not: add a celebratory cue to *deleting* or editing a meal. Only the
record-creating act gets it.
- must not: touch `~/diet-guard/diet_guard/` (the Python desktop side) — it has
- must not: touch `~/src/diet-guard/diet_guard/` (the Python desktop side) — it has
its own streak logic and is out of scope here.
- optional: a progress ring instead of the plain kcal text. The article's
near-miss point applies honestly here — a ring at 80% of budget is truthful
@ -146,8 +146,8 @@ Settings (for the sound opt-out in step 2):
1. Logging a meal on the phone produces a haptic within ~50ms of the tap, an
explicit confirmation, and a visible (not instant) update of the streak/progress.
2. `cd ~/diet-guard/app && flutter analyze` is clean.
3. `cd ~/diet-guard/app && flutter test` passes.
2. `cd ~/src/diet-guard/app && flutter analyze` is clean.
3. `cd ~/src/diet-guard/app && flutter test` passes.
4. With OS "remove animations" enabled, the screen still works and durations are
zero — verified by toggling it, not by reading the code.
5. Step 2 only: the settings toggle flips, persists across an app restart, and
@ -159,7 +159,7 @@ Settings (for the sound opt-out in step 2):
```
adb devices # confirm 23181JEGR08034 is attached
cd ~/diet-guard/app
cd ~/src/diet-guard/app
flutter build apk --release
adb install -r build/app/outputs/flutter-apk/app-release.apk
```
@ -180,10 +180,10 @@ whitelist entry before it can be tested.
- `app/lib/services/app_settings_service.dart` — the `dailyKcalGoal` field
(~:34/:40) is the pattern to copy for a new bool. Note the `_writeToDisk`
comment.
- `~/diet-guard/diet_guard/_calendar_view.py` — `streaks_text()` ~:136 and
- `~/src/diet-guard/diet_guard/_calendar_view.py` — `streaks_text()` ~:136 and
`ytd_text()` ~:154. The Dart `streak_summary_row.dart` docstring says it mirrors
this formatting; keep them consistent if you change wording.
- `~/utils/unified-design-system/motion.md` — the motion/haptic vocabulary from
- `~/src/utils/unified-design-system/motion.md` — the motion/haptic vocabulary from
prompt 01. **Prompt 01 must have run first.**
## context you would otherwise rediscover
@ -203,6 +203,6 @@ whitelist entry before it can be tested.
making existing true data feel like something, not inventing a new metric.
- diet-guard state lives under XDG (`~/.local/share/diet_guard`), unlike
screen-locker's in-repo JSON. Tests isolate it via
`~/diet-guard/diet_guard/tests/conftest.py:97` `_isolate_state`.
`~/src/diet-guard/diet_guard/tests/conftest.py:97` `_isolate_state`.
REMOVE ME AFTER FINISH

View File

@ -16,7 +16,7 @@ dependencies = [
# so the systemd/CLI system-python path stays dependency-light and never has
# to import the MCP SDK.
[project.optional-dependencies]
mcp = ["mcp==2.1.1"]
mcp = ["mcp==2.2.0"]
# Without this, setuptools' flat-layout auto-discovery treats the Flutter
# app/ directory as a second top-level package and refuses to build.

View File

@ -6,7 +6,7 @@ coverage==7.16.0
crdt-sync @ git+https://github.com/kuhyx/utils@crdt-sync-v0.9.1#subdirectory=crdt-sync
freedays @ git+https://github.com/kuhyx/utils@freedays-v0.2.0#subdirectory=freedays
gatelock @ git+https://github.com/kuhyx/utils@gatelock-v0.7.3#subdirectory=gatelock
mcp==2.1.1
mcp==2.2.0
mypy==2.3.1
pre-commit==4.6.2
pydantic==2.13.5
@ -17,4 +17,4 @@ pytest-randomly==5.0.0
pytest-sugar==1.1.1
pytest-xdist==3.8.0
requests==2.34.2
ruff==0.16.6
ruff==0.16.7

View File

@ -3,7 +3,7 @@
# ============================================================================
# Fail if any dependency in the commit is behind its ecosystem's newest stable.
#
# Thin delegate to the shared gate in ~/utils, which owns the registry
# Thin delegate to the shared gate in ~/src/utils, which owns the registry
# adapters, the pre-release rules and the allowlist semantics. Copying that
# logic here is what lets one repo's idea of "current" drift from every other
# repo's -- so this script only locates the shared checker and forwards its
@ -18,12 +18,12 @@
set -euo pipefail
readonly SHARED_GATE="${UTILS_ROOT:-$HOME/utils}/scripts/check_dependency_freshness.sh"
readonly SHARED_GATE="${UTILS_ROOT:-$HOME/src/utils}/scripts/check_dependency_freshness.sh"
main() {
if [[ ! -x "$SHARED_GATE" ]]; then
echo "Error: shared dependency-freshness gate not found at $SHARED_GATE" >&2
echo " Clone github.com/kuhyx/utils to ~/utils, or set" >&2
echo " Clone github.com/kuhyx/utils to ~/src/utils, or set" >&2
echo " UTILS_ROOT to where it lives." >&2
exit 1
fi

View File

@ -3,7 +3,7 @@
# ============================================================================
# Fail if any file in the commit exceeds the shared 250-line cap.
#
# Thin delegate to the shared gate in ~/utils, which owns the cap and the
# Thin delegate to the shared gate in ~/src/utils, which owns the cap and the
# exemption list (generated / vendored / data files). Copying that logic here
# is what lets one repo's idea of "too long" drift from every other repo's --
# so this script only locates the shared checker and forwards its arguments.
@ -15,12 +15,12 @@
set -euo pipefail
readonly SHARED_GATE="${UTILS_ROOT:-$HOME/utils}/scripts/check_file_length.sh"
readonly SHARED_GATE="${UTILS_ROOT:-$HOME/src/utils}/scripts/check_file_length.sh"
main() {
if [[ ! -x "$SHARED_GATE" ]]; then
echo "Error: shared file-length gate not found at $SHARED_GATE" >&2
echo " Clone github.com/kuhyx/utils to ~/utils, or set" >&2
echo " Clone github.com/kuhyx/utils to ~/src/utils, or set" >&2
echo " UTILS_ROOT to where it lives." >&2
exit 1
fi

View File

@ -3,7 +3,7 @@
# ============================================================================
# Fail if any markdown file breaks the shared naming convention.
#
# Thin delegate to the shared gate in ~/utils, which owns the four namespaces
# Thin delegate to the shared gate in ~/src/utils, which owns the four namespaces
# (README / CLAUDE* / DOCS* / TODO*), the "REMOVE ME AFTER FINISH" marker rule
# and the exemption list. Copying that logic here is what lets one repo's idea
# of a valid name drift from every other repo's -- so this script only locates
@ -16,12 +16,12 @@
set -euo pipefail
readonly SHARED_GATE="${UTILS_ROOT:-$HOME/utils}/scripts/check_md_naming.sh"
readonly SHARED_GATE="${UTILS_ROOT:-$HOME/src/utils}/scripts/check_md_naming.sh"
main() {
if [[ ! -x "$SHARED_GATE" ]]; then
echo "Error: shared markdown-naming gate not found at $SHARED_GATE" >&2
echo " Clone github.com/kuhyx/utils to ~/utils, or set" >&2
echo " Clone github.com/kuhyx/utils to ~/src/utils, or set" >&2
echo " UTILS_ROOT to where it lives." >&2
exit 1
fi

View File

@ -5,7 +5,7 @@
#
# The apps depend on crdt_sync as a *git dependency pinned to a tag*, so what
# CI builds is whatever that tag points at. A `dependency_overrides:` entry
# pointing at ~/utils/crdt_sync_dart is invaluable while developing an unreleased
# pointing at ~/src/utils/crdt_sync_dart is invaluable while developing an unreleased
# library change -- and catastrophic if it survives the commit: local tests go
# green against code CI has never seen, and the failure is silent in both
# directions.