@im-fan/skill-manage
v0.1.2
Published
Local-first agent skill manager with a global skill-manager CLI.
Readme
🗃️ Skill Manager
English | 中文

Open-source, local-first agent skill manager for Codex, ClaudeCode, Hermes, and OpenClaw.
Agent Skill Manager is a local web console for organizing shared skill folders across multiple AI agents. It focuses on one job: keep your SKILL repository, agent-mounted links, invalid directories, and local skill library manageable from one place.
It is designed for developers who search for an open-source local agent skill manager, a SKILL repository manager, a multi-agent skill library UI, or a lightweight tool for symlink cleanup and invalid skill link cleanup across Codex, ClaudeCode, Hermes, and OpenClaw.
The project stays intentionally small, but it now uses an engineered layout: the Python backend lives in src/skill_manage/, the UI lives in web/, launch helpers live in scripts/, and source-development runtime artifacts are written to data/ and logs/. When installed as the npm CLI, runtime data moves to the configured user runtime home instead of the package install directory.
The default deployment model is local-only: the built-in server is intended to run on loopback addresses such as 127.0.0.1, localhost, or ::1.
Search Keywords
agent skill manageropen source local-first skill managerSKILL repository managermulti-agent skill libraryCodex skills managerClaudeCode skills managerHermes skills managerOpenClaw skills managersymlink-based skill mountinginvalid link cleanuplocal skill repository cleanupSKILL.md directory scanner
What The App Does
- Scan local skill sources in two modes:
skill_root: recursively collect directories that containSKILL.mdskill_dir: register one standalone skill directory directly
- Maintain a local SKILL repository with persisted metadata, health status, and search support.
- Manage agent directories from a single UI, including current path, default path, mounted symlinks, direct folders, and invalid entries.
- Move direct agent skills into the shared repository and keep them mounted through managed symlinks.
- Rescan sources and agent directories, clean invalid links, and compare similar skills by content.
- Persist scan roots, local skills, agent settings, managed links, and operation logs into SQLite.
Current UI Tabs
SKILL Repository
- Add scan roots and rescan them in place.
- Edit an existing scan source from the card dialog and rescan immediately after saving.
- Browse repository entries as cards and remove records when needed.
- Run similarity scanning against healthy repository skills.
Agent List
- Focus on one current agent at a time and switch agents from the inline selector.
- Review current configured path, default path, mounted skills, direct skill folders, and invalid links.
- Search addable skills from the shared repository and mount them into the current agent.
- Import direct folders into the repository, move them to another repository root, or delete them intentionally.
- Run similarity scanning inside the current agent context.
Agent Manage
- Create a custom agent record manually.
- Auto-discover built-in agent directories for
Codex,ClaudeCode,OpenClaw, andHermes. - Keep only the current configured path and default path in the list view.
- Edit an agent, set it as current, toggle visible/hidden state, and delete it from the registry.
System
- Show system status cards for service state, service URL, SQLite path, and Python version.
- Show recent operation logs for write/update style actions without startup noise.
Language Switch
- The top-right
中 / Encontrol switches fixed UI copy between Chinese and English. - Chinese is the default language.
- The selected language is stored in browser
localStoragewith the keyskill-manage-language.
Supported Agents
The current implementation supports these built-in targets:
| Agent | Default path |
| --- | --- |
| Codex | ~/.codex/skills |
| ClaudeCode | ~/.claude/skills |
| Hermes | ~/.hermes/skills |
| OpenClaw | ~/.openclaw/skills |
Auto-discovery scans exactly one built-in default path per agent. After registration, the UI keeps both the current configured path and the default path for each agent.
Project Layout
| Path | Purpose |
| --- | --- |
| src/skill-manage-server.py | Thin compatibility entry that boots the packaged backend |
| src/skill_manage/ | Python backend package for startup, HTTP handlers, services, repositories, database, and utilities |
| bin/skill-manager.js | npm CLI for start/stop/restart/status/web/help/version |
| web/skill-manage.html | Single-file UI for the full local management console |
| scripts/start.sh | Startup helper that checks Python, installs dependencies, frees the configured port, and launches the service |
| data/skill-manage.sqlite3 | Source-development SQLite database |
| logs/skill-manage.log | Source-development log file |
| requirements.txt | Python dependency list used by the startup script |
| docs/dependencies.md | Dependency inventory and runtime notes |
| docs/npm-install-publish-use-zh.md | Source install, npm packaging, publishing, local/global install, and CLI usage tutorial |
Quick Start
Requirements
- Python 3.10+
- A Unix-like environment is recommended
- Filesystem symlink support
Notes:
- Startup checks whether the Python environment is healthy before launch.
- If Python is not available or broken, startup fails fast with a message asking you to check Python.
- If Python is healthy,
./scripts/start.shinstalls dependencies fromrequirements.txtautomatically before starting the service. - The backend is standard-library-first, but the project still keeps
requirements.txtas the install entry for startup automation. - The default host is
127.0.0.1.
Install With npm
The npm package name is scoped, but the global command is skill-manager:
npm install -g @im-fan/skill-manageUse the CLI to manage the local Python service:
skill-manager start
skill-manager status
skill-manager web
skill-manager restart
skill-manager stop
skill-manager h
skill-manager versionThe first start, status, or web command creates the default config file:
~/.skill-manager/config.jsonDefault config:
{
"server": {
"host": "127.0.0.1",
"port": 8765
},
"runtimeHome": "~/.skill-manager"
}The CLI stores runtime files under runtimeHome:
~/.skill-manager/
config.json
data/skill-manage.sqlite3
logs/skill-manage.log
run/skill-manager.pid
run/skill-manager.jsonTo change the port, edit server.port in the config file and run skill-manager restart. skill-manager start is restart-friendly: if the service is already running, it stops the old managed process first; if the configured port is occupied, it kills the owning process and then starts the service.
Environment variables:
| Variable | Purpose |
| --- | --- |
| SKILL_MANAGER_CONFIG | Use a custom config file path |
| SKILL_MANAGER_HOME | Override the default CLI home, including the default config path |
| SKILL_MANAGE_HOME | Override the Python runtime home for database and logs |
| SKILL_MANAGER_PYTHON | Select the Python executable used by the CLI |
SKILL_MANAGER_HOME is preferred for CLI configuration. The CLI passes the resolved runtimeHome to Python as SKILL_MANAGE_HOME, so SQLite and logs are not written into the npm package directory.
For the full source install, npm pack, publishing, local/global npm install, and skill-manager usage flow, see Skill Manager 源码安装、npm 打包发布与使用教程.
Start The Service
For npm/global installs, start the service with:
skill-manager start
skill-manager webFor source development, run the compatibility entry:
python3 src/skill-manage-server.py --openRun the packaged module:
PYTHONPATH=src python3 -m skill_manage --openRun the helper script:
./scripts/start.shDefault address:
http://127.0.0.1:8765/After startup succeeds, the Python service logs a startup success message and the bound port.
Typical Workflow
- Add one or more scan roots in the
SKILL Repositorytab. - Let the scanner collect directories that contain
SKILL.md. - Open
Agent Manageand auto-discover or manually register the agent directories you actually use. - Switch to
Agent List, pick the current agent, and mount reusable skills from the shared repository. - Normalize direct folders by importing them into the shared repository or moving them between repository roots.
- Use the similarity scanners to find duplicated or overlapping skills before the library drifts again.
Common Use Cases
- Build one shared local SKILL repository for multiple AI coding agents.
- Clean old symlinks, invalid skill mounts, and duplicated skill folders.
- Migrate direct skill folders from agent directories into a managed repository.
- Review which skills are mounted into the current agent and rescan them quickly.
- Keep a local-first workflow instead of relying on a remote marketplace or sync service.
HTTP API
The UI talks to a small local JSON API. Current endpoints include:
| Method | Endpoint | Purpose |
| --- | --- | --- |
| GET | /api/state | Fetch the full page state |
| GET | /api/agents | Fetch registered agents |
| GET | /api/operation-logs | Fetch paginated operation logs |
| POST | /api/scan-roots | Save and scan one scan root |
| POST | /api/scan-roots/update | Update one scan root and rescan it |
| POST | /api/scan-roots/rescan | Rescan all scan roots |
| POST | /api/scan-roots/item/rescan | Rescan one saved scan root |
| POST | /api/local-skills | Add one local skill manually |
| POST | /api/local-skills/find-similar | Find similar skills in the repository |
| POST | /api/local-skills/move | Move a local skill to another repository root |
| POST | /api/agents | Create one agent |
| POST | /api/agents/update | Update one agent |
| POST | /api/agents/auto-discover | Auto-discover built-in agent directories |
| POST | /api/agents/visibility | Toggle agent visible/hidden state |
| POST | /api/agents/{agent}/path | Save the configured path for one agent |
| POST | /api/agents/{agent}/scan | Rescan one agent directory |
| POST | /api/agents/{agent}/scan-default-to-local | Scan the current configured directory into the repository |
| POST | /api/agents/{agent}/link | Mount one repository skill into an agent directory |
| POST | /api/agents/{agent}/move-direct-to-local | Move one direct agent skill into the repository |
| POST | /api/agents/{agent}/delete-direct-skill | Delete one direct skill folder from an agent directory |
| POST | /api/agents/{agent}/cleanup-invalid | Remove invalid symlinks from an agent directory |
| POST | /api/agents/{agent}/find-similar | Find similar skills inside one agent context |
| DELETE | /api/scan-roots?path=... | Remove one saved scan root |
| DELETE | /api/links?path=... | Remove one mounted symlink |
| DELETE | /api/local-skills?path=... | Delete one local skill record |
| DELETE | /api/agents?agent_code=... | Delete one registered agent |
Runtime And Safety Notes
- State is stored in
data/skill-manage.sqlite3during source development, or in<runtimeHome>/data/skill-manage.sqlite3when launched by the npm CLI. - Runtime logs are written to
logs/skill-manage.logduring source development, or in<runtimeHome>/logs/skill-manage.logwhen launched by the npm CLI. - The app uses SQLite
DELETEjournal mode, sosqlite3-walandsqlite3-shmshould not be kept around during normal operation. - Operation logs are intended for meaningful write/update actions, not noisy initialization messages.
- Invalid-link cleanup removes symlink entries only; it does not delete real skill directories.
- Deleting a direct skill folder from an agent directory is destructive and should be used intentionally.
- The built-in server is local-only by default and rejects non-loopback bind hosts unless
SKILL_MANAGE_ALLOW_REMOTE=1is set explicitly. - CORS is restricted to loopback web origins instead of wildcard access.
License
This project is released under the MIT License. See LICENSE.
Scope
This project is for local skill management. It does not try to be a remote sync service or a marketplace.
It is a good fit for:
- personal multi-agent setups
- shared local skill repositories
- cleanup of long-lived skill directories
- teams that want one lightweight local control panel instead of multiple ad hoc folders
