diff --git a/agent/managed-skills/dankvoice-bats-serialization/SKILL.md b/agent/managed-skills/dankvoice-bats-serialization/SKILL.md new file mode 100644 index 0000000..0c86e85 --- /dev/null +++ b/agent/managed-skills/dankvoice-bats-serialization/SKILL.md @@ -0,0 +1,44 @@ +--- +name: dankvoice-bats-serialization +description: "Run dankvoice bats suites without hangs: serialize builds on shared dist/, DV_HOLD is seconds, stub needs sleep&wait trap before hold, timing tests assert CALLS/at not tail PLAYS." +--- + +# Dankvoice bats: serialization and hang-proofing + +## Serialize builds on the shared artifact +`tests/behavior.bats` setup runs `bun run build` into the repo's shared `dist/index.js` +before EVERY test (`DV_EXT="$REPO/dist/index.js"`). Any second concurrent bats run, +`bun run build`, or `bun run typecheck` racing the same repo contends on that file and +can stall single tests past 60 s. NEVER run two bats processes (or bats + build) against +`~/Projects/dankvoice` at the same time — including harness background jobs. If a suite +gets backgrounded, kill it before launching any other repo command; re-run serially. + +## The stub player's units and traps +- `DV_HOLD` is in **seconds** (`sleep "${DV_HOLD:-0.1}"`), not ms. `DV_HOLD=1500` + means a 25-minute "hung" test. Use `DV_HOLD=2` for multi-second holds. +- The stub must sleep as `sleep "${DV_HOLD:-0.1}" &` + `wait $!`, with + `trap 'printf "KILLED\n" >> "$DV_STUB_LOG"; exit 143' TERM` installed **before** the + sleep: a foreground `sleep` defers the trap until the sleep finishes, so SIGTERM-kill + tests (shutdown/interrupt pins) stay red and every kill test eats the full hold. +- Keep the `cp *.wav "$DV_COPY"` loop when editing the stub — the byte-equality test + depends on it. + +## Timing-sensitive assertions +The driver prints `PLAYS` from the stub log at scenario end (~800 ms settle), so with a +long `DV_HOLD` in-flight playback is UNDERCOUNTED — assert `CALLS`/arrival timestamps, +not tail `PLAYS`. The fixture stamps every request with `at=` (ms since driver start, +comparable between CALL lines); prefetch overlap = `t2 - t1 < 1500` with `DV_HOLD=2` +(sequential chain cannot answer inside 2000 ms). + +## Diagnosing a hung bats test (deterministic recipe) +1. `timeout 45 bats -f "" tests/behavior.bats; echo rc=$?` — rc=124 confirms hang. +2. Launch the same test as a background job, then probe live: + `pgrep -af "driver.ts|bats"` and `ps afx | grep -E "sleep|stub"` — a `sleep ` child + with N seconds in the stub log names the culprit (usually DV_HOLD misuse). +3. Detached `(cmd &)` inside a temp shell is KILLED when the shell exits — use the + harness background jobs for anything you must probe. +4. Direct driver repro: extract the heredoc with + `sed -n '/cat > "$WORK\/driver.ts" <<.TS./,/^TS$/p' tests/behavior.bats | sed '1d;$d' > $W/driver.ts`, + build a fresh ext, then run `bun $W/driver.ts ` with the env the setup block + exports. Caveat: hand-made fixture env can yield different segment counts than bats — + trust in-bats numbers for assertions. diff --git a/agent/managed-skills/plugin-git-install-committed-artifact/SKILL.md b/agent/managed-skills/plugin-git-install-committed-artifact/SKILL.md new file mode 100644 index 0000000..a9b8abf --- /dev/null +++ b/agent/managed-skills/plugin-git-install-committed-artifact/SKILL.md @@ -0,0 +1,47 @@ +--- +name: plugin-git-install-committed-artifact +description: "Use when shipping an omp/pi plugin for omp plugin install git: — the installer clone fails validation (missing build artifact) or silently reuses a stale bun git-mirror cache; recipes for committing dist + drift pins + cache purge." +--- + +# Plugin install from git: committed artifact + fresh mirror + +`omp plugin install git:` (and `pi install git:`) **clone the repo and validate the manifest's declared extension entry WITHOUT running a build step**. Two failure classes seen live (dank/dankvoice, 2026-10-19): + +## 1. Declared entry missing from the clone + +Symptom: `Plugin extension validation failed: ./dist/index.js: declared extension entry not found on disk`. + +Cause: build output (`dist/`) is gitignored; the manifest points at it; the clone has only `src/`. + +Fix — ship the artifact: +- Remove `dist/` from `.gitignore`, `bun run build`, commit `dist/`. +- Prove build determinism first: build twice, `cmp` the outputs (bun esm builds are byte-reproducible without sourcemaps). +- Pin the contract in a small bats suite so it can't rot: + 1. the manifest's declared entry is tracked in git (`git ls-files -- "${entry#./}"` non-empty — this is the installer's exact contract, not a config assertion); + 2. committed bytes equal a fresh build (`bun run build` then `git diff --name-only -- dist` is empty → red on drift). + +## 2. Stale bun git-mirror cache + +Symptom: fix pushed, retry **still** fails identically, and the retry is suspiciously fast (seconds). + +Cause: bun keeps bare mirrors in `~/.bun/install/cache/.git` and may reuse them at an old commit — even after the fix is pushed and the default branch is correct. + +Diagnose + fix: +```bash +find ~/.bun/install/cache -maxdepth 2 -iname "**" +git --git-dir ~/.bun/install/cache/.git log --oneline -3 --all # stale HEAD? +rm -rf ~/.bun/install/cache/.git # it is a cache; safe +``` +Prove the fetch path independently first (also validates credentials for private Gitea repos): +```bash +GIT_TERMINAL_PROMPT=0 git clone -q /tmp/x && git -C /tmp/x log --oneline -1 && ls /tmp/x/dist +``` + +## Order of investigation (don't skip) +1. Gitea default branch correct? (`GET /api/v1/repos//` with token — private repos 404/None unauthenticated.) +2. Plain unattended clone contains the entry? If yes, the installer's view is cached → purge mirror. +3. Only then suspect the installer itself (validation code lives in the minified bundle; `grep -oE '.{600}' "$bunfile"` on `readlink -f $(which omp)` shows the exact check). + +## After install — proof without a TUI +- `omp plugin doctor` → per-plugin ✔ line. +- Audible/behavioral chain when TUI input is unusable (update-banner modal freezes pty submits): run `omp --mode=rpc --no-session` with the feature env armed (dankvoice: `DANKVOICE_AUTO=1`, gate is print/json-only) and watch for objective side effects, e.g. PipeWire: `pw-dump | grep -q "say-.wav"` proves synth+playback end-to-end. diff --git a/agent/managed-skills/ryzenai-generic-failure-loader-order/SKILL.md b/agent/managed-skills/ryzenai-generic-failure-loader-order/SKILL.md new file mode 100644 index 0000000..f071b4a --- /dev/null +++ b/agent/managed-skills/ryzenai-generic-failure-loader-order/SKILL.md @@ -0,0 +1,41 @@ +--- +name: ryzenai-generic-failure-loader-order +description: "Debug AMD Ryzen AI OGA \"Exception during initialization: Generic Failure\" on Linux XDNA2 — the LD_LIBRARY_PATH-vs-activate ordering trap, its proof instruments, and the OGA 0.14 run contract." +--- + +Symptom (any `onnxruntime_genai` run on a Ryzen AI NPU, container or bare): + +``` +[E:onnxruntime:, inference_session.cc:2811 operator()] Exception during initialization: Generic Failure +``` + +Fails ~2 ms after `og.Model()`. No `openat` of `/dev/accel/accel0`, **nothing in the kernel log**, no XRT log (the INI logger is not built into AMD's shipped XRT), no core dump. It is NOT a platform, model-export, or driver-ABI failure. + +## Root cause + +`source /bin/activate` from `install_ryzen_ai.sh` **prepends** to `LD_LIBRARY_PATH`: + +``` +site-packages/flexml/flexml_extras/lib : site-packages/onnxruntime/capi : site-packages/voe/lib +``` + +`voe/lib` is the **compiler-side** bundle: it ships its own `libxrt_coreutil.so.2` and `libryzen_mm.so.1`. Set the path *before* activating and those copies win, XRT's XDNA shim binds against the wrong coreutil, `xrt_core::shim_loader::shim_loader()` → `get_userpf_device()` → `xrt::device(0)` throws, `ryzenai::Allocator::Alloc` throws next, and ORT flattens both into the bare string above. + +**Rule: activate first, THEN set `LD_LIBRARY_PATH`, with `/opt/xilinx/xrt/lib` first.** Passing the var via `podman -e` and sourcing activate afterwards in the same `bash -lc` is the broken shape — that is exactly how a runner script differs from a hand-typed probe, and it is why diagnostics pass while the runner fails. Mounting XRT is not enough either: the tree must be **on** the path. + +## Proof instruments, cheapest first + +1. `ldd /lib/libonnxruntime_providers_ryzenai.so | grep -E "libxrt_coreutil|libryzen_mm"` — the resolved path settles it alone: `/opt/xilinx/xrt/lib` = good, `.../voe/lib` = this bug. +2. `XILINX_XRT=/opt/xilinx/xrt /opt/xilinx/xrt/bin/xrt-smi examine` → `RyzenAI-npu5 | aie2p | 6x8` + `NPU Firmware Version`. Needs `libboost_filesystem1.83.0`, `libboost_program_options1.83.0`, `libuuid1` (26.04 names; the 24.04 docs' 1.74.0 does not exist). A "No such file or directory" for a file that exists = missing interpreter/dep, not a missing binary. +3. `strace -f -e trace=openat` — `/dev/accel/accel0` never opened ⇒ failure is pre-device ⇒ loader-level. +4. `gdb -q -batch -x <(echo 'catch throw'; echo run; echo 'bt 10')` style catch-throw loop → names `shim_loader` / `Allocator::Alloc`. + +Known dead ends (each costs one run to rule out, then stop): `--ulimit memlock`, XRT INI verbosity, `DD_LOG_LEVEL` / `RYZENAI_TRACE` / `RYZENAI_EP_TRACING` (print nothing before the throw), byte-scanning XRT `.so` for PCI IDs (ambiguous), libboost presence for the OGA path (only `xrt-smi` needs it), flag-by-flag container matrices (`--memory`, `--security-opt`, `--name`, extra mounts — all innocent). + +## Verified facts on this stack + +- Vendor XRT 2.25.37 userspace (`dpkg-deb -x`, never dpkg-installed) works against Ubuntu's **in-tree `amdxdna` 0.7.0`; no DKMS module needed. `1022:17f0` rev 11 = XDNA2, handled as `aie2p 6x8`. +- AMD's `quicktest` passing does **not** prove NPU use (it can silently run on CPU); trust `xrt-smi` + logits, not "it didn't crash". +- `/dev/accel/accel0` is `root:render 0660`; rootless podman cannot read it (userns drops the gid; `keep-groups`, `keep-id:gid=990`, `--group-add render` all fail) → rootful container, or a udev rule like the GPU nodes'. +- OGA 0.14 (RAI 1.8) contract: `GeneratorParams` has only `set_search_options` (no `input_ids`, no `model.generate`); feed with `Generator.append_tokens(ids)`, loop `generate_next_token()`, read `get_sequence(0)`; `max_length` counts **prompt + generated**. Full Fusion (`*_npu_4K`) caps input+output at 4096. +- Validate the *content*, not just the exit code: `np.argsort(logits[0])[-8:]`. `append_tokens` returning a real logits tensor proves the graph ran; if argmax is the sequence terminator (` diff --git a/agent/managed-skills/ryzenai-npu-oga-linux-run/SKILL.md b/agent/managed-skills/ryzenai-npu-oga-linux-run/SKILL.md new file mode 100644 index 0000000..05acea0 --- /dev/null +++ b/agent/managed-skills/ryzenai-npu-oga-linux-run/SKILL.md @@ -0,0 +1,49 @@ +--- +name: ryzenai-npu-oga-linux-run +description: "Run an AMD vendor-compiled Ryzen AI (XDNA2) model — OGA/onnxruntime-genai — on a Linux Ryzen AI host with the in-tree amdxdna driver, without installing the vendor driver or touching the host driver; includes the triage for ORT \"Exception during initialization: Generic Failure\"." +--- + +Run a vendor-compiled Ryzen AI (XDNA2) model on Linux with the **in-tree** amdxdna driver: no vendor kernel module, no `dpkg -i`, host driver untouched. + +## Preconditions +- Host: Strix Point / Strix Halo / Krackan (PCI `1022:17f0`), in-tree `amdxdna` bound to the NPU function (`readlink /sys/bus/pci/devices//driver` → `amdxdna`), `/dev/accel/accel0` present. +- `ryzen_ai-.tgz` installed into a venv (`install_ryzen_ai.sh -a yes -p `; it hard-codes `python3.12` — put a uv-managed 3.12 **bin dir** on PATH, never a symlink: a symlinked shim breaks venv creation with `No module named 'encodings'`). +- Model artifact MUST match the RAI version: `_rai__npu_`. Other versions load and emit garbage. +- Vendor XRT userspace: `dpkg-deb -x` the debs from `RAI__Linux_NPU_XRT.zip` (base + npu + `xrt_plugin…amdxdna.deb` — the plugin is what ships `libxrt_driver_xdna.so.*`) into a host dir, bind-mount it at `/opt/xilinx/xrt`. + +## Container run line (the part that is easy to get wrong) +``` +--device /dev/accel/accel0 # root:render 0660 → rootful, or a world-writable udev rule +-v /opt/xilinx/xrt:/opt/xilinx/xrt:ro +-e RYZEN_AI_INSTALLATION_PATH= -e XILINX_XRT=/opt/xilinx/xrt +-e LD_LIBRARY_PATH=/opt/xilinx/xrt/lib:/onnxruntime/lib:/deployment/lib +# cwd MUST be /deployment/lib — the RyzenAI EP is dlopen'd by bare name and the +# only place ORT looks is the working directory. +# Activate the venv explicitly; a login shell (`bash -lc`) re-sources the profile and +# can put a numpy-less base python first on PATH. +``` + +## LAW: mounting XRT is not enough — `/opt/xilinx/xrt/lib` must be ON `LD_LIBRARY_PATH` +The RyzenAI EP reaches the XDNA shim through XRT's own loader. With the tree bind-mounted +but off the loader path, `xrt::device(0)` throws in `xrt_core::shim_loader`, the RMM +allocator fails next, and ORT flattens all of it into + +``` +[E:onnxruntime:, inference_session.cc:2811] Exception during initialization: Generic Failure +``` + +Signature that distinguishes this from a real device/driver fault: fails in ~2 ms, **never +opens `/dev/accel/accel0`**, nothing in `dmesg`/`journalctl -k`, no XRT log (the INI logger +is not built into the vendor build — `XRT_INI_PATH` + `[Common] verbosity` writes nothing). + +## Triage recipe for "Generic Failure" (in this order — each step is one call) +1. `strace -f -e trace=openat` → does it open `/dev/accel/accel0`? If **no**, the failure is pre-device: loader/shim, not the driver. Also note the last file it opens (`genai_config.json` = config parsed, then provider setup fails). +2. `gdb -q -batch -x cmds --args python driver.py` with `catch throw` + `bt 10` + `continue`. Frames `xrt_core::shim_loader::shim_loader` / `get_userpf_device` / `xrt::device::device` then `ryzenai::Allocator::Alloc` ⇒ the shim never loaded ⇒ fix `LD_LIBRARY_PATH`. +3. Prove it with a two-arm run in ONE container (toggle only the suspect) before writing the law down. Both arms passing ⇒ that variable was never the cause. +4. Ground truth on device visibility: `xrt-smi examine` → `RyzenAI-npu5 | aie2p | 6x8` + `NPU Firmware Version`. If xrt-smi dies on `libboost_filesystem.so.1.83.0`, install `libboost_filesystem1.83.0`+`libboost_program_options1.83.0` — **boost is only needed by xrt-smi, not by the OGA/EP path** (verified by purging it and still loading the model). +5. `voe` in site-packages is a *compiler* toolkit (passes/patterns), not a runtime — swapping `LD_LIBRARY_PATH` to `voe/lib` fixes nothing. +6. Byte-scanning XRT `.so` files for supported PCI IDs is inconclusive (2-byte ID patterns collide constantly) — don't bother. + +## Distrust "it ran" on this stack +- Vendor `quicktest` can print success while computing on CPU (missing peano lib ⇒ silent CPU fallback). Prove NPU residency per run: sample `/sys/class/accel/accel0/device/mem_usage` (needs root) during generation, or read the EP's `Actually running on NPU` line. +- Never report request #1 after a boot as a rate — first pass includes graph/init cost. diff --git a/agent/managed-skills/ryzenai-venv-dependency-triangle/SKILL.md b/agent/managed-skills/ryzenai-venv-dependency-triangle/SKILL.md new file mode 100644 index 0000000..e6e82f2 --- /dev/null +++ b/agent/managed-skills/ryzenai-venv-dependency-triangle/SKILL.md @@ -0,0 +1,77 @@ +--- +name: ryzenai-venv-dependency-triangle +description: "Debug the torchao/torchtune/transformers import triangle inside an AMD Ryzen AI (ryzen_ai-*.tgz) venv under torch 2.6, including the masked \"cannot import name\" failures and the port-the-one-symbol escape." +--- + +# Ryzen AI venv dependency triangle (torch 2.6 era) + +Symptom that starts it all — and it never names the culprit: + +``` +ImportError: cannot import name 'HubertModel' from 'transformers' +``` + +The named symbol is healthy. `import torchao` alone reproduces the failure; `import transformers` alone does not. transformers imports its **torchao integration** whenever the real modelling path loads, and the failure is re-raised two frames deep by the lazy loader as a missing name. + +## Instruments + +Never conclude from `grep -c Symbol transformers/__init__.py` — 4.5x generates its lazy `__init__`, so an absent literal proves nothing. Get the real exception: + +```python +import traceback, torch, transformers +try: + __import__("transformers.models.hubert.modeling_hubert") +except Exception: + traceback.print_exc() +``` + +That prints the truth, e.g. `AttributeError: module 'torchao.quantization' has no attribute 'Float8WeightOnlyConfig'` from `transformers/modeling_layers.py`. + +Also probe the order matrix (`import X; from transformers import Y` for each suspect): only the poisoned order fails, which isolates the culprit without reading vendor code. + +## The triangle (measured 2026-10-19, ryzen_ai 1.8.0, torch 2.6.0+cpu, transformers 4.57.6) + +| Option | Result | +|---|---| +| torchao absent | `from transformers import HubertModel` -> OK | +| torchao 0.7.0+cpu | `ImportError: Float8WeightOnlyConfig` (masked as missing symbol) | +| torchao 0.8.0+cpu | imports (warns `No module named 'triton'`), still lacks `Float8WeightOnlyConfig` | +| torchao >= 0.9 | has the symbol, requires torch >= 2.7 -> impossible in this venv | +| torchtune, ANY version (0.6.1 … 0.1.1) | guard `torchao not installed`, or `pyarrow requires NumPy 2.0 or newer, found 1.26.4` | + +Two independent dead ends: torchtune's package init pulls `datasets` -> **the pyarrow AMD ships in its own venv refuses that venv's own numpy 1.26.4**. So `import torchtune` is structurally dead, and torchao (the only thing that satisfies its guard) breaks transformers. **Never "just upgrade" torch/numpy: the vendor's ONNX runtime and torch build are what the NPU EP is loaded against.** + +## Escape: port the one symbol, pin both absent + +Ask what the third-party package is actually used for before fighting the resolver. In `neucodec` it was one symbol (`RotaryPositionalEmbeddings`, ~40 lines, copied verbatim from `torchtune/modules/position_embeddings.py`, BSD-3) used by two files. Apply it in the image with a transform that **asserts** each import line exists, so a vendor update fails the build instead of shipping a half-patched package: + +```dockerfile +COPY patches/rope_local.py /opt/patch/rope_local.py +RUN python - <<'PY' +import pathlib +from importlib.util import find_spec +pkg = pathlib.Path(find_spec("neucodec").origin).parent # find_spec: importing it is what is impossible yet +(pkg / "rope_local.py").write_text(pathlib.Path("/opt/patch/rope_local.py").read_text()) +old, new = "from torchtune.modules import RotaryPositionalEmbeddings", "from .rope_local import RotaryPositionalEmbeddings" +for name in ("bs_roformer5.py", "codec_decoder_vocos.py"): + p = pkg / name; s = p.read_text() + assert old in s, name + ": import line moved - re-read the vendor source" + p.write_text(s.replace(old, new)) +PY +``` + +Gate both absences at build time so nobody re-adds them and inherits a three-week-later mystery: + +```dockerfile +RUN ... import-check \ + && python -c "import importlib.util as u; assert u.find_spec('torchao') is None; assert u.find_spec('torchtune') is None" +``` + +Prove a ported numeric kernel with the vendor's own fixtures, not with faith: `neucodec` ships `samples/jo.wav` *and* its own encoding `samples/jo.pt`, so re-encoding the WAV and comparing integer codes is a pass/fail correctness test of the RoPE port. + +## Rules of thumb + +- `--no-deps` for anything adjacent to torch/onnxruntime/numpy; check the vendor pins by reading them out of the venv (`python -c "import torch; print(torch.__version__)"`), never from docs. +- A `--dry-run` install that resolves without touching torch/numpy/onnxruntime is the licence to install *with* deps. +- `uv pip install --target DIR` / a nested venv does **not** layer over a parent venv: a venv created from `/opt/rai/bin/python` resolves "system site-packages" to the base interpreter, and uv's resolver ignores `.pth` paths and will pull a second numpy that breaks the vendor C extensions. +- Ephemeral `podman run --rm` probes discard everything you installed in them — build a throwaway tag (truncate the Containerfile before the failing step) instead of re-hypothesising. diff --git a/agent/memories/sharpshooter/dv-smoke-3pbj8a9qptnym/state.json b/agent/memories/sharpshooter/dv-smoke-3pbj8a9qptnym/state.json new file mode 100644 index 0000000..d5b56d7 --- /dev/null +++ b/agent/memories/sharpshooter/dv-smoke-3pbj8a9qptnym/state.json @@ -0,0 +1,4 @@ +{ + "v": 1, + "lastConsolidatedAt": 1792440454430 +} diff --git a/agent/memories/sharpshooter/omp-32c11n2wnglul/state.json b/agent/memories/sharpshooter/omp-32c11n2wnglul/state.json index 3fe57b4..1ced842 100644 --- a/agent/memories/sharpshooter/omp-32c11n2wnglul/state.json +++ b/agent/memories/sharpshooter/omp-32c11n2wnglul/state.json @@ -1,6 +1,6 @@ { "v": 1, - "lastConsolidatedAt": 1792398332410, + "lastConsolidatedAt": 1792439707623, "lastResult": { "at": 1791599865775, "sessions": 1, diff --git a/agent/memories/sharpshooter/tmp-1tpw73408x3e/state.json b/agent/memories/sharpshooter/tmp-1tpw73408x3e/state.json index 30f8d28..382c078 100644 --- a/agent/memories/sharpshooter/tmp-1tpw73408x3e/state.json +++ b/agent/memories/sharpshooter/tmp-1tpw73408x3e/state.json @@ -1,4 +1,4 @@ { "v": 1, - "lastConsolidatedAt": 1792432172049 + "lastConsolidatedAt": 1792439491829 } diff --git a/agent/memories/sharpshooter/wt-20261018-204442-7c8a99d-2u1dm4kttza8t/state.json b/agent/memories/sharpshooter/wt-20261018-204442-7c8a99d-2u1dm4kttza8t/state.json index afb5976..a56aef0 100644 --- a/agent/memories/sharpshooter/wt-20261018-204442-7c8a99d-2u1dm4kttza8t/state.json +++ b/agent/memories/sharpshooter/wt-20261018-204442-7c8a99d-2u1dm4kttza8t/state.json @@ -1,6 +1,6 @@ { "v": 1, - "lastConsolidatedAt": 1792400453482, + "lastConsolidatedAt": 1792439324791, "lastResult": { "at": 1792398531282, "sessions": 1, diff --git a/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/architecture.md b/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/architecture.md new file mode 100644 index 0000000..e69de29 diff --git a/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/product.md b/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/product.md new file mode 100644 index 0000000..e69de29 diff --git a/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/queue/01a1531d-3e48-70b0-8ee0-6d48a197cae3/00mvez49uq-zxrj.json b/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/queue/01a1531d-3e48-70b0-8ee0-6d48a197cae3/00mvez49uq-zxrj.json deleted file mode 100644 index 7de4ada..0000000 --- a/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/queue/01a1531d-3e48-70b0-8ee0-6d48a197cae3/00mvez49uq-zxrj.json +++ /dev/null @@ -1 +0,0 @@ -{"v":1,"kind":"product_decision","statement":"Documentation links to @~/Projects/serverAppConfig/serverAppConfigs-docs/","source":"explicit_user","evidence":"correct our documentation to just link to @~/Projects/serverAppConfig/serverAppConfigs-docs/","friction":{"corrective":false,"regression":false,"subtle":false},"sessionId":"01a1531d-3e48-70b0-8ee0-6d48a197cae3","ts":1792397374946} \ No newline at end of file diff --git a/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/state.json b/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/state.json index c041cb2..82d1a73 100644 --- a/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/state.json +++ b/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/state.json @@ -1,4 +1,10 @@ { "v": 1, - "lastConsolidatedAt": 1792397349857 + "lastConsolidatedAt": 1792439315327, + "lastResult": { + "at": 1792439315327, + "sessions": 1, + "deltas": 1, + "model": "frank-zealot" + } } diff --git a/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/style.md b/agent/memories/sharpshooter/wt-20261019-004309-7c8a99d-u0xusjwyvzai/style.md new file mode 100644 index 0000000..e69de29 diff --git a/agent/memories/sharpshooter/wt-20261019-011132-7c8a99d-y69mcckuzbqu/state.json b/agent/memories/sharpshooter/wt-20261019-011132-7c8a99d-y69mcckuzbqu/state.json index ca00f3a..42dcde5 100644 --- a/agent/memories/sharpshooter/wt-20261019-011132-7c8a99d-y69mcckuzbqu/state.json +++ b/agent/memories/sharpshooter/wt-20261019-011132-7c8a99d-y69mcckuzbqu/state.json @@ -1,8 +1,8 @@ { "v": 1, - "lastConsolidatedAt": 1792437458615, + "lastConsolidatedAt": 1792439612626, "lastResult": { - "at": 1792433135862, + "at": 1792439612626, "sessions": 1, "deltas": 1, "model": "frank-zealot" diff --git a/agent/memories/sharpshooter/wt-20261019-020309-6d1fc1f-8knxmfcrfa1k/state.json b/agent/memories/sharpshooter/wt-20261019-020309-6d1fc1f-8knxmfcrfa1k/state.json index c6e68d0..043f783 100644 --- a/agent/memories/sharpshooter/wt-20261019-020309-6d1fc1f-8knxmfcrfa1k/state.json +++ b/agent/memories/sharpshooter/wt-20261019-020309-6d1fc1f-8knxmfcrfa1k/state.json @@ -1,6 +1,6 @@ { "v": 1, - "lastConsolidatedAt": 1792437542473, + "lastConsolidatedAt": 1792440990901, "lastResult": { "at": 1792433353188, "sessions": 1, diff --git a/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/state.json b/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/state.json new file mode 100644 index 0000000..b1c133d --- /dev/null +++ b/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/state.json @@ -0,0 +1,4 @@ +{ + "v": 1, + "lastConsolidatedAt": 1792441029706 +} diff --git a/dotfiles/lazyvim/.gitignore b/dotfiles/lazyvim/.gitignore new file mode 100644 index 0000000..cc5457a --- /dev/null +++ b/dotfiles/lazyvim/.gitignore @@ -0,0 +1,8 @@ +tt.* +.tests +doc/tags +debug +.repro +foo.* +*.log +data diff --git a/dotfiles/lazyvim/.neoconf.json b/dotfiles/lazyvim/.neoconf.json new file mode 100644 index 0000000..7c48087 --- /dev/null +++ b/dotfiles/lazyvim/.neoconf.json @@ -0,0 +1,15 @@ +{ + "neodev": { + "library": { + "enabled": true, + "plugins": true + } + }, + "neoconf": { + "plugins": { + "lua_ls": { + "enabled": true + } + } + } +} diff --git a/dotfiles/lazyvim/LICENSE b/dotfiles/lazyvim/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/dotfiles/lazyvim/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/dotfiles/lazyvim/README.md b/dotfiles/lazyvim/README.md new file mode 100644 index 0000000..185280b --- /dev/null +++ b/dotfiles/lazyvim/README.md @@ -0,0 +1,4 @@ +# 💤 LazyVim + +A starter template for [LazyVim](https://github.com/LazyVim/LazyVim). +Refer to the [documentation](https://lazyvim.github.io/installation) to get started. diff --git a/dotfiles/lazyvim/init.lua b/dotfiles/lazyvim/init.lua new file mode 100644 index 0000000..2514f9e --- /dev/null +++ b/dotfiles/lazyvim/init.lua @@ -0,0 +1,2 @@ +-- bootstrap lazy.nvim, LazyVim and your plugins +require("config.lazy") diff --git a/dotfiles/lazyvim/lazy-lock.json b/dotfiles/lazyvim/lazy-lock.json new file mode 100644 index 0000000..f623d8e --- /dev/null +++ b/dotfiles/lazyvim/lazy-lock.json @@ -0,0 +1,35 @@ +{ + "LazyVim": { "branch": "main", "commit": "999700997f72227187d49d8b92667183dc7fc809" }, + "base16-nvim": { "branch": "master", "commit": "7183774e90841f4bd27a47cb6e75cf532fd1192d" }, + "blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, + "catppuccin": { "branch": "main", "commit": "edefef779ab08ce1a4a404713e3012b0d202bd35" }, + "conform.nvim": { "branch": "master", "commit": "016802de402556da54c36bd7359b441266b01cdd" }, + "flash.nvim": { "branch": "main", "commit": "5f0f270fdc7c5b0c21d903ee85b9cb06f2ac636a" }, + "friendly-snippets": { "branch": "main", "commit": "b4d01b0fdf3c9a549961c2f9ffe8dc09be166219" }, + "gitsigns.nvim": { "branch": "main", "commit": "fd780920613e541cbdfac41bf711583ed49f9249" }, + "grug-far.nvim": { "branch": "main", "commit": "bbde8ef5ae46ceee2c3bd8b21fc048c5f8ffbfc0" }, + "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, + "lazydev.nvim": { "branch": "main", "commit": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d" }, + "lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "00b5473cca4db5b410ff4bae724e3b6e21f2687f" }, + "mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" }, + "mini.ai": { "branch": "main", "commit": "d0c4987a1ead2bcf4eb22cc9815c662d76677c08" }, + "mini.icons": { "branch": "main", "commit": "f916635dc5ae2f479fbb9ab8184bb9444b62e86c" }, + "mini.pairs": { "branch": "main", "commit": "03eb1f0062a2cee5314d1ac3939246e4bb21352e" }, + "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" }, + "nui.nvim": { "branch": "main", "commit": "10fc361835c856ba4233ef5ea135b919bf3dce97" }, + "nvim-lint": { "branch": "master", "commit": "f6230a5c06ba59e6059c14637f1dbe29a7978b9b" }, + "nvim-lspconfig": { "branch": "master", "commit": "45a3a444b710511c39abca3b60bb6e23a21e3de5" }, + "nvim-treesitter": { "branch": "main", "commit": "29212d826054bb2948fa9d3a99eca9bf6a050eb2" }, + "nvim-treesitter-textobjects": { "branch": "main", "commit": "5c7b0263797dfd1bd6202f2b219f3b53a80b2187" }, + "nvim-ts-autotag": { "branch": "main", "commit": "d7220b55e16ed3c04e88086256def5d282429493" }, + "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" }, + "plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" }, + "snacks.nvim": { "branch": "main", "commit": "882c996cf28183f4d63640de0b4c02ec886d01f2" }, + "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, + "tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" }, + "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" }, + "ts-comments.nvim": { "branch": "main", "commit": "a59d6092213447450191122c9346f309161504cb" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } +} diff --git a/dotfiles/lazyvim/lazyvim.json b/dotfiles/lazyvim/lazyvim.json new file mode 100644 index 0000000..d8bcaf6 --- /dev/null +++ b/dotfiles/lazyvim/lazyvim.json @@ -0,0 +1,10 @@ +{ + "extras": [ + + ], + "install_version": 8, + "news": { + "NEWS.md": "11866" + }, + "version": 8 +} \ No newline at end of file diff --git a/dotfiles/lazyvim/lua/config/autocmds.lua b/dotfiles/lazyvim/lua/config/autocmds.lua new file mode 100644 index 0000000..4221e75 --- /dev/null +++ b/dotfiles/lazyvim/lua/config/autocmds.lua @@ -0,0 +1,8 @@ +-- Autocmds are automatically loaded on the VeryLazy event +-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua +-- +-- Add any additional autocmds here +-- with `vim.api.nvim_create_autocmd` +-- +-- Or remove existing autocmds by their group name (which is prefixed with `lazyvim_` for the defaults) +-- e.g. vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell") diff --git a/dotfiles/lazyvim/lua/config/keymaps.lua b/dotfiles/lazyvim/lua/config/keymaps.lua new file mode 100644 index 0000000..2c134f7 --- /dev/null +++ b/dotfiles/lazyvim/lua/config/keymaps.lua @@ -0,0 +1,3 @@ +-- Keymaps are automatically loaded on the VeryLazy event +-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua +-- Add any additional keymaps here diff --git a/dotfiles/lazyvim/lua/config/lazy.lua b/dotfiles/lazyvim/lua/config/lazy.lua new file mode 100644 index 0000000..d73bfa1 --- /dev/null +++ b/dotfiles/lazyvim/lua/config/lazy.lua @@ -0,0 +1,53 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) + +require("lazy").setup({ + spec = { + -- add LazyVim and import its plugins + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, + -- import/override with your plugins + { import = "plugins" }, + }, + defaults = { + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. + -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. + lazy = false, + -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, + -- have outdated releases, which may break your Neovim install. + version = false, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + }, + install = { colorscheme = { "tokyonight", "habamax" } }, + checker = { + enabled = true, -- check for plugin updates periodically + notify = false, -- notify on update + }, -- automatically check for plugin updates + performance = { + rtp = { + -- disable some rtp plugins + disabled_plugins = { + "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + "tarPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/dotfiles/lazyvim/lua/config/options.lua b/dotfiles/lazyvim/lua/config/options.lua new file mode 100644 index 0000000..3ea1454 --- /dev/null +++ b/dotfiles/lazyvim/lua/config/options.lua @@ -0,0 +1,3 @@ +-- Options are automatically loaded before lazy.nvim startup +-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua +-- Add any additional options here diff --git a/dotfiles/lazyvim/lua/matugen.lua b/dotfiles/lazyvim/lua/matugen.lua new file mode 100644 index 0000000..e5d2132 --- /dev/null +++ b/dotfiles/lazyvim/lua/matugen.lua @@ -0,0 +1,70 @@ + local M = {} + +function M.setup() + require('base16-colorscheme').setup({ + base00 = '#181818', + base01 = '#282828', + base02 = '#323232', + base03 = '#646464', + base04 = '#95a99f', + base05 = '#e4e4ef', + base06 = '#e4e4ef', + base07 = '#e4e4ef', + base08 = '#f43841', + base09 = '#9e95c7', + base0A = '#96a6c8', + base0B = '#f43841', + base0C = '#a596e9', + base0D = '#f8868c', + base0E = '#96b0e9', + base0F = '#becff4', + }) + + local hi = function(group, opts) + vim.api.nvim_set_hl(0, group, opts) + end + + -- telescope.nvim + hi('TelescopeNormal', { fg = '#e4e4ef', bg = '#181818' }) + hi('TelescopeBorder', { fg = '#646464', bg = '#181818' }) + hi('TelescopePromptNormal', { fg = '#e4e4ef', bg = '#181818' }) + hi('TelescopePromptBorder', { fg = '#646464', bg = '#181818' }) + hi('TelescopePromptPrefix', { fg = '#f43841', bg = '#181818' }) + hi('TelescopePromptCounter', { fg = '#95a99f', bg = '#181818' }) + hi('TelescopePromptTitle', { fg = '#181818', bg = '#f43841' }) + hi('TelescopePreviewTitle', { fg = '#181818', bg = '#96a6c8' }) + hi('TelescopeResultsTitle', { fg = '#181818', bg = '#9e95c7' }) + hi('TelescopeSelection', { fg = '#e4e4ef', bg = '#323232' }) + hi('TelescopeSelectionCaret', { fg = '#f43841', bg = '#323232' }) + hi('TelescopeMatching', { fg = '#f43841', bold = true }) + + -- mini.pick + hi('MiniPickNormal', { fg = '#e4e4ef', bg = '#181818' }) + hi('MiniPickBorder', { fg = '#646464', bg = '#181818' }) + hi('MiniPickPrompt', { fg = '#e4e4ef', bg = '#181818' }) + hi('MiniPickPromptPrefix', { fg = '#f43841', bg = '#181818' }) + hi('MiniPickBorderText', { fg = '#181818', bg = '#f43841' }) + hi('MiniPickMatchCurrent', { fg = '#e4e4ef', bg = '#323232' }) + hi('MiniPickPromptCaret', { fg = '#f43841', bg = '#323232' }) + hi('MiniPickMatchRanges', { fg = '#f43841', bold = true }) +end + +-- Register a signal handler for SIGUSR1 (matugen updates). +-- The handler re-requires this module, which re-runs the code below, so the +-- previous handle is stopped first; otherwise handlers double on every signal. +if _G.__matugen_signal then + _G.__matugen_signal:stop() + _G.__matugen_signal:close() +end + +local signal = vim.uv.new_signal() +_G.__matugen_signal = signal +signal:start( + 'sigusr1', + vim.schedule_wrap(function() + package.loaded['matugen'] = nil + require('matugen').setup() + end) +) + +return M diff --git a/dotfiles/lazyvim/lua/plugins/example.lua b/dotfiles/lazyvim/lua/plugins/example.lua new file mode 100644 index 0000000..17f53d6 --- /dev/null +++ b/dotfiles/lazyvim/lua/plugins/example.lua @@ -0,0 +1,197 @@ +-- since this is just an example spec, don't actually load anything here and return an empty spec +-- stylua: ignore +if true then return {} end + +-- every spec file under the "plugins" directory will be loaded automatically by lazy.nvim +-- +-- In your plugin files, you can: +-- * add extra plugins +-- * disable/enabled LazyVim plugins +-- * override the configuration of LazyVim plugins +return { + -- add gruvbox + { "ellisonleao/gruvbox.nvim" }, + + -- Configure LazyVim to load gruvbox + { + "LazyVim/LazyVim", + opts = { + colorscheme = "gruvbox", + }, + }, + + -- change trouble config + { + "folke/trouble.nvim", + -- opts will be merged with the parent spec + opts = { use_diagnostic_signs = true }, + }, + + -- disable trouble + { "folke/trouble.nvim", enabled = false }, + + -- override nvim-cmp and add cmp-emoji + { + "hrsh7th/nvim-cmp", + dependencies = { "hrsh7th/cmp-emoji" }, + ---@param opts cmp.ConfigSchema + opts = function(_, opts) + table.insert(opts.sources, { name = "emoji" }) + end, + }, + + -- change some telescope options and a keymap to browse plugin files + { + "nvim-telescope/telescope.nvim", + keys = { + -- add a keymap to browse plugin files + -- stylua: ignore + { + "fp", + function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end, + desc = "Find Plugin File", + }, + }, + -- change some options + opts = { + defaults = { + layout_strategy = "horizontal", + layout_config = { prompt_position = "top" }, + sorting_strategy = "ascending", + winblend = 0, + }, + }, + }, + + -- add pyright to lspconfig + { + "neovim/nvim-lspconfig", + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- pyright will be automatically installed with mason and loaded with lspconfig + pyright = {}, + }, + }, + }, + + -- add tsserver and setup with typescript.nvim instead of lspconfig + { + "neovim/nvim-lspconfig", + dependencies = { + "jose-elias-alvarez/typescript.nvim", + init = function() + require("lazyvim.util").lsp.on_attach(function(_, buffer) + -- stylua: ignore + vim.keymap.set( "n", "co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" }) + vim.keymap.set("n", "cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer }) + end) + end, + }, + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- tsserver will be automatically installed with mason and loaded with lspconfig + tsserver = {}, + }, + -- you can do any additional lsp server setup here + -- return true if you don't want this server to be setup with lspconfig + ---@type table + setup = { + -- example to setup with typescript.nvim + tsserver = function(_, opts) + require("typescript").setup({ server = opts }) + return true + end, + -- Specify * to use this function as a fallback for any server + -- ["*"] = function(server, opts) end, + }, + }, + }, + + -- for typescript, LazyVim also includes extra specs to properly setup lspconfig, + -- treesitter, mason and typescript.nvim. So instead of the above, you can use: + { import = "lazyvim.plugins.extras.lang.typescript" }, + + -- add more treesitter parsers + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "bash", + "html", + "javascript", + "json", + "lua", + "markdown", + "markdown_inline", + "python", + "query", + "regex", + "tsx", + "typescript", + "vim", + "yaml", + }, + }, + }, + + -- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above + -- would overwrite `ensure_installed` with the new value. + -- If you'd rather extend the default config, use the code below instead: + { + "nvim-treesitter/nvim-treesitter", + opts = function(_, opts) + -- add tsx and treesitter + vim.list_extend(opts.ensure_installed, { + "tsx", + "typescript", + }) + end, + }, + + -- the opts function can also be used to change the default opts: + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function(_, opts) + table.insert(opts.sections.lualine_x, { + function() + return "😄" + end, + }) + end, + }, + + -- or you can return new options to override all the defaults + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function() + return { + --[[add your custom lualine config here]] + } + end, + }, + + -- use mini.starter instead of alpha + { import = "lazyvim.plugins.extras.ui.mini-starter" }, + + -- add jsonls and schemastore packages, and setup treesitter for json, json5 and jsonc + { import = "lazyvim.plugins.extras.lang.json" }, + + -- add any tools you want to have installed below + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "stylua", + "shellcheck", + "shfmt", + "flake8", + }, + }, + }, +} diff --git a/dotfiles/lazyvim/lua/plugins/matugen.lua b/dotfiles/lazyvim/lua/plugins/matugen.lua new file mode 100644 index 0000000..c4932bf --- /dev/null +++ b/dotfiles/lazyvim/lua/plugins/matugen.lua @@ -0,0 +1,22 @@ +-- Applies the hand-kept wallpaper palette (lua/matugen.lua) on top of LazyVim's +-- colorscheme instead of living with tokyonight defaults. +-- +-- base16-colorscheme writes highlights directly and never touches v:colors_name, +-- so LazyVim keeps thinking tokyonight is loaded and its plugin-specific tweaks +-- still run; ours is the last word on the UI groups. +return { + "RRethy/base16-nvim", + lazy = false, + priority = 900, + config = function() + -- LazyVim loads its colorscheme after plugin configs, so re-apply on every + -- ColorScheme event: that also makes `:colorscheme foo` land on our palette. + vim.api.nvim_create_autocmd("ColorScheme", { + desc = "Re-apply the matugen base16 palette after any colorscheme", + callback = function() + require("matugen").setup() + end, + }) + require("matugen").setup() + end, +} diff --git a/dotfiles/lazyvim/stylua.toml b/dotfiles/lazyvim/stylua.toml new file mode 100644 index 0000000..5d6c50d --- /dev/null +++ b/dotfiles/lazyvim/stylua.toml @@ -0,0 +1,3 @@ +indent_type = "Spaces" +indent_width = 2 +column_width = 120 \ No newline at end of file diff --git a/dotfiles/noctalia/.local/state/noctalia/settings.toml b/dotfiles/noctalia/.local/state/noctalia/settings.toml index 93e7c5c..b7b08a5 100644 --- a/dotfiles/noctalia/.local/state/noctalia/settings.toml +++ b/dotfiles/noctalia/.local/state/noctalia/settings.toml @@ -275,13 +275,13 @@ transition = [ "fade" ] interval_seconds = 1200 [wallpaper.default] - path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_oxex69.jpg" + path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v9w8r5.jpg" [wallpaper.last] - path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_oxex69.jpg" + path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v9w8r5.jpg" [wallpaper.monitors.DP-1] - path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_oxex69.jpg" + path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v9w8r5.jpg" [wallpaper.monitors.DP-2] path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_oxex69.jpg" @@ -290,7 +290,7 @@ transition = [ "fade" ] path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v9e2w3.jpg" [wallpaper.monitors.eDP-1] - path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_oxex69.jpg" + path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v9w8r5.jpg" [weather] unit = "imperial" diff --git a/dotfiles/zz-blankpad/zsh/.zshrc b/dotfiles/zz-blankpad/zsh/.zshrc index f5fded4..cf87963 100644 --- a/dotfiles/zz-blankpad/zsh/.zshrc +++ b/dotfiles/zz-blankpad/zsh/.zshrc @@ -4,3 +4,8 @@ source /usr/share/cachyos-zsh-config/cachyos-config.zsh [ -f ~/.config/secrets/hf_token ] && export HF_TOKEN="$(cat ~/.config/secrets/hf_token)" [ -d "$HOME/.bun/bin" ] && export PATH="$HOME/.bun/bin:$PATH" + +# LazyVim lives in its own NVIM_APPNAME profile (~/.config/lazyvim), so plain +# `nvim` stays a vanilla quick-edit editor. NVIM_APPNAME swaps config, data, +# state and cache dirs wholesale — no shared plugin tree between the two. +lazyvim() { NVIM_APPNAME=lazyvim nvim "$@"; }