diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
deleted file mode 100644
index 60a11e29..00000000
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ /dev/null
@@ -1,144 +0,0 @@
-name: "🐛 Bug Report"
-description: Report a bug — something that's broken, crashes, or behaves incorrectly.
-title: "[Bug]: "
-labels: ["bug"]
-body:
- - type: markdown
- attributes:
- value: |
- Thanks for reporting a bug! Please fill out the sections below so we can reproduce and fix it quickly.
-
- **Before submitting**, please:
- - [ ] Search [existing issues](https://github.com/NousResearch/hermes-agent/issues) to avoid duplicates
- - [ ] Update to the latest version (`hermes update`) and confirm the bug still exists
-
- - type: textarea
- id: description
- attributes:
- label: Bug Description
- description: A clear description of what's broken. Include error messages, tracebacks, or screenshots if relevant.
- placeholder: |
- What happened? What did you expect to happen instead?
- validations:
- required: true
-
- - type: textarea
- id: reproduction
- attributes:
- label: Steps to Reproduce
- description: Minimal steps to trigger the bug. The more specific, the faster we can fix it.
- placeholder: |
- 1. Run `hermes chat`
- 2. Send the message "..."
- 3. Agent calls tool X
- 4. Error appears: ...
- validations:
- required: true
-
- - type: textarea
- id: expected
- attributes:
- label: Expected Behavior
- description: What should have happened instead?
- validations:
- required: true
-
- - type: textarea
- id: actual
- attributes:
- label: Actual Behavior
- description: What actually happened? Include full error output if available.
- validations:
- required: true
-
- - type: dropdown
- id: component
- attributes:
- label: Affected Component
- description: Which part of Hermes is affected?
- multiple: true
- options:
- - CLI (interactive chat)
- - Gateway (Telegram/Discord/Slack/WhatsApp)
- - Setup / Installation
- - Tools (terminal, file ops, web, code execution, etc.)
- - Skills (skill loading, skill hub, skill guard)
- - Agent Core (conversation loop, context compression, memory)
- - Configuration (config.yaml, .env, hermes setup)
- - Other
- validations:
- required: true
-
- - type: dropdown
- id: platform
- attributes:
- label: Messaging Platform (if gateway-related)
- description: Which platform adapter is affected?
- multiple: true
- options:
- - N/A (CLI only)
- - Telegram
- - Discord
- - Slack
- - WhatsApp
-
- - type: input
- id: os
- attributes:
- label: Operating System
- description: e.g. Ubuntu 24.04, macOS 15.2, Windows 11
- placeholder: Ubuntu 24.04
- validations:
- required: true
-
- - type: input
- id: python-version
- attributes:
- label: Python Version
- description: Output of `python --version`
- placeholder: "3.11.9"
- validations:
- required: true
-
- - type: input
- id: hermes-version
- attributes:
- label: Hermes Version
- description: Output of `hermes version`
- placeholder: "2.1.0"
- validations:
- required: true
-
- - type: textarea
- id: logs
- attributes:
- label: Relevant Logs / Traceback
- description: Paste any error output, traceback, or log messages. This will be auto-formatted as code.
- render: shell
-
- - type: textarea
- id: root-cause
- attributes:
- label: Root Cause Analysis (optional)
- description: |
- If you've dug into the code and identified the root cause, share it here.
- Include file paths, line numbers, and code snippets if possible. This massively speeds up fixes.
- placeholder: |
- The bug is in `gateway/run.py` line 949. `len(history)` counts session_meta entries
- but `agent_messages` was built from filtered history...
-
- - type: textarea
- id: proposed-fix
- attributes:
- label: Proposed Fix (optional)
- description: If you have a fix in mind (or a PR ready), describe it here.
- placeholder: |
- Replace `.get()` with `.pop()` on line 289 of `gateway/platforms/base.py`
- to actually clear the pending message after retrieval.
-
- - type: checkboxes
- id: pr-ready
- attributes:
- label: Are you willing to submit a PR for this?
- options:
- - label: I'd like to fix this myself and submit a PR
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
deleted file mode 100644
index 0daa52c9..00000000
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-blank_issues_enabled: true
-contact_links:
- - name: 💬 Nous Research Discord
- url: https://discord.gg/NousResearch
- about: For quick questions, showcasing projects, sharing skills, and community chat.
- - name: 📖 Documentation
- url: https://github.com/NousResearch/hermes-agent/blob/main/README.md
- about: Check the README and docs before opening an issue.
- - name: 🤝 Contributing Guide
- url: https://github.com/NousResearch/hermes-agent/blob/main/CONTRIBUTING.md
- about: Read this before submitting a PR.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
deleted file mode 100644
index 8dba7d43..00000000
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ /dev/null
@@ -1,73 +0,0 @@
-name: "✨ Feature Request"
-description: Suggest a new feature or improvement.
-title: "[Feature]: "
-labels: ["enhancement"]
-body:
- - type: markdown
- attributes:
- value: |
- Thanks for the suggestion! Before submitting, please consider:
-
- - **Is this a new skill?** Most capabilities should be [skills, not tools](https://github.com/NousResearch/hermes-agent/blob/main/CONTRIBUTING.md#should-it-be-a-skill-or-a-tool). If it's a specialized integration (crypto, NFT, niche SaaS), it belongs on the Skills Hub, not bundled.
- - **Search [existing issues](https://github.com/NousResearch/hermes-agent/issues)** — someone may have already proposed this.
-
- - type: textarea
- id: problem
- attributes:
- label: Problem or Use Case
- description: What problem does this solve? What are you trying to do that you can't today?
- placeholder: |
- I'm trying to use Hermes with [provider/platform/workflow] but currently
- there's no way to...
- validations:
- required: true
-
- - type: textarea
- id: solution
- attributes:
- label: Proposed Solution
- description: How do you think this should work? Be as specific as you can — CLI flags, config options, UI behavior.
- placeholder: |
- Add a `--foo` flag to `hermes chat` that enables...
- Or: Add a config key `bar.baz` that controls...
- validations:
- required: true
-
- - type: textarea
- id: alternatives
- attributes:
- label: Alternatives Considered
- description: What other approaches did you consider? Why is the proposed solution better?
-
- - type: dropdown
- id: type
- attributes:
- label: Feature Type
- options:
- - New tool
- - New bundled skill
- - CLI improvement
- - Gateway / messaging improvement
- - Configuration option
- - Performance / reliability
- - Developer experience (tests, docs, CI)
- - Other
- validations:
- required: true
-
- - type: dropdown
- id: scope
- attributes:
- label: Scope
- description: How big is this change?
- options:
- - Small (single file, < 50 lines)
- - Medium (few files, < 300 lines)
- - Large (new module or significant refactor)
-
- - type: checkboxes
- id: pr-ready
- attributes:
- label: Contribution
- options:
- - label: I'd like to implement this myself and submit a PR
diff --git a/.github/ISSUE_TEMPLATE/setup_help.yml b/.github/ISSUE_TEMPLATE/setup_help.yml
deleted file mode 100644
index f13eea4a..00000000
--- a/.github/ISSUE_TEMPLATE/setup_help.yml
+++ /dev/null
@@ -1,100 +0,0 @@
-name: "🔧 Setup / Installation Help"
-description: Having trouble installing or configuring Hermes? Ask here.
-title: "[Setup]: "
-labels: ["setup"]
-body:
- - type: markdown
- attributes:
- value: |
- Sorry you're having trouble! Please fill out the details below so we can help.
-
- **Quick checks first:**
- - Run `hermes doctor` and include the output below
- - Try `hermes update` to get the latest version
- - Check the [README troubleshooting section](https://github.com/NousResearch/hermes-agent#troubleshooting)
- - For general questions, consider the [Nous Research Discord](https://discord.gg/NousResearch) for faster help
-
- - type: textarea
- id: description
- attributes:
- label: What's Going Wrong?
- description: Describe what you're trying to do and where it fails.
- placeholder: |
- I ran `hermes setup` and selected Nous Portal, but when I try to
- start the gateway I get...
- validations:
- required: true
-
- - type: textarea
- id: steps
- attributes:
- label: Steps Taken
- description: What did you do? Include the exact commands you ran.
- placeholder: |
- 1. Ran the install script: `curl -fsSL ... | bash`
- 2. Ran `hermes setup` and chose "Quick setup"
- 3. Selected OpenRouter, entered API key
- 4. Ran `hermes chat` and got error...
- validations:
- required: true
-
- - type: dropdown
- id: install-method
- attributes:
- label: Installation Method
- options:
- - Install script (curl | bash)
- - Manual clone + pip/uv install
- - PowerShell installer (Windows)
- - Docker
- - Other
- validations:
- required: true
-
- - type: input
- id: os
- attributes:
- label: Operating System
- placeholder: Ubuntu 24.04 / macOS 15.2 / Windows 11
- validations:
- required: true
-
- - type: input
- id: python-version
- attributes:
- label: Python Version
- description: Output of `python --version` (or `python3 --version`)
- placeholder: "3.11.9"
-
- - type: input
- id: hermes-version
- attributes:
- label: Hermes Version
- description: Output of `hermes version` (if install got that far)
- placeholder: "2.1.0"
-
- - type: textarea
- id: doctor-output
- attributes:
- label: Output of `hermes doctor`
- description: Run `hermes doctor` and paste the full output. This will be auto-formatted.
- render: shell
-
- - type: textarea
- id: error-output
- attributes:
- label: Full Error Output
- description: Paste the complete error message or traceback. This will be auto-formatted.
- render: shell
- validations:
- required: true
-
- - type: textarea
- id: tried
- attributes:
- label: What I've Already Tried
- description: List any fixes or workarounds you've already attempted.
- placeholder: |
- - Ran `hermes update`
- - Tried reinstalling with `pip install -e ".[all]"`
- - Checked that OPENROUTER_API_KEY is set in ~/.hermes/.env
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 5496eb53..00000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,75 +0,0 @@
-## What does this PR do?
-
-
-
-
-
-## Related Issue
-
-
-
-Fixes #
-
-## Type of Change
-
-
-
-- [ ] 🐛 Bug fix (non-breaking change that fixes an issue)
-- [ ] ✨ New feature (non-breaking change that adds functionality)
-- [ ] 🔒 Security fix
-- [ ] 📝 Documentation update
-- [ ] ✅ Tests (adding or improving test coverage)
-- [ ] ♻️ Refactor (no behavior change)
-- [ ] 🎯 New skill (bundled or hub)
-
-## Changes Made
-
-
-
--
-
-## How to Test
-
-
-
-1.
-2.
-3.
-
-## Checklist
-
-
-
-### Code
-
-- [ ] I've read the [Contributing Guide](https://github.com/NousResearch/hermes-agent/blob/main/CONTRIBUTING.md)
-- [ ] My commit messages follow [Conventional Commits](https://www.conventionalcommits.org/) (`fix(scope):`, `feat(scope):`, etc.)
-- [ ] I searched for [existing PRs](https://github.com/NousResearch/hermes-agent/pulls) to make sure this isn't a duplicate
-- [ ] My PR contains **only** changes related to this fix/feature (no unrelated commits)
-- [ ] I've run `pytest tests/ -q` and all tests pass
-- [ ] I've added tests for my changes (required for bug fixes, strongly encouraged for features)
-- [ ] I've tested on my platform:
-
-### Documentation & Housekeeping
-
-
-
-- [ ] I've updated relevant documentation (README, `docs/`, docstrings) — or N/A
-- [ ] I've updated `cli-config.yaml.example` if I added/changed config keys — or N/A
-- [ ] I've updated `CONTRIBUTING.md` or `AGENTS.md` if I changed architecture or workflows — or N/A
-- [ ] I've considered cross-platform impact (Windows, macOS) per the [compatibility guide](https://github.com/NousResearch/hermes-agent/blob/main/CONTRIBUTING.md#cross-platform-compatibility) — or N/A
-- [ ] I've updated tool descriptions/schemas if I changed tool behavior — or N/A
-
-## For New Skills
-
-
-
-- [ ] This skill is **broadly useful** to most users (if bundled) — see [Contributing Guide](https://github.com/NousResearch/hermes-agent/blob/main/CONTRIBUTING.md#should-the-skill-be-bundled)
-- [ ] SKILL.md follows the [standard format](https://github.com/NousResearch/hermes-agent/blob/main/CONTRIBUTING.md#skillmd-format) (frontmatter, trigger conditions, steps, pitfalls)
-- [ ] No external dependencies that aren't already available (prefer stdlib, curl, existing Hermes tools)
-- [ ] I've tested the skill end-to-end: `hermes --toolsets skills -q "Use the X skill to do Y"`
-
-## Screenshots / Logs
-
-
-
diff --git a/.github/workflows/deploy-site.yml b/.github/workflows/deploy-site.yml
deleted file mode 100644
index 89e031e5..00000000
--- a/.github/workflows/deploy-site.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-name: Deploy Site
-
-on:
- push:
- branches: [main]
- paths:
- - 'website/**'
- - 'landingpage/**'
- - '.github/workflows/deploy-site.yml'
- workflow_dispatch:
-
-permissions:
- pages: write
- id-token: write
-
-concurrency:
- group: pages
- cancel-in-progress: false
-
-jobs:
- build-and-deploy:
- runs-on: ubuntu-latest
- environment:
- name: github-pages
- url: ${{ steps.deploy.outputs.page_url }}
- steps:
- - uses: actions/checkout@v4
-
- - uses: actions/setup-node@v4
- with:
- node-version: 20
- cache: npm
- cache-dependency-path: website/package-lock.json
-
- - name: Install dependencies
- run: npm ci
- working-directory: website
-
- - name: Build Docusaurus
- run: npm run build
- working-directory: website
-
- - name: Stage deployment
- run: |
- mkdir -p _site/docs
- # Landing page at root
- cp -r landingpage/* _site/
- # Docusaurus at /docs/
- cp -r website/build/* _site/docs/
- # CNAME so GitHub Pages keeps the custom domain between deploys
- echo "hermes-agent.nousresearch.com" > _site/CNAME
-
- - name: Upload artifact
- uses: actions/upload-pages-artifact@v3
- with:
- path: _site
-
- - name: Deploy to GitHub Pages
- id: deploy
- uses: actions/deploy-pages@v4
diff --git a/.github/workflows/docs-site-checks.yml b/.github/workflows/docs-site-checks.yml
deleted file mode 100644
index 6e4b966b..00000000
--- a/.github/workflows/docs-site-checks.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-name: Docs Site Checks
-
-on:
- pull_request:
- paths:
- - 'website/**'
- - '.github/workflows/docs-site-checks.yml'
- workflow_dispatch:
-
-jobs:
- docs-site-checks:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
-
- - uses: actions/setup-node@v4
- with:
- node-version: 20
- cache: npm
- cache-dependency-path: website/package-lock.json
-
- - name: Install website dependencies
- run: npm ci
- working-directory: website
-
- - uses: actions/setup-python@v5
- with:
- python-version: '3.11'
-
- - name: Install ascii-guard
- run: python -m pip install ascii-guard
-
- - name: Lint docs diagrams
- run: npm run lint:diagrams
- working-directory: website
-
- - name: Build Docusaurus
- run: npm run build
- working-directory: website
diff --git a/.github/workflows/supply-chain-audit.yml b/.github/workflows/supply-chain-audit.yml
deleted file mode 100644
index b94e1dda..00000000
--- a/.github/workflows/supply-chain-audit.yml
+++ /dev/null
@@ -1,192 +0,0 @@
-name: Supply Chain Audit
-
-on:
- pull_request:
- types: [opened, synchronize, reopened]
-
-permissions:
- pull-requests: write
- contents: read
-
-jobs:
- scan:
- name: Scan PR for supply chain risks
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
-
- - name: Scan diff for suspicious patterns
- id: scan
- env:
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
- set -euo pipefail
-
- BASE="${{ github.event.pull_request.base.sha }}"
- HEAD="${{ github.event.pull_request.head.sha }}"
-
- # Get the full diff (added lines only)
- DIFF=$(git diff "$BASE".."$HEAD" -- . ':!uv.lock' ':!*.lock' ':!package-lock.json' ':!yarn.lock' || true)
-
- FINDINGS=""
- CRITICAL=false
-
- # --- .pth files (auto-execute on Python startup) ---
- PTH_FILES=$(git diff --name-only "$BASE".."$HEAD" | grep '\.pth$' || true)
- if [ -n "$PTH_FILES" ]; then
- CRITICAL=true
- FINDINGS="${FINDINGS}
- ### 🚨 CRITICAL: .pth file added or modified
- Python \`.pth\` files in \`site-packages/\` execute automatically when the interpreter starts — no import required. This is the exact mechanism used in the [litellm supply chain attack](https://github.com/BerriAI/litellm/issues/24512).
-
- **Files:**
- \`\`\`
- ${PTH_FILES}
- \`\`\`
- "
- fi
-
- # --- base64 + exec/eval combo (the litellm attack pattern) ---
- B64_EXEC_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -iE 'base64\.(b64decode|decodebytes|urlsafe_b64decode)' | grep -iE 'exec\(|eval\(' | head -10 || true)
- if [ -n "$B64_EXEC_HITS" ]; then
- CRITICAL=true
- FINDINGS="${FINDINGS}
- ### 🚨 CRITICAL: base64 decode + exec/eval combo
- This is the exact pattern used in the [litellm supply chain attack](https://github.com/BerriAI/litellm/issues/24512) — base64-decoded strings passed to exec/eval to hide credential-stealing payloads.
-
- **Matches:**
- \`\`\`
- ${B64_EXEC_HITS}
- \`\`\`
- "
- fi
-
- # --- base64 decode/encode (alone — legitimate uses exist) ---
- B64_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -iE 'base64\.(b64decode|b64encode|decodebytes|encodebytes|urlsafe_b64decode)|atob\(|btoa\(|Buffer\.from\(.*base64' | head -20 || true)
- if [ -n "$B64_HITS" ]; then
- FINDINGS="${FINDINGS}
- ### ⚠️ WARNING: base64 encoding/decoding detected
- Base64 has legitimate uses (images, JWT, etc.) but is also commonly used to obfuscate malicious payloads. Verify the usage is appropriate.
-
- **Matches (first 20):**
- \`\`\`
- ${B64_HITS}
- \`\`\`
- "
- fi
-
- # --- exec/eval with string arguments ---
- EXEC_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -E '(exec|eval)\s*\(' | grep -v '^\+\s*#' | grep -v 'test_\|mock\|assert\|# ' | head -20 || true)
- if [ -n "$EXEC_HITS" ]; then
- FINDINGS="${FINDINGS}
- ### ⚠️ WARNING: exec() or eval() usage
- Dynamic code execution can hide malicious behavior, especially when combined with base64 or network fetches.
-
- **Matches (first 20):**
- \`\`\`
- ${EXEC_HITS}
- \`\`\`
- "
- fi
-
- # --- subprocess with encoded/obfuscated commands ---
- PROC_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -E 'subprocess\.(Popen|call|run)\s*\(' | grep -iE 'base64|decode|encode|\\x|chr\(' | head -10 || true)
- if [ -n "$PROC_HITS" ]; then
- CRITICAL=true
- FINDINGS="${FINDINGS}
- ### 🚨 CRITICAL: subprocess with encoded/obfuscated command
- Subprocess calls with encoded arguments are a strong indicator of payload execution.
-
- **Matches:**
- \`\`\`
- ${PROC_HITS}
- \`\`\`
- "
- fi
-
- # --- Network calls to non-standard domains ---
- EXFIL_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -iE 'requests\.(post|put)\(|httpx\.(post|put)\(|urllib\.request\.urlopen' | grep -v '^\+\s*#' | grep -v 'test_\|mock\|assert' | head -10 || true)
- if [ -n "$EXFIL_HITS" ]; then
- FINDINGS="${FINDINGS}
- ### ⚠️ WARNING: Outbound network calls (POST/PUT)
- Outbound POST/PUT requests in new code could be data exfiltration. Verify the destination URLs are legitimate.
-
- **Matches (first 10):**
- \`\`\`
- ${EXFIL_HITS}
- \`\`\`
- "
- fi
-
- # --- setup.py / setup.cfg install hooks ---
- SETUP_HITS=$(git diff --name-only "$BASE".."$HEAD" | grep -E '(setup\.py|setup\.cfg|__init__\.pth|sitecustomize\.py|usercustomize\.py)$' || true)
- if [ -n "$SETUP_HITS" ]; then
- FINDINGS="${FINDINGS}
- ### ⚠️ WARNING: Install hook files modified
- These files can execute code during package installation or interpreter startup.
-
- **Files:**
- \`\`\`
- ${SETUP_HITS}
- \`\`\`
- "
- fi
-
- # --- Compile/marshal/pickle (code object injection) ---
- MARSHAL_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -iE 'marshal\.loads|pickle\.loads|compile\(' | grep -v '^\+\s*#' | grep -v 'test_\|re\.compile\|ast\.compile' | head -10 || true)
- if [ -n "$MARSHAL_HITS" ]; then
- FINDINGS="${FINDINGS}
- ### ⚠️ WARNING: marshal/pickle/compile usage
- These can deserialize or construct executable code objects.
-
- **Matches:**
- \`\`\`
- ${MARSHAL_HITS}
- \`\`\`
- "
- fi
-
- # --- Output results ---
- if [ -n "$FINDINGS" ]; then
- echo "found=true" >> "$GITHUB_OUTPUT"
- if [ "$CRITICAL" = true ]; then
- echo "critical=true" >> "$GITHUB_OUTPUT"
- else
- echo "critical=false" >> "$GITHUB_OUTPUT"
- fi
- # Write findings to a file (multiline env vars are fragile)
- echo "$FINDINGS" > /tmp/findings.md
- else
- echo "found=false" >> "$GITHUB_OUTPUT"
- echo "critical=false" >> "$GITHUB_OUTPUT"
- fi
-
- - name: Post warning comment
- if: steps.scan.outputs.found == 'true'
- env:
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
- SEVERITY="⚠️ Supply Chain Risk Detected"
- if [ "${{ steps.scan.outputs.critical }}" = "true" ]; then
- SEVERITY="🚨 CRITICAL Supply Chain Risk Detected"
- fi
-
- BODY="## ${SEVERITY}
-
- This PR contains patterns commonly associated with supply chain attacks. This does **not** mean the PR is malicious — but these patterns require careful human review before merging.
-
- $(cat /tmp/findings.md)
-
- ---
- *Automated scan triggered by [supply-chain-audit](/.github/workflows/supply-chain-audit.yml). If this is a false positive, a maintainer can approve after manual review.*"
-
- gh pr comment "${{ github.event.pull_request.number }}" --body "$BODY"
-
- - name: Fail on critical findings
- if: steps.scan.outputs.critical == 'true'
- run: |
- echo "::error::CRITICAL supply chain risk patterns detected in this PR. See the PR comment for details."
- exit 1
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
deleted file mode 100644
index 5d8711e1..00000000
--- a/.github/workflows/tests.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: Tests
-
-on:
- push:
- branches: [main]
- pull_request:
- branches: [main]
-
-# Cancel in-progress runs for the same PR/branch
-concurrency:
- group: tests-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- test:
- runs-on: ubuntu-latest
- timeout-minutes: 10
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Install uv
- uses: astral-sh/setup-uv@v5
-
- - name: Set up Python 3.11
- run: uv python install 3.11
-
- - name: Install dependencies
- run: |
- uv venv .venv --python 3.11
- source .venv/bin/activate
- uv pip install -e ".[all,dev]"
-
- - name: Run tests
- run: |
- source .venv/bin/activate
- python -m pytest tests/ -q --ignore=tests/integration --tb=short -n auto
- env:
- # Ensure tests don't accidentally call real APIs
- OPENROUTER_API_KEY: ""
- OPENAI_API_KEY: ""
- NOUS_API_KEY: ""
diff --git a/.gitignore b/.gitignore
index 5a3f7f89..56299679 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,6 +15,8 @@ docker-compose.override.yml
hermes_code/test_browser.py
.git
+.github
+.idea
hermes_data
workspace
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index ab1f4164..00000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Ignored default folder with query files
-/queries/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
-# Editor-based HTTP Client requests
-/httpRequests/
diff --git a/.idea/hermes-agent.iml b/.idea/hermes-agent.iml
deleted file mode 100644
index a2a889b2..00000000
--- a/.idea/hermes-agent.iml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644
index 105ce2da..00000000
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index db8786c0..00000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 3f4d7115..00000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 35eb1ddf..00000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file