src / config.ts
import { createConfigSchematics } from "@lmstudio/sdk";
export const pluginConfigSchematics = createConfigSchematics()
.field("dataPath", "string", {
displayName: "Data Path",
subtitle: "Directory where growth data is stored. Leave blank to use ~/developer-growth.",
}, "")
.field("developerName", "string", {
displayName: "Your Name",
subtitle: "Used to personalise feedback and reports.",
}, "")
.field("currentRole", "string", {
displayName: "Current Role",
subtitle: "e.g. 'Backend Engineer', 'Full-Stack Developer', 'ML Engineer', 'Student'.",
}, "Developer")
.field("targetRole", "string", {
displayName: "Target Role",
subtitle: "Where you want to be — e.g. 'AI Engineer', 'Staff Engineer', 'Founder'.",
}, "")
.field("experienceYears", "numeric", {
int: true, min: 0, max: 40,
displayName: "Years of Experience",
subtitle: "Helps calibrate learning path depth and project difficulty.",
slider: { min: 0, max: 40, step: 1 },
}, 3)
.field("weeklyGoalMinutes", "numeric", {
int: true, min: 30, max: 1200,
displayName: "Weekly Learning Goal (minutes)",
subtitle: "Target learning time per week. Used for streak and progress tracking.",
slider: { min: 30, max: 1200, step: 30 },
}, 300)
.field("maxSearchResults", "numeric", {
int: true, min: 3, max: 20,
displayName: "Max Search Results",
subtitle: "Results returned per resource search.",
slider: { min: 3, max: 20, step: 1 },
}, 8)
.field("searxngUrl", "string", {
displayName: "SearXNG URL",
subtitle:
"Base URL of your self-hosted SearXNG instance (e.g. http://localhost:8080). " +
"Leave blank to use the built-in DDG/Bing scraper. " +
"SearXNG aggregates many engines and has no rate limits.",
}, "")
.field("searchRecencyWindow", "string", {
displayName: "Search Recency Window",
subtitle:
"Limit all web searches to results published within this window. " +
"Options: day, week, month, year, any (no filter). " +
"Narrower windows give fresher results but may reduce result count.",
}, "year")
.build();