Replace the conflated `runner` axis with two orthogonal ones: `manager`
(systemd|caddy|path|none) — who supervises/realizes a deployment — and, for
systemd only, a nested `launcher` (python|command|container|compose|node) — how
the process starts. ServiceSpec and JobSpec collapse into one manager-
discriminated DeploymentSpec union (Systemd/Caddy/Path/Remote); the services/
and jobs/ config dirs collapse into one deployments/ dir. The human "kind"
(service|job|tool|static|reference) is fully derived (kind_for), never stored —
the frontend kind is renamed static. behavior is gone.
- core: DeploymentSpec union + LaunchSpec + kind_for; legacy-aware loader
normalizes old runner shapes; CastleConfig.deployments with derived
services/jobs/tools views; registry.Deployment carries manager/launcher/kind.
- cli: service/job/tool as filtered views + a deployment group; --behavior→--kind,
create --runner→--launcher; lifecycle dispatches over config.deployments.
- castle-api: /deployments primary with /services,/jobs as views; summaries
derive kind; PUT/DELETE /config/deployments/{name} (services/jobs aliased).
- app: KindBadge, frontend→static everywhere, pick-a-kind creation wizard,
per-kind config editors.
- docs: single deployments/ layout, manager/launcher, static kind throughout.
Live migration verified byte-identical: regenerated Caddyfile and every unit
ExecStart line unchanged, so nothing restarted. Suites: core 124, cli 25,
castle-api 55; dashboard build + type-check clean.
38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
import { Link } from "react-router-dom"
|
|
import { ArrowLeft } from "lucide-react"
|
|
import { KindBadge } from "@/components/KindBadge"
|
|
import { StackBadge } from "@/components/StackBadge"
|
|
|
|
interface DetailHeaderProps {
|
|
backTo: string
|
|
backLabel: string
|
|
name: string
|
|
kind?: string | null
|
|
stack?: string | null
|
|
source?: string | null
|
|
children?: React.ReactNode
|
|
}
|
|
|
|
export function DetailHeader({ backTo, backLabel, name, kind, stack, source, children }: DetailHeaderProps) {
|
|
return (
|
|
<>
|
|
<Link to={backTo} className="text-[var(--primary)] hover:underline flex items-center gap-1 mb-6">
|
|
<ArrowLeft size={16} /> {backLabel}
|
|
</Link>
|
|
|
|
<div className="flex items-start justify-between gap-3 flex-wrap mb-4">
|
|
<h1 className="text-2xl font-bold break-all min-w-0">{name}</h1>
|
|
{children}
|
|
</div>
|
|
|
|
<div className="flex items-center gap-3 flex-wrap mb-6">
|
|
<KindBadge kind={kind ?? null} />
|
|
<StackBadge stack={stack ?? null} />
|
|
{source && (
|
|
<span className="text-sm text-[var(--muted)] font-mono break-all min-w-0">{source}</span>
|
|
)}
|
|
</div>
|
|
</>
|
|
)
|
|
}
|