diff --git a/agent/managed-skills/command-center-bundle-lint-gate/SKILL.md b/agent/managed-skills/command-center-bundle-lint-gate/SKILL.md new file mode 100644 index 0000000..429ff77 --- /dev/null +++ b/agent/managed-skills/command-center-bundle-lint-gate/SKILL.md @@ -0,0 +1,67 @@ +--- +name: command-center-bundle-lint-gate +description: "Before committing docs in dank/command-center, lint the real omp-docs bundle directly — the bats suite only lints fixtures, so a green suite is not proof." +--- + +# The bundle lint gate (`dank/command-center`) + +Adding or editing pages under `omp-docs/`? `bats tests/` going green proves +nothing about the pages you just wrote. + +## Why this exists + +`tests/kb-lint.bats` exercises `scripts/kb-lint.sh` against `mktemp -d` fixtures +(`"conformant bundle passes"`, `"missing frontmatter is reported"`, …). For years +nothing in the suite pointed the linter at the shipped tree, so a page with no +frontmatter, an index that stopped listing a file, or a broken relative link +committed under a green suite. (Two tests appended 2026-10-20 now run both +checkers against `omp-docs/`; verify they are still present before assuming the +suite covers it — `grep -n omp-docs tests/kb-lint.bats`.) + +The general law: **a lint suite that tests only the linter does not lint your +content.** Check which one a suite runs before calling green a gate. + +## Gate a docs commit + +```bash +cd +bats tests/ ; grep -E '^1\.\.' /tmp/… # suite (count, failures) +./scripts/kb-lint.sh omp-docs # want: kb-lint: 0 violation(s) +python3 scripts/kb-coverage.py omp-docs # want: index-coverage: 0 issue(s) +``` + +`kb-lint.sh ` (default `omp-docs`) = OKF v0.1 conformance **plus link +integrity**, so it is the check that absolute bundle links like +`/tools/gitea/client-access.md` resolve. `kb-coverage.py` = every page listed by +its directory `index.md` (repo doctrine: nothing may appear in a directory its +`index.md` does not list). + +OKF shape that passes: every concept page carries frontmatter with a `type` +(`type: reference` + `title`/`description`/`tags`/`timestamp`/`verified`); +`index.md` files carry **no** frontmatter; new pages get an entry in their +directory index in the same commit, plus a dated entry in `omp-docs/log.md` +(one entry = what changed + the durable lesson, a few lines, never a narrative). + +## Commit-message trap in this harness + +A multi-line message written as a heredoc inside a chained `bash` command +(`git commit -q -F - <<'MSG' … && …`) fails with +`pi-natives:command: syntax error at end of input`. Write the message to +`/tmp/msg-.txt` with the write tool and `git commit -q -F /tmp/msg-.txt`. +Keep the `&&` chain so a failed gate stops the commit — hooks (secret gate) stay armed, +never `--no-verify`. + +## Land and reap + +Merge is form-encoded `do=merge&merge_style=no-ff` and answers `200` with an +**empty body**; never read that as ambiguous — verify by landing. Then +`git -C ~/.omp merge --ff-only origin/main` (the checkout *is* the deployment; +dirty `agent/memories/`, `agent/config.yml`, `APPEND_SYSTEM.md` are machine-tier +live state and do not block an ff whose diff misses them), fast-forward the +session's `wt/*` scratch branch the same way, then `git worktree remove ` +and `git branch -d /-` (`-d` succeeding is itself proof of +merge). + +Stray files whose names start with `-` (e.g. `-c`, `-es` — vim takes a +`--startuptime` flag name as the output filename) show as untracked dirt: +`mv ./-c .AGENTTRASH/-.log`, never `rm`. diff --git a/agent/managed-skills/gitea-api-pr-operations/SKILL.md b/agent/managed-skills/gitea-api-pr-operations/SKILL.md index 52fc9be..687de15 100644 --- a/agent/managed-skills/gitea-api-pr-operations/SKILL.md +++ b/agent/managed-skills/gitea-api-pr-operations/SKILL.md @@ -1,21 +1,27 @@ --- name: gitea-api-pr-operations -description: "\"Open, list, merge, and diagnose issues/PRs on the Dankclaw Gitea API (192.168.0.143:3000, repo dank/command-center) with the token stored in ~/.config/secrets/gitea — incl. the required merge payload, where review comments actually live on 1.27.3, and how to recover the session id for the mandatory body footer.\"" +description: "\"Open, list, merge, and diagnose issues/PRs and manage labels on the Dankclaw Gitea API (192.168.0.143:3000) with the token stored in ~/.config/secrets/gitea — incl. the token-only write auth (Basic reads but 422s on POST/PATCH), the required merge payload, where review comments actually live on 1.27.3, and how to recover the session id for the mandatory body footer.\"" --- -# Gitea API PR operations (Dankclaw `dank/command-center`) +# Gitea API operations (Dankclaw `dank/command-center`, `dank/serverAppConfigs`) ## Where -- Token: `~/.config/secrets/gitea` (`http://user:TOKEN@192.168.0.143` single line). +- Token: `~/.config/secrets/gitea` (`http://user:TOKEN@192.168.0.143` single line — git-credential URL form, NOT `username=`/`password=` lines). Extract WITHOUT echoing: `tok=$(sed -nE 's#^http://[^:/@]+:([^@]+)@192\.168\.0\.143.*#\1#p' ~/.config/secrets/gitea | head -1)` - Build a 600-perm temp curl config and use `curl -K`: `cfg=$(mktemp) && chmod 600 "$cfg" && printf 'header = "Authorization: token %s"\n' "$tok" > "$cfg"` Delete `$cfg` after use. NEVER pass `-H "Authorization: token $tok"` (the literal header lands in transcript + logs). NEVER echo the token. -- Base URL: `http://192.168.0.143:3000/api/v1/repos/dank/command-center`. +- Base URL: `http://192.168.0.143:3000/api/v1/repos/dank/`. -## Recipes (all verified live 2026-10-18) +## Auth: reads tolerate Basic, writes DO NOT (measured 2026-10-20) +GETs succeed with an HTTP Basic header built from the same credential, but every +POST/PATCH/DELETE with Basic returns `407/422 {"message":"token is required"}`. +Always use the `Authorization: token ` header for everything — never debug +"permissions" when the header shape is the fault. + +## Recipes (all verified live) - **Open PR** (token only needed for private repos; this one reads publicly but POST needs auth): `POST /pulls` JSON `{title, head, base:"main", body}`. - **PATCH PR title/body**: `PATCH /pulls/` with JSON body `{title}` and/or @@ -36,6 +42,12 @@ description: "\"Open, list, merge, and diagnose issues/PRs on the Dankclaw Gitea merge --ff-only origin/main` propagates the live deployment. - **Issues**: same shape at `/issues` (`POST {title, body}`), `/issues//comments` (`POST {body}`, `PATCH .../comments/`) — both work with the temp-cfg auth. +- **Labels**: `GET /labels` (list incl. numeric `id`); `POST /labels` + `{"name":"","color":"#rrggbb"}` to create; attach by ID with + `POST /issues//labels {"labels":[,...]}` (names are rejected); + detach with `DELETE /issues//labels/`. serverAppConfigs gained + needs-triage / needs-info / ready-for-agent / ready-for-human / wontfix + (2026-10-20) alongside the older `human-only`. ## Review comments: the API lies on 1.27.3 (learned 2026-10-18) - `GET /pulls//comments` (inline review comments) → **404 `not found` on every diff --git a/agent/managed-skills/repo-agent-handoff-doc/SKILL.md b/agent/managed-skills/repo-agent-handoff-doc/SKILL.md new file mode 100644 index 0000000..0f7a274 --- /dev/null +++ b/agent/managed-skills/repo-agent-handoff-doc/SKILL.md @@ -0,0 +1,80 @@ +--- +name: repo-agent-handoff-doc +description: "Use when asked to write or refresh a standing handoff/status doc so agents landing in a repo can continue work isolated from other directories; sections that code cannot reveal, plus moving untracked docs onto a branch without dirtying a shared checkout." +--- + +# Standing agent handoff doc for a repo + +"Put a complete handoff on project X in its directory so agents there can work +isolated" is not a changelog request. The value is the knowledge the code cannot +reveal. Discover the repo's own conventions first, then write one **living** file. + +## 0. Fit the repo, do not invent a layout + +`ls -a` + `grep -n '^##' README.md` + `find docs -maxdepth 2` before writing: +- existing `docs/` conventions (dated `docs/decisions/*.md` records vs flat pages), +- whether an `AGENTS.md`/`CLAUDE.md` auto-loads (if not, the README is the only + entry point → the handoff MUST be linked from it, same commit), +- the exact numbers you will quote: per-file `grep -c '^@test'`, `package.json` + `scripts`, module list from `ls src/`. Never write a test count or command from + memory. + +## 1. Section checklist (point of use — each answers a question the next agent hits) + +1. **State line**: the commit it describes (`main` at ``, "after PRs #N") + + the rule that whoever leaves work updates it in the same commit. A stale + handoff is worse than none: it gets believed. +2. **Commands** — build/typecheck/test with real runtime, plus concurrency + hazards (e.g. a suite that rebuilds `dist/` in `setup()` → two `bats` runs + corrupt each other's byte-identical pin). +3. **Test seam and how to add a test** — where the harness mock lives, scenario + names, how scripted UI answers are consumed, env dials that are *ignored* + (a `setup()` that clobbers your override), and the red-first rule with the + one exception (a characterization test that says so in a comment). +4. **The laws, each with the test that holds it** — table form. Distinguish + load-bearing invariants from incidental behaviour; this is the section that + stops a confident agent "fixing" a chosen design. +5. **Worktree/dev-dir recipe** — symlinked deps, gitignore rule that keeps the + symlink untracked, why the shared checkout stays clean. +6. **Ship path** — branch → tests → rebuild committed artifact → PR → merge on the + owner's OK → land with `--ff-only` → deploy (the gotcha that the upgrade target + is the PACKAGE name, not the directory alias) → `cmp` the live artifact against + the merged build → prune. Include the auth traps of the forge (token via a + 600 curl `-K` file, empty token answering 404 not 401, form-encoded merge). +7. **Live verification** — the instrument that produces evidence (stub player, + log line counts, pty submit semantics), and explicitly what is NOT a check + (print-mode invocation, screen reads of transient toasts, single-take audio + comparisons). +8. **Environment reality not visible from this code** — the live endpoints, + measured limits, refusals; crosslink the README if it owns the table. +9. **Open items** — numbered, each actionable alone, each saying who decides if a + human must; name the repo a fix belongs in when it is NOT this one. +10. **History** — one line per issue/PR. No tables of metrics. + +One owner per fact: link the README/decision records instead of restating knob +tables or rationale. + +## 2. Tree hygiene (the costly step) + +Writing straight into a shared checkout leaves an untracked file on `main` — a +half-deployed state where the checkout is the deployment, and a dirty tree for +everyone else. Move it onto a branch without switching anyone's HEAD: + +```bash +mv /docs/handoff.md /tmp/handoff.md +git -C fetch -q origin +git -C worktree add -q -b docs/ ~/Projects/wt- origin/main +ln -s /node_modules ~/Projects/wt-/node_modules # if deps are needed +mv /tmp/handoff.md ~/Projects/wt-/docs/handoff.md +git -C status --porcelain # shared checkout clean again +``` + +README pointer edit happens **in the worktree** (an edit there is a separate +checkout; editing the shared one dirties a tracked file). Then commit, run the +suite, push, open the PR, and merge only on the owner's explicit OK. + +## 3. Voice rules + +Prose in the repo's own style (match an existing decision record). State reasons +and consequences, not bookkeeping. No measured numbers for things that drift; +keep the law, drop the figure. diff --git a/agent/memories/sharpshooter/dankvoice-ltr11vzomibk/state.json b/agent/memories/sharpshooter/dankvoice-ltr11vzomibk/state.json new file mode 100644 index 0000000..4c9b14c --- /dev/null +++ b/agent/memories/sharpshooter/dankvoice-ltr11vzomibk/state.json @@ -0,0 +1,4 @@ +{ + "v": 1, + "lastConsolidatedAt": 1792536631688 +} diff --git a/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/product.md b/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/product.md index 55e2e06..8ed9c4d 100644 --- a/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/product.md +++ b/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/product.md @@ -3,4 +3,8 @@ - Typed intro: "Update, [randomly generated epithet]!" - Heckle mode option - Typed outro: "More later, over and out!" -- Generation frequency control \ No newline at end of file +- Generation frequency control + +## Documentation Flow + +- Put any created docs in the existing knowledgebase instead of creating a new one \ No newline at end of file diff --git a/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/state.json b/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/state.json index 931642f..a57883c 100644 --- a/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/state.json +++ b/agent/memories/sharpshooter/wt-20261019-125509-7c8a99d-me8scwe1t2nf/state.json @@ -1,10 +1,10 @@ { "v": 1, - "lastConsolidatedAt": 1792524641573, + "lastConsolidatedAt": 1792538189166, "lastResult": { - "at": 1792452243238, + "at": 1792537233005, "sessions": 1, - "deltas": 4, + "deltas": 1, "model": "frank-zealot" } } diff --git a/agent/memories/sharpshooter/wt-20261020-125416-6d1fc1f-3cjcsma2m7gk5/product.md b/agent/memories/sharpshooter/wt-20261020-125416-6d1fc1f-3cjcsma2m7gk5/product.md index b2a4c78..1c10ca5 100644 --- a/agent/memories/sharpshooter/wt-20261020-125416-6d1fc1f-3cjcsma2m7gk5/product.md +++ b/agent/memories/sharpshooter/wt-20261020-125416-6d1fc1f-3cjcsma2m7gk5/product.md @@ -1,2 +1,2 @@ ## Handoff Location -- put it at ~/Projects \ No newline at end of file +- put it at ~/Projects diff --git a/agent/memories/sharpshooter/wt-20261020-125416-6d1fc1f-3cjcsma2m7gk5/state.json b/agent/memories/sharpshooter/wt-20261020-125416-6d1fc1f-3cjcsma2m7gk5/state.json index 30ec72c..a58e646 100644 --- a/agent/memories/sharpshooter/wt-20261020-125416-6d1fc1f-3cjcsma2m7gk5/state.json +++ b/agent/memories/sharpshooter/wt-20261020-125416-6d1fc1f-3cjcsma2m7gk5/state.json @@ -1,8 +1,8 @@ { "v": 1, - "lastConsolidatedAt": 1792534456791, + "lastConsolidatedAt": 1792538116812, "lastResult": { - "at": 1792532921161, + "at": 1792537164207, "sessions": 1, "deltas": 1, "model": "frank-zealot" diff --git a/agent/memories/sharpshooter/wt-20261020-144605-e7c60f6-31xsw83t7yjc6/state.json b/agent/memories/sharpshooter/wt-20261020-144605-e7c60f6-31xsw83t7yjc6/state.json index 5fb2807..a5e808e 100644 --- a/agent/memories/sharpshooter/wt-20261020-144605-e7c60f6-31xsw83t7yjc6/state.json +++ b/agent/memories/sharpshooter/wt-20261020-144605-e7c60f6-31xsw83t7yjc6/state.json @@ -1,4 +1,4 @@ { "v": 1, - "lastConsolidatedAt": 1792534385325 + "lastConsolidatedAt": 1792537985341 } diff --git a/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/architecture.md b/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/architecture.md new file mode 100644 index 0000000..e69de29 diff --git a/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/product.md b/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/product.md new file mode 100644 index 0000000..c850951 --- /dev/null +++ b/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/product.md @@ -0,0 +1,3 @@ +## Documentation structure + +- Store agent-related docs in `dankvoice-docs` \ No newline at end of file diff --git a/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/state.json b/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/state.json new file mode 100644 index 0000000..31cadd5 --- /dev/null +++ b/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/state.json @@ -0,0 +1,10 @@ +{ + "v": 1, + "lastConsolidatedAt": 1792538005214, + "lastResult": { + "at": 1792537052571, + "sessions": 1, + "deltas": 2, + "model": "frank-zealot" + } +} diff --git a/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/style.md b/agent/memories/sharpshooter/wt-20261020-155034-1b9ba40-iffz605wjz2v/style.md new file mode 100644 index 0000000..e69de29 diff --git a/agent/memories/sharpshooter/wt-20261020-155521-1b9ba40-30rfxlamgvpdt/state.json b/agent/memories/sharpshooter/wt-20261020-155521-1b9ba40-30rfxlamgvpdt/state.json new file mode 100644 index 0000000..17be469 --- /dev/null +++ b/agent/memories/sharpshooter/wt-20261020-155521-1b9ba40-30rfxlamgvpdt/state.json @@ -0,0 +1,4 @@ +{ + "v": 1, + "lastConsolidatedAt": 1792536921764 +} diff --git a/dotfiles/noctalia/.local/state/noctalia/settings.toml b/dotfiles/noctalia/.local/state/noctalia/settings.toml index b93317f..841e4d2 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_nzz3gy.jpg" + path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v93dk3.jpg" [wallpaper.last] - path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_nzz3gy.jpg" + path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v93dk3.jpg" [wallpaper.monitors.DP-1] - path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_nzz3gy.jpg" + path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v93dk3.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_nzz3gy.jpg" + path = "/home/blank/.local/share/noctalia/wallpapers/wallhaven_v93dk3.jpg" [weather] unit = "imperial"