[GH-ISSUE #4186] [BUG]: Custom Agent Skills Cloned via Git Are Not Persistently Enabled in Docker Setup #2663

Closed
opened 2026-02-22 18:30:40 -05:00 by yindo · 3 comments
Owner

Originally created by @tvcastilho on GitHub (Jul 22, 2025).
Original GitHub issue: https://github.com/Mintplex-Labs/anything-llm/issues/4186

Originally assigned to: @shatfield4 on GitHub.

How are you running AnythingLLM?

Docker (remote machine)

What happened?

Custom Agent Skills Cloned via Git Are Not Persistently Enabled in Docker Setup

Environment

  • Deployment method: Docker Compose (Coolify one-click template)
  • Volume mapping: /app/server/storage
  • Custom skill installation: Cloned via git clone into /app/server/storage/plugins/agent-skills
  • Plugin structure: Each folder includes plugin.json and handler.js with valid hubId
  • Permissions: All files owned by UID/GID 1000 (anythingllm), container runs as user 1000
  • Database: anythingllm.db is present, writable, and accessible via SQLite

Issue

After cloning a custom agent skill repository into the correct agent-skills folder:

  • The plugin appears in the UI under Agent → Configure Agent Skills
  • Enabling the plugin via the UI toggle has no effect
  • After UI refresh or container restart, the toggle resets to off
  • The plugin is not active and does not persist as enabled
  • The SQLite database (anythingllm.db) contains no agent_skills table, and the plugin state is not recorded anywhere obvious

Debugging Attempted

  • Verified correct ownership and permissions inside the Docker volume
  • Confirmed the plugin folder structure is valid
  • Attempted to manually enable the plugin via SQLite — but agent_skills table does not exist in recent versions
  • Tried using /api/agent-skills endpoint — responds with HTML instead of JSON
  • No error in logs on startup; plugin is detected but never registered persistently

Expected Behavior

  • Manually cloned plugins should either:
    • Persist the enabled/disabled state in the database or config
    • Or provide a documented CLI/API path to officially register them, especially for MCP-enabled versions

Suggested Fix

  • Ensure the toggle in the UI writes plugin state to the database or relevant workspace metadata
  • Provide a supported workflow (e.g. anythingllm-hub-cli upload) to persist custom agent skills, especially in Docker-based setups

Let me know if logs, plugin examples, or volume configurations are needed — happy to provide more context.

Are there known steps to reproduce?

No response

Originally created by @tvcastilho on GitHub (Jul 22, 2025). Original GitHub issue: https://github.com/Mintplex-Labs/anything-llm/issues/4186 Originally assigned to: @shatfield4 on GitHub. ### How are you running AnythingLLM? Docker (remote machine) ### What happened? # Custom Agent Skills Cloned via Git Are Not Persistently Enabled in Docker Setup ## Environment - **Deployment method:** Docker Compose (Coolify one-click template) - **Volume mapping:** `/app/server/storage` - **Custom skill installation:** Cloned via `git clone` into `/app/server/storage/plugins/agent-skills` - **Plugin structure:** Each folder includes `plugin.json` and `handler.js` with valid `hubId` - **Permissions:** All files owned by UID/GID 1000 (`anythingllm`), container runs as user 1000 - **Database:** `anythingllm.db` is present, writable, and accessible via SQLite ## Issue After cloning a custom agent skill repository into the correct `agent-skills` folder: - The plugin appears in the UI under *Agent → Configure Agent Skills* - Enabling the plugin via the UI toggle has **no effect** - After UI refresh or container restart, the toggle resets to **off** - The plugin is **not active** and does **not persist as enabled** - The SQLite database (`anythingllm.db`) contains **no `agent_skills` table**, and the plugin state is not recorded anywhere obvious ## Debugging Attempted - Verified correct ownership and permissions inside the Docker volume - Confirmed the plugin folder structure is valid - Attempted to manually enable the plugin via SQLite — but `agent_skills` table does not exist in recent versions - Tried using `/api/agent-skills` endpoint — responds with HTML instead of JSON - No error in logs on startup; plugin is detected but never registered persistently ## Expected Behavior - Manually cloned plugins should either: - Persist the enabled/disabled state in the database or config - Or provide a documented CLI/API path to officially register them, especially for MCP-enabled versions ## Suggested Fix - Ensure the toggle in the UI writes plugin state to the database or relevant workspace metadata - Provide a supported workflow (e.g. `anythingllm-hub-cli upload`) to persist custom agent skills, especially in Docker-based setups Let me know if logs, plugin examples, or volume configurations are needed — happy to provide more context. ### Are there known steps to reproduce? _No response_
yindo added the possible buginvestigating labels 2026-02-22 18:30:40 -05:00
yindo closed this issue 2026-02-22 18:30:40 -05:00
Author
Owner

@timothycarambat commented on GitHub (Jul 22, 2025):

What kind of plugin handler and JSON are you trying to put into place? It is likely just invalid so it is omitted

@timothycarambat commented on GitHub (Jul 22, 2025): What kind of plugin handler and JSON are you trying to put into place? It is likely just invalid so it is omitted
Author
Owner

@shatfield4 commented on GitHub (Jul 22, 2025):

Please provide us with the both the handler.js and plugin.json so that we can debug this. I have tested one of my custom agent skills in a fresh docker instance and it's working as expected. Like Tim said, your configuration is most likely invalid which is why it's failing to start.

@shatfield4 commented on GitHub (Jul 22, 2025): Please provide us with the both the `handler.js` and `plugin.json` so that we can debug this. I have tested one of my custom agent skills in a fresh docker instance and it's working as expected. Like Tim said, your configuration is most likely invalid which is why it's failing to start.
Author
Owner

@tvcastilho commented on GitHub (Jul 22, 2025):

I was simply testing this mode of upload so I can manage multiple plugins from github . I was using this repo as example:

https://github.com/stoneskin/AnythingLLM_AgentSample

I cloned the 4 projects below for testing:

  • ArxivSearchTool
  • BBCNewsFeed
  • Datetime
  • stockQuote

one example of handler.js

`

module.exports.runtime = {
handler: async function () {
const callerId = '${this.config.name}-v${this.config.version}';
try {
this.introspect(
'${callerId} called to get current date and time'
);

    const now = new Date();

    const dateOptions = {
      weekday: 'long',
      year: 'numeric',
      month: 'long',
      day: 'numeric'
    };
    const currentDate = now.toLocaleDateString('en-US', dateOptions);

    const timeOptions = {
      hour: '2-digit',
      minute: '2-digit',
      second: '2-digit',
      hour12: false
    };
    const currentTime = now.toLocaleTimeString('en-US', timeOptions);

    return JSON.stringify({
      date: `Today's date is ${currentDate}`,
      time: `Current Time: ${currentTime}`
    });

  } catch (e) {
    this.introspect(
      `${callerId} failed to get datetime info. Reason: ${e.message}`
    );
    this.logger(
      `${callerId} failed to get datetime info`,
      e.message
    );
    return `Failed to get datetime information. Error: ${e.message}`;
  }
}

};

`

and plugin.js

{ "hubId": "efQFNbWmjoFuOkWDtU05", "active": false, "name": "Datetime", "version": "1.0.0", "description": "A plugin to get current date and time in formatted strings", "author": "MintplexLabs", "author_url": "https://hub.anythingllm.com/u/MintplexLabs", "license": "MIT", "examples": [ { "prompt": "Use datetime to tell me what time it is", "call": "{\"format\": \"time\", \"timezone\": \"America/New_York\"}" }, { "prompt": "What's today's date?", "call": "{\"format\": \"date\", \"timezone\": \"UTC\"}" }, { "prompt": "Use datetime to show me the full timestamp", "call": "{\"format\": \"full\", \"timezone\": \"Europe/London\"}" }, { "prompt": "What day of the week is it?", "call": "{\"format\": \"day\", \"timezone\": \"Asia/Tokyo\"}" }, { "prompt": "Get the current month", "call": "{\"format\": \"month\", \"timezone\": \"Australia/Sydney\"}" } ], "setup_args": {}, "entrypoint": { "file": "handler.js", "params": {} } }

@tvcastilho commented on GitHub (Jul 22, 2025): I was simply testing this mode of upload so I can manage multiple plugins from github . I was using this repo as example: https://github.com/stoneskin/AnythingLLM_AgentSample I cloned the 4 projects below for testing: - ArxivSearchTool - BBCNewsFeed - Datetime - stockQuote one example of handler.js ` module.exports.runtime = { handler: async function () { const callerId = '${this.config.name}-v${this.config.version}'; try { this.introspect( '${callerId} called to get current date and time' ); const now = new Date(); const dateOptions = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }; const currentDate = now.toLocaleDateString('en-US', dateOptions); const timeOptions = { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }; const currentTime = now.toLocaleTimeString('en-US', timeOptions); return JSON.stringify({ date: `Today's date is ${currentDate}`, time: `Current Time: ${currentTime}` }); } catch (e) { this.introspect( `${callerId} failed to get datetime info. Reason: ${e.message}` ); this.logger( `${callerId} failed to get datetime info`, e.message ); return `Failed to get datetime information. Error: ${e.message}`; } } }; ` and plugin.js `{ "hubId": "efQFNbWmjoFuOkWDtU05", "active": false, "name": "Datetime", "version": "1.0.0", "description": "A plugin to get current date and time in formatted strings", "author": "MintplexLabs", "author_url": "https://hub.anythingllm.com/u/MintplexLabs", "license": "MIT", "examples": [ { "prompt": "Use datetime to tell me what time it is", "call": "{\"format\": \"time\", \"timezone\": \"America/New_York\"}" }, { "prompt": "What's today's date?", "call": "{\"format\": \"date\", \"timezone\": \"UTC\"}" }, { "prompt": "Use datetime to show me the full timestamp", "call": "{\"format\": \"full\", \"timezone\": \"Europe/London\"}" }, { "prompt": "What day of the week is it?", "call": "{\"format\": \"day\", \"timezone\": \"Asia/Tokyo\"}" }, { "prompt": "Get the current month", "call": "{\"format\": \"month\", \"timezone\": \"Australia/Sydney\"}" } ], "setup_args": {}, "entrypoint": { "file": "handler.js", "params": {} } } `
yindo changed title from [BUG]: Custom Agent Skills Cloned via Git Are Not Persistently Enabled in Docker Setup to [GH-ISSUE #4186] [BUG]: Custom Agent Skills Cloned via Git Are Not Persistently Enabled in Docker Setup 2026-06-05 14:47:49 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Mintplex-Labs/anything-llm#2663