Commit Graph

87 Commits

Author SHA1 Message Date
witcheer
7301a9aa71 docs(user-stories): add 45 business and professional stories (#133708)
Prepends 45 verified first-person stories of Hermes Agent used at work
(companies, agencies, practices, shops and solo operators) to
userStories.json. Every quote is verbatim from the linked public source.
No existing entries are changed or removed.

Co-authored-by: witcheer <208820874+notwitcheer@users.noreply.github.com>
2026-10-06 00:07:45 -07:00
teknium1
83097ba008 fix(desktop): keep the hermes://skill/install deep link through the catalog revert
The plugin deep link (hermes://plugin/install?catalog=) and the skill
deep link are separate features: one per kind. Reverting #119381's card
catalog should not leave skills without a link, so this restores the
skill route on its own:

- Desktop: skill-deeplink-install store, the skill route in
  deeplink-routes, its use-desktop-integrations wiring, and the
  confirm-store onConfirm/details/busy/done phases its dialog uses
  (restored from main with their tests). Its nine strings move from the
  deleted catalog.* namespace to skillDeepLink.* (en + the six locales
  that translated them).
- Website: Skills Hub "Install in Hermes" button, plus the
  source-qualified installIdentifier from extract-skills.py so the link,
  the embedded picker and the CLI command all name the exact skill
  (apps/shared/src/catalog-install.ts keeps only the skill helpers).
- Docs: skills.md "Install from the website" section, desktop.md pointer.

The card catalog UI stays reverted.
2026-10-02 10:29:28 -07:00
teknium1
6cb7a64e59 revert: Skills and Plugins card catalog browser, third landing (reverts #119381)
Reverts all seven commits of #119381 (59c54c78..476ff4dd), which
re-landed the native card-based Skills/Plugins catalog browser after it
was reverted twice (#113037 reverting #112669, #115787 reverting
#113128). Capabilities -> Skills and Plugins return to the list/detail
tabs with the embedded catalog picker they had before #119381.

Removed with it:
- Desktop catalog/ module (browser, cards, detail dialog, filters,
  reels/masonry, install switch) and skill deep-link install
  (hermes://skill/install); skills/embedded-hub-picker.tsx comes back.
- apps/shared catalog-browse.ts and catalog-install.ts.
- The `catalog` i18n namespace in every locale (+ regenerated
  locales/_keys.desktop.json); the two i18n pack tests and the keys
  test now exercise connectorsPage.searchPlaceholder instead.
- Website /skills "Open in Hermes Desktop" skill links and the
  extract-skills install identifiers; docs return to the pre-#119381 text.
- Later fixes that only patched the reverted catalog code go with it:
  5832a6eb93 + 7aba2cbbe9 (catalog download deadline),
  9e63cdc4b8 (catalog lookalike rows), c756986db2 (catalog counts),
  the catalog half of c13232e90c / f265273347.

Kept on purpose (later work that depends on code #119381 introduced):
- DialogContent `chrome` / `overlayClassName` / nested-dialog layering
  (the image lightbox uses them).
- vitest.setup.ts / src/test/jsdom.ts stubs (other suites rely on them).
- Kanban toolset wiring on the Plugins Desktop switch (cd30fdadf6,
  7ca2f5665f) and its tests, the `hermes_not_connected` server tone,
  the SearchField flex-1 fix, skill provenance helpers. SkillDetail shows
  a provenance pill only for agent/hub skills, since the pre-#119381
  labels have no `external` entry.
2026-10-02 10:29:28 -07:00
teknium1
d802c47238 docs: one complete plugin catalog submission guide, synced with the README rules
Submitters only saw a stale 5-point summary on the catalog page (it even listed
a 'Released' requirement nothing enforces), while reviewers applied ten README
rules plus criteria written nowhere public (credentials, approvals, disclosure,
compatibility metadata, forks of bundled plugins).

- plugin-catalog/README.md: rules 11-15 write down those review criteria; the
  rule list sits between admission-rules markers.
- New developer-guide page 'Submitting to the plugin catalog': before you
  submit, the PR flow, the full rule block (verbatim mirror), pin updates,
  delisting vs removal, asking for a hook.
- The /plugins 'Submit' links and the user-guide section point at it.
- tests/website/test_catalog_rules_mirror.py fails when the two rule blocks
  differ; classify_changes makes a README-only edit run it.
- AGENTS.md, plugins/AGENTS.md and CONTRIBUTING.md reference both files.
2026-10-01 21:58:11 -07:00
liuhao1024
f87a52edf2 fix(website): abort a stalled skills catalog fetch and show a retryable error card
The Skills Hub page fetched the catalog with a bare fetch and no timeout,
so a silently hung connection (DNS pollution, TLS resets) left it on
"Loading the catalog…" forever, and any load error fell through to the
misleading "No skills found" empty state with no retry path.

Read the catalog bodies as streams and abort only when no bytes have
arrived for 45s — slow-but-alive transfers keep re-arming the timer and
are never cut off, while a dead connection surfaces as a stall error.
Failed loads now render a dedicated error card with a Retry button
instead of the empty state, and effect cleanup aborts the in-flight
fetch on unmount.

Fixes #97861
2026-09-29 19:20:28 -05:00
Austin Pickett
5d40f8e95d docs(website): move Terms/Privacy links from catalog footers into the hero
Legal links at the very bottom of the Skills Hub and Plugin Catalog were
easy to miss. Show 'Terms • Privacy Policy' in the hero instead, linking
to the same portal.nousresearch.com pages, and drop the now-unused
legalNote footer markup and CSS.
2026-09-28 19:31:44 -04:00
Austin Pickett
9a0a162536 docs(website): Terms of Service + Privacy Policy links on Plugin Catalog and Skills Hub (#125916)
* docs(website): link Terms of Service and Privacy Policy under Plugin Catalog and Skills Hub

* docs(website): open catalog legal links in a new tab
2026-09-27 22:48:07 -04:00
teknium1
14c4b62e6a website: catalog card banner slot at the 2:1 catalog ratio instead of a 120px crop
The fixed 120px strip cropped ~50px off the top and bottom of every authored
banner at 3 columns. The catalog spec (plugin-catalog/README.md) asks for 2:1
images and 48 of the 56 shipped banners are exactly that, so size the slot by
aspect ratio: the same width on every card in the grid keeps heights uniform
(probe: 9/9 grids single height) and 49/57 loaded banners now render whole.
The placeholder glyph scales up with the taller slot.
2026-09-27 11:18:17 -07:00
teknium1
afc05274a2 website: keep the plugin name whole; tier/version pills move to the chip row, tools as one ellipsized list
With Community + version + stars pinned beside the title at 3 columns the name
collapsed to 'hermes-r…' — the one element a card must never lose. The title
now owns its row (stars stay right-aligned); tier and version pills lead the
chip row. The Tools row renders the first three names as one comma-separated
run that ellipsizes as a whole plus '+N', instead of three shrinking chips that
read 'mnemosyn… mnemosyn… mnemosyn…' for same-prefix tools.
2026-09-27 03:34:51 -07:00
teknium1
97a3607838 feat(website): uniform plugin catalog cards (clamped text, capped tool list)
Every card in a Plugin Catalog grid now renders at one height, so rows line
up instead of staggering by description length, banner presence and tool
count (the Desktop section had 28 distinct card heights, 412px to 1485px).

- grid-auto-rows: 1fr + column-flex card; the detail block (facts, install
  box, links) sinks to the bottom edge of every card
- banner slot is always 120px: entries without an image get a placeholder
  (tier tint gradient + large muted category glyph); a broken image URL
  swaps to the placeholder instead of collapsing the slot
- title row is one line (ellipsis), description clamps to 3 lines with an
  ellipsis and reserves 3 lines when shorter; full text stays in `title`
- chip row and dates row are one fixed line each (right-edge fade mask on
  chips); dates row renders empty when undated
- facts block is exactly three fixed-height rows: Maintainer, Pinned (with
  `Requires` folded in as `· hermes >=x`), Tools — first 3 tool names as
  chips plus a dashed `+N` chip (full list in `title`), or a muted dash
- install command truncates with an ellipsis instead of scrolling

`capToolChips` in PluginCatalog/catalog.ts is the cap helper (first 3 + N).
Desktop picker embed (`?embed=picker`) uses the same card and stays uniform.
2026-09-27 03:34:51 -07:00
kshitijk4poor
3eea0fe1e1 refactor(website): dedupe plugin catalog light-mode overrides
Follow-up to the light-mode contrast fix; no visual change on the catalog.

- Edit the existing light .heroEyebrow rule in place instead of shadowing
  it from the appended block (it was left dead at the old #a8860a).
- One rule per component: .starPill, .capChip, .envChip, .copyBtn,
  .highlight, .versionPill/.platformPill and .categoryChip each had colour
  in one block and border/background in another; .categoryBtnActive set its
  colour twice; .docsLink:hover/.emptyCtaSecondary:hover got a colour that
  the later hover rule always overrode.
- The amber was hardcoded ~20 times although it is the theme's own
  --ifm-color-primary-darker (the search icon's is --ifm-color-primary);
  use the variables, including for --plugin-catalog-official.
- Share the light link blue between the list and detail pages via
  --plugin-catalog-link so the two can't drift.
- Plugin detail/author pages used #8a6d00 for light star counts while the
  list now uses the darker amber; align them on the same variable.

Verified: computed colour/background/border/shadow of every element on the
catalog, a plugin page, an official plugin page, an author page and the
empty state, in both themes plus hover on 19 controls, is identical to the
contributor's head except the intended star colour on detail/author pages.
2026-09-26 19:53:39 +05:30
xxxigm
0487c5934e fix(website): keep plugin pages readable in light mode
Version pills and the eyebrow on a plugin page used the same pale colors that disappear on a white background.

(cherry picked from commit a1051e2565a1f2daad934362fc31319020e1c24e)
2026-09-26 19:53:39 +05:30
xxxigm
499c1837ea fix(website): make the plugin catalog readable in light mode
Gold and pale-blue chips, dates, and links sit around 1.2:1 on white, so the catalog grid washes out. Light mode now uses the dark amber and blue already chosen for the docs theme.

(cherry picked from commit b84d6d8fac4ff3f2ef5b9fe32558b8d2a79fae47)
2026-09-26 19:53:39 +05:30
brooklyn!
78e2bcfaa9 refactor(catalog): browse-only catalog with clickable cards, category reels, and plugin enable/disable switches
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-25 12:09:55 -05:00
brooklyn!
e47db9414a feat(catalog): restore website skill links and native browse guidance 2026-09-25 12:09:55 -05:00
ethernet
05609d2092 merge: origin/main (19 commits) into ethie/pm-clean
Conflicts, all inside the local-runtime / local-models subsystem:

- hermes_cli/local_runtime/binaries.py, hermes_cli/web_routers/local_models.py:
  main's own transfer machinery (urllib ranged download, shutil.move publish) is
  retired here — pm/downloader owns every fetch. Took ours.
- tests/hermes_cli/test_local_runtime_downloads.py: deleted here (its subject,
  binaries._download, is gone); kept deleted.
- tests/hermes_cli/test_local_models_routes.py: ours (the pause/resume suite) plus
  main's held-finished-file contract, re-seamed onto the pm downloader.

main's fix 515412f415 ("wait out a held finished download instead of copying it and
failing") is re-homed so it fits the PM model: the Windows rename that fails while an
antivirus or indexing scan still holds a just-closed multi-gigabyte file is now handled
once, in pm/downloader.replace_when_released, which is the single publish path for PM
archives and model files alike. A cleanup that cannot remove its leftover can no longer
mask the error that left it.

Tests: helper retries a transient refusal and lands the file; gives up with the
plain-language message chained to the OS error; a download publishes through two refused
renames with nothing left behind; a stuck hold reports the rename error, not the failed
cleanup. Route-level: the job lands the file and reports done.
2026-09-21 17:24:14 -04:00
kshitijk4poor
4a75fad06a fix(website): keep the compact selects from overrunning their column
At 601px the select columns were squeezed to 89/103/113px while the selects
are floored at 120px, so each control overran its neighbour (row scrollWidth
603 vs 569 clientWidth). Hold the same floor on the column, letting the
search field absorb the shrink instead.

The plugins panel had the same viewport-drift the drawer had: leaving the
mobile band left `filtersOpen` true, so `aria-expanded` stayed "true" on the
hidden toggle. Reset it from the same media query.
2026-09-22 02:02:30 +05:30
kshitijk4poor
6c91f1b8ba chore(website): drop the unreachable Categories toggle and dead control CSS
The new compact controls hid `.sidebarToggle` at every width — the 1024px
block's `.layout > .sidebarToggle` rule outranks the later 900px
`display: flex` — so its button, `activeCatBadge` and three CSS blocks were
unreachable, and the drawer's `onKeyDown` was shadowed by the focus trap's
capture-phase listener. Delete them.

Also drop declarations that cannot paint under `display: contents`
(`padding`/`border-bottom`/`backdrop-filter`/`background !important` on
`.controlsBar` at <=600px), the redundant `.compactSort` hide (its parent is
already hidden), and the empty effect left over on the plugins page.

`.filterPanel.filterPanelOpen` keeps the open panel working regardless of
source order instead of relying on the 600px block coming last.
2026-09-22 02:02:30 +05:30
kshitijk4poor
c125b005a6 fix(website): stop the filters panel from jumping the page
Tapping Filters scrolled 391px even when the panel was already on screen,
because the handler called `scrollIntoView({ block: "start" })` on every
open. Reveal it from an effect instead, with `block: "nearest"`, and keep the
click handler a plain state toggle (the cancelled rAF no longer rides along
on the handler).
2026-09-22 02:02:30 +05:30
kshitijk4poor
e2ee6c7be3 fix(website): drop the drawer state when the viewport leaves mobile
Opening the filters drawer at <=600px and then resizing to a wider viewport
left `sidebarOpen` true: the hidden toggle kept `aria-expanded="true"`, and
coming back to mobile silently reopened the drawer and re-locked body scroll.

Reset it in the matchMedia sync, and name the query constant so it stays in
step with the `max-width: 600px` CSS blocks it mirrors.
2026-09-22 02:02:30 +05:30
kshitijk4poor
e4b05b0ef5 fix(website): keep the compact bar pinned inside the picker embed
`?embed=picker` hides the navbar and pins the controls bar to the frame top,
but that override still names `.controlsBar` — which is `display: contents`
at <=600px, so the sticky element (`.controlsTopRow`) kept its 60px navbar
offset and left a dead 60px gap with cards sliding under it. Extend the
override to the row, and add the same rule to the skills page, which had no
picker offset at all.
2026-09-22 02:02:30 +05:30
kshitijk4poor
c846b2a4e7 fix(website): give compact filter selects room for their own value
Between 601px and ~870px the compact selects were squeezed to as little as
13px of text area (SOURCE needed 64px), so the control displayed no
readable value while the pills it replaced were hidden — the band had no
way to see the active filter.

Floor the selects at 7.5rem, let the search field shrink to 8rem instead of
12rem, and drop the uppercase labels below 820px where they leave no room.
2026-09-22 02:02:30 +05:30
kshitijk4poor
bf84ba4a24 fix(website): keep the compact directory bar legible in light theme
The new sticky control bar hardcoded the dark surface
(`rgba(7, 7, 13, 0.94)` plus gold borders and a gold-on-gold count badge),
but the site respects `prefers-color-scheme`, so light-mode users got dark
text on a near-black bar: the Filters label measured 1.00 contrast (1.5 by
pixel sample) and the skills search input dropped from 3.34 to 1.12.

Use the theme tokens instead — `--ifm-navbar-background-color` and
`--ifm-hr-border-color` resolve to the previous dark values exactly — and
scope the gold gem/border accents to the dark theme, with
`--ifm-color-emphasis-*` for light mode.
2026-09-22 02:02:30 +05:30
unsupportedpastels
df3e62457b fix(website): compact plugin and skill directory headers
(cherry picked from commit 38ef7b7784e8561f04105fcd0fd7d30bbea6674c)
2026-09-22 02:02:30 +05:30
ethernet
22b0d1c355 Merge remote-tracking branch 'origin/main' into ethie/pm-clean 2026-09-21 03:44:24 -04:00
teknium1
a782e2ee77 fix(website): catalog cards never collapse; clicking one opens the plugin page
Cards toggled between a 2-line summary and an expanded detail block on click, so the
click users expected to open the plugin page only grew or shrank the card, and the way
to the page (a plain-styled title link) was invisible. Cards now always show the full
detail block, the title underlines on hover, and a click anywhere on the card navigates
to /docs/plugins/<name>; inside the Desktop picker embed it opens the page in a new tab
so the host embed stays put.
2026-09-21 00:31:26 -07:00
ethernet
9f2ba1b74d merge origin/main (779 commits) into ethie/pm-clean
Branch semantics kept where main and PM disagree: update_cmd_deps.py,
constraints-termux.txt, the Electron update-api-check module and the
post-swap hand-off test stay deleted; the pending-fleet-restart catch-up
and the local_runtime tag/download ladder stay retired (PM owns engines).

Ported from main onto the branch's shape: profile_scoped_chore for the
auto-archive and plugin-update housekeeping chores, the local-runtime
cross-process boot lock and residency cap, the checkpoint tmp_pack sweep,
the cua daemon-liveness status probe, the remote-served Desktop update
flag (posix.sh / windows.ps1), sign-in for env-pinned remote gateways
(urlDisabled on RemoteSetupFields), the uvloop extra split (uvicorn
without [standard]), and the umask-scoping spawn test.

uv.lock regenerated with pm.build_env --lock-only; new utf-8 reads from
main switched to utf-8-sig (check-windows-footguns).
2026-09-21 00:58:39 -04:00
teknium1
845fee6cf4 feat(website): a page for every catalog plugin and every author
/docs/plugins/<name> and /docs/plugins/by/<maintainer> are generated at
build time by a small Docusaurus plugin (website/plugins/plugin-catalog-pages)
from the same plugins.json the grid fetches, so a merged catalog PR is the
only way a page appears or changes.

Plugin page: full description with the Disclosure sentence pulled into a
callout, pinned commit / version / platforms / requires facts, tools, hooks
and env chips, Desktop install button + CLI command, repository and reviewed
source links, optional screenshots gallery, optional README rendered from the
PINNED commit (fetched at build, allowlisted HTML, raw HTML dropped, relative
links and images resolved against the pinned tree), and a "More by this
author" shelf. Author page: everything a maintainer has in the catalog with
total stars and a profile link when all repos share one owner.

Cards on the grid link through: the title is a link and a card click opens
the page (the Desktop picker embed keeps expanding in place). The shared
vocabulary (entry type, tier/category taxonomy, link builders) moved to
src/components/PluginCatalog/catalog.ts so the three surfaces cannot drift.
Docs: field table and catalog README describe screenshots:/readme: and the
pages.
2026-09-20 20:43:13 -07:00
teknium1
4c2c20f6e7 feat(website): plugin catalog shows when each entry was added/updated and can sort by it
extract-plugins.py derives addedAt/updatedAt per entry from one `git log
--name-status` over plugin-catalog/ (committer dates, so rebase-merged PRs
are stamped when they land; renames carry the original addedAt). A shallow
checkout or missing git yields null dates instead of wrong ones, and
deploy-site.yml now checks out with fetch-depth: 0 so the deploy has the
history.

The /docs/plugins page gains a Sort control (Most starred / Newest /
Recently updated) and an "Added … · Updated …" line on every card; Updated
is hidden while it equals Added.
2026-09-20 20:18:58 -07:00
teknium1
d9fdaeb434 feat(website): catalog cards open the Desktop Install Plugin dialog by catalog name
Every catalog card gets an 'Open in Hermes Desktop' link:
hermes://plugin/install?catalog=<name>. The app resolves the reviewed pin
itself, so the page hands it a catalog name and never a repo URL; the CLI
install command stays in the expanded card for people without the app.
In the in-app picker embed the existing '+ Add to this Agent' button is
unchanged.
2026-09-20 13:56:30 -07:00
ethernet
9f837d298b Merge remote-tracking branch 'origin/main' into ethie/pm-clean
Conflicts resolved toward the PM model: main's lazy_deps/update_cmd_deps/npm
stamp machinery stays deleted (PM + scripts/build/node-deps.mjs own it), the
systemd ExecStop stop-mark rides the installation launcher, legacy
linux_only/macos_only/windows_only markers are rewritten to platforms(), and
finalize_update_receipt carries pending manual-serve obligations forward
again (lost when the ContextVar receipt rewrite crossed c0aa3ce354).

Test harness: the real-home I/O guard exempts /proc/<pid>/fd metadata reads
(deleted-WAL holder scans) and run_tests.sh drops ~/.hermes PATH entries so
shutil.which() cannot trip the tripwire.
2026-09-20 10:07:50 -04:00
teknium1
76fe8f7f5f fix: plugin catalog ranks by stars only and drops the review-claim badges
The catalog hero showed three trust chips ("Reviewed by the Hermes team",
"Installs exactly the version we reviewed", "One click from Hermes Desktop")
and the hero copy repeated the review claim. Teknium asked for the review
claim to go; the row goes with it since the remaining two chips only made
sense as a set.

Ranking pinned the official tier above every community entry, so a 5-star
official plugin sat above a 215-star community one and the page looked
unsorted. Tier no longer ranks; stars desc, unknown stars last, name as the
tiebreak. The Official/Community filter pills still exist for anyone who
wants the tier view.
2026-09-19 22:45:39 -07:00
ethernet
e1576d06a6 Merge remote-tracking branch 'origin/main' into ethie/pm-clean
Resolved toward the branch: PM provisions uv/python (main's install.ps1 uv-shim
salvage + its test and workflow steps dropped), the shim re-exec stays retired,
package.json carries no electron-builder block (afterExtract identity stamp wired
into electron-builder.config.cjs instead; after-pack.mjs keeps signing only),
Desktop workspace-deps helpers stay retired. Main's scratch-dir bootstrap
(export_scratch_tmp_env) is taken and re-run after profile resolution.
2026-09-19 22:57:07 -04:00
ethernet
d29da5fe20 Merge remote-tracking branch 'origin/main' into ethie/pm-clean
Conflicts resolved toward the branch: PM owns dependency preparation, the
Windows shim re-exec/hand-off path stays retired (main's shim-parent wait,
gateway-resume env token and update_cmd_deps tests dropped), docs describe
the PM update flow. The docker workflow parks install-stamp.json around the
toolchain step instead of deleting it so tests/docker can compare provenance.
2026-09-19 13:45:07 -04:00
teknium1
82f99a469d docs: link the plugin-catalog submission guide from the Plugin Catalog page
The /plugins catalog page only pointed at "how to submit" in its empty
state, which nobody sees once the catalog has entries. Add a persistent
"Built a plugin? Submit it to the catalog" link under the hero subtitle
and point both it and the empty-state CTA at the docs section
(plugin-catalog#submitting-a-plugin-to-the-catalog) instead of the raw
GitHub tree, so the submission workflow is one click from the catalog.
2026-09-19 02:36:05 -07:00
teknium1
04a722d677 feat(website): plugin catalog hero speaks to users, not package managers
The hero opened with "Reviewed, SHA-pinned plugins... or copy the CLI
command", a red "0 REMOVED" counter and "ranked by GitHub stars" fine
print: a registry dashboard, not a store front. Now: a benefit-first
tagline, a one-line meta ("138 plugins across 9 categories, updated N
ago"), three trust chips (reviewed / installs the reviewed version /
one click from Desktop) in place of the tier counters, a plain-language
search placeholder with the "/" hint moved to a tooltip, a light search
field in light mode, and a readable eyebrow on white.
2026-09-19 01:57:36 -07:00
teknium1
3eb9712180 Revert "feat(catalog): restore website install links to Desktop"
This reverts commit cf59980e2c.
2026-09-19 00:11:36 -07:00
ethernet
82a5affdd3 Merge remote-tracking branch 'origin/main' into ethie/pm-clean
# Conflicts:
#	hermes_cli/backup.py
#	tests/hermes_cli/test_gateway_restart_loop.py
#	website/docs/developer-guide/web-search-provider-plugin.md
#	website/docs/getting-started/installation.md
#	website/docs/getting-started/updating.md
#	website/docs/index.mdx
#	website/docs/reference/cli-commands.md
#	website/docs/user-guide/docker.md
#	website/docs/user-guide/windows-wsl-quickstart.md
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/plugins/index.md
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/web-search-provider-plugin.md
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/index.mdx
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli-commands.md
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/environment-variables.md
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/docker.md
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/features/plugins.md
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/security.md
#	website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/windows-wsl-quickstart.md
2026-09-18 18:41:16 -04:00
teknium1
36fb2be926 fix(website): cross-page doc links resolve on GitHub as well as on the site
Docs under website/docs were linked with Docusaurus site routes
(`](/getting-started/installation)`, `](/docs/user-guide/x)`), which GitHub's
file viewer resolves as repository paths and 404s (#114428). Relative Markdown
file links (`](../user-guide/x.md#anchor)`) are followed by both GitHub and
Docusaurus, so that becomes the authoring convention:

- website/scripts/check_doc_links.py lints hand-authored EN + zh-Hans pages
  for route-style links (`--fix` rewrites them, refusing any route that maps
  to no doc file); wired into the Docs Site Checks workflow and
  tests/website/test_check_doc_links.py.
- generate-skill-docs.py emits the same relative form for related-skill and
  catalog links instead of `/docs/user-guide/skills/...`.
- src/remark/relativeDocLinks.js rewrites `./x.md`/`../x.md` to
  content-root-absolute `/x.md` before Docusaurus resolves links, so a
  relative link still resolves in the zh-Hans build when source and target
  sit on different sides of the translation fallback (Docusaurus resolves
  `./`/`../` only against the source file's own directory).
- website/README.md states the convention and points at the checker.
2026-09-18 14:27:04 -07:00
ethernet
b4a294fff9 Merge origin/main; keep PM as plugin dependency owner
Reconcile plugin declarations and validation through PM's atomic generation publication; preserve external runtimes, target markers, and conflict refusal. Keep one source-update completion owner and port upstream lifecycle changes to the PM desktop/runtime paths.
2026-09-17 13:52:05 -04:00
teknium1
bd46352705 feat: catalog card image slot is 2:1; version pill reads as a pill
repo social banners are 2:1, so that shape fills the slot without a crop;
the recommended size is in the README/docs. Desktop AgentPluginRow gains
catalog_version to match the generated contract.
2026-09-16 14:18:39 -07:00
teknium1
034313e7cd feat: plugin catalog entries carry an optional version label and card image
The 40-hex sha stays the release, but nobody reads one. Entries may now add
`version: "1.4.0"` (free-form, <=32 chars, never parsed) and `image:` (an https
URL on raw.githubusercontent.com / github.com / *.githubusercontent.com).

Why GitHub-only: the Desktop catalog browser deliberately never fetches from
third-party hosts, and a raw URL pinned to the entry commit is as immutable as
the sha it decorates.

Readers updated together: PluginCatalogEntry + entry_from_mapping (drop with a
warning, entry survives), validate_plugin_catalog.py (admission error), the
site extractor (drop, never fatal), the /docs/plugins card (banner + version
pill + "1.4.0 @ abcd1234" pin), the CLI table/info (pin_label), the TUI-gateway
plugin row (catalog_version -> Desktop "Update to 1.4.0"), and the Desktop
catalog detail header (image).
2026-09-16 14:18:39 -07:00
brooklyn!
cf59980e2c feat(catalog): restore website install links to Desktop 2026-09-16 13:55:13 -05:00
teknium1
9796235822 Revert "feat(catalog): open website installs in Hermes Desktop"
This reverts commit b0e78e60fb.
2026-09-16 09:25:14 -07:00
brooklyn!
b0e78e60fb feat(catalog): open website installs in Hermes Desktop 2026-09-16 04:33:07 -05:00
teknium1
3e2e2c50eb feat(plugin-catalog): rank entries by GitHub stars, probed at most once a day
Catalog entries sort official → stars desc → name, both in browse shelves and
filtered grids, with a ★ pill on each card linking to the repo's stargazers.

Rate-limit discipline is the design constraint: the docs site deploys many
times a day and shares one GitHub App API budget with every other workflow
(tonight's merge train got rate-limited on unrelated uploads). So
website/scripts/fetch-plugin-stars.py first fetches the live site's own
plugin-stars.json (a CDN GET, not the API); if that cache is under 24h old it
is reused verbatim and GitHub is never called. Only a stale cache triggers one
GET /repos/{owner}/{repo} per unique catalog repo, and a 403/429 mid-run keeps
the previous counts instead of zeroing them. extract-plugins.py merges the
cache into plugins.json (`stars`) and plugins-meta.json (`starsFetchedAt`), and
the page footnote says when the ranking was last refreshed.
2026-09-14 21:24:33 -07:00
teknium1
2de17e5d40 feat(plugin-catalog): default shelf is Desktop, catch-all is General; categorise today's six entries
Teknium's call: most community submissions are Desktop panes, so an entry
without a category lands on the Desktop shelf; "other" becomes "general" for
plugins that genuinely span areas. Shelf order puts Desktop first. The six
entries merged today (pets-all, newswire, auto-titler, live-voice,
metamask-wallet, web-octen) get explicit categories.
2026-09-14 21:00:29 -07:00
teknium1
55dbd7f6e1 feat(plugin-catalog): shelve the catalog by category (Memory, Desktop, Platforms, …)
The catalog page was one undifferentiated grid filtered only by tier, so a
memory provider sat between two Desktop panes. Entries now carry an optional
``category`` (memory | desktop | platform | web | tools | voice | automation |
models | other, default other) that the loader, the admission validator and
the site extractor all understand.

/docs/plugins renders one shelf per category in browse mode, a category pill
row under the tier pills, a clickable category chip on every card, and a
results bar (active category, count, clear) when a filter or search flattens
the view. ``hermes plugins catalog`` gains a Category column and groups by it.
All 18 shipped entries are categorised. Unknown categories fail admission
(same contract as tier) so a typo cannot create a phantom shelf.
2026-09-14 21:00:29 -07:00
ethernet
b681f0c50e merge: reconcile origin/main with PM runtime ownership
Preserve upstream fixes without restoring retired dependency installers.
Run configured-feature checks in the selected build interpreter. Reuse a
supported base Python during bootstrap, and preserve durable backup media.

Refresh the dependency lock through PM. Keep the frozen historical import
surface unchanged. Adapt incoming native tests to the platform markers.

Verification: the incoming 86-file pass found two fixture mismatches;
both passed after correction. Targeted PM/update/compatibility checks,
Electron and renderer typechecks, and desktop tests passed.
Native Windows/macOS update journeys and the full suite remain unrun.
2026-09-12 16:55:32 -04:00
teknium1
abedd8c018 fix(website): active filter pill stays readable on hover
The generic .filterBtn:hover rule outranks .filterActive and set the label to emphasis-1000 (near-black) on the emphasis-900 pill background, so hovering the selected filter made it unreadable in light mode and left the #91491 contrast fix incomplete. Add a .filterActive:hover rule keeping the emphasis-0 foreground. Dark mode is unaffected: [data-theme='dark'] .filterActive ties .filterBtn:hover on specificity and wins by source order.
2026-09-12 08:28:35 -07:00