Rename Castle -> Wild PC across the repo
Repo-side rename only (Phases 1-3 of the migration plan); the live box (~/.castle, systemd units, /data/castle, domains) is a separate cutover. - Slug `castle` -> `wildpc`: CLI command, module names (wildpc_core/cli/api), dist names, entry point `wildpc = wildpc_cli.main:main`. - Identifiers: CastleConfig/NATSClient/DirError/MDNS -> Wildpc*. - Env/constants: CASTLE_* -> WILDPC_*; ~/.castle -> ~/.wildpc, castle.yaml -> wildpc.yaml, /data/castle -> /data/wildpc. - Systemd UNIT_PREFIX castle- -> wildpc-; own programs castle-api/gateway/etc. - Display prose "Castle" -> "Wild PC" in docs, agent-guide files, README, frontend. - Package dirs and bootstrap yaml renamed via git mv; lockfiles regenerated; redundant nested uv.lock files dropped (workspace root lock is authoritative). Tests: core 273, cli 47, wildpc-api 120 all pass. Frontend type-checks + builds. Fixed a stale test fixture (secret_env_path kind arg) broken pre-rename.
This commit is contained in:
2
app/.env
2
app/.env
@@ -1,4 +1,4 @@
|
||||
# The API base URL is derived at runtime (see src/services/api/client.ts):
|
||||
# - dashboard at castle-app.<domain> -> castle-api.<domain> (cross-origin, CORS)
|
||||
# - dashboard at wildpc-app.<domain> -> wildpc-api.<domain> (cross-origin, CORS)
|
||||
# - dev / off-mode :9000 (bare host) -> /api (same-origin)
|
||||
# Set VITE_API_BASE_URL only to force a specific base (rarely needed).
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Castle</title>
|
||||
<title>Wild PC</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
@@ -21,7 +21,7 @@ function splitPath(raw: string): { dir: string | null; filter: string } {
|
||||
return { dir: raw.slice(0, idx), filter: raw.slice(idx + 1) }
|
||||
}
|
||||
|
||||
/** Adopt an existing repo as a program (the web `castle program add`). Programs
|
||||
/** Adopt an existing repo as a program (the web `wildpc program add`). Programs
|
||||
* live on the *server's* filesystem, so the picker browses the server's dirs: type
|
||||
* a path (autocompletes as you go), navigate the listing, or paste a git URL. */
|
||||
export function AddProgramForm({
|
||||
@@ -181,7 +181,7 @@ export function AddProgramForm({
|
||||
{target && (
|
||||
<p className="text-xs text-[var(--muted)]">
|
||||
Registering <span className="font-mono text-[var(--foreground)]">{target}</span>
|
||||
{isGit && " (cloned later via castle clone)"}
|
||||
{isGit && " (cloned later via wildpc clone)"}
|
||||
</p>
|
||||
)}
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ export function AssistantDock() {
|
||||
? "border-[var(--primary)] text-[var(--foreground)]"
|
||||
: pillIdle,
|
||||
)}
|
||||
title="Plain login shell in the castle repo"
|
||||
title="Plain login shell in the wildpc repo"
|
||||
>
|
||||
<TerminalIcon size={13} /> Shell
|
||||
</button>
|
||||
|
||||
@@ -240,7 +240,7 @@ function PaletteBody({ onClose }: { onClose: () => void }) {
|
||||
)}
|
||||
<button
|
||||
onClick={(e) => (e.stopPropagation(), details(a))}
|
||||
title="Castle details"
|
||||
title="Wild PC details"
|
||||
className="shrink-0 text-[var(--muted)] hover:text-[var(--card-foreground)]"
|
||||
>
|
||||
<Maximize2 size={12} />
|
||||
|
||||
@@ -31,7 +31,7 @@ export function ConvergePanel() {
|
||||
setMsg("Applied — the node is converged.")
|
||||
qc.invalidateQueries()
|
||||
} catch (e) {
|
||||
// A self-apply restarts castle-api, dropping the connection — expected.
|
||||
// A self-apply restarts wildpc-api, dropping the connection — expected.
|
||||
if (e instanceof TypeError) {
|
||||
setPlan(null)
|
||||
setMsg("Applied — services are restarting.")
|
||||
|
||||
@@ -4,7 +4,7 @@ import type { GatewayInfo } from "@/types"
|
||||
import { useSaveGatewayConfig } from "@/services/api/hooks"
|
||||
|
||||
/** Editable gateway routing + public-exposure settings (domain / public_domain /
|
||||
* tunnel / tls). Saves to castle.yaml; changes take effect on the next apply. */
|
||||
* tunnel / tls). Saves to wildpc.yaml; changes take effect on the next apply. */
|
||||
export function GatewaySettings({ gateway }: { gateway: GatewayInfo }) {
|
||||
const { mutate: save, isPending, data: saved } = useSaveGatewayConfig()
|
||||
const [editing, setEditing] = useState(false)
|
||||
@@ -44,7 +44,7 @@ export function GatewaySettings({ gateway }: { gateway: GatewayInfo }) {
|
||||
<button onClick={() => setEditing(false)} className="flex items-center gap-1 text-xs px-2.5 py-1 rounded bg-[var(--border)] text-[var(--muted)]">
|
||||
<X size={12} /> Cancel
|
||||
</button>
|
||||
<span className="text-xs text-[var(--muted)]">Run <span className="font-mono">castle apply</span> (or the Apply button) to converge.</span>
|
||||
<span className="text-xs text-[var(--muted)]">Run <span className="font-mono">wildpc apply</span> (or the Apply button) to converge.</span>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -4,12 +4,12 @@ import { useNodes } from "@/services/api/hooks"
|
||||
import type { NodeSummary } from "@/types"
|
||||
import { cn } from "@/lib/utils"
|
||||
|
||||
// Each machine's castle is served at its own origin (castle.<domain>), so hopping
|
||||
// Each machine's wildpc is served at its own origin (wildpc.<domain>), so hopping
|
||||
// between hosts is a cross-origin navigation. This shows which host you're driving
|
||||
// (the is_local node) and lets you jump to a peer's dashboard, preserving the view.
|
||||
function dashboardUrl(n: NodeSummary): string {
|
||||
const base = n.gateway_domain
|
||||
? `https://castle.${n.gateway_domain}`
|
||||
? `https://wildpc.${n.gateway_domain}`
|
||||
: `http://${n.hostname}:${n.gateway_port}`
|
||||
return `${base}${window.location.pathname}`
|
||||
}
|
||||
@@ -58,7 +58,7 @@ export function HostSwitcher({ collapsed }: { collapsed: boolean }) {
|
||||
{open && (
|
||||
<div className="absolute left-2 z-50 mt-1 min-w-[190px] overflow-hidden rounded-md border border-[var(--border)] bg-[var(--card)] shadow-xl">
|
||||
<div className="border-b border-[var(--border)] px-2.5 py-1 text-[10px] uppercase tracking-wide text-[var(--muted)]">
|
||||
Castle hosts
|
||||
Wild PC hosts
|
||||
</div>
|
||||
{list.map((n) => {
|
||||
const isCur = n.is_local
|
||||
|
||||
@@ -50,7 +50,7 @@ const NAV: (NavLeaf | NavGroup)[] = [
|
||||
{ to: "/secrets", label: "Secrets", icon: KeyRound },
|
||||
]
|
||||
|
||||
const COLLAPSE_KEY = "castle-nav-collapsed"
|
||||
const COLLAPSE_KEY = "wildpc-nav-collapsed"
|
||||
|
||||
function NavLeafLink({
|
||||
leaf,
|
||||
@@ -162,7 +162,7 @@ function NavItems({ collapsed, onNavigate }: { collapsed: boolean; onNavigate?:
|
||||
function Brand({ collapsed, onClick }: { collapsed?: boolean; onClick?: () => void }) {
|
||||
return (
|
||||
<Link to="/" onClick={onClick} className="font-bold text-lg truncate">
|
||||
{collapsed ? "C" : "Castle"}
|
||||
{collapsed ? "W" : "Wild PC"}
|
||||
</Link>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ export function ConfigPanel({ deployment, configSection, onRefetch }: ConfigPane
|
||||
const navigate = useNavigate()
|
||||
const qc = useQueryClient()
|
||||
const [message, setMessage] = useState<{ type: "ok" | "error"; text: string } | null>(null)
|
||||
// A deployment edit only persists to castle.yaml; the unit/process still need
|
||||
// A deployment edit only persists to wildpc.yaml; the unit/process still need
|
||||
// a deploy (regenerate) + restart to actually take effect.
|
||||
const [pendingApply, setPendingApply] = useState(false)
|
||||
const [applying, setApplying] = useState(false)
|
||||
@@ -43,8 +43,8 @@ export function ConfigPanel({ deployment, configSection, onRefetch }: ConfigPane
|
||||
setMessage({
|
||||
type: "ok",
|
||||
text: isDeployment
|
||||
? "Saved to castle.yaml — not live yet; apply to converge."
|
||||
: "Saved to castle.yaml",
|
||||
? "Saved to wildpc.yaml — not live yet; apply to converge."
|
||||
: "Saved to wildpc.yaml",
|
||||
})
|
||||
if (isDeployment) setPendingApply(true)
|
||||
onRefetch()
|
||||
@@ -67,7 +67,7 @@ export function ConfigPanel({ deployment, configSection, onRefetch }: ConfigPane
|
||||
qc.invalidateQueries()
|
||||
onRefetch()
|
||||
} catch (e: unknown) {
|
||||
// A self-apply of castle-api restarts it, killing the connection — expected.
|
||||
// A self-apply of wildpc-api restarts it, killing the connection — expected.
|
||||
if (e instanceof TypeError) {
|
||||
setPendingApply(false)
|
||||
setMessage({ type: "ok", text: "Applied — the service is restarting." })
|
||||
|
||||
@@ -26,7 +26,7 @@ const KIND_INFO: Record<DeploymentKind, { label: string; hint: string }> = {
|
||||
static: { label: "Static", hint: "Static site served by the gateway" },
|
||||
}
|
||||
|
||||
/** Create a deployment in castle.yaml, then deploy (and start, for a service).
|
||||
/** Create a deployment in wildpc.yaml, then deploy (and start, for a service).
|
||||
* A pick-a-kind wizard: the chosen kind sets the manager and shows only its
|
||||
* relevant fields. Reachable standalone or prefilled from a program page. */
|
||||
export function CreateDeploymentForm({
|
||||
|
||||
@@ -93,7 +93,7 @@ export function JobFields({ job, onSave, onDelete }: Props) {
|
||||
width="w-48"
|
||||
mono
|
||||
placeholder="0 2 * * *"
|
||||
hint="Cron expression — castle generates a systemd timer that runs the job on this schedule."
|
||||
hint="Cron expression — wildpc generates a systemd timer that runs the job on this schedule."
|
||||
/>
|
||||
<Field label="Launch" hint="How the job runs on each tick, then exits: the launcher and its target (a console script, command/argv, image, node script, or compose file).">
|
||||
<div className="flex items-center gap-2">
|
||||
@@ -124,7 +124,7 @@ export function JobFields({ job, onSave, onDelete }: Props) {
|
||||
onSave={handleSave}
|
||||
onDelete={onDelete ? () => onDelete(job.id) : undefined}
|
||||
deleteLabel="Remove job"
|
||||
confirmMessage={`Remove job "${job.id}" from castle.yaml? Run a deploy afterward to tear down its timer.`}
|
||||
confirmMessage={`Remove job "${job.id}" from wildpc.yaml? Run a deploy afterward to tear down its timer.`}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -95,7 +95,7 @@ export function ProgramFields({ program, onSave, onDelete }: Props) {
|
||||
onChange={setSource}
|
||||
mono
|
||||
placeholder="/data/repos/my-prog"
|
||||
hint="The working copy on disk. Castle runs dev verbs and builds here. Absolute path, or repo:<name> for castle's own programs."
|
||||
hint="The working copy on disk. Wild PC runs dev verbs and builds here. Absolute path, or repo:<name> for wildpc's own programs."
|
||||
/>
|
||||
<Field
|
||||
label="Stack"
|
||||
@@ -119,7 +119,7 @@ export function ProgramFields({ program, onSave, onDelete }: Props) {
|
||||
onChange={setRepo}
|
||||
mono
|
||||
placeholder="https://github.com/me/x.git"
|
||||
hint="Git URL so 'castle program clone' can fetch the source on a fresh machine. An existing working copy at Source takes precedence."
|
||||
hint="Git URL so 'wildpc program clone' can fetch the source on a fresh machine. An existing working copy at Source takes precedence."
|
||||
/>
|
||||
<TextField
|
||||
label="Ref"
|
||||
@@ -134,7 +134,7 @@ export function ProgramFields({ program, onSave, onDelete }: Props) {
|
||||
value={deps}
|
||||
onChange={setDeps}
|
||||
placeholder="pandoc, poppler-utils"
|
||||
hint="OS packages the program needs. Listed for reference — castle does not install them."
|
||||
hint="OS packages the program needs. Listed for reference — wildpc does not install them."
|
||||
/>
|
||||
|
||||
<Field
|
||||
|
||||
@@ -201,7 +201,7 @@ export function ServiceFields({ service, onSave, onDelete }: Props) {
|
||||
width="w-32"
|
||||
mono
|
||||
placeholder="9001"
|
||||
hint="The port the service listens on. Castle health-checks and proxies this port; map it to the program's own var with ${port} in Environment."
|
||||
hint="The port the service listens on. Wild PC health-checks and proxies this port; map it to the program's own var with ${port} in Environment."
|
||||
/>
|
||||
<TextField
|
||||
label="Health path"
|
||||
@@ -210,7 +210,7 @@ export function ServiceFields({ service, onSave, onDelete }: Props) {
|
||||
width="w-48"
|
||||
mono
|
||||
placeholder="/health"
|
||||
hint="HTTP path castle polls to report up/down."
|
||||
hint="HTTP path wildpc polls to report up/down."
|
||||
/>
|
||||
<Field
|
||||
label="Reach"
|
||||
@@ -263,7 +263,7 @@ export function ServiceFields({ service, onSave, onDelete }: Props) {
|
||||
onSave={handleSave}
|
||||
onDelete={onDelete ? () => onDelete(service.id) : undefined}
|
||||
deleteLabel="Remove service"
|
||||
confirmMessage={`Remove service "${service.id}" from castle.yaml? Run a deploy afterward to tear down its unit.`}
|
||||
confirmMessage={`Remove service "${service.id}" from wildpc.yaml? Run a deploy afterward to tear down its unit.`}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -15,7 +15,7 @@ interface Props {
|
||||
/** Edit a tool's (path) deployment config. A path deployment has no launcher,
|
||||
* port, or schedule — only a description and its `tool_schema` (the neutral
|
||||
* tool-call definition handed to agents), plus its manager. It has no run env:
|
||||
* a tool is a CLI on PATH, invoked from a shell with castle out of the loop, so
|
||||
* a tool is a CLI on PATH, invoked from a shell with wildpc out of the loop, so
|
||||
* `defaults.env` is never applied (deploy.py only wires env for systemd units). */
|
||||
export function ToolFields({ tool, onSave, onDelete }: Props) {
|
||||
const m = tool.manifest
|
||||
|
||||
@@ -170,7 +170,7 @@ export function useEnvSecrets(initial: Record<string, string>) {
|
||||
Use <code className="font-mono">${"{port}"}</code>,{" "}
|
||||
<code className="font-mono">${"{data_dir}"}</code>,{" "}
|
||||
<code className="font-mono">${"{name}"}</code>,{" "}
|
||||
<code className="font-mono">${"{public_url}"}</code> for castle's computed values,
|
||||
<code className="font-mono">${"{public_url}"}</code> for wildpc's computed values,
|
||||
and <code className="font-mono">${"{secret:NAME}"}</code> for secrets.
|
||||
</p>
|
||||
{Object.entries(env).map(([key, val]) => (
|
||||
|
||||
@@ -82,7 +82,7 @@ export function detailPath(name: string, kind: string): string {
|
||||
|
||||
/**
|
||||
* Full URL for a service exposed at <subdomain>.<gateway.domain>. The domain is
|
||||
* derived from the dashboard's own host (it is served at castle.<domain>), so
|
||||
* derived from the dashboard's own host (it is served at wildpc.<domain>), so
|
||||
* this returns null when the dashboard is on a bare host (off mode, no subdomains).
|
||||
*/
|
||||
export function subdomainUrl(subdomain: string): string | null {
|
||||
|
||||
@@ -78,7 +78,7 @@ export function Overview() {
|
||||
|
||||
return (
|
||||
<div className="max-w-6xl mx-auto px-6 py-8">
|
||||
<PageHeader title="Castle" subtitle="Personal software platform" />
|
||||
<PageHeader title="Wild PC" subtitle="Personal software platform" />
|
||||
|
||||
{nodes && <NodeBar nodes={nodes} />}
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ export function ProgramDetailPage() {
|
||||
Program Info
|
||||
</h2>
|
||||
<p className="text-xs text-[var(--muted)] mb-4">
|
||||
Where the source lives and how castle works with it.
|
||||
Where the source lives and how wildpc works with it.
|
||||
</p>
|
||||
<div className="grid grid-cols-2 gap-x-6 gap-y-2 text-sm mb-4">
|
||||
{deployment.source && (
|
||||
|
||||
@@ -15,7 +15,7 @@ export function ServiceDetailPage() {
|
||||
const { data: deployment, isLoading, error, refetch } = useService(name ?? "")
|
||||
const { data: statusResp } = useStatus()
|
||||
const health = statusResp?.statuses.find((s) => s.id === name)
|
||||
const isGateway = name === "castle-gateway"
|
||||
const isGateway = name === "wildpc-gateway"
|
||||
const { data: caddyfile } = useCaddyfile(isGateway)
|
||||
|
||||
if (isLoading) {
|
||||
|
||||
@@ -84,7 +84,7 @@ const KIND_COLOR: Record<string, string> = {
|
||||
|
||||
// Dependency edges are colored by the protocol of the thing being consumed (the
|
||||
// target's endpoint). "system" = a socket-less dep (a tool/package) or a target
|
||||
// castle doesn't model an endpoint for.
|
||||
// wildpc doesn't model an endpoint for.
|
||||
const PROTO_COLOR: Record<string, string> = {
|
||||
http: "#58a6ff",
|
||||
pg: "#3b82f6",
|
||||
@@ -100,7 +100,7 @@ const HANDLE = { opacity: 0, width: 8, height: 8 } as const
|
||||
|
||||
// User's manual node arrangement. Positions default to the computed lane layout;
|
||||
// any node the user drags is remembered here and survives refetches + reloads.
|
||||
const POS_KEY = "castle-map-positions"
|
||||
const POS_KEY = "wildpc-map-positions"
|
||||
type PosMap = Record<string, { x: number; y: number }>
|
||||
function loadPositions(): PosMap {
|
||||
try {
|
||||
@@ -295,7 +295,7 @@ function protoOf(url: string | null): string {
|
||||
}
|
||||
}
|
||||
|
||||
// An external resource — a `reference` (manager: none) castle doesn't run. Sits in
|
||||
// An external resource — a `reference` (manager: none) wildpc doesn't run. Sits in
|
||||
// the External zone as a registry entry + a drop target for consumes edges.
|
||||
function ExternalNode({ data }: NodeProps) {
|
||||
const d = data as { label: string; host: string; focusDim?: boolean; focused?: boolean }
|
||||
@@ -325,7 +325,7 @@ function ExternalNode({ data }: NodeProps) {
|
||||
)
|
||||
}
|
||||
|
||||
// A deployment on another castle node (mesh-discovered). Read-only — you manage
|
||||
// A deployment on another wildpc node (mesh-discovered). Read-only — you manage
|
||||
// remote deployments from that node.
|
||||
function RemoteNode({ data }: NodeProps) {
|
||||
const d = data as {
|
||||
@@ -1336,7 +1336,7 @@ export function SystemMapPage() {
|
||||
open={!!confirmDel}
|
||||
danger
|
||||
title={`Delete ${confirmDel?.name}?`}
|
||||
body={`This removes the ${confirmDel?.kind} deployment from castle.yaml and tears it down. The program's source is kept.`}
|
||||
body={`This removes the ${confirmDel?.kind} deployment from wildpc.yaml and tears it down. The program's source is kept.`}
|
||||
confirmLabel="Delete"
|
||||
onConfirm={doDelete}
|
||||
onCancel={() => setConfirmDel(null)}
|
||||
@@ -1345,7 +1345,7 @@ export function SystemMapPage() {
|
||||
)
|
||||
}
|
||||
|
||||
const LEGEND_KEY = "castle-map-legend-open"
|
||||
const LEGEND_KEY = "wildpc-map-legend-open"
|
||||
|
||||
function Legend() {
|
||||
const [open, setOpen] = useState(() => {
|
||||
@@ -1461,7 +1461,7 @@ function InspectPanel({
|
||||
<ExternalLink size={13} />
|
||||
</a>
|
||||
)}
|
||||
<button onClick={() => onOpen(info.name, info.kind, info.node)} title="Castle details" className="text-[var(--muted)] hover:text-[var(--card-foreground)]">
|
||||
<button onClick={() => onOpen(info.name, info.kind, info.node)} title="Wild PC details" className="text-[var(--muted)] hover:text-[var(--card-foreground)]">
|
||||
<Maximize2 size={12} />
|
||||
</button>
|
||||
<button onClick={onClose} title="Close" className="text-[var(--muted)] hover:text-[var(--card-foreground)]">
|
||||
@@ -1593,7 +1593,7 @@ function AddExternalModal({
|
||||
>
|
||||
<h3 className="mb-1 font-semibold">Add external resource</h3>
|
||||
<p className="mb-3 text-xs text-[var(--muted)]">
|
||||
An endpoint castle doesn't run (a SaaS API, a remote service). Draw a consumes edge to
|
||||
An endpoint wildpc doesn't run (a SaaS API, a remote service). Draw a consumes edge to
|
||||
it from any deployment.
|
||||
</p>
|
||||
<label className="mb-1 block text-xs text-[var(--muted)]">Name</label>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Resolve the castle-api base URL. The gateway serves each service at its own
|
||||
// subdomain (<name>.<domain>), so when the dashboard runs at castle.<domain>
|
||||
// the API lives at castle-api.<domain> — a cross-origin call (castle-api allows
|
||||
// Resolve the wildpc-api base URL. The gateway serves each service at its own
|
||||
// subdomain (<name>.<domain>), so when the dashboard runs at wildpc.<domain>
|
||||
// the API lives at wildpc-api.<domain> — a cross-origin call (wildpc-api allows
|
||||
// CORS *). When served at a bare host (dev, or the off-mode :9000 gateway), the
|
||||
// API is reachable same-origin at /api.
|
||||
function resolveApiBase(): string {
|
||||
@@ -10,7 +10,7 @@ function resolveApiBase(): string {
|
||||
const { protocol, hostname } = window.location
|
||||
const labels = hostname.split(".")
|
||||
if (labels.length > 2) {
|
||||
return `${protocol}//castle-api.${labels.slice(1).join(".")}`
|
||||
return `${protocol}//wildpc-api.${labels.slice(1).join(".")}`
|
||||
}
|
||||
}
|
||||
return "/api"
|
||||
@@ -78,7 +78,7 @@ class ApiClient {
|
||||
}
|
||||
|
||||
// Build a ws(s):// URL for a WebSocket endpoint. Handles both the cross-origin
|
||||
// base (https://castle-api.<domain>) and the same-origin "/api" base.
|
||||
// base (https://wildpc-api.<domain>) and the same-origin "/api" base.
|
||||
wsUrl(path: string): string {
|
||||
const absolute = this.baseUrl.startsWith("http")
|
||||
? `${this.baseUrl}${path}`
|
||||
|
||||
@@ -59,7 +59,7 @@ export function useJobs() {
|
||||
})
|
||||
}
|
||||
|
||||
// The stacks castle has handlers for — authoritative source for the program
|
||||
// The stacks wildpc has handlers for — authoritative source for the program
|
||||
// stack select, so a new backend stack appears without a frontend change.
|
||||
export function useStacks() {
|
||||
return useQuery({
|
||||
@@ -260,7 +260,7 @@ const REACH_SECTION: Record<string, string> = {
|
||||
}
|
||||
|
||||
// Create/update an external resource — a `reference` deployment (manager: none)
|
||||
// that points at an endpoint castle doesn't run (a SaaS API, a remote service).
|
||||
// that points at an endpoint wildpc doesn't run (a SaaS API, a remote service).
|
||||
// Behind the System Map's "add external resource" authoring. No apply needed —
|
||||
// a reference has no runtime unit; it just declares the endpoint.
|
||||
export function useSaveReference() {
|
||||
@@ -314,7 +314,7 @@ export function useSetReach() {
|
||||
})
|
||||
}
|
||||
|
||||
// Delete a deployment from castle.yaml (the kind-scoped removal; keeps the
|
||||
// Delete a deployment from wildpc.yaml (the kind-scoped removal; keeps the
|
||||
// program). Behind the System Map's node deletion.
|
||||
export function useDeleteDeployment() {
|
||||
const qc = useQueryClient()
|
||||
@@ -450,7 +450,7 @@ export interface AdoptResult {
|
||||
commands: string[]
|
||||
is_git_url: boolean
|
||||
}
|
||||
// Adopt an existing repo as a program (the web `castle program add`). Refreshes
|
||||
// Adopt an existing repo as a program (the web `wildpc program add`). Refreshes
|
||||
// the catalog + the derived graph/repo views.
|
||||
export function useAdoptProgram() {
|
||||
const qc = useQueryClient()
|
||||
@@ -508,7 +508,7 @@ export function useSuggestions() {
|
||||
})
|
||||
}
|
||||
|
||||
// Deployments on other (mesh-discovered) castle nodes, for the multi-node map.
|
||||
// Deployments on other (mesh-discovered) wildpc nodes, for the multi-node map.
|
||||
export function useMeshDeployments() {
|
||||
return useQuery({
|
||||
queryKey: ["mesh", "deployments"],
|
||||
|
||||
@@ -163,7 +163,7 @@ export interface GraphSuggestion {
|
||||
protocol: string
|
||||
}
|
||||
|
||||
// GET /mesh/deployments — deployments on other (mesh-discovered) castle nodes.
|
||||
// GET /mesh/deployments — deployments on other (mesh-discovered) wildpc nodes.
|
||||
export interface MeshDeployment {
|
||||
name: string
|
||||
kind: string
|
||||
@@ -311,7 +311,7 @@ export interface SSEServiceActionEvent {
|
||||
export interface NodeSummary {
|
||||
hostname: string
|
||||
gateway_port: number
|
||||
gateway_domain: string | null // acme domain → dashboard at castle.<domain>
|
||||
gateway_domain: string | null // acme domain → dashboard at wildpc.<domain>
|
||||
deployed_count: number
|
||||
service_count: number
|
||||
is_local: boolean
|
||||
|
||||
@@ -4,8 +4,8 @@ import { defineConfig } from "vite"
|
||||
import react from "@vitejs/plugin-react"
|
||||
|
||||
export default defineConfig({
|
||||
// Castle sets VITE_BASE to the gateway serve prefix at build time so absolute
|
||||
// asset URLs resolve at the subpath (castle-app is the root app → "/").
|
||||
// Wild PC sets VITE_BASE to the gateway serve prefix at build time so absolute
|
||||
// asset URLs resolve at the subpath (wildpc-app is the root app → "/").
|
||||
base: process.env.VITE_BASE ?? "/",
|
||||
plugins: [react(), tailwindcss()],
|
||||
resolve: {
|
||||
|
||||
Reference in New Issue
Block a user