* feat(skills): load skills from ~/.agents/skills and opt-in ~/.claude/skills (#2258)
Read user skills that other coding agents keep in their own homes,
read-only and after every OpenClaude-owned skill source:
- ~/.agents/skills (shared cross-agent home used by Codex and
`npx skills`) loads by default; agentsSkillsEnabled turns it off.
- ~/.claude/skills (Claude Code's private config dir) is opt-in via
claudeCodeSkillsEnabled, keeping the #1875 isolation default.
Both settings are honored from user, local, flag and policy settings
only; project settings cannot opt a user in. Sibling skills never shadow
anything: same-file dedup keeps the OpenClaude copy of a symlinked skill,
and a sibling skill is dropped when any skill-dir, dynamic, plugin or
bundled skill or built-in command owns its name. When the skill listing
is over budget, sibling skills go names-only before any OpenClaude skill
description is trimmed.
/skills and `openclaude skills list` group and label sibling skills and
hint at disabled homes that hold skills; /config gets a toggle for each
home; `skills remove` refuses them; enabled homes are watched. The
skills CLI now registers bundled skills and built-in plugins like a
session does, so name collisions resolve the same way.
Co-Authored-By: OpenClaude <openclaude@gitlawb.com>
* fix(skills): respect pinned sibling settings in /config and start the watcher on toggle
- /config hid a sibling skills toggle only when managed policy set it.
Local and --settings values outrank the user settings the toggle
writes, so flipping it there changed nothing. resolveSiblingSkillsHomes
now reports pinnedBy for any source that outranks user settings;
/config hides that toggle and the /skills hint skips that home.
- Turning a home on in /config added it only to a running watcher. With
no skill directory at startup there was none, so edits in the newly
enabled home never hot-reloaded. The reload now starts the watcher.
Co-Authored-By: OpenClaude <openclaude@gitlawb.com>
* fix(skills): reconcile sibling source state and CLI bootstrap
* fix(skills): preserve activation during command refresh
* test(skills): wait for observed watcher edits
* fix(skills): reconcile sibling sources and fence stale loads
* fix(skills): reserve owned invocation names against sibling display names
* test(skills): allow bounded subprocess regression to finish
* fix(skills): preserve sibling identity priority and watch linked skills
---------
Co-authored-by: OpenClaude <openclaude@gitlawb.com>
Co-authored-by: jatmn <the@jat.mn>
* chore(rebrand): update Gitlawb references to Twigpine (#2246)
The GitHub org has been renamed to Twigpine, so point repo URLs, badges,
CI repo-identity guards, and user-facing sponsor/partner labels at the new
name.
Scope is deliberately limited to references that are safe to change today:
- GitHub URLs (github.com, api.github.com, raw.githubusercontent.com),
including the skills registry and release-please release notes
- The release-please release trigger, which gates on the repo slug and
would otherwise stop publishing
- User-visible display strings: gateway label/name, AI/ML API partner
name, sponsored-tip sponsor, and docs/site prose
Left on the old name because the rename has not landed for them:
- `@gitlawb/openclaude` npm scope (the package does not exist on npm)
- opengateway/ads/docs subdomains, which resolve only under gitlawb.com
- The `gitlawb-opengateway` preset id, tip ids, and gateway file names,
which are persisted in user config and sent on the wire
* fix(aimlapi): stop matching topup intent on partnerName (#2246)
partnerName is display metadata that travels alongside the partner id, not
part of the intent identity. It is now excluded from INTENT_KEYS, so
matchesIntent no longer requires it to be unchanged.
Without this, renaming the partner on the Gitlawb -> Twigpine rebrand would
have stranded any in-flight topup: a receipt persisted under the old name
fails the strict equality check, so loadAimlapiTopupState returns null and
the user restarts checkout. partnerId remains the identity field, so
receipts are still scoped to the correct partner.
* fix(web): use current Twigpine artwork for the partner card (#2246)
The partner asset was a byte-identical rename, so the roster row rendered
the former GitLawb key/branch symbol under the Twigpine name while the
README pointed at the official tree mark. Vendors the current artwork from
twigpine.com/logo.png, resized to the roster's 256x256 convention, keeping
the self-hosting contract in web/src/data/partners.ts.
---------
Co-authored-by: Gravirei <gravirei@users.noreply.github.com>
* docs: add a skills guide
* docs: imprvements on skills doc
* docs(skills): address review on the skills guide
* docs(skills): correct verify exit code descriptions
* docs(skills): state what each check covers
* docs(skills): align validate wording and name each install path condition