Skip to main content

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.

FieldDescription
enabledIf true, apply creates symlinks for this tool
configPathGlobal config directory (default ~/.cursor, ~/.claude, or ~/.codex)

On first config creation, enabled is set only when the matching directory already exists under ~.

Installation fields

FieldDescription
kind"skill" or "agent"
globalSymlink under each enabled tool’s configPath
projectSymlink under <project>/<tool-subfolder>/...
projectPathActive 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

FieldDescription
recentProjectsUp to 10 absolute paths, most recent first. Updated when a project install is saved via PUT /installations.

Legacy migration

  • scope: "global" | "project" | "off"global / project booleans
  • Configs without ides → defaults from home-folder detection
  • adapter kept 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.