using System.Text.Json.Serialization; namespace Sdt.Config; public sealed class DevToolConfig { public string Name { get; init; } = "SDT Project"; public string Version { get; init; } = "0.1.0"; public List Targets { get; init; } = []; public List Workflows { get; init; } = []; public List Env { get; init; } = []; public ToolchainConfig? Toolchains { get; init; } public ToolingConfig? Tooling { get; init; } public ProjectMetadata? Project { get; init; } public DebugConfig? Debug { get; init; } } public sealed class BuildTarget { public string Id { get; init; } = ""; public string Label { get; init; } = ""; public string Description { get; init; } = ""; public string Group { get; init; } = "General"; /// Executable name. Null = virtual aggregator (runs DependsOn only). public string? Command { get; init; } public List Args { get; init; } = []; /// Working directory relative to project root. public string WorkingDir { get; init; } = "."; public List DependsOn { get; init; } = []; } public sealed class EnvVarDef { public string Key { get; init; } = ""; public string Description { get; init; } = ""; [System.Text.Json.Serialization.JsonPropertyName("default")] public string DefaultValue { get; init; } = ""; /// If non-empty, shown as a dropdown. Otherwise free-text input. public List Options { get; init; } = []; } public sealed class WorkflowDefinition { public string Id { get; init; } = ""; public string Label { get; init; } = ""; public string Description { get; init; } = ""; public string Group { get; init; } = "General"; public List DependsOn { get; init; } = []; public List Steps { get; init; } = []; } public sealed class WorkflowStep { public string Id { get; init; } = ""; public string Label { get; init; } = ""; public string? Command { get; init; } public List Args { get; init; } = []; public string WorkingDir { get; init; } = "."; public string? Action { get; init; } public List ActionArgs { get; init; } = []; public List Requires { get; init; } = []; } public sealed class ToolRequirement { public string Tool { get; init; } = ""; [JsonConverter(typeof(JsonStringEnumConverter))] public InstallPolicy InstallPolicy { get; init; } = InstallPolicy.Prompt; } [JsonConverter(typeof(JsonStringEnumConverter))] public enum InstallPolicy { Prompt, Auto, Never, } public sealed class ToolingConfig { public List Tools { get; init; } = []; } public sealed class ToolInstallDefinition { public string Tool { get; init; } = ""; public List PreferredInstallCommands { get; init; } = []; public List Executables { get; init; } = []; } public sealed class ProjectMetadata { public string Type { get; init; } = ""; public List RootHints { get; init; } = []; public List Artifacts { get; init; } = []; } public sealed class DebugConfig { public List Profiles { get; init; } = []; public DebugDiagnosticsOptions Diagnostics { get; init; } = new(); } public sealed class DebugProfileDefinition { public string Id { get; init; } = ""; public string Label { get; init; } = ""; public string Type { get; init; } = "generic"; public string Command { get; init; } = ""; public List Args { get; init; } = []; public string WorkingDir { get; init; } = "."; public Dictionary Env { get; init; } = new(StringComparer.OrdinalIgnoreCase); public List Requires { get; init; } = []; public DebugAttachConfig? Attach { get; init; } } public sealed class DebugAttachConfig { public string Kind { get; init; } = ""; public int? Port { get; init; } public string? ProcessName { get; init; } public string? Note { get; init; } } public sealed class DebugDiagnosticsOptions { public bool Enabled { get; init; } = true; public string OutputDir { get; init; } = ".sdt/debug"; public bool IncludeAllEnv { get; init; } = false; public List CaptureEnvKeys { get; init; } = []; public bool BundleOnFailure { get; init; } = true; } // ── Toolchain config ────────────────────────────────────────────────────────── public sealed class ToolchainConfig { public PythonToolchain? Python { get; init; } public NodeToolchain? Node { get; init; } } public sealed class PythonToolchain { /// Python executable (e.g. "python3.14", "python"). public string Executable { get; init; } = "python"; /// Windows-specific override (e.g. "py" when using the launcher). public string? WindowsExecutable { get; init; } /// Optional version flag to pass (e.g. "-3.14" for py launcher). public string? LauncherVersion { get; init; } /// Venv directory relative to project root. public string VenvDir { get; init; } = ".venv"; public List Profiles { get; init; } = []; /// Optional path to a pip wrapper script (relative to project root). public string? PipScript { get; init; } } public sealed class PythonProfile { public string Id { get; init; } = ""; public string Label { get; init; } = ""; public string RequirementsFile { get; init; } = ""; public string? ExtraIndexUrl { get; init; } public List PostInstallCommands { get; init; } = []; } public sealed class NodeToolchain { /// Package manager: "npm", "pnpm", or "yarn". public string PackageManager { get; init; } = "npm"; /// Working directory for the frontend (relative to project root). public string WorkingDir { get; init; } = "."; }