This commit is contained in:
oliver
2026-06-22 17:05:28 -03:00
parent ad8e17e163
commit 365c69871e
6 changed files with 102 additions and 22 deletions
+19 -4
View File
@@ -2,11 +2,26 @@
"name": "GitHub Repo",
"description": "Set up and sync with a GitHub repository — clone, commit, push, and manage code for your Hermes agent.",
"fields": [
{"label": "Repository URL", "key": "repo_url", "type": "text", "placeholder": "https://github.com/your-username/your-repo.git"},
{"label": "GitHub Username", "key": "git_user", "type": "text", "placeholder": "your-username"},
{"label": "GitHub Password / Personal Access Token", "key": "git_pass", "type": "password", "placeholder": "ghp_xxxxxxxxxxxx"}
{
"label": "Repository URL",
"key": "repo_url",
"type": "text",
"placeholder": "https://github.com/your-username/your-repo.git"
},
{
"label": "GitHub Username",
"key": "git_user",
"type": "text",
"placeholder": "your-username"
},
{
"label": "GitHub Password / Personal Access Token",
"key": "git_pass",
"type": "password",
"placeholder": "ghp_xxxxxxxxxxxx"
}
],
"signup_url": "https://semrush.com",
"signup_label": "Need to drive traffic to your site? Create a Semrush account",
"signup_label": "🤝 Need to drive traffic to your site? Create a Semrush account",
"prompt": "Create a Hermes agent skill named \"github_repo_setup\".\n\n## Purpose\nSet up a working GitHub repository that the Hermes agent can use to read, write, and manage code, content, or configuration files via git. The repo acts as a persistent file store and version-controlled workspace.\n\n## Credentials\n\nREPO_URL={repo_url}\nGIT_USER={git_user}\nGIT_PASS={git_pass}\n\n## Startup behaviour\n\n1. On first run, check if git is installed. If not, install it:\n apt-get update && apt-get install -y git\n Or the equivalent for the system's package manager.\n\n2. Check if the repo directory (~/repo) already exists and is a git repo.\n cd ~/repo && git status\n\n3. If ~/repo does not exist or is not a git repo:\n - Extract the repo name from REPO_URL (the part before .git).\n - If a remote git URL is provided, authenticate using GIT_USER and GIT_PASS in the URL:\n AUTH_URL=$(echo \"$REPO_URL\" | sed \"s|https://|https://$GIT_USER:$GIT_PASS@|\")\n - Clone the repo:\n git clone \"$AUTH_URL\" ~/repo\n - Set the remote origin to the AUTH_URL for future push/pull:\n git remote set-url origin \"$AUTH_URL\"\n\n4. If ~/repo exists but is not a git repo, print an error and halt.\n\n5. If ~/repo is already a valid git repo and has a remote origin:\n - Re-authenticate the remote with the provided credentials:\n AUTH_URL=$(echo \"$REPO_URL\" | sed \"s|https://|https://$GIT_USER:$GIT_PASS@|\")\n git remote set-url origin \"$AUTH_URL\"\n - Pull the latest changes:\n git pull --ff-only\n - Print the status: \"GitHub repo already set up. Latest changes pulled.\"\n\n6. After clone or pull, print the current git log (last 5 commits):\n git --no-pager log --oneline -5\n\n## Daily usage\n\nWhenever the agent needs to read, write, or edit files:\n\n### Read a file\n cat ~/repo/<path>\n\n### Edit / write a file\n Write the new content, then:\n cd ~/repo\n git add <path>\n git commit -m \"<descriptive message>\"\n git push\n\n### Commit message format\n Always use conventional commits:\n - feat: <description>\n - fix: <description>\n - docs: <description>\n - chore: <description>\n - refactor: <description>\n\n### Push discipline\n- Always pull before push:\n git pull --ff-only && git push\n- If pull fails due to divergent branches, fetch and rebase:\n git fetch origin && git rebase origin/$(git branch --show-current) && git push\n- If rebase has conflicts, abort and notify the user:\n git rebase --abort\n echo \"ERROR: Merge conflict — needs manual resolution.\"\n\n### Create a new branch\n git checkout -b <branch-name>\n git push -u origin <branch-name>\n\n### List branches\n git branch -a\n\n### Working directory discipline\n- All work goes inside ~/repo. Never write files outside ~/repo unless explicitly instructed.\n- After every batch of changes, commit and push.\n\n## Solved cases log\n\nAfter every successfully completed task that involved the GitHub repo, append to ~/repo_solutions.md:\n\n ## <short title> (<date>)\n Goal: <one sentence>\n Commands: <the git commands that worked>\n Gotchas: <anything non-obvious>\n\nRead ~/repo_solutions.md at the start of every task — if a matching case exists, reuse it directly."
}
+31 -6
View File
@@ -2,13 +2,38 @@
"name": "IMAP / SMTP Email",
"description": "Read, send, and manage email from any standard mailbox.",
"fields": [
{"label": "Email Address", "key": "email", "type": "text", "placeholder": "you@yourdomain.com"},
{"label": "Your Name", "key": "display_name", "type": "text", "placeholder": "Jane Smith"},
{"label": "IMAP Host", "key": "imap_host", "type": "text", "placeholder": "imap.hostinger.com"},
{"label": "SMTP Host", "key": "smtp_host", "type": "text", "placeholder": "smtp.hostinger.com"},
{"label": "Password", "key": "password", "type": "password", "placeholder": ""}
{
"label": "Email Address",
"key": "email",
"type": "text",
"placeholder": "you@yourdomain.com"
},
{
"label": "Your Name",
"key": "display_name",
"type": "text",
"placeholder": "Jane Smith"
},
{
"label": "IMAP Host",
"key": "imap_host",
"type": "text",
"placeholder": "imap.hostinger.com"
},
{
"label": "SMTP Host",
"key": "smtp_host",
"type": "text",
"placeholder": "smtp.hostinger.com"
},
{
"label": "Password",
"key": "password",
"type": "password",
"placeholder": ""
}
],
"signup_url": "https://hostinger.com",
"signup_label": "Need a domain or email? Sign up at Hostinger",
"signup_label": "🤝 Need a domain or email? Sign up at Hostinger",
"prompt": "Create a skill for IMAP / SMTP Email.\n\nUse the himalaya CLI to read, send, and manage emails.\n\n## Install himalaya (if not already installed)\n\ncurl -sSL https://raw.githubusercontent.com/pimalaya/himalaya/master/install.sh | PREFIX=~/.local sh\nexport PATH=\"$HOME/.local/bin:$PATH\" # add to ~/.bashrc if not present\nhimalaya --version\n\n## Write the config file\n\nCreate ~/.config/himalaya/config.toml with exactly this content:\n\n[accounts.default]\ndefault = true\nemail = \"{email}\"\ndisplay-name = \"{display_name}\"\n\nfolder.aliases.inbox = \"INBOX\"\nfolder.aliases.sent = \"Sent\"\nfolder.aliases.drafts = \"Drafts\"\nfolder.aliases.trash = \"Trash\"\n\nbackend.type = \"imap\"\nbackend.host = \"{imap_host}\"\nbackend.port = 993\nbackend.encryption.type = \"tls\"\nbackend.login = \"{email}\"\nbackend.auth.type = \"password\"\nbackend.auth.raw = \"{password}\"\n\nmessage.send.backend.type = \"smtp\"\nmessage.send.backend.host = \"{smtp_host}\"\nmessage.send.backend.port = 587\nmessage.send.backend.encryption.type = \"start-tls\"\nmessage.send.backend.login = \"{email}\"\nmessage.send.backend.auth.type = \"password\"\nmessage.send.backend.auth.raw = \"{password}\"\n\n## Key commands\n\nhimalaya folder list\nhimalaya envelope list\nhimalaya envelope list -f Sent\nhimalaya message read <id>\nhimalaya message reply <id>\nhimalaya message forward <id>\nhimalaya message delete <id>\nhimalaya --output json envelope list\n\n## Sending email\n\nprintf 'From: {display_name} <{email}>\\nTo: recipient@example.com\\nSubject: Hello\\n\\nBody text here.' | himalaya message send\n\n## Solved cases log\n\nEvery time you successfully solve an email task, append a short entry to ~/email_solutions.md:\n\n ## <short title> (<date>)\n Goal: <one sentence>\n Key commands: <the himalaya commands or shell pipeline that worked>\n Gotchas: <anything non-obvious>\n\nRead ~/email_solutions.md at the start of each task — if a matching solved case exists, reuse it directly."
}
+25 -5
View File
@@ -2,12 +2,32 @@
"name": "N8N CRM",
"description": "Manage contacts and deal stages via your n8n webhook CRM.",
"fields": [
{"label": "Webhook Base URL", "key": "webhook_url", "type": "text", "placeholder": "https://your-n8n.example.com/webhook/crm"},
{"label": "Auth Header Name", "key": "auth_header_name", "type": "text", "placeholder": "Authorization"},
{"label": "Auth Header Value", "key": "auth_header_value", "type": "password", "placeholder": ""},
{"label": "Example Contact JSON (paste one record from your CRM)", "key": "example_json", "type": "textarea", "placeholder": "{\n \"email\": \"alice@example.com\",\n \"name\": \"Alice Smith\",\n \"company\": \"Acme Corp\",\n \"stage\": \"Cold\",\n \"followup\": false,\n \"notes\": \"\"\n}"}
{
"label": "Webhook Base URL",
"key": "webhook_url",
"type": "text",
"placeholder": "https://your-n8n.example.com/webhook/crm"
},
{
"label": "Auth Header Name",
"key": "auth_header_name",
"type": "text",
"placeholder": "Authorization"
},
{
"label": "Auth Header Value",
"key": "auth_header_value",
"type": "password",
"placeholder": ""
},
{
"label": "Example Contact JSON (paste one record from your CRM)",
"key": "example_json",
"type": "textarea",
"placeholder": "{\n \"email\": \"alice@example.com\",\n \"name\": \"Alice Smith\",\n \"company\": \"Acme Corp\",\n \"stage\": \"Cold\",\n \"followup\": false,\n \"notes\": \"\"\n}"
}
],
"signup_url": "https://n8n.io",
"signup_label": "Need a webhook backend? Try n8n — self-host or cloud",
"signup_label": "🤝 Need a webhook backend? Try n8n — self-host or cloud",
"prompt": "Create a skill for an N8N CRM backed by a webhook.\n\n## Configuration\n\nWEBHOOK_URL={webhook_url}\nAUTH_HEADER_NAME={auth_header_name}\nAUTH_HEADER_VALUE={auth_header_value}\n\n## Example record schema (auto-detected from user input)\n\n{example_json}\n\nParse the keys of the JSON above to discover the available columns. Always use exactly those column names when building payloads or displaying data. The column named \"email\" is the unique identifier for every contact.\n\n## Stages\n\n| Stage | Meaning |\n|------------|--------------------------------|\n| Cold | No contact so far |\n| Contacted | First message / email sent |\n| Warm | Response received |\n| Won | Deal closed successfully |\n| Lost | Deal closed unsuccessfully |\n\n## API contract\n\n### List contacts\n\n curl -s -H \"$AUTH_HEADER_NAME: $AUTH_HEADER_VALUE\" \"$WEBHOOK_URL\"\n curl -s -H \"$AUTH_HEADER_NAME: $AUTH_HEADER_VALUE\" \"$WEBHOOK_URL?stage=Warm\"\n curl -s -H \"$AUTH_HEADER_NAME: $AUTH_HEADER_VALUE\" \"$WEBHOOK_URL?email=alice@example.com\"\n curl -s -H \"$AUTH_HEADER_NAME: $AUTH_HEADER_VALUE\" \"$WEBHOOK_URL?followup=true\"\n\n### Create or update a contact (upsert by email)\n\n curl -s -X POST \"$WEBHOOK_URL\" \\\n -H \"$AUTH_HEADER_NAME: $AUTH_HEADER_VALUE\" \\\n -H 'Content-Type: application/json' \\\n -d '{\"email\":\"alice@example.com\",\"name\":\"Alice Smith\",\"stage\":\"Contacted\",\"followup\":false}'\n\n### Delete a contact\n\n curl -s -X DELETE \"$WEBHOOK_URL\" \\\n -H \"$AUTH_HEADER_NAME: $AUTH_HEADER_VALUE\" \\\n -H 'Content-Type: application/json' \\\n -d '{\"email\":\"alice@example.com\"}'\n\n## Solved cases log\n\nAfter every successful CRM task, append an entry to ~/crm_solutions.md:\n\n ## <short title> (<date>)\n Goal: <one sentence>\n Key commands: <the curl | jq pipelines that worked>\n Gotchas: <anything non-obvious>\n\nRead ~/crm_solutions.md at task start — if a matching case exists, reuse it directly."
}
+1 -1
View File
@@ -16,6 +16,6 @@
}
],
"signup_url": "https://n8n.io/?via=derez",
"signup_label": "Need n8n? Sign up via our affiliate link",
"signup_label": "🤝 Need n8n? Sign up via our affiliate link",
"prompt": "Create a skill that integrates with n8n's skill library and REST API.\n\n## Configuration\n\nN8N_URL={n8n_url}\nN8N_API_KEY={n8n_api_key}\n\n## Skill library\n\nYou have access to n8n's official skill library at https://github.com/n8n-io/skills\n\nAt the start of every task, clone or pull the latest version of this repo to discover available skills.\n\n if [ ! -d /tmp/n8n-skills ]; then\n git clone --depth 1 https://github.com/n8n-io/skills /tmp/n8n-skills\n else\n cd /tmp/n8n-skills && git pull --ff-only\n fi\n\nRead the README.md and INDEX.md files in that repo to understand what skills are available. Each skill has a dedicated directory with a README.md describing its purpose and usage. Choose the most relevant skill(s) for the user's request.\n\n## API basics\n\nAll calls go to {n8n_url}/rest/... with the header:\n X-N8N-API-KEY: {n8n_api_key}\n\nThe n8n REST API documentation is available at {n8n_url}/api/v1/openapi.json — fetch it if you need to discover available endpoints.\n\n### Common operations\n\nList workflows:\n curl -s -H 'X-N8N-API-KEY: {n8n_api_key}' '{n8n_url}/rest/workflows'\n\nGet a workflow by ID:\n curl -s -H 'X-N8N-API-KEY: {n8n_api_key}' '{n8n_url}/rest/workflows/<id>'\n\nList executions:\n curl -s -H 'X-N8N-API-KEY: {n8n_api_key}' '{n8n_url}/rest/executions'\n\nList credentials:\n curl -s -H 'X-N8N-API-KEY: {n8n_api_key}' '{n8n_url}/rest/credentials'\n\nList tags:\n curl -s -H 'X-N8N-API-KEY: {n8n_api_key}' '{n8n_url}/rest/tags'\n\n## Workflow skill execution pattern\n\nWhen a skill from the library maps to a workflow to run:\n\n1. Read the skill's README.md to understand the inputs, outputs, and workflow structure.\n2. Check if a matching workflow already exists in n8n (use the list endpoint).\n3. If it does, create an execution:\n\n curl -s -X POST '{n8n_url}/rest/workflows/<id>/run' \\\n -H 'X-N8N-API-KEY: {n8n_api_key}' \\\n -H 'Content-Type: application/json' \\\n -d '{\"data\": <input_data>}'\n\n4. If it doesn't, create a new workflow using the skill's specification:\n\n curl -s -X POST '{n8n_url}/rest/workflows' \\\n -H 'X-N8N-API-KEY: {n8n_api_key}' \\\n -H 'Content-Type: application/json' \\\n -d '{\"name\": \"<skill-name>\", \"nodes\": [...], \"connections\": {...}}'\n\n5. Poll execution status:\n curl -s -H 'X-N8N-API-KEY: {n8n_api_key}' '{n8n_url}/rest/executions/<id>' | jq '.data'\n\n## Solved cases log\n\nAfter every successful n8n task, append to ~/n8n_solutions.md:\n\n ## <short title> (<date>)\n Goal: <one sentence>\n Skill used: <skill path in the library>\n Key commands: <the curl | jq pipelines that worked>\n Gotchas: <anything non-obvious>\n\nRead ~/n8n_solutions.md at task start — if a matching case exists, reuse it directly."
}
+1 -1
View File
@@ -28,6 +28,6 @@
}
],
"signup_url": "https://nextcloud.com/de/",
"signup_label": "Don't have Nextcloud yet? Get started at nextcloud.com",
"signup_label": "🤝 Don't have Nextcloud yet? Get started at nextcloud.com",
"prompt": "\n Create a Hermes agent skill named \"nextcloud_exchange_bisync\".\n \n Purpose:\n Create a skill that synchronizes data bidirectionally between a user's Nextcloud instance and a Nextcloud directory named \"exchange\" using rclone.\n \n Skill requirements:\n \n 1. Startup behavior:\n - When the skill starts, print a clear status message:\n \"Starting Nextcloud exchange synchronization...\"\n - Check whether rclone is installed.\n - If rclone is missing, install it automatically using the official rclone installation method.\n - Verify that rclone is available before continuing.\n \n 2. \"Credentials\"\n Your credentials are below. store them for future use\n Credentials\n NC_URL={nc_url}\nNC_USER={nc_user}\nNC_PASS={nc_pass}\n \n 3. rclone configuration:\n - Automatically create rclone WebDAV remotes for Nextcloud.\n - Configure Nextcloud as the WebDAV provider.\n - Use:\n vendor=nextcloud\n - Store configuration in the standard rclone config location.\n - Reuse existing configuration if already present.\n\n \n 4. Synchronization:\n rclone bisync /root/exchange/ nextcloud:/{nc_dir} --resync\n you need to start the sync manually. do this before every access to the directory and after any changes you want to sync.\n \n 5. Safety:\n - Enable checks before syncing.\n - Detect access problems before starting.\n - Preserve timestamps.\n - Preserve empty directories.\n - Avoid accidental deletion unless confirmed by bisync logic.\n - Produce readable logs.\n \n 6. Completion:\n When finished:\n - Print:\n \"Nextcloud exchange synchronization completed.\"\n - Provide a short summary:\n - files checked\n - changes transferred\n - errors if any\n \n 7. Error handling:\n - Fail cleanly.\n - Explain missing credentials.\n - Explain connection failures.\n - Explain rclone errors.\n - Return non-zero status on failure.\n \n Generate:\n - The complete Hermes skill definition.\n - The executable script.\n - Configuration schema.\n - Required environment variables.\n - Usage example."
}
+25 -5
View File
@@ -2,12 +2,32 @@
"name": "ODOO Community",
"description": "Automate ERP tasks — sales, accounting, and inventory — via REST API.",
"fields": [
{"label": "Site URL", "key": "site_url", "type": "text", "placeholder": "https://ODOO4projects.com"},
{"label": "Username", "key": "username", "type": "text", "placeholder": "admin"},
{"label": "Password / API Key", "key": "api_key", "type": "password", "placeholder": ""},
{"label": "Database Name", "key": "db_name", "type": "text", "placeholder": "mycompany"}
{
"label": "Site URL",
"key": "site_url",
"type": "text",
"placeholder": "https://ODOO4projects.com"
},
{
"label": "Username",
"key": "username",
"type": "text",
"placeholder": "admin"
},
{
"label": "Password / API Key",
"key": "api_key",
"type": "password",
"placeholder": ""
},
{
"label": "Database Name",
"key": "db_name",
"type": "text",
"placeholder": "mycompany"
}
],
"signup_url": "https://ODOO4projects.com",
"signup_label": "Need ODOO Community hosting? Sign up here",
"signup_label": "🤝 Need ODOO Community hosting? Sign up here",
"prompt": "create a skill for ODOO community. You are an Odoo automation agent. Your only tools are curl and jq. Never write Python scripts, never develop modules or addons, never use xmlrpc libraries. Every task must be solved with shell one-liners or short shell scripts using curl + jq only.\n\n## Credentials\n\nSITE_URL={site_url}\nUSER={username}\nAPI_KEY={api_key}\nDB={db_name}\n\n## API call pattern\n\nEvery call is a POST to {site_url}/json/2/<model>/<method>\nRequired headers on every request:\n Authorization: Bearer {api_key}\n X-Openerp-Database: {db_name}\n Content-Type: application/json\n\nBody: a FLAT JSON object of the method arguments (NOT JSON-RPC — no \"params\" wrapper).\nResponse: the raw return value directly (no \"result\" wrapper).\n\n## Always request only the fields you need\n\nNever call search_read without a \"fields\" list. Fetching all fields is wasteful and slow.\nDecide upfront which fields the task actually requires, then pass exactly those.\n\n curl -s -X POST '{site_url}/json/2/sale.order/search_read' \\\n -H 'Authorization: Bearer {api_key}' \\\n -H 'X-Openerp-Database: {db_name}' \\\n -H 'Content-Type: application/json' \\\n -d '{\"domain\": [[\"state\",\"=\",\"sale\"]], \"fields\": [\"name\",\"partner_id\",\"amount_total\"], \"limit\": 20}' \\\n | jq '.[] | {order: .name, customer: .partner_id[1], total: .amount_total}'\n\nUse fields_get only when you genuinely do not know a model's field names:\n curl -s -X POST '{site_url}/json/2/account.move/fields_get' \\\n -H 'Authorization: Bearer {api_key}' \\\n -H 'X-Openerp-Database: {db_name}' \\\n -H 'Content-Type: application/json' \\\n -d '{\"attributes\": [\"string\",\"type\"]}' \\\n | jq 'to_entries[] | {field: .key, label: .value.string, type: .value.type}'\n\n## First-run: build your API digest\n\nIf ~/odoo_digest.md does NOT exist yet, run this once and write the output to the file:\n\n curl -s '{site_url}/json/2/doc' \\\n -H 'Authorization: Bearer {api_key}' \\\n -H 'X-Openerp-Database: {db_name}' \\\n | jq '[to_entries[] | {model: .key, label: .value.string}]' > /tmp/odoo_models.json\n\nFrom /tmp/odoo_models.json, write ~/odoo_digest.md containing:\n - The standard ORM methods available on every model\n - A compact table of installed business models with their technical name and human label\n - The exact one-liner curl template for POST calls\n - Any non-standard or custom routes found in /doc\n\nOn every future task, read ~/odoo_digest.md first.\n\n## Solved cases log\n\nAfter successfully solving any business task, append to ~/odoo_solutions.md:\n\n ## <short title> (<date>)\n Goal: <one sentence>\n Models: <models used>\n Fields queried: <only the fields that were actually needed>\n Key calls: <the curl | jq pipelines that worked>\n Gotchas: <anything non-obvious>\n\nRead ~/odoo_solutions.md at task start — if a matching case exists, reuse it directly."
}