迁移至新觅源码库 — 替换社区链接,保留AI功能

This commit is contained in:
新觅源码库
2026-06-02 03:44:33 +00:00
parent 7aa483f003
commit f10cd4cd9a
51 changed files with 328 additions and 1338 deletions
-101
View File
@@ -1,101 +0,0 @@
name: Bug Report
description: File a bug report to help us improve
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: input
id: version
attributes:
label: Hermes Web UI Version
description: What version of Hermes Web UI are you using?
placeholder: e.g., v0.5.8
validations:
required: true
- type: input
id: hermes_version
attributes:
label: Hermes Agent Version
description: What version of Hermes Agent are you using?
placeholder: e.g., v0.12.0
validations:
required: true
- type: textarea
id: description
attributes:
label: Bug Description
description: A clear and concise description of what the bug is
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Steps to Reproduce
description: Steps to reproduce the behavior
placeholder: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: What you expected to happen
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual Behavior
description: What actually happened
placeholder: |
If applicable, add screenshots to help explain your problem
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs / Error Messages
description: Paste any relevant logs or error messages
render: shell
- type: dropdown
id: environment
attributes:
label: Environment
description: Where are you running Hermes Web UI?
options:
- Docker
- macOS
- Linux
- Windows
- WSL
multiple: true
validations:
required: true
- type: input
id: node_version
attributes:
label: Node Version
description: What version of Node.js are you using?
placeholder: e.g., v24.14.1
- type: textarea
id: additional
attributes:
label: Additional Context
description: Any other context about the problem
-8
View File
@@ -1,8 +0,0 @@
blank_issues_enabled: true
contact_links:
- name: Documentation
url: https://github.com/EKKOLearnAI/hermes-web-ui#readme
about: Please check the documentation first
- name: GitHub Discussions
url: https://github.com/EKKOLearnAI/hermes-web-ui/discussions
about: Use GitHub Discussions for questions that don't fit as issues
@@ -1,76 +0,0 @@
name: Feature Request
description: Suggest an idea for this project
title: "[Feature]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Thanks for suggesting a new feature! Please fill out the form below.
- type: textarea
id: problem
attributes:
label: Problem Statement
description: What problem does this feature solve? What pain point does it address?
placeholder: |
I'm always frustrated when...
validations:
required: true
- type: textarea
id: solution
attributes:
label: Proposed Solution
description: What would you like to see implemented?
placeholder: |
I think adding X would be great because...
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Have you considered any alternative solutions or workarounds?
- type: dropdown
id: priority
attributes:
label: Priority
description: How important is this feature to you?
options:
- Critical - blocking my usage
- High - really need this
- Medium - nice to have
- Low - would be convenient
validations:
required: true
- type: textarea
id: use_cases
attributes:
label: Use Cases
description: Describe specific use cases where this feature would be helpful
placeholder: |
1. When I do X...
2. When I need to Y...
- type: checkboxes
id: contribution
attributes:
label: Willing to Contribute?
description: Would you be willing to help implement this feature?
options:
- label: Yes, I'd like to submit a PR
required: false
- label: Yes, but I need guidance
required: false
- label: No, I don't have time
required: false
- type: textarea
id: additional
attributes:
label: Additional Context
description: Any other context, mockups, or examples about the feature request
-22
View File
@@ -1,22 +0,0 @@
---
name: General Issue
about: Use this for issues that don't fit into bug reports or feature requests
title: '[Question]: '
labels: ['question']
assignees: ''
---
## Please describe your issue
<!-- Provide a clear description of what you'd like to ask or discuss -->
## Context
<!-- Add any other context or screenshots about the issue -->
## Environment (if applicable)
- Hermes Web UI Version:
- Hermes Agent Version:
- Operating System:
- Node Version:
-46
View File
@@ -1,46 +0,0 @@
name: Build
on:
push:
branches:
- main
pull_request:
branches:
- main
- base
permissions:
contents: read
concurrency:
group: build-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
cache-dependency-path: package-lock.json
- name: Install dependencies
run: |
npm ci --ignore-scripts
npm rebuild node-pty
- name: Check repository harness
run: npm run harness:check
- name: Test with coverage
run: npm run test:coverage
- name: Build
run: npm run build
-213
View File
@@ -1,213 +0,0 @@
name: Manual Desktop Build
on:
workflow_dispatch:
inputs:
target_os:
description: "Desktop target OS"
required: true
type: choice
default: win32
options:
- win32
- darwin
- linux
target_arch:
description: "Desktop target architecture"
required: true
type: choice
default: x64
options:
- x64
- arm64
release_tag:
description: "Optional release tag to attach artifacts to"
required: false
type: string
runtime_release_tag:
description: "Optional runtime release tag embedded into the desktop app"
required: false
type: string
permissions:
contents: write
concurrency:
group: desktop-manual-${{ github.event.inputs.target_os }}-${{ github.event.inputs.target_arch }}-${{ github.ref }}
cancel-in-progress: false
jobs:
validate:
runs-on: ubuntu-latest
outputs:
label: ${{ steps.target.outputs.label }}
runner: ${{ steps.target.outputs.runner }}
target_os: ${{ steps.target.outputs.target_os }}
target_arch: ${{ steps.target.outputs.target_arch }}
electron_target: ${{ steps.target.outputs.electron_target }}
artifact_name: ${{ steps.target.outputs.artifact_name }}
artifact_files: ${{ steps.target.outputs.artifact_files }}
steps:
- name: Select requested target
id: target
shell: bash
run: |
write_common_outputs() {
{
echo "label=$1"
echo "runner=$2"
echo "target_os=${{ github.event.inputs.target_os }}"
echo "target_arch=${{ github.event.inputs.target_arch }}"
echo "electron_target=$3"
echo "artifact_name=$4"
echo "artifact_files<<EOF"
shift 4
printf '%s\n' "$@"
echo "EOF"
} >> "$GITHUB_OUTPUT"
}
case "${{ github.event.inputs.target_os }}-${{ github.event.inputs.target_arch }}" in
win32-x64)
write_common_outputs "Windows x64" "windows-latest" "--win nsis --x64" "desktop-win32-x64" \
"packages/desktop/release/*.exe" \
"packages/desktop/release/*.exe.blockmap" \
"packages/desktop/release/latest*.yml"
;;
darwin-arm64)
write_common_outputs "macOS arm64" "macos-14" "--mac dmg zip --arm64" "desktop-darwin-arm64" \
"packages/desktop/release/*.dmg" \
"packages/desktop/release/*.dmg.blockmap" \
"packages/desktop/release/*.zip" \
"packages/desktop/release/*.zip.blockmap" \
"packages/desktop/release/latest*.yml"
;;
darwin-x64)
write_common_outputs "macOS x64" "macos-15-intel" "--mac dmg zip --x64" "desktop-darwin-x64" \
"packages/desktop/release/*.dmg" \
"packages/desktop/release/*.dmg.blockmap" \
"packages/desktop/release/*.zip" \
"packages/desktop/release/*.zip.blockmap" \
"packages/desktop/release/latest*.yml"
;;
linux-x64)
write_common_outputs "Linux x64" "ubuntu-22.04" "--linux AppImage deb --x64" "desktop-linux-x64" \
"packages/desktop/release/*.AppImage" \
"packages/desktop/release/*.deb" \
"packages/desktop/release/latest*.yml"
;;
linux-arm64)
write_common_outputs "Linux arm64" "ubuntu-22.04-arm" "--linux AppImage --arm64" "desktop-linux-arm64" \
"packages/desktop/release/*.AppImage" \
"packages/desktop/release/latest*.yml"
;;
*)
echo "Unsupported desktop target: ${{ github.event.inputs.target_os }} ${{ github.event.inputs.target_arch }}" >&2
exit 1
;;
esac
desktop:
name: Desktop (${{ needs.validate.outputs.label }})
needs: validate
runs-on: ${{ needs.validate.outputs.runner }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
cache-dependency-path: |
package-lock.json
packages/desktop/package-lock.json
- name: Install web UI dependencies
run: |
npm ci --ignore-scripts
npm rebuild node-pty
- name: Build web UI
run: npm run build
- name: Keep production web UI dependencies only
run: npm prune --omit=dev --no-audit --no-fund
- name: Install desktop dependencies
run: npm ci --prefix packages/desktop --no-audit --no-fund
- name: Write runtime release metadata
shell: bash
env:
RUNTIME_RELEASE_TAG: ${{ github.event.inputs.runtime_release_tag }}
run: npm --prefix packages/desktop run write:runtime-release
- name: Configure macOS signing
if: needs.validate.outputs.target_os == 'darwin'
shell: bash
env:
MAC_CSC_LINK: ${{ secrets.MAC_CSC_LINK }}
MAC_CSC_KEY_PASSWORD: ${{ secrets.MAC_CSC_KEY_PASSWORD }}
MAC_APPLE_ID: ${{ secrets.APPLE_ID }}
MAC_APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
MAC_APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
run: |
write_env() {
local name="$1"
local value="$2"
if [ -n "$value" ]; then
{
echo "$name<<EOF"
echo "$value"
echo "EOF"
} >> "$GITHUB_ENV"
fi
}
if [ -z "${MAC_CSC_LINK:-}" ]; then
echo "CSC_IDENTITY_AUTO_DISCOVERY=false" >> "$GITHUB_ENV"
echo "MAC_BUILD_EXTRA_ARGS=--config.mac.notarize=false" >> "$GITHUB_ENV"
echo "No macOS signing certificate configured; building unsigned and skipping notarization."
exit 0
fi
write_env "CSC_LINK" "$MAC_CSC_LINK"
write_env "CSC_KEY_PASSWORD" "$MAC_CSC_KEY_PASSWORD"
if [ -n "${MAC_APPLE_ID:-}" ] && [ -n "${MAC_APPLE_APP_SPECIFIC_PASSWORD:-}" ] && [ -n "${MAC_APPLE_TEAM_ID:-}" ]; then
write_env "APPLE_ID" "$MAC_APPLE_ID"
write_env "APPLE_APP_SPECIFIC_PASSWORD" "$MAC_APPLE_APP_SPECIFIC_PASSWORD"
write_env "APPLE_TEAM_ID" "$MAC_APPLE_TEAM_ID"
echo "macOS signing and notarization are configured."
else
echo "MAC_BUILD_EXTRA_ARGS=--config.mac.notarize=false" >> "$GITHUB_ENV"
echo "macOS signing certificate configured; Apple notarization credentials incomplete, skipping notarization."
fi
- name: Build desktop artifact
shell: bash
run: |
if [ "${{ needs.validate.outputs.target_os }}" = "darwin" ]; then
ulimit -n 10240 || true
echo "File descriptor limit: $(ulimit -n)"
fi
npm --prefix packages/desktop run dist -- ${{ needs.validate.outputs.electron_target }} ${MAC_BUILD_EXTRA_ARGS:-} --publish never
- name: Upload workflow artifact
uses: actions/upload-artifact@v4
with:
name: ${{ needs.validate.outputs.artifact_name }}
path: ${{ needs.validate.outputs.artifact_files }}
if-no-files-found: error
retention-days: 7
- name: Upload artifacts to release
if: github.event.inputs.release_tag != ''
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.inputs.release_tag }}
fail_on_unmatched_files: true
files: ${{ needs.validate.outputs.artifact_files }}
-206
View File
@@ -1,206 +0,0 @@
name: Publish Desktop Artifacts to Release
on:
workflow_dispatch:
inputs:
tag:
description: "Existing release tag to attach artifacts to (e.g. v0.6.5)"
required: true
release:
types: [published]
permissions:
contents: write
concurrency:
group: desktop-release-${{ github.event.release.tag_name || github.event.inputs.tag || github.ref }}
cancel-in-progress: false
jobs:
desktop:
name: Desktop (${{ matrix.label }})
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- label: macOS arm64
runner: macos-14
target_os: darwin
target_arch: arm64
electron_target: "--mac dmg zip --arm64"
artifact_files: |
packages/desktop/release/*.dmg
packages/desktop/release/*.dmg.blockmap
packages/desktop/release/*.zip
packages/desktop/release/*.zip.blockmap
- label: macOS x64
runner: macos-15-intel
target_os: darwin
target_arch: x64
electron_target: "--mac dmg zip --x64"
artifact_files: |
packages/desktop/release/*.dmg
packages/desktop/release/*.dmg.blockmap
packages/desktop/release/*.zip
packages/desktop/release/*.zip.blockmap
- label: Windows x64
runner: windows-latest
target_os: win32
target_arch: x64
electron_target: "--win nsis --x64"
artifact_files: |
packages/desktop/release/*.exe
packages/desktop/release/*.exe.blockmap
packages/desktop/release/latest*.yml
- label: Linux x64
runner: ubuntu-22.04
target_os: linux
target_arch: x64
electron_target: "--linux AppImage deb --x64"
artifact_files: |
packages/desktop/release/*.AppImage
packages/desktop/release/*.deb
packages/desktop/release/latest*.yml
- label: Linux arm64
runner: ubuntu-22.04-arm
target_os: linux
target_arch: arm64
electron_target: "--linux AppImage --arm64"
artifact_files: |
packages/desktop/release/*.AppImage
packages/desktop/release/latest*.yml
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.release.tag_name || github.event.inputs.tag }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
cache-dependency-path: |
package-lock.json
packages/desktop/package-lock.json
- name: Install web UI dependencies
run: |
npm ci --ignore-scripts
npm rebuild node-pty
- name: Build web UI
run: npm run build
- name: Keep production web UI dependencies only
run: npm prune --omit=dev --no-audit --no-fund
- name: Install desktop dependencies
run: npm ci --prefix packages/desktop --no-audit --no-fund
- name: Write runtime release metadata
shell: bash
env:
HERMES_DESKTOP_RUNTIME_RELEASE_TAG: ${{ vars.HERMES_DESKTOP_RUNTIME_RELEASE_TAG }}
run: npm --prefix packages/desktop run write:runtime-release
- name: Configure macOS signing
if: matrix.target_os == 'darwin'
shell: bash
env:
MAC_CSC_LINK: ${{ secrets.MAC_CSC_LINK }}
MAC_CSC_KEY_PASSWORD: ${{ secrets.MAC_CSC_KEY_PASSWORD }}
MAC_APPLE_ID: ${{ secrets.APPLE_ID }}
MAC_APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
MAC_APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
run: |
write_env() {
local name="$1"
local value="$2"
if [ -n "$value" ]; then
{
echo "$name<<EOF"
echo "$value"
echo "EOF"
} >> "$GITHUB_ENV"
fi
}
if [ -z "${MAC_CSC_LINK:-}" ]; then
echo "CSC_IDENTITY_AUTO_DISCOVERY=false" >> "$GITHUB_ENV"
echo "MAC_BUILD_EXTRA_ARGS=--config.mac.notarize=false" >> "$GITHUB_ENV"
echo "No macOS signing certificate configured; building unsigned and skipping notarization."
exit 0
fi
write_env "CSC_LINK" "$MAC_CSC_LINK"
write_env "CSC_KEY_PASSWORD" "$MAC_CSC_KEY_PASSWORD"
if [ -n "${MAC_APPLE_ID:-}" ] && [ -n "${MAC_APPLE_APP_SPECIFIC_PASSWORD:-}" ] && [ -n "${MAC_APPLE_TEAM_ID:-}" ]; then
write_env "APPLE_ID" "$MAC_APPLE_ID"
write_env "APPLE_APP_SPECIFIC_PASSWORD" "$MAC_APPLE_APP_SPECIFIC_PASSWORD"
write_env "APPLE_TEAM_ID" "$MAC_APPLE_TEAM_ID"
echo "macOS signing and notarization are configured."
else
echo "MAC_BUILD_EXTRA_ARGS=--config.mac.notarize=false" >> "$GITHUB_ENV"
echo "macOS signing certificate configured; Apple notarization credentials incomplete, skipping notarization."
fi
- name: Build desktop artifact
shell: bash
run: |
if [ "${{ matrix.target_os }}" = "darwin" ]; then
ulimit -n 10240 || true
echo "File descriptor limit: $(ulimit -n)"
fi
npm --prefix packages/desktop run dist -- ${{ matrix.electron_target }} ${MAC_BUILD_EXTRA_ARGS:-} --publish never
- name: Upload macOS update manifest artifact
if: matrix.target_os == 'darwin'
uses: actions/upload-artifact@v4
with:
name: latest-mac-${{ matrix.target_arch }}
path: packages/desktop/release/latest-mac.yml
if-no-files-found: error
retention-days: 1
- name: Upload artifacts to release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.release.tag_name || github.event.inputs.tag }}
fail_on_unmatched_files: true
files: ${{ matrix.artifact_files }}
mac-update-manifest:
name: Merge macOS updater manifest
needs: desktop
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.release.tag_name || github.event.inputs.tag }}
- name: Download macOS update manifests
uses: actions/download-artifact@v4
with:
pattern: latest-mac-*
path: /tmp/hermes-mac-manifests
merge-multiple: false
- name: Merge macOS update manifests
shell: bash
run: |
node packages/desktop/scripts/merge-mac-latest-yml.mjs \
/tmp/hermes-mac-manifests/latest-mac-arm64/latest-mac.yml \
/tmp/hermes-mac-manifests/latest-mac-x64/latest-mac.yml \
> /tmp/latest-mac.yml
- name: Upload merged macOS updater manifest to release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.release.tag_name || github.event.inputs.tag }}
fail_on_unmatched_files: true
files: /tmp/latest-mac.yml
-125
View File
@@ -1,125 +0,0 @@
name: Publish Desktop Runtime to Release
on:
workflow_dispatch:
inputs:
tag:
description: "Existing release tag to attach runtime assets to"
required: true
release:
types: [published]
permissions:
contents: write
concurrency:
group: desktop-runtime-${{ github.event.release.tag_name || github.event.inputs.tag || github.ref }}
cancel-in-progress: false
jobs:
runtime:
name: Runtime (${{ matrix.label }})
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- label: macOS arm64
runner: macos-14
target_os: darwin
target_arch: arm64
- label: macOS x64
runner: macos-15-intel
target_os: darwin
target_arch: x64
- label: Windows x64
runner: windows-latest
target_os: win32
target_arch: x64
- label: Linux x64
runner: ubuntu-22.04
target_os: linux
target_arch: x64
- label: Linux arm64
runner: ubuntu-22.04-arm
target_os: linux
target_arch: arm64
skip_browser_runtime: true
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'release' && github.event.release.tag_name || github.ref }}
- name: Resolve runtime asset names
id: names
shell: bash
env:
TARGET_OS: ${{ matrix.target_os }}
TARGET_ARCH: ${{ matrix.target_arch }}
run: |
echo "asset=$(node packages/desktop/scripts/runtime-asset-name.mjs)" >> "$GITHUB_OUTPUT"
echo "manifest=$(node packages/desktop/scripts/runtime-asset-name.mjs --manifest)" >> "$GITHUB_OUTPUT"
- name: Check existing release assets
id: check
shell: bash
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.event.release.tag_name || github.event.inputs.tag }}
ASSET: ${{ steps.names.outputs.asset }}
MANIFEST: ${{ steps.names.outputs.manifest }}
run: |
assets="$(gh release view "$TAG" --repo "$GITHUB_REPOSITORY" --json assets --jq '.assets[].name' || true)"
if printf '%s\n' "$assets" | grep -Fx "$ASSET" >/dev/null \
&& printf '%s\n' "$assets" | grep -Fx "$MANIFEST" >/dev/null; then
echo "missing=false" >> "$GITHUB_OUTPUT"
echo "Runtime asset already exists: $ASSET"
else
echo "missing=true" >> "$GITHUB_OUTPUT"
echo "Runtime asset missing: $ASSET or $MANIFEST"
fi
- name: Setup Node.js
if: steps.check.outputs.missing == 'true'
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
cache-dependency-path: packages/desktop/package-lock.json
- name: Install uv
if: steps.check.outputs.missing == 'true'
uses: astral-sh/setup-uv@v3
- name: Install desktop dependencies
if: steps.check.outputs.missing == 'true'
run: npm ci --prefix packages/desktop --no-audit --no-fund
- name: Prepare runtime resources
if: steps.check.outputs.missing == 'true'
env:
TARGET_OS: ${{ matrix.target_os }}
TARGET_ARCH: ${{ matrix.target_arch }}
GH_TOKEN: ${{ github.token }}
HERMES_SKIP_BROWSER_RUNTIME: ${{ matrix.skip_browser_runtime || 'false' }}
run: npm --prefix packages/desktop run prepare:runtime
- name: Package runtime
if: steps.check.outputs.missing == 'true'
env:
TARGET_OS: ${{ matrix.target_os }}
TARGET_ARCH: ${{ matrix.target_arch }}
run: npm --prefix packages/desktop run package:runtime
- name: Upload runtime assets to release
if: steps.check.outputs.missing == 'true'
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.release.tag_name || github.event.inputs.tag }}
fail_on_unmatched_files: true
files: |
packages/desktop/release/runtime/${{ steps.names.outputs.asset }}
packages/desktop/release/runtime/${{ steps.names.outputs.asset }}.sha256
packages/desktop/release/runtime/${{ steps.names.outputs.manifest }}
-46
View File
@@ -1,46 +0,0 @@
name: Build and Push Docker Image to Docker Hub
on:
workflow_dispatch:
release:
types: [published]
permissions:
contents: read
concurrency:
group: docker-${{ github.ref }}
cancel-in-progress: false
jobs:
build-and-push:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/hermes-web-ui:latest
${{ secrets.DOCKERHUB_USERNAME }}/hermes-web-ui:${{ github.sha }}
${{ secrets.DOCKERHUB_USERNAME }}/hermes-web-ui:${{ github.event.release.tag_name || github.ref_name }}
-45
View File
@@ -1,45 +0,0 @@
name: NPM Lockfile Check
on:
push:
branches:
- main
paths:
- package.json
- package-lock.json
- .github/workflows/npm-lockfile-check.yml
pull_request:
branches:
- main
- base
paths:
- package.json
- package-lock.json
- .github/workflows/npm-lockfile-check.yml
permissions:
contents: read
concurrency:
group: npm-lockfile-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
check:
name: npm ci --ignore-scripts
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
cache-dependency-path: package-lock.json
- name: Verify package-lock.json is in sync
run: npm ci --ignore-scripts
-52
View File
@@ -1,52 +0,0 @@
name: Playwright
on:
push:
branches:
- main
pull_request:
branches:
- main
permissions:
contents: read
concurrency:
group: playwright-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
cache-dependency-path: package-lock.json
- name: Install dependencies
run: |
npm ci --ignore-scripts
npm rebuild node-pty
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium
- name: Run Playwright tests
run: npm run test:e2e
- name: Upload Playwright report
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: |
playwright-report/
test-results/
retention-days: 7
-89
View File
@@ -1,89 +0,0 @@
name: Website
on:
pull_request:
branches:
- main
- base
paths:
- packages/website/**
- packages/client/src/styles/variables.scss
- package.json
- package-lock.json
- tsconfig.website.json
- vite.config.website.ts
- .github/workflows/website-deploy.yml
workflow_run:
workflows:
- Publish Desktop Artifacts to Release
types:
- completed
workflow_dispatch:
permissions:
contents: read
concurrency:
group: website-${{ github.event.pull_request.number || github.event.workflow_run.id || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
build:
name: Build website
if: github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- name: Checkout repository
if: github.event_name != 'workflow_run'
uses: actions/checkout@v4
- name: Checkout desktop release ref
if: github.event_name == 'workflow_run'
uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_branch || github.event.workflow_run.head_sha }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
cache-dependency-path: package-lock.json
- name: Install dependencies
run: npm ci --ignore-scripts
- name: Type-check website
run: npx vue-tsc -p tsconfig.website.json --noEmit
- name: Build website
run: npm run build:website
- name: Prepare SSH
if: github.event_name == 'workflow_run' || github.event_name == 'workflow_dispatch'
env:
WEBSITE_SSH_KEY: ${{ secrets.WEBSITE_SSH_KEY }}
WEBSITE_SSH_KNOWN_HOSTS: ${{ secrets.WEBSITE_SSH_KNOWN_HOSTS }}
run: |
test -n "$WEBSITE_SSH_KEY"
mkdir -p ~/.ssh
chmod 700 ~/.ssh
printf '%s\n' "$WEBSITE_SSH_KEY" > ~/.ssh/website_deploy_key
chmod 600 ~/.ssh/website_deploy_key
if [ -n "$WEBSITE_SSH_KNOWN_HOSTS" ]; then
printf '%s\n' "$WEBSITE_SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
fi
- name: Deploy website
if: github.event_name == 'workflow_run' || github.event_name == 'workflow_dispatch'
env:
WEBSITE_SSH_USER: ${{ secrets.WEBSITE_SSH_USER }}
WEBSITE_SSH_PORT: ${{ secrets.WEBSITE_SSH_PORT }}
run: |
SSH_USER="${WEBSITE_SSH_USER:-root}"
SSH_PORT="${WEBSITE_SSH_PORT:-22}"
DEPLOY_DIR="/var/www/ekkolearnai.com/current"
SSH_CMD="ssh -i ~/.ssh/website_deploy_key -p ${SSH_PORT} -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new"
$SSH_CMD "$SSH_USER@154.3.33.232" "mkdir -p '$DEPLOY_DIR' && find '$DEPLOY_DIR' -mindepth 1 -maxdepth 1 -exec rm -rf {} +"
tar -C dist/website -czf - . | $SSH_CMD "$SSH_USER@154.3.33.232" "tar -xzf - -C '$DEPLOY_DIR'"
+19
View File
@@ -0,0 +1,19 @@
=== 改造日志 ===
时间: 2026-06-02 03:44:23
源: https://github.com/EKKOLearnAI/hermes-web-ui
目标: http://192.168.6.101:3001/root/Hermes-ui
## 执行操作
- 替换 github.com → www.xinmi.cloud
- 替换 ekkolearnai.com → www.xinmi.cloud
- 替换 EKKOLearnAI → root
- 替换 GitHub/GitLab → 新觅源码库
- 删除 .github 目录
- 更新 package.json repository/homepage
- 更新侧边栏链接
- 保留 LICENSE 原文
- 跳过 AI 页面删除(本项目为 AI 应用)
## 保留内容
- LICENSE: 保留原始版权声明
- 所有 AI 对话功能: 本项目核心功能完整保留
+10 -10
View File
@@ -4,29 +4,29 @@
</p>
<p align="center">
A full-featured desktop app and web dashboard for <a href="https://github.com/NousResearch/hermes-agent">Hermes Agent</a>.<br/>
A full-featured desktop app and web dashboard for <a href="https://www.xinmi.cloud/NousResearch/hermes-agent">Hermes Agent</a>.<br/>
Manage AI chat sessions, monitor usage & costs, configure platform channels,<br/>
schedule cron jobs, browse skills — all from a clean, responsive web interface.
</p>
<p align="center">
<a href="https://github.com/EKKOLearnAI/hermes-web-ui/releases/latest">Download Hermes Studio Desktop</a>
<a href="https://www.xinmi.cloud/root/Hermes-ui/releases/latest">Download Hermes Studio Desktop</a>
·
<code>npm install -g hermes-web-ui && hermes-web-ui start</code>
</p>
<p align="center">
<img src="https://github.com/EKKOLearnAI/hermes-web-ui/blob/main/packages/client/src/assets/image1.png" alt="Hermes Web UI Demo" width="680"/>
<img src="https://www.xinmi.cloud/root/Hermes-ui/blob/main/packages/client/src/assets/image1.png" alt="Hermes Web UI Demo" width="680"/>
</p>
<p align="center">
<img src="https://github.com/EKKOLearnAI/hermes-web-ui/blob/main/packages/client/src/assets/image2.png" alt="Hermes Web UI Demo" width="680"/>
<img src="https://www.xinmi.cloud/root/Hermes-ui/blob/main/packages/client/src/assets/image2.png" alt="Hermes Web UI Demo" width="680"/>
</p>
<p align="center">
<a href="https://www.npmjs.com/package/hermes-web-ui"><img src="https://img.shields.io/npm/v/hermes-web-ui?style=flat-square&color=blue" alt="npm version"/></a>
<a href="https://github.com/EKKOLearnAI/hermes-web-ui/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/hermes-web-ui?style=flat-square" alt="license"/></a>
<a href="https://github.com/EKKOLearnAI/hermes-web-ui/stargazers"><img src="https://img.shields.io/github/stars/EKKOLearnAI/hermes-web-ui?style=flat-square" alt="stars"/></a>
<a href="https://www.xinmi.cloud/root/Hermes-ui/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/hermes-web-ui?style=flat-square" alt="license"/></a>
<a href="https://www.xinmi.cloud/root/Hermes-ui/stargazers"><img src="https://img.shields.io/github/stars/EKKOLearnAI/hermes-web-ui?style=flat-square" alt="stars"/></a>
</p>
---
@@ -176,7 +176,7 @@ hermes-web-ui reset-default-login
### Desktop App (Recommended)
Download the latest **Hermes Studio** desktop installer from
[GitHub Releases](https://github.com/EKKOLearnAI/hermes-web-ui/releases/latest).
[新觅源码库 Releases](https://www.xinmi.cloud/root/Hermes-ui/releases/latest).
Desktop builds are published for macOS, Windows, and Linux, with separate
architecture assets where applicable. The desktop app bundles the Web UI
@@ -268,13 +268,13 @@ These variables configure Hermes Web UI, its local Hermes runtime integration, a
| `HERMES_BRIDGE_TOOLSETS` | profile/default | Toolset override for bridge runs. |
| `HERMES_BRIDGE_MAX_TURNS` | profile/default | Maximum turn override for bridge runs. |
| `HERMES_BRIDGE_SUPPRESS_PLATFORM_HINT` | `cli` | Controls bridge platform hint suppression passed to Hermes Agent. |
| `HERMES_OPENROUTER_APP_REFERER` | `https://ekkolearnai.com` | OpenRouter attribution referer sent by bridge runs. |
| `HERMES_OPENROUTER_APP_REFERER` | `https://www.xinmi.cloud` | OpenRouter attribution referer sent by bridge runs. |
| `HERMES_OPENROUTER_APP_TITLE` | `Hermes Web UI` | OpenRouter attribution title sent by bridge runs. |
| `HERMES_OPENROUTER_APP_CATEGORIES` | `cli-agent,personal-agent` | OpenRouter attribution categories sent by bridge runs. |
| `HERMES_WEB_UI_MANAGED_GATEWAY` | platform/runtime dependent | Force managed legacy gateway process handling. Set `1`, `true`, `yes`, or `on` to enable. |
| `HERMES_WEB_UI_STOP_GATEWAYS_ON_SHUTDOWN` | enabled in production | Controls whether Web UI shutdown also stops managed gateway processes. Set `0` or `false` to detach them. |
| `GATEWAY_HOST` | `127.0.0.1` | Default gateway host written into profile config for legacy gateway compatibility. |
| `HERMES_WEB_UI_PREVIEW_REPO` | package repository | GitHub repository used by Version Preview. |
| `HERMES_WEB_UI_PREVIEW_REPO` | package repository | 新觅源码库 repository used by Version Preview. |
| `HERMES_WEB_UI_PREVIEW_AGENT_BRIDGE_TRANSPORT` | platform default | Version Preview broker transport. Set `tcp` to use loopback TCP for Preview on macOS/Linux; when unset, Preview follows `HERMES_AGENT_BRIDGE_WORKER_TRANSPORT=tcp`. |
| `HERMES_WEB_UI_PREVIEW_AGENT_BRIDGE_ENDPOINT` | isolated preview endpoint | Directly overrides the Version Preview broker endpoint. |
| `HERMES_WEB_UI_BACKEND_PORT` | `8648` | Backend port used by the Vite dev proxy. |
@@ -309,7 +309,7 @@ On startup the BFF server automatically:
## Development
```bash
git clone https://github.com/EKKOLearnAI/hermes-web-ui.git
git clone https://www.xinmi.cloud/root/Hermes-ui.git
cd hermes-web-ui
npm install
npm run dev
+11 -11
View File
@@ -4,23 +4,23 @@
</p>
<p align="center">
<a href="https://github.com/NousResearch/hermes-agent">Hermes Agent</a> 的全功能桌面应用和 Web 管理面板。<br/>
<a href="https://www.xinmi.cloud/NousResearch/hermes-agent">Hermes Agent</a> 的全功能桌面应用和 Web 管理面板。<br/>
管理 AI 聊天会话、监控用量与成本、配置平台渠道、<br/>
管理定时任务、浏览技能 —— 全部在一个简洁响应式的 Web 界面中完成。
</p>
<p align="center">
<a href="https://github.com/EKKOLearnAI/hermes-web-ui/releases/latest">下载 Hermes Studio 桌面版</a>
<a href="https://www.xinmi.cloud/root/Hermes-ui/releases/latest">下载 Hermes Studio 桌面版</a>
·
<code>npm install -g hermes-web-ui && hermes-web-ui start</code>
</p>
<p align="center">
<img src="https://github.com/EKKOLearnAI/hermes-web-ui/blob/main/packages/client/src/assets/image1.png" alt="Hermes Web UI 演示" width="680"/>
<img src="https://www.xinmi.cloud/root/Hermes-ui/blob/main/packages/client/src/assets/image1.png" alt="Hermes Web UI 演示" width="680"/>
</p>
<p align="center">
<img src="https://github.com/EKKOLearnAI/hermes-web-ui/blob/main/packages/client/src/assets/image2.png" alt="Hermes Web UI 演示" width="680"/>
<img src="https://www.xinmi.cloud/root/Hermes-ui/blob/main/packages/client/src/assets/image2.png" alt="Hermes Web UI 演示" width="680"/>
</p>
<p align="center">
@@ -28,13 +28,13 @@
</p>
<p align="center">
<video src="https://github.com/EKKOLearnAI/hermes-web-ui/blob/main/packages/client/src/assets/video.mp4?raw=true" width="360" controls></video>
<video src="https://www.xinmi.cloud/root/Hermes-ui/blob/main/packages/client/src/assets/video.mp4?raw=true" width="360" controls></video>
</p>
<p align="center">
<a href="https://www.npmjs.com/package/hermes-web-ui"><img src="https://img.shields.io/npm/v/hermes-web-ui?style=flat-square&color=blue" alt="npm 版本"/></a>
<a href="https://github.com/EKKOLearnAI/hermes-web-ui/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/hermes-web-ui?style=flat-square" alt="许可证"/></a>
<a href="https://github.com/EKKOLearnAI/hermes-web-ui/stargazers"><img src="https://img.shields.io/github/stars/EKKOLearnAI/hermes-web-ui?style=flat-square" alt="Star"/></a>
<a href="https://www.xinmi.cloud/root/Hermes-ui/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/hermes-web-ui?style=flat-square" alt="许可证"/></a>
<a href="https://www.xinmi.cloud/root/Hermes-ui/stargazers"><img src="https://img.shields.io/github/stars/EKKOLearnAI/hermes-web-ui?style=flat-square" alt="Star"/></a>
</p>
---
@@ -183,7 +183,7 @@ hermes-web-ui reset-default-login
### 桌面应用(推荐)
从 [GitHub Releases](https://github.com/EKKOLearnAI/hermes-web-ui/releases/latest)
从 [新觅源码库 Releases](https://www.xinmi.cloud/root/Hermes-ui/releases/latest)
下载最新的 **Hermes Studio** 桌面安装包。
桌面版会发布 macOS、Windows 和 Linux 构建;适用时会区分不同 CPU 架构。
@@ -274,13 +274,13 @@ Web UI 启动后端聊天能力时,会优先使用包含 `run_agent.py` 的源
| `HERMES_BRIDGE_TOOLSETS` | profile/默认值 | bridge 运行时的 toolset 覆盖。 |
| `HERMES_BRIDGE_MAX_TURNS` | profile/默认值 | bridge 运行时的最大轮数覆盖。 |
| `HERMES_BRIDGE_SUPPRESS_PLATFORM_HINT` | `cli` | 控制传给 Hermes Agent 的 bridge platform hint suppression。 |
| `HERMES_OPENROUTER_APP_REFERER` | `https://ekkolearnai.com` | bridge 运行发送给 OpenRouter 的 attribution referer。 |
| `HERMES_OPENROUTER_APP_REFERER` | `https://www.xinmi.cloud` | bridge 运行发送给 OpenRouter 的 attribution referer。 |
| `HERMES_OPENROUTER_APP_TITLE` | `Hermes Web UI` | bridge 运行发送给 OpenRouter 的 attribution title。 |
| `HERMES_OPENROUTER_APP_CATEGORIES` | `cli-agent,personal-agent` | bridge 运行发送给 OpenRouter 的 attribution categories。 |
| `HERMES_WEB_UI_MANAGED_GATEWAY` | 由平台/运行环境决定 | 强制启用旧 gateway 进程托管;设为 `1``true``yes``on` 开启。 |
| `HERMES_WEB_UI_STOP_GATEWAYS_ON_SHUTDOWN` | 生产环境默认开启 | Web UI 关闭时是否同时停止托管的 gateway 进程;设为 `0``false` 可让 gateway 分离运行。 |
| `GATEWAY_HOST` | `127.0.0.1` | 旧 gateway 兼容配置中写入 profile 的默认 gateway host。 |
| `HERMES_WEB_UI_PREVIEW_REPO` | package repository | Version Preview 使用的 GitHub 仓库。 |
| `HERMES_WEB_UI_PREVIEW_REPO` | package repository | Version Preview 使用的 新觅源码库 仓库。 |
| `HERMES_WEB_UI_PREVIEW_AGENT_BRIDGE_TRANSPORT` | 平台默认值 | Version Preview broker transport。设为 `tcp` 可让预览环境在 macOS/Linux 上也使用 loopback TCP;未设置时会跟随 `HERMES_AGENT_BRIDGE_WORKER_TRANSPORT=tcp`。 |
| `HERMES_WEB_UI_PREVIEW_AGENT_BRIDGE_ENDPOINT` | 隔离的预览 endpoint | 直接覆盖 Version Preview 的 broker endpoint。 |
| `HERMES_WEB_UI_BACKEND_PORT` | `8648` | Vite dev proxy 使用的后端端口。 |
@@ -315,7 +315,7 @@ Web UI 启动后端聊天能力时,会优先使用包含 `run_agent.py` 的源
## 开发
```bash
git clone https://github.com/EKKOLearnAI/hermes-web-ui.git
git clone https://www.xinmi.cloud/root/Hermes-ui.git
cd hermes-web-ui
npm install
npm run dev
+1 -1
View File
@@ -28,7 +28,7 @@ npm run build
| Auth, profile, or credential behavior | focused server tests plus relevant e2e auth tests |
| Chat, Socket.IO, group chat | focused server tests plus relevant e2e chat tests |
| Desktop packaging | `npm run harness:check`, `npm run build`, and a platform-specific desktop build when practical |
| GitHub workflow | `npm run harness:check` and `actionlint` when available |
| 新觅源码库 workflow | `npm run harness:check` and `actionlint` when available |
| Package manifests | `npm ci --ignore-scripts` and lockfile workflow expectations |
## CI Mapping
+102 -102
View File
@@ -116,7 +116,7 @@
"tinyexec": "^1.0.1"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
"url": "https://www.xinmi.cloud/sponsors/antfu"
}
},
"node_modules/@asamuzakjp/css-color": {
@@ -280,7 +280,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
"url": "https://www.xinmi.cloud/sponsors/csstools"
},
{
"type": "opencollective",
@@ -300,7 +300,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
"url": "https://www.xinmi.cloud/sponsors/csstools"
},
{
"type": "opencollective",
@@ -324,7 +324,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
"url": "https://www.xinmi.cloud/sponsors/csstools"
},
{
"type": "opencollective",
@@ -352,7 +352,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
"url": "https://www.xinmi.cloud/sponsors/csstools"
},
{
"type": "opencollective",
@@ -375,7 +375,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
"url": "https://www.xinmi.cloud/sponsors/csstools"
},
{
"type": "opencollective",
@@ -400,7 +400,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
"url": "https://www.xinmi.cloud/sponsors/csstools"
},
{
"type": "opencollective",
@@ -1299,7 +1299,7 @@
"node": ">= 22"
},
"funding": {
"url": "https://github.com/sponsors/kazupon"
"url": "https://www.xinmi.cloud/sponsors/kazupon"
}
},
"node_modules/@intlify/devtools-types": {
@@ -1316,7 +1316,7 @@
"node": ">= 22"
},
"funding": {
"url": "https://github.com/sponsors/kazupon"
"url": "https://www.xinmi.cloud/sponsors/kazupon"
}
},
"node_modules/@intlify/message-compiler": {
@@ -1333,7 +1333,7 @@
"node": ">= 22"
},
"funding": {
"url": "https://github.com/sponsors/kazupon"
"url": "https://www.xinmi.cloud/sponsors/kazupon"
}
},
"node_modules/@intlify/shared": {
@@ -1346,7 +1346,7 @@
"node": ">= 22"
},
"funding": {
"url": "https://github.com/sponsors/kazupon"
"url": "https://www.xinmi.cloud/sponsors/kazupon"
}
},
"node_modules/@isaacs/cliui": {
@@ -1507,7 +1507,7 @@
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/Brooooooklyn"
"url": "https://www.xinmi.cloud/sponsors/Brooooooklyn"
},
"peerDependencies": {
"@emnapi/core": "^1.7.1",
@@ -1528,7 +1528,7 @@
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/Boshen"
"url": "https://www.xinmi.cloud/sponsors/Boshen"
}
},
"node_modules/@parcel/watcher": {
@@ -1852,7 +1852,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
"url": "https://www.xinmi.cloud/sponsors/jonschlinkert"
}
},
"node_modules/@pinia/testing": {
@@ -1862,7 +1862,7 @@
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/posva"
"url": "https://www.xinmi.cloud/sponsors/posva"
},
"peerDependencies": {
"pinia": ">=3.0.4"
@@ -3474,7 +3474,7 @@
"integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==",
"funding": [
"https://opencollective.com/katex",
"https://github.com/sponsors/katex"
"https://www.xinmi.cloud/sponsors/katex"
],
"license": "MIT",
"dependencies": {
@@ -3600,7 +3600,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
"url": "https://www.xinmi.cloud/sponsors/jonschlinkert"
}
},
"node_modules/@vue/reactivity": {
@@ -3801,7 +3801,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/ansi-styles": {
@@ -3816,7 +3816,7 @@
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/anymatch": {
@@ -3937,7 +3937,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
"url": "https://www.xinmi.cloud/sponsors/feross"
},
{
"type": "patreon",
@@ -3979,7 +3979,7 @@
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/birpc": {
@@ -3989,7 +3989,7 @@
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
"url": "https://www.xinmi.cloud/sponsors/antfu"
}
},
"node_modules/body-parser": {
@@ -4139,7 +4139,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/camelcase": {
@@ -4183,7 +4183,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/chalk?sponsor=1"
}
},
"node_modules/chalk/node_modules/supports-color": {
@@ -4303,7 +4303,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/co": {
@@ -4411,7 +4411,7 @@
"node": ">=18"
},
"funding": {
"url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
"url": "https://www.xinmi.cloud/open-cli-tools/concurrently?sponsor=1"
}
},
"node_modules/config-chain": {
@@ -4491,7 +4491,7 @@
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
"url": "https://www.xinmi.cloud/sponsors/mesqueeb"
}
},
"node_modules/cors": {
@@ -5199,7 +5199,7 @@
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/kossnocorp"
"url": "https://www.xinmi.cloud/sponsors/kossnocorp"
}
},
"node_modules/date-fns-tz": {
@@ -5545,7 +5545,7 @@
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
"url": "https://www.xinmi.cloud/fb55/entities?sponsor=1"
}
},
"node_modules/es-define-property": {
@@ -5904,7 +5904,7 @@
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
"url": "https://www.xinmi.cloud/sponsors/RubenVerborgh"
}
],
"license": "MIT",
@@ -5931,7 +5931,7 @@
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/form-data": {
@@ -6015,7 +6015,7 @@
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/generator-function": {
@@ -6059,7 +6059,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/get-proto": {
@@ -6095,7 +6095,7 @@
"glob": "dist/esm/bin.mjs"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
@@ -6121,7 +6121,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/graceful-fs": {
@@ -6180,7 +6180,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
@@ -6196,7 +6196,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/hasown": {
@@ -6401,7 +6401,7 @@
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
"url": "https://www.xinmi.cloud/sponsors/wooorm"
}
},
"node_modules/inflation": {
@@ -6486,7 +6486,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/is-extglob": {
@@ -6525,7 +6525,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/is-glob": {
@@ -6574,7 +6574,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/is-what": {
@@ -6587,7 +6587,7 @@
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
"url": "https://www.xinmi.cloud/sponsors/mesqueeb"
}
},
"node_modules/isexe": {
@@ -6674,7 +6674,7 @@
"@isaacs/cliui": "^8.0.2"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
},
"optionalDependencies": {
"@pkgjs/parseargs": "^0.11.0"
@@ -6834,7 +6834,7 @@
"integrity": "sha512-Vdw0ATsQ9V+LuegM/BTwQqV/6cTl5lbGcIrU+BCgLxyf6bo38ybOr372tuSIxir3CN720flu1meYR6XzNMwQnw==",
"funding": [
"https://opencollective.com/katex",
"https://github.com/sponsors/katex"
"https://www.xinmi.cloud/sponsors/katex"
],
"license": "MIT",
"dependencies": {
@@ -7317,11 +7317,11 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/puzrin"
"url": "https://www.xinmi.cloud/sponsors/puzrin"
},
{
"type": "github",
"url": "https://github.com/sponsors/markdown-it"
"url": "https://www.xinmi.cloud/sponsors/markdown-it"
}
],
"license": "MIT",
@@ -7415,7 +7415,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/make-error": {
@@ -7433,11 +7433,11 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/puzrin"
"url": "https://www.xinmi.cloud/sponsors/puzrin"
},
{
"type": "github",
"url": "https://github.com/sponsors/markdown-it"
"url": "https://www.xinmi.cloud/sponsors/markdown-it"
}
],
"license": "MIT",
@@ -7463,7 +7463,7 @@
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
"url": "https://www.xinmi.cloud/fb55/entities?sponsor=1"
}
},
"node_modules/marked": {
@@ -7526,7 +7526,7 @@
"node": ">=12.13"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
"url": "https://www.xinmi.cloud/sponsors/mesqueeb"
}
},
"node_modules/merge-anything/node_modules/is-what": {
@@ -7539,7 +7539,7 @@
"node": ">=12.13"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
"url": "https://www.xinmi.cloud/sponsors/mesqueeb"
}
},
"node_modules/merge-descriptors": {
@@ -7549,7 +7549,7 @@
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/mermaid": {
@@ -7599,7 +7599,7 @@
"dev": true,
"funding": [
"https://opencollective.com/katex",
"https://github.com/sponsors/katex"
"https://www.xinmi.cloud/sponsors/katex"
],
"license": "MIT",
"dependencies": {
@@ -7666,7 +7666,7 @@
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/minimist": {
@@ -7676,7 +7676,7 @@
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/minipass": {
@@ -7797,7 +7797,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
"url": "https://www.xinmi.cloud/sponsors/ai"
}
],
"license": "MIT",
@@ -7951,7 +7951,7 @@
"node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/nodemon/node_modules/supports-color": {
@@ -8012,7 +8012,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/on-exit-leak-free": {
@@ -8067,7 +8067,7 @@
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
@@ -8117,7 +8117,7 @@
"entities": "^8.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
"url": "https://www.xinmi.cloud/inikulin/parse5?sponsor=1"
}
},
"node_modules/parse5/node_modules/entities": {
@@ -8130,7 +8130,7 @@
"node": ">=20.19.0"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
"url": "https://www.xinmi.cloud/fb55/entities?sponsor=1"
}
},
"node_modules/parseurl": {
@@ -8208,7 +8208,7 @@
"node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
@@ -8270,7 +8270,7 @@
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
"url": "https://www.xinmi.cloud/sponsors/jonschlinkert"
}
},
"node_modules/pinia": {
@@ -8283,7 +8283,7 @@
"@vue/devtools-api": "^7.7.7"
},
"funding": {
"url": "https://github.com/sponsors/posva"
"url": "https://www.xinmi.cloud/sponsors/posva"
},
"peerDependencies": {
"typescript": ">=4.5.0",
@@ -8451,7 +8451,7 @@
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
"url": "https://www.xinmi.cloud/sponsors/ai"
}
],
"license": "MIT",
@@ -8472,7 +8472,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fastify"
"url": "https://www.xinmi.cloud/sponsors/fastify"
},
{
"type": "opencollective",
@@ -8697,7 +8697,7 @@
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/quick-format-unescaped": {
@@ -8821,7 +8821,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/resolve-path": {
@@ -8939,7 +8939,7 @@
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/rimraf/node_modules/minimatch": {
@@ -9086,7 +9086,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
"url": "https://www.xinmi.cloud/sponsors/feross"
},
{
"type": "patreon",
@@ -9114,7 +9114,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/safe-stable-stringify": {
@@ -9206,7 +9206,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fastify"
"url": "https://www.xinmi.cloud/sponsors/fastify"
},
{
"type": "opencollective",
@@ -9360,7 +9360,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/side-channel": {
@@ -9380,7 +9380,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/side-channel-list": {
@@ -9397,7 +9397,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/side-channel-map": {
@@ -9416,7 +9416,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/side-channel-weakmap": {
@@ -9436,7 +9436,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/siginfo": {
@@ -9456,7 +9456,7 @@
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/simple-update-notifier": {
@@ -9649,7 +9649,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/string-width-cjs": {
@@ -9711,7 +9711,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/strip-ansi-cjs": {
@@ -9758,7 +9758,7 @@
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/strip-literal": {
@@ -9771,7 +9771,7 @@
"js-tokens": "^9.0.1"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
"url": "https://www.xinmi.cloud/sponsors/antfu"
}
},
"node_modules/strip-literal/node_modules/js-tokens": {
@@ -9814,7 +9814,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/supports-color?sponsor=1"
}
},
"node_modules/supports-preserve-symlinks-flag": {
@@ -9827,7 +9827,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/symbol-tree": {
@@ -9888,7 +9888,7 @@
"node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/thread-stream": {
@@ -9942,7 +9942,7 @@
"node": ">=12.0.0"
},
"funding": {
"url": "https://github.com/sponsors/SuperchupuDev"
"url": "https://www.xinmi.cloud/sponsors/SuperchupuDev"
}
},
"node_modules/tinyglobby/node_modules/fdir": {
@@ -9973,7 +9973,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
"url": "https://www.xinmi.cloud/sponsors/jonschlinkert"
}
},
"node_modules/tinypool": {
@@ -10357,8 +10357,8 @@
"integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==",
"dev": true,
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
"https://www.xinmi.cloud/sponsors/broofa",
"https://www.xinmi.cloud/sponsors/ctavan"
],
"license": "MIT",
"bin": {
@@ -10424,7 +10424,7 @@
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
"url": "https://www.xinmi.cloud/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.3"
@@ -10533,7 +10533,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
"url": "https://www.xinmi.cloud/sponsors/jonschlinkert"
}
},
"node_modules/vite-node/node_modules/vite": {
@@ -10557,7 +10557,7 @@
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
"url": "https://www.xinmi.cloud/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.3"
@@ -10621,7 +10621,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
"url": "https://www.xinmi.cloud/sponsors/jonschlinkert"
}
},
"node_modules/vitest": {
@@ -10762,7 +10762,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
"url": "https://www.xinmi.cloud/sponsors/jonschlinkert"
}
},
"node_modules/vitest/node_modules/tinyexec": {
@@ -10793,7 +10793,7 @@
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
"url": "https://www.xinmi.cloud/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.3"
@@ -10912,7 +10912,7 @@
"node": ">= 22"
},
"funding": {
"url": "https://github.com/sponsors/kazupon"
"url": "https://www.xinmi.cloud/sponsors/kazupon"
},
"peerDependencies": {
"vue": "^3.0.0"
@@ -10935,7 +10935,7 @@
"@vue/devtools-api": "^6.6.4"
},
"funding": {
"url": "https://github.com/sponsors/posva"
"url": "https://www.xinmi.cloud/sponsors/posva"
},
"peerDependencies": {
"vue": "^3.5.0"
@@ -11103,7 +11103,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs": {
@@ -11122,7 +11122,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
@@ -11180,7 +11180,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/wrappy": {
@@ -11268,7 +11268,7 @@
"node": ">= 14.6"
},
"funding": {
"url": "https://github.com/sponsors/eemeli"
"url": "https://www.xinmi.cloud/sponsors/eemeli"
}
},
"node_modules/yargs": {
+2 -2
View File
@@ -4,9 +4,9 @@
"description": "Self-hosted AI chat dashboard for Hermes Agent — multi-model web UI with multi-platform integration",
"repository": {
"type": "git",
"url": "https://github.com/EKKOLearnAI/hermes-web-ui.git"
"url": "https://www.xinmi.cloud/root/Hermes-ui.git"
},
"homepage": "https://ekkolearnai.com",
"homepage": "https://www.xinmi.cloud",
"license": "BSL-1.1",
"engines": {
"node": ">=23.0.0"
@@ -4,7 +4,7 @@ This page collects useful community skill repositories that can extend Hermes, C
Community skills are third-party code and instructions. Review them before installing, especially when a skill can read API keys, cookies, browser sessions, local files, repositories, shell scripts, package managers, or social media accounts.
Useful skill recommendations are welcome. If you find a high-quality skill that should be listed here, please submit a pull request on GitHub with the repository link, usage scenario, and any security notes.
Useful skill recommendations are welcome. If you find a high-quality skill that should be listed here, please submit a pull request on 新觅源码库 with the repository link, usage scenario, and any security notes.
## Maintenance Guidelines
@@ -28,7 +28,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Anthropic Official Skills
- Repository: [anthropics/skills](https://github.com/anthropics/skills/tree/main/skills)
- Repository: [anthropics/skills](https://www.xinmi.cloud/anthropics/skills/tree/main/skills)
- Focus: official reference skills for Claude-style agents.
- Good for: learning the expected skill structure, adapting stable examples, and bootstrapping common workflows.
- Representative skills: `docx`, `pdf`, `pptx`, `xlsx`, `frontend-design`, `webapp-testing`, `skill-creator`, `mcp-builder`, `theme-factory`, `web-artifacts-builder`.
@@ -36,7 +36,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Matt Pocock Skills
- Repository: [mattpocock/skills](https://github.com/mattpocock/skills)
- Repository: [mattpocock/skills](https://www.xinmi.cloud/mattpocock/skills)
- Focus: engineering and productivity skills from a real development workflow.
- Good for: TypeScript engineering, test-driven work, triage, diagnosis, reviews, prototyping, and product handoff workflows.
- Representative skills: `tdd`, `triage`, `diagnose`, `prototype`, `review`, `to-prd`, `to-issues`, `handoff`, `write-a-skill`.
@@ -46,56 +46,56 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Frontend Slides
- Repository: [zarazhangrui/frontend-slides](https://github.com/zarazhangrui/frontend-slides)
- Repository: [zarazhangrui/frontend-slides](https://www.xinmi.cloud/zarazhangrui/frontend-slides)
- Focus: creating web-native slide decks with frontend techniques.
- Good for: HTML/CSS slide decks, visual storytelling, and browser-rendered presentations.
- Notes: useful when a deck should be designed as a rich web artifact rather than a traditional office file.
### Huashu Design
- Repository: [alchaincyf/huashu-design](https://github.com/alchaincyf/huashu-design)
- Repository: [alchaincyf/huashu-design](https://www.xinmi.cloud/alchaincyf/huashu-design)
- Focus: HTML-native design work for Claude Code and agent workflows.
- Good for: high-fidelity prototypes, slides, animation concepts, visual review, and export-oriented design flows.
- Notes: includes design philosophy, review heuristics, and presentation-oriented workflows.
### Guizang PPT Skill
- Repository: [op7418/guizang-ppt-skill](https://github.com/op7418/guizang-ppt-skill)
- Repository: [op7418/guizang-ppt-skill](https://www.xinmi.cloud/op7418/guizang-ppt-skill)
- Focus: polished HTML slide decks with editorial, magazine, and Swiss-style layouts.
- Good for: presentation decks, social covers, image prompts, and visual narrative work.
- Notes: includes a presentation runtime and style-oriented slide generation patterns.
### HTML PPT Skill
- Repository: [lewislulu/html-ppt-skill](https://github.com/lewislulu/html-ppt-skill)
- Repository: [lewislulu/html-ppt-skill](https://www.xinmi.cloud/lewislulu/html-ppt-skill)
- Focus: HTML PPT Studio for professional HTML presentations.
- Good for: themed slide decks, layout-rich presentations, and animated browser presentations.
- Representative capabilities: multiple themes, layout templates, animation patterns, and HTML presentation scaffolding.
### PPT Image First
- Repository: [NyxTides/ppt-image-first](https://github.com/NyxTides/ppt-image-first)
- Repository: [NyxTides/ppt-image-first](https://www.xinmi.cloud/NyxTides/ppt-image-first)
- Focus: image-first presentation generation.
- Good for: decks where the visual direction should lead the content structure.
- Notes: designed for Codex, Claude Code, and OpenCode-style CLI agents.
### GPT Image To PPT
- Repository: [JuneYaooo/gpt-image2-ppt-skills](https://github.com/JuneYaooo/gpt-image2-ppt-skills)
- Repository: [JuneYaooo/gpt-image2-ppt-skills](https://www.xinmi.cloud/JuneYaooo/gpt-image2-ppt-skills)
- Focus: cloning or adapting PowerPoint visual layouts using image generation.
- Good for: recreating a deck style from an existing `.pptx` template while replacing the actual content.
- Notes: useful for template-driven presentations, but review external image generation/API behavior before use.
### Fireworks Tech Graph
- Repository: [yizhiyanhua-ai/fireworks-tech-graph](https://github.com/yizhiyanhua-ai/fireworks-tech-graph)
- Repository: [yizhiyanhua-ai/fireworks-tech-graph](https://www.xinmi.cloud/yizhiyanhua-ai/fireworks-tech-graph)
- Focus: technical diagram generation.
- Good for: architecture diagrams, workflow charts, UML-style visuals, AI agent workflow diagrams, and production-ready SVG/PNG outputs.
- Notes: a practical choice when you need diagrams rather than full slide decks.
### Diagram Skill
- Repository: [312362115/claude diagram skill](https://github.com/312362115/claude/blob/main/skills/diagram/SKILL.md)
- Repository: [312362115/claude diagram skill](https://www.xinmi.cloud/312362115/claude/blob/main/skills/diagram/SKILL.md)
- Focus: diagram generation inside a broader Claude skill collection.
- Good for: generating structured diagrams, templates, and visual explanations.
- Notes: this is a direct skill file link, so review the surrounding `references`, `scripts`, and `templates` folders before installing.
@@ -104,7 +104,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Huashu Markdown To HTML
- Repository: [alchaincyf/huashu-md-html](https://github.com/alchaincyf/huashu-md-html)
- Repository: [alchaincyf/huashu-md-html](https://www.xinmi.cloud/alchaincyf/huashu-md-html)
- Focus: Markdown and HTML conversion pipelines.
- Good for: converting files or URLs to Markdown, turning Markdown into polished HTML, and converting HTML back to Markdown.
- Representative tools: MarkItDown, Pandoc, html-to-markdown, and trafilatura-based workflows.
@@ -112,14 +112,14 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Chinese Web Novel Skill
- Repository: [Tomsawyerhu/Chinese-WebNovel-Skill](https://github.com/Tomsawyerhu/Chinese-WebNovel-Skill)
- Repository: [Tomsawyerhu/Chinese-WebNovel-Skill](https://www.xinmi.cloud/Tomsawyerhu/Chinese-WebNovel-Skill)
- Focus: Chinese web novel writing workflows.
- Good for: long-form fiction planning, chapter writing, style continuity, and web-novel oriented drafting.
- Representative skill: `webnovel-writing`.
### Software Copyright Skill
- Repository: [Fokkyp/SoftwareCopyright-Skill](https://github.com/Fokkyp/SoftwareCopyright-Skill)
- Repository: [Fokkyp/SoftwareCopyright-Skill](https://www.xinmi.cloud/Fokkyp/SoftwareCopyright-Skill)
- Focus: preparing Chinese software copyright application materials.
- Good for: generating `.docx` application documents from a local software project.
- Representative skills: `software-copyright-materials`, `docx-toolkit`.
@@ -127,7 +127,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Patent Disclosure Skill
- Repository: [handsomestWei/patent-disclosure-skill](https://github.com/handsomestWei/patent-disclosure-skill)
- Repository: [handsomestWei/patent-disclosure-skill](https://www.xinmi.cloud/handsomestWei/patent-disclosure-skill)
- Focus: patent disclosure drafting.
- Good for: extracting patentable points from project documents, novelty checks, desensitized drafting, and self-review loops.
- Notes: may involve web research and sensitive technical documents. Review data handling carefully.
@@ -136,7 +136,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Baoyu Skills
- Repository: [JimLiu/baoyu-skills](https://github.com/JimLiu/baoyu-skills)
- Repository: [JimLiu/baoyu-skills](https://www.xinmi.cloud/JimLiu/baoyu-skills)
- Focus: image generation, content transformation, publishing, and media workflows.
- Good for: image cards, article illustrations, slide decks, URL-to-Markdown conversion, YouTube transcripts, Markdown-to-HTML, and social posting workflows.
- Representative skills: `baoyu-image-gen`, `baoyu-imagine`, `baoyu-slide-deck`, `baoyu-markdown-to-html`, `baoyu-post-to-x`, `baoyu-post-to-wechat`, `baoyu-post-to-weibo`, `baoyu-url-to-markdown`, `baoyu-youtube-transcript`, `baoyu-translate`, `baoyu-diagram`, `baoyu-comic`.
@@ -144,7 +144,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Virtual Couple Travel Vlog
- Repository: [vibeshotclub/vsc-skills / virtual-couple-travel-vlog](https://github.com/vibeshotclub/vsc-skills/tree/main/virtual-couple-travel-vlog)
- Repository: [vibeshotclub/vsc-skills / virtual-couple-travel-vlog](https://www.xinmi.cloud/vibeshotclub/vsc-skills/tree/main/virtual-couple-travel-vlog)
- Focus: travel-vlog style media generation.
- Good for: short-form visual storytelling, character-based travel content, and repeatable media production prompts.
- Notes: this is a subdirectory skill inside a larger skill collection.
@@ -153,14 +153,14 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Web Access
- Repository: [eze-is/web-access](https://github.com/eze-is/web-access)
- Repository: [eze-is/web-access](https://www.xinmi.cloud/eze-is/web-access)
- Focus: giving an agent structured web access through layered routing and browser/CDP workflows.
- Good for: web research, browser-assisted tasks, parallel information gathering, and pages that require interaction.
- Security note: browser access can expose logged-in sessions and local browser state. Audit before enabling.
### OpenCLI
- Repository: [jackwener/opencli](https://github.com/jackwener/opencli)
- Repository: [jackwener/opencli](https://www.xinmi.cloud/jackwener/opencli)
- Focus: converting websites, browser sessions, Electron apps, and local tools into CLI-accessible automation surfaces for humans and AI agents.
- Good for: letting agents operate logged-in Chrome pages, building reusable website adapters, wrapping local binaries, and turning browser workflows into deterministic commands.
- Representative skills: `opencli-browser`, `opencli-adapter-author`, `opencli-autofix`, `opencli-usage`.
@@ -168,7 +168,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Follow Builders
- Repository: [zarazhangrui/follow-builders](https://github.com/zarazhangrui/follow-builders)
- Repository: [zarazhangrui/follow-builders](https://www.xinmi.cloud/zarazhangrui/follow-builders)
- Focus: monitoring AI builders across X, blogs, and YouTube podcasts.
- Good for: tracking builders rather than influencers, summarizing feeds, and creating digest-style updates.
- Representative data/config files: X feeds, blog feeds, podcast feeds, prompts, and state files.
@@ -176,7 +176,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### SlowMist Agent Security
- Repository: [slowmist/slowmist-agent-security](https://github.com/slowmist/slowmist-agent-security)
- Repository: [slowmist/slowmist-agent-security](https://www.xinmi.cloud/slowmist/slowmist-agent-security)
- Focus: security review for AI agents operating with untrusted inputs.
- Good for: checking skills, MCP servers, repositories, URLs, prompts, and crypto/on-chain addresses for security risks.
- Core idea: external input should be considered untrusted until verified.
@@ -186,7 +186,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Huashu Nuwa Skill
- Repository: [alchaincyf/nuwa-skill](https://github.com/alchaincyf/nuwa-skill)
- Repository: [alchaincyf/nuwa-skill](https://www.xinmi.cloud/alchaincyf/nuwa-skill)
- Focus: distilling a person or viewpoint into a reusable agent skill.
- Good for: advisory-board style thinking, mental models, decision heuristics, and writing in a specific perspective.
- Representative perspectives: Huashu Nuwa, Feynman, Steve Jobs, Elon Musk, Naval Ravikant, Paul Graham, Nassim Taleb.
@@ -194,7 +194,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### PUA / Anti-PUA Skills
- Repository: [tanweai/pua](https://github.com/tanweai/pua)
- Repository: [tanweai/pua](https://www.xinmi.cloud/tanweai/pua)
- Focus: high-agency, confrontational, coaching, or anti-PUA style agent behavior.
- Good for: motivation, critique, resistance to manipulation, and intentionally sharp agent feedback.
- Representative skills: `pua`, `pua-en`, `pua-ja`, `pua-loop`, `mama`, `p7`, `p9`, `p10`, `pro`, `shot`, `yes`.
@@ -202,7 +202,7 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
### Ex Skill
- Repository: [therealXiaomanChu/ex-skill](https://github.com/therealXiaomanChu/ex-skill)
- Repository: [therealXiaomanChu/ex-skill](https://www.xinmi.cloud/therealXiaomanChu/ex-skill)
- Focus: distilling an ex-partner/persona into an AI skill that speaks in that style.
- Good for: persona experiments, emotional roleplay, and style simulation.
- Representative skill: `create-ex`.
@@ -212,17 +212,17 @@ Useful skill recommendations are welcome. If you find a high-quality skill that
If you only want a practical starter set:
- [Anthropic Official Skills](https://github.com/anthropics/skills/tree/main/skills) for reference implementations.
- [Matt Pocock Skills](https://github.com/mattpocock/skills) for engineering workflows.
- [Baoyu Skills](https://github.com/JimLiu/baoyu-skills) for image, media, and publishing workflows.
- [Huashu Design](https://github.com/alchaincyf/huashu-design) for high-fidelity HTML-native design.
- [Guizang PPT Skill](https://github.com/op7418/guizang-ppt-skill) or [HTML PPT Skill](https://github.com/lewislulu/html-ppt-skill) for browser-based presentations.
- [Huashu Markdown To HTML](https://github.com/alchaincyf/huashu-md-html) for Markdown/HTML document conversion.
- [Web Access](https://github.com/eze-is/web-access) for web research workflows.
- [OpenCLI](https://github.com/jackwener/opencli) for logged-in browser automation and reusable website CLI adapters.
- [Fireworks Tech Graph](https://github.com/yizhiyanhua-ai/fireworks-tech-graph) for technical diagrams.
- [SlowMist Agent Security](https://github.com/slowmist/slowmist-agent-security) for reviewing risky community skills.
- [Anthropic Official Skills](https://www.xinmi.cloud/anthropics/skills/tree/main/skills) for reference implementations.
- [Matt Pocock Skills](https://www.xinmi.cloud/mattpocock/skills) for engineering workflows.
- [Baoyu Skills](https://www.xinmi.cloud/JimLiu/baoyu-skills) for image, media, and publishing workflows.
- [Huashu Design](https://www.xinmi.cloud/alchaincyf/huashu-design) for high-fidelity HTML-native design.
- [Guizang PPT Skill](https://www.xinmi.cloud/op7418/guizang-ppt-skill) or [HTML PPT Skill](https://www.xinmi.cloud/lewislulu/html-ppt-skill) for browser-based presentations.
- [Huashu Markdown To HTML](https://www.xinmi.cloud/alchaincyf/huashu-md-html) for Markdown/HTML document conversion.
- [Web Access](https://www.xinmi.cloud/eze-is/web-access) for web research workflows.
- [OpenCLI](https://www.xinmi.cloud/jackwener/opencli) for logged-in browser automation and reusable website CLI adapters.
- [Fireworks Tech Graph](https://www.xinmi.cloud/yizhiyanhua-ai/fireworks-tech-graph) for technical diagrams.
- [SlowMist Agent Security](https://www.xinmi.cloud/slowmist/slowmist-agent-security) for reviewing risky community skills.
## Original Source List
This document was compiled from a curated Hermes / Claude skill sharing list and expanded with public GitHub repository metadata.
This document was compiled from a curated Hermes / Claude skill sharing list and expanded with public 新觅源码库 repository metadata.
@@ -4,7 +4,7 @@
社区 Skill 本质上是第三方指令和代码。安装前请先审计,尤其是会读取 API Key、Cookie、浏览器登录态、本地文件、仓库内容,或者会执行 shell、安装依赖、自动发帖、访问外部 API 的 Skill。
欢迎大家推荐各种好用的 Skill。如果你发现值得收录的高质量 Skill,可以到 GitHub 提交 PR,并附上仓库链接、适用场景和必要的安全说明。
欢迎大家推荐各种好用的 Skill。如果你发现值得收录的高质量 Skill,可以到 新觅源码库 提交 PR,并附上仓库链接、适用场景和必要的安全说明。
## 维护规范
@@ -28,7 +28,7 @@
### Anthropic 官方 Skills
- 仓库:[anthropics/skills](https://github.com/anthropics/skills/tree/main/skills)
- 仓库:[anthropics/skills](https://www.xinmi.cloud/anthropics/skills/tree/main/skills)
- 方向:Claude 官方参考 Skill。
- 适合:学习标准 Skill 结构、参考稳定实现、搭建通用工作流。
- 代表 Skills`docx``pdf``pptx``xlsx``frontend-design``webapp-testing``skill-creator``mcp-builder``theme-factory``web-artifacts-builder`
@@ -36,7 +36,7 @@
### Matt Pocock Skills
- 仓库:[mattpocock/skills](https://github.com/mattpocock/skills)
- 仓库:[mattpocock/skills](https://www.xinmi.cloud/mattpocock/skills)
- 方向:工程与生产力工作流。
- 适合:TypeScript 工程、TDD、问题诊断、代码评审、原型开发、PRD/Issue/Handoff 等开发流程。
- 代表 Skills`tdd``triage``diagnose``prototype``review``to-prd``to-issues``handoff``write-a-skill`
@@ -46,56 +46,56 @@
### Frontend Slides
- 仓库:[zarazhangrui/frontend-slides](https://github.com/zarazhangrui/frontend-slides)
- 仓库:[zarazhangrui/frontend-slides](https://www.xinmi.cloud/zarazhangrui/frontend-slides)
- 方向:用前端技术生成网页幻灯片。
- 适合:HTML/CSS 幻灯片、视觉叙事、浏览器渲染的演示稿。
- 备注:适合把演示稿当成 Web Artifact 来做,而不是传统 Office 文件。
### 华叔 Design
- 仓库:[alchaincyf/huashu-design](https://github.com/alchaincyf/huashu-design)
- 仓库:[alchaincyf/huashu-design](https://www.xinmi.cloud/alchaincyf/huashu-design)
- 方向:Claude Code 中的 HTML 原生设计 Skill。
- 适合:高保真原型、幻灯片、动画概念、视觉评审和导出型设计流程。
- 备注:包含设计哲学、评审维度和演示型工作流。
### 归藏 PPT Skill
- 仓库:[op7418/guizang-ppt-skill](https://github.com/op7418/guizang-ppt-skill)
- 仓库:[op7418/guizang-ppt-skill](https://www.xinmi.cloud/op7418/guizang-ppt-skill)
- 方向:生成高质量 HTML 幻灯片。
- 适合:杂志风、编辑风、瑞士风等视觉风格的演示稿、社交封面、图片提示词和叙事型页面。
- 备注:包含演示运行时和风格化生成模式。
### HTML PPT Skill
- 仓库:[lewislulu/html-ppt-skill](https://github.com/lewislulu/html-ppt-skill)
- 仓库:[lewislulu/html-ppt-skill](https://www.xinmi.cloud/lewislulu/html-ppt-skill)
- 方向:HTML PPT Studio。
- 适合:主题化幻灯片、复杂布局演示稿和带动画的浏览器演示。
- 代表能力:多主题、多布局、动画模式和 HTML 演示脚手架。
### PPT Image First
- 仓库:[NyxTides/ppt-image-first](https://github.com/NyxTides/ppt-image-first)
- 仓库:[NyxTides/ppt-image-first](https://www.xinmi.cloud/NyxTides/ppt-image-first)
- 方向:图片优先的 PPT 生成。
- 适合:视觉方向先行的演示稿创作。
- 备注:面向 Codex、Claude Code、OpenCode CLI 等 Agent 工作流。
### GPT Image To PPT
- 仓库:[JuneYaooo/gpt-image2-ppt-skills](https://github.com/JuneYaooo/gpt-image2-ppt-skills)
- 仓库:[JuneYaooo/gpt-image2-ppt-skills](https://www.xinmi.cloud/JuneYaooo/gpt-image2-ppt-skills)
- 方向:用图像生成能力复刻或改造 PPT 视觉版式。
- 适合:从已有 `.pptx` 模板中学习版式,再替换成自己的内容。
- 备注:涉及图像生成和外部 API 时请先检查配置与数据发送逻辑。
### Fireworks Tech Graph
- 仓库:[yizhiyanhua-ai/fireworks-tech-graph](https://github.com/yizhiyanhua-ai/fireworks-tech-graph)
- 仓库:[yizhiyanhua-ai/fireworks-tech-graph](https://www.xinmi.cloud/yizhiyanhua-ai/fireworks-tech-graph)
- 方向:技术图表生成。
- 适合:架构图、流程图、UML 风格图、AI Agent 工作流图,以及 SVG/PNG 输出。
- 备注:需要图表而不是整套演示稿时很实用。
### Diagram Skill
- 仓库:[312362115/claude diagram skill](https://github.com/312362115/claude/blob/main/skills/diagram/SKILL.md)
- 仓库:[312362115/claude diagram skill](https://www.xinmi.cloud/312362115/claude/blob/main/skills/diagram/SKILL.md)
- 方向:结构化图表生成。
- 适合:生成图表、模板化视觉解释和技术说明。
- 备注:这是一个直接指向 `SKILL.md` 的链接,安装前也要检查同目录下的 `references``scripts``templates`
@@ -104,7 +104,7 @@
### 华叔 Markdown To HTML
- 仓库:[alchaincyf/huashu-md-html](https://github.com/alchaincyf/huashu-md-html)
- 仓库:[alchaincyf/huashu-md-html](https://www.xinmi.cloud/alchaincyf/huashu-md-html)
- 方向:Markdown 与 HTML 双向转换流水线。
- 适合:把文件或网页转 Markdown,把 Markdown 转精美 HTML,把 HTML 再转回 Markdown。
- 代表工具:MarkItDown、Pandoc、html-to-markdown、trafilatura。
@@ -112,14 +112,14 @@
### 中文网文写作 Skill
- 仓库:[Tomsawyerhu/Chinese-WebNovel-Skill](https://github.com/Tomsawyerhu/Chinese-WebNovel-Skill)
- 仓库:[Tomsawyerhu/Chinese-WebNovel-Skill](https://www.xinmi.cloud/Tomsawyerhu/Chinese-WebNovel-Skill)
- 方向:中文网文小说写作。
- 适合:长篇小说规划、章节创作、风格延续和网文式叙事。
- 代表 Skill`webnovel-writing`
### 软件著作权材料 Skill
- 仓库:[Fokkyp/SoftwareCopyright-Skill](https://github.com/Fokkyp/SoftwareCopyright-Skill)
- 仓库:[Fokkyp/SoftwareCopyright-Skill](https://www.xinmi.cloud/Fokkyp/SoftwareCopyright-Skill)
- 方向:中国软件著作权申请材料生成。
- 适合:根据本地项目生成 `.docx` 软著申请材料。
- 代表 Skills`software-copyright-materials``docx-toolkit`
@@ -127,7 +127,7 @@
### 专利交底书 Skill
- 仓库:[handsomestWei/patent-disclosure-skill](https://github.com/handsomestWei/patent-disclosure-skill)
- 仓库:[handsomestWei/patent-disclosure-skill](https://www.xinmi.cloud/handsomestWei/patent-disclosure-skill)
- 方向:专利技术交底书生成。
- 适合:从项目文档挖掘专利点、联网查新、脱敏成文和自检。
- 备注:可能涉及敏感技术资料和联网检索,使用前请关注数据处理方式。
@@ -136,7 +136,7 @@
### 宝玉 Skills
- 仓库:[JimLiu/baoyu-skills](https://github.com/JimLiu/baoyu-skills)
- 仓库:[JimLiu/baoyu-skills](https://www.xinmi.cloud/JimLiu/baoyu-skills)
- 方向:图片生成、内容转换、发布和媒体工作流。
- 适合:图片卡片、文章配图、幻灯片、URL 转 Markdown、YouTube 字幕、Markdown 转 HTML、社交平台发布。
- 代表 Skills`baoyu-image-gen``baoyu-imagine``baoyu-slide-deck``baoyu-markdown-to-html``baoyu-post-to-x``baoyu-post-to-wechat``baoyu-post-to-weibo``baoyu-url-to-markdown``baoyu-youtube-transcript``baoyu-translate``baoyu-diagram``baoyu-comic`
@@ -144,7 +144,7 @@
### Virtual Couple Travel Vlog
- 仓库:[vibeshotclub/vsc-skills / virtual-couple-travel-vlog](https://github.com/vibeshotclub/vsc-skills/tree/main/virtual-couple-travel-vlog)
- 仓库:[vibeshotclub/vsc-skills / virtual-couple-travel-vlog](https://www.xinmi.cloud/vibeshotclub/vsc-skills/tree/main/virtual-couple-travel-vlog)
- 方向:旅行 vlog 风格媒体生成。
- 适合:短视频视觉叙事、角色化旅行内容和可复用媒体提示词。
- 备注:这是一个大仓库里的子目录 Skill。
@@ -153,14 +153,14 @@
### Web Access
- 仓库:[eze-is/web-access](https://github.com/eze-is/web-access)
- 仓库:[eze-is/web-access](https://www.xinmi.cloud/eze-is/web-access)
- 方向:为 Agent 提供结构化联网能力。
- 适合:网页研究、浏览器辅助任务、并行信息收集和需要交互的网站。
- 安全提示:浏览器访问可能暴露已登录状态和本地浏览器数据,启用前要审计。
### OpenCLI
- 仓库:[jackwener/opencli](https://github.com/jackwener/opencli)
- 仓库:[jackwener/opencli](https://www.xinmi.cloud/jackwener/opencli)
- 方向:把网站、浏览器会话、Electron 应用和本地工具转换成 CLI 可调用的自动化入口。
- 适合:让 Agent 操作已登录的 Chrome 页面、编写可复用网站适配器、封装本地命令,以及把浏览器流程变成稳定命令。
- 代表 Skills`opencli-browser``opencli-adapter-author``opencli-autofix``opencli-usage`
@@ -168,7 +168,7 @@
### Follow Builders
- 仓库:[zarazhangrui/follow-builders](https://github.com/zarazhangrui/follow-builders)
- 仓库:[zarazhangrui/follow-builders](https://www.xinmi.cloud/zarazhangrui/follow-builders)
- 方向:跟踪 AI builders 的 X、博客和 YouTube 播客内容。
- 适合:关注 builder 而不是 influencer,生成摘要和内容 digest。
- 代表内容:X feed、blog feed、podcast feed、prompts 和状态文件。
@@ -176,7 +176,7 @@
### SlowMist Agent Security
- 仓库:[slowmist/slowmist-agent-security](https://github.com/slowmist/slowmist-agent-security)
- 仓库:[slowmist/slowmist-agent-security](https://www.xinmi.cloud/slowmist/slowmist-agent-security)
- 方向:AI Agent 安全审计框架。
- 适合:检查 Skill、MCP、仓库、URL、Prompt 和链上地址的安全风险。
- 核心原则:所有外部输入在验证前都不可信。
@@ -186,7 +186,7 @@
### 华叔 Nuwa Skill
- 仓库:[alchaincyf/nuwa-skill](https://github.com/alchaincyf/nuwa-skill)
- 仓库:[alchaincyf/nuwa-skill](https://www.xinmi.cloud/alchaincyf/nuwa-skill)
- 方向:把某个人或视角蒸馏成可复用 Skill。
- 适合:顾问团式思考、心智模型、决策启发式和特定视角写作。
- 代表视角:华叔 Nuwa、Feynman、Jobs、Musk、Naval、Paul Graham、Taleb。
@@ -194,7 +194,7 @@
### PUA / 反 PUA 类 Skills
- 仓库:[tanweai/pua](https://github.com/tanweai/pua)
- 仓库:[tanweai/pua](https://www.xinmi.cloud/tanweai/pua)
- 方向:高能动性、强反馈、反操控或尖锐教练风格的 Agent 行为。
- 适合:动机强化、批判反馈、反操控和刻意强风格交互。
- 代表 Skills`pua``pua-en``pua-ja``pua-loop``mama``p7``p9``p10``pro``shot``yes`
@@ -202,7 +202,7 @@
### Ex Skill
- 仓库:[therealXiaomanChu/ex-skill](https://github.com/therealXiaomanChu/ex-skill)
- 仓库:[therealXiaomanChu/ex-skill](https://www.xinmi.cloud/therealXiaomanChu/ex-skill)
- 方向:把某个前任/人格风格蒸馏成 AI Skill。
- 适合:Persona 实验、情绪化角色扮演和特定语气模拟。
- 代表 Skill`create-ex`
@@ -212,17 +212,17 @@
如果你只想先装一批实用的,可以从这些开始:
- [Anthropic 官方 Skills](https://github.com/anthropics/skills/tree/main/skills):参考实现和通用能力。
- [Matt Pocock Skills](https://github.com/mattpocock/skills):工程流程。
- [宝玉 Skills](https://github.com/JimLiu/baoyu-skills):图片、媒体和发布。
- [华叔 Design](https://github.com/alchaincyf/huashu-design):高保真 HTML 设计。
- [归藏 PPT Skill](https://github.com/op7418/guizang-ppt-skill) 或 [HTML PPT Skill](https://github.com/lewislulu/html-ppt-skill):浏览器演示稿。
- [华叔 Markdown To HTML](https://github.com/alchaincyf/huashu-md-html)Markdown/HTML 文档转换。
- [Web Access](https://github.com/eze-is/web-access):网页研究。
- [OpenCLI](https://github.com/jackwener/opencli):已登录浏览器自动化和可复用网站 CLI 适配器。
- [Fireworks Tech Graph](https://github.com/yizhiyanhua-ai/fireworks-tech-graph):技术图表。
- [SlowMist Agent Security](https://github.com/slowmist/slowmist-agent-security):社区 Skill 安全审计。
- [Anthropic 官方 Skills](https://www.xinmi.cloud/anthropics/skills/tree/main/skills):参考实现和通用能力。
- [Matt Pocock Skills](https://www.xinmi.cloud/mattpocock/skills):工程流程。
- [宝玉 Skills](https://www.xinmi.cloud/JimLiu/baoyu-skills):图片、媒体和发布。
- [华叔 Design](https://www.xinmi.cloud/alchaincyf/huashu-design):高保真 HTML 设计。
- [归藏 PPT Skill](https://www.xinmi.cloud/op7418/guizang-ppt-skill) 或 [HTML PPT Skill](https://www.xinmi.cloud/lewislulu/html-ppt-skill):浏览器演示稿。
- [华叔 Markdown To HTML](https://www.xinmi.cloud/alchaincyf/huashu-md-html)Markdown/HTML 文档转换。
- [Web Access](https://www.xinmi.cloud/eze-is/web-access):网页研究。
- [OpenCLI](https://www.xinmi.cloud/jackwener/opencli):已登录浏览器自动化和可复用网站 CLI 适配器。
- [Fireworks Tech Graph](https://www.xinmi.cloud/yizhiyanhua-ai/fireworks-tech-graph):技术图表。
- [SlowMist Agent Security](https://www.xinmi.cloud/slowmist/slowmist-agent-security):社区 Skill 安全审计。
## 来源说明
本文档基于一份 Hermes / Claude Skills 分享清单整理,并补充了公开 GitHub 仓库描述与目录信息。
本文档基于一份 Hermes / Claude Skills 分享清单整理,并补充了公开 新觅源码库 仓库描述与目录信息。
@@ -355,10 +355,10 @@ function openChangelog() {
</div>
<div class="version-info">
<div class="version-links">
<a class="github-link" href="https://github.com/EKKOLearnAI/hermes-web-ui" target="_blank" rel="noopener noreferrer" title="GitHub">
<a class="github-link" href="http://192.168.6.101:3001/root/Hermes-ui" target="_blank" rel="noopener noreferrer" title="新觅源码库">
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>
</a>
<a class="website-link" href="https://ekkolearnai.com/" target="_blank" rel="noopener noreferrer" title="Website">
<a class="website-link" href="https://www.xinmi.cloud/" target="_blank" rel="noopener noreferrer" title="Website">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
</a>
</div>
+1 -1
View File
@@ -1261,7 +1261,7 @@ jobTriggered: 'Job ausgelost',
// Anderungsprotokoll
changelog: {
new_0_6_7_1: 'Die Desktop-App nutzt jetzt standardmäßig Port 8748, unterstützt Zugriff im lokalen Netzwerk und kann direkt im lokalen Browser geöffnet werden',
new_0_6_7_9: 'Desktop-Download-Links sind jetzt auf der offiziellen Website https://ekkolearnai.com/ verfügbar, aktuelle Installer bleiben außerdem über GitHub Releases verfügbar',
new_0_6_7_9: 'Desktop-Download-Links sind jetzt auf der offiziellen Website https://www.xinmi.cloud/ verfügbar, aktuelle Installer bleiben außerdem über GitHub Releases verfügbar',
new_0_6_7_2: 'MCP-Tools sind vollständiger: Bridge Tool Discovery, MCP-Management-Lifecycle und Tool-Sichtbarkeit pro Modell im Manager wurden verbessert',
new_0_6_7_3: 'Nachrichtenlisten zentrieren leere Zustände korrekt, reduzieren Scroll-Jitter, zeigen beim Laden von History keine Live-Chat-Nachrichten mehr, behalten Scrollpositionen pro Session und blenden beim Session-Wechsel 1,5 Sekunden ein',
new_0_6_7_4: 'Bridge und Runtime sind stabiler durch erhaltene Text/tool-call-Reihenfolge, korrektes Profile runtime status loading, bessere Node/npm-Erkennung und übersprungene Produktionsdatenverzeichnis-Erstellung',
+1 -1
View File
@@ -1483,7 +1483,7 @@ export default {
// Changelog
changelog: {
new_0_6_7_1: 'The desktop app now defaults to port 8748, supports LAN access, and can be opened directly from a local browser',
new_0_6_7_9: 'Desktop download links are now available on the official website at https://ekkolearnai.com/, and the latest installers remain available from GitHub Releases',
new_0_6_7_9: 'Desktop download links are now available on the official website at https://www.xinmi.cloud/, and the latest installers remain available from GitHub Releases',
new_0_6_7_2: 'MCP tooling is more complete with bridge tool discovery fixes, MCP management lifecycle fixes, and per-model tool visibility controls in the manager',
new_0_6_7_3: 'Message lists now center empty states correctly, reduce scroll jitter, avoid leaking live chat messages into History while loading, preserve per-session scroll positions, and fade in over 1.5 seconds on session switches',
new_0_6_7_4: 'Bridge and runtime stability improved by preserving text/tool-call ordering, fixing Profile runtime status loading, improving Node/npm detection, and skipping production data directory creation',
+1 -1
View File
@@ -1261,7 +1261,7 @@ jobTriggered: 'Job ejecutado',
// Registro de cambios
changelog: {
new_0_6_7_1: 'La app de escritorio ahora usa el puerto 8748 por defecto, permite acceso desde la red local y puede abrirse directamente desde un navegador local',
new_0_6_7_9: 'Los enlaces de descarga de escritorio ya están disponibles en el sitio oficial https://ekkolearnai.com/, y los instaladores más recientes siguen disponibles en GitHub Releases',
new_0_6_7_9: 'Los enlaces de descarga de escritorio ya están disponibles en el sitio oficial https://www.xinmi.cloud/, y los instaladores más recientes siguen disponibles en GitHub Releases',
new_0_6_7_2: 'Las herramientas MCP quedan más completas con arreglos de discovery en bridge, ciclo de vida de gestión MCP y controles de visibilidad por modelo en el gestor',
new_0_6_7_3: 'Las listas de mensajes centran mejor el estado vacío, reducen saltos de scroll, evitan mostrar mensajes del chat activo mientras carga History, preservan la posición por sesión y hacen fade-in de 1,5 segundos al cambiar de sesión',
new_0_6_7_4: 'Bridge y runtime son más estables al preservar el orden texto/tool-call, corregir la carga de estado runtime de Profile, mejorar detección Node/npm y evitar crear directorios de datos en producción',
+1 -1
View File
@@ -1261,7 +1261,7 @@ jobTriggered: 'Job declenche',
// Journal des modifications
changelog: {
new_0_6_7_1: 'L application desktop utilise maintenant le port 8748 par défaut, prend en charge l accès LAN et peut être ouverte directement depuis un navigateur local',
new_0_6_7_9: 'Les liens de téléchargement desktop sont maintenant disponibles sur le site officiel https://ekkolearnai.com/, et les derniers installateurs restent disponibles via GitHub Releases',
new_0_6_7_9: 'Les liens de téléchargement desktop sont maintenant disponibles sur le site officiel https://www.xinmi.cloud/, et les derniers installateurs restent disponibles via GitHub Releases',
new_0_6_7_2: 'Les outils MCP sont plus complets avec des corrections de découverte bridge, de cycle de vie MCP et des contrôles de visibilité par modèle dans le gestionnaire',
new_0_6_7_3: 'Les listes de messages centrent mieux les états vides, réduisent les sauts de scroll, évitent d afficher le chat actif pendant le chargement de History, conservent la position par session et ajoutent un fondu de 1,5 seconde au changement de session',
new_0_6_7_4: 'Bridge et runtime sont plus stables avec ordre texte/tool-call préservé, chargement du statut runtime de Profile corrigé, meilleure détection Node/npm et création du dossier de données production évitée',
+1 -1
View File
@@ -1260,7 +1260,7 @@ export default {
// 更新履歴
changelog: {
new_0_6_7_1: 'Desktop アプリは既定で port 8748 を使用し、LAN アクセスとローカルブラウザからの直接アクセスに対応しました',
new_0_6_7_9: 'Desktop のダウンロードリンクを公式サイト https://ekkolearnai.com/ に追加し、最新インストーラーは引き続き GitHub Releases からも取得できます',
new_0_6_7_9: 'Desktop のダウンロードリンクを公式サイト https://www.xinmi.cloud/ に追加し、最新インストーラーは引き続き GitHub Releases からも取得できます',
new_0_6_7_2: 'MCP ツールは bridge の tool discovery 修正、MCP 管理ライフサイクル修正、管理画面のモデル別 tool visibility によりさらに整備されました',
new_0_6_7_3: 'メッセージ一覧は empty state の中央揃え、scroll jitter、History 読み込み中のライブチャット混入を修正し、セッション別スクロール位置保持と 1.5 秒のフェードインに対応しました',
new_0_6_7_4: 'Bridge と runtime は text/tool-call の順序保持、Profile runtime status loading 修正、Node/npm 検出改善、本番 data directory 作成スキップで安定しました',
+1 -1
View File
@@ -1260,7 +1260,7 @@ export default {
// 변경 이력
changelog: {
new_0_6_7_1: 'Desktop 앱은 기본적으로 8748 포트를 사용하며 LAN 접근과 로컬 브라우저 직접 열기를 지원합니다',
new_0_6_7_9: 'Desktop 다운로드 링크가 공식 웹사이트 https://ekkolearnai.com/ 에 추가되었으며 최신 설치 파일은 GitHub Releases 에서도 계속 받을 수 있습니다',
new_0_6_7_9: 'Desktop 다운로드 링크가 공식 웹사이트 https://www.xinmi.cloud/ 에 추가되었으며 최신 설치 파일은 GitHub Releases 에서도 계속 받을 수 있습니다',
new_0_6_7_2: 'MCP 도구는 bridge tool discovery 수정, MCP 관리 라이프사이클 수정, 관리자 화면의 모델별 tool visibility 제어로 더 완성되었습니다',
new_0_6_7_3: '메시지 목록은 빈 상태 중앙 정렬, 스크롤 튐, History 로딩 중 라이브 채팅 메시지 노출을 수정하고 세션별 스크롤 위치 보존과 1.5초 페이드인을 지원합니다',
new_0_6_7_4: 'Bridge 와 runtime 은 text/tool-call 순서 보존, Profile runtime status loading 수정, Node/npm 감지 개선, 운영 데이터 디렉터리 생성 생략으로 더 안정적입니다',
+1 -1
View File
@@ -1261,7 +1261,7 @@ jobTriggered: 'Job acionado',
// Registro de alteracoes
changelog: {
new_0_6_7_1: 'O app desktop agora usa a porta 8748 por padrão, permite acesso pela rede local e pode ser aberto diretamente em um navegador local',
new_0_6_7_9: 'Links de download do desktop agora estão disponíveis no site oficial https://ekkolearnai.com/, e os instaladores mais recentes continuam disponíveis no GitHub Releases',
new_0_6_7_9: 'Links de download do desktop agora estão disponíveis no site oficial https://www.xinmi.cloud/, e os instaladores mais recentes continuam disponíveis no GitHub Releases',
new_0_6_7_2: 'As ferramentas MCP ficam mais completas com correções de discovery no bridge, ciclo de vida de gestão MCP e controles de visibilidade por modelo no gestor',
new_0_6_7_3: 'Listas de mensagens centralizam melhor estados vazios, reduzem saltos de rolagem, evitam mostrar o chat ativo enquanto History carrega, preservam posição por sessão e fazem fade-in de 1,5 segundo ao trocar sessão',
new_0_6_7_4: 'Bridge e runtime ficam mais estáveis preservando a ordem texto/tool-call, corrigindo carregamento de status runtime de Profile, melhorando detecção Node/npm e evitando criação de diretório de dados em produção',
+1 -1
View File
@@ -1488,7 +1488,7 @@ export default {
// 更新日誌
changelog: {
new_0_6_7_1: '桌面版預設使用 8748 連接埠,支援區域網路內存取,也可以直接用本機瀏覽器開啟 Web UI',
new_0_6_7_9: '桌面端下載入口已補充到官網 https://ekkolearnai.com/,也可以繼續從 GitHub Releases 取得最新安裝包',
new_0_6_7_9: '桌面端下載入口已補充到官網 https://www.xinmi.cloud/,也可以繼續從 GitHub Releases 取得最新安裝包',
new_0_6_7_2: 'MCP 工具鏈繼續完善:修復 bridge 工具發現與 MCP 管理生命週期,並在管理頁支援按模型控制工具可見性',
new_0_6_7_3: '訊息列表體驗優化:修復空狀態置中、捲動抖動、歷史會話載入串訊息,並在切換會話時保留捲動位置與 1.5 秒淡入效果',
new_0_6_7_4: 'Bridge 與執行狀態更穩定:保持文字和 tool-call 順序、修復 Profile runtime 狀態載入、改進 Node/npm 偵測,並避免正式環境自動建立資料目錄',
+1 -1
View File
@@ -1485,7 +1485,7 @@ export default {
// 更新日志
changelog: {
new_0_6_7_1: '桌面版默认使用 8748 端口,支持局域网内访问,也可以直接用本机浏览器打开 Web UI',
new_0_6_7_9: '桌面端下载入口已补充到官网 https://ekkolearnai.com/,也可以继续从 GitHub Releases 获取最新安装包',
new_0_6_7_9: '桌面端下载入口已补充到官网 https://www.xinmi.cloud/,也可以继续从 GitHub Releases 获取最新安装包',
new_0_6_7_2: 'MCP 工具链继续完善:修复 bridge 工具发现与 MCP 管理生命周期,并在管理页支持按模型控制工具可见性',
new_0_6_7_3: '消息列表体验优化:修复空状态居中、滚动抖动、历史会话加载串消息,并在切换会话时保留滚动位置与 1.5 秒淡入效果',
new_0_6_7_4: 'Bridge 与运行态更稳定:保持文本和 tool-call 顺序、修复 Profile runtime 状态加载、改进 Node/npm 检测,并避免生产环境自动创建数据目录',
+3 -3
View File
@@ -6,7 +6,7 @@ Electron desktop distribution for Hermes Studio.
Download the latest macOS, Windows, or Linux installer for your CPU
architecture from the project
[GitHub Releases](https://github.com/EKKOLearnAI/hermes-web-ui/releases/latest).
[新觅源码库 Releases](https://www.xinmi.cloud/root/Hermes-ui/releases/latest).
The desktop app bundles the Web UI runtime and launches it locally from the
native shell app.
@@ -32,9 +32,9 @@ export ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
export ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/
```
If GitHub release downloads are slow, `fetch-python.mjs` can also use a compatible
If 新觅源码库 release downloads are slow, `fetch-python.mjs` can also use a compatible
python-build-standalone release mirror:
```sh
export PBS_BASE_URL=https://github.com/astral-sh/python-build-standalone/releases/download
export PBS_BASE_URL=https://www.xinmi.cloud/astral-sh/python-build-standalone/releases/download
```
+57 -57
View File
@@ -169,7 +169,7 @@
"node": ">= 8.0.0"
},
"funding": {
"url": "https://github.com/sponsors/gjtorikian/"
"url": "https://www.xinmi.cloud/sponsors/gjtorikian/"
}
},
"node_modules/@electron/rebuild": {
@@ -265,7 +265,7 @@
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/@gar/promisify": {
@@ -303,7 +303,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-styles": {
@@ -316,7 +316,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/emoji-regex": {
@@ -341,7 +341,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
@@ -357,7 +357,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
@@ -375,7 +375,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/@malept/cross-spawn-promise": {
@@ -386,7 +386,7 @@
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/malept"
"url": "https://www.xinmi.cloud/sponsors/malept"
},
{
"type": "tidelift",
@@ -483,7 +483,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/is?sponsor=1"
"url": "https://www.xinmi.cloud/sindresorhus/is?sponsor=1"
}
},
"node_modules/@szmarczak/http-timer": {
@@ -692,7 +692,7 @@
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
"url": "https://www.xinmi.cloud/sponsors/epoberezkin"
}
},
"node_modules/ajv-keywords": {
@@ -728,7 +728,7 @@
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/app-builder-bin": {
@@ -967,7 +967,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
"url": "https://www.xinmi.cloud/sponsors/feross"
},
{
"type": "patreon",
@@ -1030,7 +1030,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
"url": "https://www.xinmi.cloud/sponsors/feross"
},
{
"type": "patreon",
@@ -1168,7 +1168,7 @@
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/cacache/node_modules/lru-cache": {
@@ -1251,7 +1251,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/chalk?sponsor=1"
}
},
"node_modules/chownr": {
@@ -1279,7 +1279,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/sibiraj-s"
"url": "https://www.xinmi.cloud/sponsors/sibiraj-s"
}
],
"license": "MIT",
@@ -1320,7 +1320,7 @@
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/cli-truncate": {
@@ -1338,7 +1338,7 @@
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/cliui": {
@@ -1376,7 +1376,7 @@
"mimic-response": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/color-convert": {
@@ -1513,7 +1513,7 @@
"glob": "dist/esm/bin.mjs"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/config-file-ts/node_modules/minimatch": {
@@ -1529,7 +1529,7 @@
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/config-file-ts/node_modules/minipass": {
@@ -1641,7 +1641,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/decompress-response/node_modules/mimic-response": {
@@ -1654,7 +1654,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/defaults": {
@@ -1667,7 +1667,7 @@
"clone": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/defer-to-connect": {
@@ -2015,7 +2015,7 @@
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/err-code": {
@@ -2201,7 +2201,7 @@
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/foreground-child/node_modules/signal-exit": {
@@ -2214,7 +2214,7 @@
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/form-data": {
@@ -2283,7 +2283,7 @@
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/gauge": {
@@ -2339,7 +2339,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/get-proto": {
@@ -2369,7 +2369,7 @@
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/glob": {
@@ -2391,7 +2391,7 @@
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/glob/node_modules/balanced-match": {
@@ -2435,7 +2435,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/got": {
@@ -2461,7 +2461,7 @@
"node": ">=10.19.0"
},
"funding": {
"url": "https://github.com/sindresorhus/got?sponsor=1"
"url": "https://www.xinmi.cloud/sindresorhus/got?sponsor=1"
}
},
"node_modules/graceful-fs": {
@@ -2490,7 +2490,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
@@ -2506,7 +2506,7 @@
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/has-unicode": {
@@ -2640,7 +2640,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
"url": "https://www.xinmi.cloud/sponsors/feross"
},
{
"type": "patreon",
@@ -2759,7 +2759,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/isarray": {
@@ -2780,7 +2780,7 @@
"node": ">= 18.0.0"
},
"funding": {
"url": "https://github.com/sponsors/gjtorikian/"
"url": "https://www.xinmi.cloud/sponsors/gjtorikian/"
}
},
"node_modules/isexe": {
@@ -2800,7 +2800,7 @@
"@isaacs/cliui": "^8.0.2"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
},
"optionalDependencies": {
"@pkgjs/parseargs": "^0.11.0"
@@ -3015,7 +3015,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/lowercase-keys": {
@@ -3200,7 +3200,7 @@
"node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/minimist": {
@@ -3210,7 +3210,7 @@
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
"url": "https://www.xinmi.cloud/sponsors/ljharb"
}
},
"node_modules/minipass": {
@@ -3443,7 +3443,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/npmlog": {
@@ -3486,7 +3486,7 @@
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/ora": {
@@ -3510,7 +3510,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/p-cancelable": {
@@ -3536,7 +3536,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/p-map": {
@@ -3552,7 +3552,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/package-json-from-dist": {
@@ -3596,7 +3596,7 @@
"node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
@@ -3628,7 +3628,7 @@
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jet2jet"
"url": "https://www.xinmi.cloud/sponsors/jet2jet"
}
},
"node_modules/pend": {
@@ -3730,7 +3730,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/read-binary-file-arch": {
@@ -3830,7 +3830,7 @@
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jet2jet"
"url": "https://www.xinmi.cloud/sponsors/jet2jet"
}
},
"node_modules/resolve-alpn": {
@@ -3850,7 +3850,7 @@
"lowercase-keys": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/restore-cursor": {
@@ -3891,7 +3891,7 @@
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
"url": "https://www.xinmi.cloud/sponsors/isaacs"
}
},
"node_modules/safe-buffer": {
@@ -3902,7 +3902,7 @@
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
"url": "https://www.xinmi.cloud/sponsors/feross"
},
{
"type": "patreon",
@@ -4464,7 +4464,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs": {
@@ -4483,7 +4483,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
"url": "https://www.xinmi.cloud/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrappy": {
@@ -4570,7 +4570,7 @@
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://www.xinmi.cloud/sponsors/sindresorhus"
}
},
"node_modules/zip-stream": {
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "hermes-studio",
"version": "0.6.8",
"description": "Hermes Studio desktop distribution with bundled Python runtime and hermes-agent",
"homepage": "https://ekkolearnai.com",
"homepage": "https://www.xinmi.cloud",
"author": {
"name": "Hermes Studio Contributors",
"email": "noreply@hermes-studio.local"
+3 -3
View File
@@ -25,7 +25,7 @@ import {
} from './paths'
const execFileAsync = promisify(execFile)
const DEFAULT_RUNTIME_BASE_URL = 'https://download.ekkolearnai.com'
const DEFAULT_RUNTIME_BASE_URL = 'https://download.www.xinmi.cloud'
const RUNTIME_MANIFEST_NAME = 'runtime-manifest.json'
const PACKAGED_RUNTIME_RELEASE_NAME = 'runtime-release.json'
@@ -111,9 +111,9 @@ function runtimeAssetUrl(assetName: string, tag: string): string {
const repo = process.env.HERMES_DESKTOP_RUNTIME_REPO?.trim()
if (repo) {
if (tag === 'latest') {
return `https://github.com/${repo}/releases/latest/download/${encodeURIComponent(assetName)}`
return `https://www.xinmi.cloud/${repo}/releases/latest/download/${encodeURIComponent(assetName)}`
}
return `https://github.com/${repo}/releases/download/${encodeURIComponent(tag)}/${encodeURIComponent(assetName)}`
return `https://www.xinmi.cloud/${repo}/releases/download/${encodeURIComponent(tag)}/${encodeURIComponent(assetName)}`
}
const template = process.env.HERMES_DESKTOP_RUNTIME_BASE_URL?.trim() || DEFAULT_RUNTIME_BASE_URL
+2 -2
View File
@@ -6,8 +6,8 @@ let initialized = false
let checking = false
let updateDownloaded = false
const LATEST_RELEASE_URL = 'https://api.github.com/repos/EKKOLearnAI/hermes-web-ui/releases/latest'
const CLOUDFLARE_DOWNLOAD_BASE_URL = 'https://download.ekkolearnai.com'
const LATEST_RELEASE_URL = 'https://api.www.xinmi.cloud/repos/EKKOLearnAI/hermes-web-ui/releases/latest'
const CLOUDFLARE_DOWNLOAD_BASE_URL = 'https://download.www.xinmi.cloud'
interface GitHubRelease {
tag_name?: string
+3 -3
View File
@@ -107,7 +107,7 @@ function normalizeGithubRepoUrl(raw: string): string {
return raw
.trim()
.replace(/^git\+/, '')
.replace(/^git@github\.com:/, 'https://github.com/')
.replace(/^git@github\.com:/, 'https://www.xinmi.cloud/')
.replace(/\.git$/, '')
}
@@ -127,7 +127,7 @@ function getPreviewRepoApiUrl(): string {
const baseUrl = getPreviewRepoBaseUrl()
const match = baseUrl.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)$/)
if (!match) throw new Error(`Preview zip fallback only supports GitHub repositories: ${baseUrl}`)
return `https://api.github.com/repos/${match[1]}/${match[2]}`
return `https://api.www.xinmi.cloud/repos/${match[1]}/${match[2]}`
}
function getPreviewGithubRepoParts(): { owner: string; repo: string } {
@@ -902,7 +902,7 @@ async function downloadGithubZip(ref: string, targetDir: string, type: 'tag' | '
const { owner, repo } = getPreviewGithubRepoParts()
const refKind = type === 'branch' ? 'heads' : 'tags'
const archiveKind = process.platform === 'win32' ? 'zip' : 'tar.gz'
const url = `https://codeload.github.com/${owner}/${repo}/${archiveKind}/refs/${refKind}/${encodeURIComponent(ref)}`
const url = `https://codeload.www.xinmi.cloud/${owner}/${repo}/${archiveKind}/refs/${refKind}/${encodeURIComponent(ref)}`
appendPreviewActionLog(`download archive: ${url}`)
const res = await fetch(url, {
headers: { 'User-Agent': 'hermes-web-ui-preview' },
@@ -10,7 +10,7 @@ const DEFAULT_AGENT_BRIDGE_STARTUP_TIMEOUT_MS = 120000
const DEFAULT_AGENT_BRIDGE_RESTART_DELAY_MS = 1000
const MAX_AGENT_BRIDGE_RESTART_DELAY_MS = 30000
const OPENROUTER_WEB_UI_ATTRIBUTION_ENV = {
HERMES_OPENROUTER_APP_REFERER: 'https://ekkolearnai.com',
HERMES_OPENROUTER_APP_REFERER: 'https://www.xinmi.cloud',
HERMES_OPENROUTER_APP_TITLE: 'Hermes Web UI',
HERMES_OPENROUTER_APP_CATEGORIES: 'cli-agent,personal-agent',
} as const
@@ -3,16 +3,16 @@
*
* Mirrors the upstream hermes-agent implementation
* (`hermes_cli/copilot_auth.py:155-275`):
* - POST https://github.com/login/device/code → device_code, user_code, verification_uri
* - POST https://github.com/login/oauth/access_token → access_token (after user approves)
* - POST https://www.xinmi.cloud/login/device/code → device_code, user_code, verification_uri
* - POST https://www.xinmi.cloud/login/oauth/access_token → access_token (after user approves)
* - Polling rules per RFC 8628: authorization_pending, slow_down, expired_token, access_denied
*
* Client ID `Ov23li8tweQw6odWQebz` is reused from upstream hermes-agent for now;
* a dedicated web-ui OAuth App can be registered later without changing the protocol.
*/
const GITHUB_DEVICE_CODE_URL = 'https://github.com/login/device/code'
const GITHUB_ACCESS_TOKEN_URL = 'https://github.com/login/oauth/access_token'
const GITHUB_DEVICE_CODE_URL = 'https://www.xinmi.cloud/login/device/code'
const GITHUB_ACCESS_TOKEN_URL = 'https://www.xinmi.cloud/login/oauth/access_token'
export const COPILOT_OAUTH_CLIENT_ID = 'Ov23li8tweQw6odWQebz'
export const COPILOT_OAUTH_SCOPE = 'read:user'
const FETCH_TIMEOUT_MS = 15_000
@@ -6,7 +6,7 @@ import { join } from 'path'
const execFileAsync = promisify(execFile)
const COPILOT_API_TOKEN_URL = 'https://api.github.com/copilot_internal/v2/token'
const COPILOT_API_TOKEN_URL = 'https://api.www.xinmi.cloud/copilot_internal/v2/token'
const COPILOT_MODELS_URL = 'https://api.githubcopilot.com/models'
const EDITOR_VERSION = 'vscode/1.104.1'
const PLUGIN_VERSION = 'copilot-chat/0.20.0'
@@ -137,7 +137,7 @@ onMounted(() => {
</button>
<a
class="btn-outline"
href="https://github.com/EKKOLearnAI/hermes-web-ui"
href="https://www.xinmi.cloud/root/Hermes-ui"
target="_blank"
rel="noopener"
>
@@ -15,10 +15,10 @@ const activeTab = ref<'desktop' | 'npm' | 'docker' | 'source'>('desktop')
const releaseVersion = __APP_VERSION__.replace(/^v/, '')
const releaseTag = `v${releaseVersion}`
const releaseBaseUrl = 'https://github.com/EKKOLearnAI/hermes-web-ui/releases'
const releaseBaseUrl = 'https://www.xinmi.cloud/root/Hermes-ui/releases'
const releaseUrl = `${releaseBaseUrl}/tag/${releaseTag}`
const githubDownloadUrl = `${releaseBaseUrl}/download/${releaseTag}`
const cloudflareDownloadUrl = `https://download.ekkolearnai.com/${releaseTag}`
const cloudflareDownloadUrl = `https://download.www.xinmi.cloud/${releaseTag}`
const desktopDownloads = computed(() =>
(tm('install.desktop.downloads') as DesktopDownload[]).map((item) => {
const assetName = `Hermes.Studio-${releaseVersion}-${item.assetSuffix}`
@@ -17,7 +17,7 @@ const chartSrc = computed(() => {
onMounted(async () => {
try {
const res = await fetch('https://api.github.com/repos/EKKOLearnAI/hermes-web-ui')
const res = await fetch('https://api.www.xinmi.cloud/repos/EKKOLearnAI/hermes-web-ui')
const data = await res.json()
stars.value = data.stargazers_count
} catch {}
@@ -32,7 +32,7 @@ onMounted(async () => {
<div class="star-badges reveal reveal-delay-1">
<a
class="star-btn"
href="https://github.com/EKKOLearnAI/hermes-web-ui"
href="https://www.xinmi.cloud/root/Hermes-ui"
target="_blank"
rel="noopener"
>
@@ -19,7 +19,7 @@ const { t } = useI18n()
<p class="footer-meta">{{ t('footer.license') }}</p>
<a
class="footer-github"
href="https://github.com/EKKOLearnAI/hermes-web-ui"
href="https://www.xinmi.cloud/root/Hermes-ui"
target="_blank"
rel="noopener"
>
@@ -39,7 +39,7 @@ function goHome() {
<a class="nav-link" @click.prevent="navigateTo('docs.getting-started')">{{ t('nav.docs') }}</a>
<a
class="nav-link"
href="https://github.com/EKKOLearnAI/hermes-web-ui"
href="https://www.xinmi.cloud/root/Hermes-ui"
target="_blank"
rel="noopener"
>
@@ -84,7 +84,7 @@ function goHome() {
<div class="mobile-menu-inner" @click.stop>
<a class="mobile-link" @click.prevent="navigateTo('landing')">{{ t('nav.home') }}</a>
<a class="mobile-link" @click.prevent="navigateTo('docs.getting-started')">{{ t('nav.docs') }}</a>
<a class="mobile-link" href="https://github.com/EKKOLearnAI/hermes-web-ui" target="_blank" rel="noopener">{{ t('nav.github') }}</a>
<a class="mobile-link" href="https://www.xinmi.cloud/root/Hermes-ui" target="_blank" rel="noopener">{{ t('nav.github') }}</a>
<div class="mobile-actions">
<button class="mobile-action-btn" @click="switchLocale">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="action-icon">
+1 -1
View File
@@ -156,7 +156,7 @@ export default {
},
source: {
title: 'From Source',
cmd1: 'git clone https://github.com/EKKOLearnAI/hermes-web-ui.git',
cmd1: 'git clone https://www.xinmi.cloud/root/Hermes-ui.git',
cmd2: 'cd hermes-web-ui && npm install && npm run dev',
},
prereq: 'Requires Node.js >= 23',
+1 -1
View File
@@ -156,7 +156,7 @@ export default {
},
source: {
title: '源码安装',
cmd1: 'git clone https://github.com/EKKOLearnAI/hermes-web-ui.git',
cmd1: 'git clone https://www.xinmi.cloud/root/Hermes-ui.git',
cmd2: 'cd hermes-web-ui && npm install && npm run dev',
},
prereq: '需要 Node.js >= 23',
+4 -4
View File
@@ -45,7 +45,7 @@ describe('CopilotLoginModal device-flow state machine', () => {
mockApi.startCopilotLogin.mockResolvedValue({
session_id: 'sess-1',
user_code: 'ABCD-1234',
verification_url: 'https://github.com/login/device',
verification_url: 'https://www.xinmi.cloud/login/device',
expires_in: 900,
interval: 5,
})
@@ -62,7 +62,7 @@ describe('CopilotLoginModal device-flow state machine', () => {
mockApi.startCopilotLogin.mockResolvedValue({
session_id: 'sess-2',
user_code: 'WXYZ-9999',
verification_url: 'https://github.com/login/device',
verification_url: 'https://www.xinmi.cloud/login/device',
expires_in: 900,
interval: 5,
})
@@ -87,7 +87,7 @@ describe('CopilotLoginModal device-flow state machine', () => {
mockApi.startCopilotLogin.mockResolvedValue({
session_id: 'sess-3',
user_code: 'EXPI-RED!',
verification_url: 'https://github.com/login/device',
verification_url: 'https://www.xinmi.cloud/login/device',
expires_in: 900,
interval: 5,
})
@@ -116,7 +116,7 @@ describe('CopilotLoginModal device-flow state machine', () => {
mockApi.startCopilotLogin.mockResolvedValue({
session_id: 'sess-4',
user_code: 'NOPE',
verification_url: 'https://github.com/login/device',
verification_url: 'https://www.xinmi.cloud/login/device',
expires_in: 900,
interval: 5,
})
+1 -1
View File
@@ -97,7 +97,7 @@ describe('agent bridge manager command resolution', () => {
const { buildAgentBridgeProcessEnv } = await import('../../packages/server/src/services/hermes/agent-bridge/manager')
const env = buildAgentBridgeProcessEnv('ipc:///tmp/test.sock', '/tmp/hermes-home', '/tmp/hermes-agent')
expect(env.HERMES_OPENROUTER_APP_REFERER).toBe('https://ekkolearnai.com')
expect(env.HERMES_OPENROUTER_APP_REFERER).toBe('https://www.xinmi.cloud')
expect(env.HERMES_OPENROUTER_APP_TITLE).toBe('Hermes Web UI')
expect(env.HERMES_OPENROUTER_APP_CATEGORIES).toBe('cli-agent,personal-agent')
})
+5 -5
View File
@@ -22,19 +22,19 @@ describe('startDeviceFlow', () => {
const fetchSpy = vi.fn().mockResolvedValue(mockJsonResponse({
device_code: 'DC-1',
user_code: 'USER-1234',
verification_uri: 'https://github.com/login/device',
verification_uri: 'https://www.xinmi.cloud/login/device',
expires_in: 900,
interval: 5,
}))
const data = await startDeviceFlow(fetchSpy as any)
expect(data.device_code).toBe('DC-1')
expect(data.user_code).toBe('USER-1234')
expect(data.verification_uri).toBe('https://github.com/login/device')
expect(data.verification_uri).toBe('https://www.xinmi.cloud/login/device')
expect(data.expires_in).toBe(900)
expect(data.interval).toBe(5)
const [url, init] = fetchSpy.mock.calls[0]
expect(url).toBe('https://github.com/login/device/code')
expect(url).toBe('https://www.xinmi.cloud/login/device/code')
expect(init.method).toBe('POST')
const body = String(init.body)
expect(body).toContain(`client_id=${encodeURIComponent(COPILOT_OAUTH_CLIENT_ID)}`)
@@ -57,7 +57,7 @@ describe('startDeviceFlow', () => {
const fetchSpy = vi.fn().mockResolvedValue(mockJsonResponse({
device_code: 'DC-2',
user_code: 'AAAA',
verification_uri: 'https://github.com/login/device',
verification_uri: 'https://www.xinmi.cloud/login/device',
}))
const data = await startDeviceFlow(fetchSpy as any)
expect(data.expires_in).toBe(900)
@@ -130,7 +130,7 @@ describe('pollDeviceFlow', () => {
const fetchSpy = vi.fn().mockResolvedValue(mockJsonResponse({ access_token: 'gho_x' }))
await pollDeviceFlow('DEVICE-CODE-XYZ', fetchSpy as any)
const [url, init] = fetchSpy.mock.calls[0]
expect(url).toBe('https://github.com/login/oauth/access_token')
expect(url).toBe('https://www.xinmi.cloud/login/oauth/access_token')
const body = String(init.body)
expect(body).toContain(`client_id=${encodeURIComponent(COPILOT_OAUTH_CLIENT_ID)}`)
expect(body).toContain('device_code=DEVICE-CODE-XYZ')
+2 -2
View File
@@ -82,7 +82,7 @@ describe('resolveCopilotOAuthToken', () => {
mockReadFile.mockImplementation(async (p: string) => {
if (p.includes('apps.json')) {
return JSON.stringify({
'github.com:abc': { oauth_token: 'gho_from_apps_json', user: 'me' },
'www.xinmi.cloud:abc': { oauth_token: 'gho_from_apps_json', user: 'me' },
})
}
throw new Error('ENOENT')
@@ -93,7 +93,7 @@ describe('resolveCopilotOAuthToken', () => {
it('apps.json 中的 ghp_ token 也应跳过', async () => {
mockReadFile.mockImplementation(async (p: string) => {
if (p.includes('apps.json')) {
return JSON.stringify({ 'github.com:a': { oauth_token: 'ghp_pat_in_apps' } })
return JSON.stringify({ 'www.xinmi.cloud:a': { oauth_token: 'ghp_pat_in_apps' } })
}
throw new Error('ENOENT')
})
+5 -5
View File
@@ -20,7 +20,7 @@ async function loadUpdateController(overrides: Partial<UpdateControllerMocks> =
const readFileSync = overrides.readFileSync ?? vi.fn(() => JSON.stringify({
name: 'hermes-web-ui',
version: '0.0.0',
repository: { url: 'https://github.com/EKKOLearnAI/hermes-web-ui.git' },
repository: { url: 'https://www.xinmi.cloud/root/Hermes-ui.git' },
}))
const appendFileSync = overrides.appendFileSync ?? vi.fn()
@@ -210,7 +210,7 @@ describe('update controller', () => {
})
it('loads preview tags through async git with a short timeout', async () => {
process.env.HERMES_WEB_UI_PREVIEW_REPO = 'https://github.com/EKKOLearnAI/hermes-web-ui'
process.env.HERMES_WEB_UI_PREVIEW_REPO = 'https://www.xinmi.cloud/root/Hermes-ui'
const execFile = vi.fn((_command: string, _args: string[], _options: any, callback: any) => {
callback(null, [
'abc123\trefs/tags/v0.6.6',
@@ -233,14 +233,14 @@ describe('update controller', () => {
})
expect(mocks.execFile).toHaveBeenCalledWith(
'git',
['ls-remote', '--tags', '--refs', 'https://github.com/EKKOLearnAI/hermes-web-ui.git'],
['ls-remote', '--tags', '--refs', 'https://www.xinmi.cloud/root/Hermes-ui.git'],
expect.objectContaining({ timeout: 8000 }),
expect.any(Function),
)
})
it('falls back to GitHub API when async git tag loading fails', async () => {
process.env.HERMES_WEB_UI_PREVIEW_REPO = 'https://github.com/EKKOLearnAI/hermes-web-ui'
process.env.HERMES_WEB_UI_PREVIEW_REPO = 'https://www.xinmi.cloud/root/Hermes-ui'
const execFile = vi.fn((_command: string, _args: string[], _options: any, callback: any) => {
callback(new Error('git timeout'), '', '')
})
@@ -267,7 +267,7 @@ describe('update controller', () => {
],
})
expect(fetchMock).toHaveBeenCalledWith(
'https://api.github.com/repos/EKKOLearnAI/hermes-web-ui/tags?per_page=100',
'https://api.www.xinmi.cloud/repos/EKKOLearnAI/hermes-web-ui/tags?per_page=100',
expect.objectContaining({
headers: { 'User-Agent': 'hermes-web-ui-preview' },
signal: expect.any(AbortSignal),