Data model
config.json (schema v1)
Stored at ~/.ide-agents/config.json:
{
"version": 1,
"adapter": "cursor",
"ides": {
"cursor": { "enabled": true, "configPath": "/Users/me/.cursor" },
"claude": { "enabled": true, "configPath": "/Users/me/.claude" },
"codex": { "enabled": false, "configPath": "/Users/me/.codex" }
},
"server": { "port": 3921 },
"repos": [
{
"id": "main",
"url": "https://github.com/org/skills.git",
"ref": "main",
"slug": "github-com-org-skills"
}
],
"installations": [
{
"id": "uuid",
"repoId": "main",
"kind": "skill",
"artifactId": "tech-debt",
"sourcePath": "skills/tech-debt",
"targetName": "tech-debt",
"global": false,
"project": true,
"projectPath": "/Users/me/code/my-app"
}
],
"recentProjects": ["/Users/me/code/my-app"]
}
ides
Per-tool settings — see Settings & IDEs.
| Field | Description |
|---|---|
enabled | If true, apply creates symlinks for this tool |
configPath | Global config directory (default ~/.cursor, ~/.claude, or ~/.codex) |
On first config creation, enabled is set only when the matching directory already exists under ~.
Installation fields
| Field | Description |
|---|---|
kind | "skill" or "agent" |
global | Symlink under each enabled tool’s configPath |
project | Symlink under <project>/<tool-subfolder>/... |
projectPath | Active installs use CLI launch cwd; when project is off, the previous path is kept so removal can run |
Global and project are independent in the UI — both may be active for the same artifact (global symlink in IDE config dirs, project symlink under the launch directory). A single installation record is applied to all enabled IDEs when you toggle either scope.
recentProjects
| Field | Description |
|---|---|
recentProjects | Up to 10 absolute paths, most recent first. Updated when a project install is saved via PUT /installations. |
Legacy migration
scope: "global" | "project" | "off"→global/projectbooleans- Configs without
ides→ defaults from home-folder detection adapterkept for compatibility (first enabled IDE)
Artifact (scanned, not persisted)
Returned by GET /api/repos/:id/artifacts:
{
"id": "hello",
"kind": "skill",
"sourcePath": "skills/hello",
"name": "hello",
"description": "From SKILL.md frontmatter",
"allowedScope": "any",
"targets": {
"global": { "exists": false, "isSymlink": false, "blocked": false },
"project": { "exists": true, "isSymlink": true, "blocked": false }
}
}
allowedScope comes from SKILL.md frontmatter. If missing, it defaults to any (both toggles enabled).
targets aggregates status across all enabled IDEs: blocked if any tool has a non-symlink at the target path.