refactor: rename Planarchy to CapaKraken (branding only)
User-facing rename across 20 files: - Layout title/meta: "CapaKraken — Resource & Capacity Planning" - Sidebar logo: "CapaKraken" with "RESOURCE & CAPACITY PLANNING" - Sign-in page: "CapaKraken Control Center", "Sign in to CapaKraken" - PWA manifest: name + short_name - PDF reports: footer text - Install prompt: "Install CapaKraken" - AI assistant system prompt - Webhooks test payload - Email subject lines - Tooltips, descriptions, empty states NOT changed (technical identifiers): - Package names (@planarchy/*) - Import paths - Database names - Docker container names - localStorage keys - Domain URLs - CLAUDE.md Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Planarchy — Resource Planning",
|
"name": "CapaKraken — Resource & Capacity Planning",
|
||||||
"short_name": "Planarchy",
|
"short_name": "CapaKraken",
|
||||||
"description": "Resource planning and project staffing for 3D production",
|
"description": "Resource planning and project staffing for 3D production",
|
||||||
"start_url": "/dashboard",
|
"start_url": "/dashboard",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { PublicHolidayBatch } from "~/components/vacations/PublicHolidayBatch.js";
|
import { PublicHolidayBatch } from "~/components/vacations/PublicHolidayBatch.js";
|
||||||
import { EntitlementManager } from "~/components/vacations/EntitlementManager.js";
|
import { EntitlementManager } from "~/components/vacations/EntitlementManager.js";
|
||||||
|
|
||||||
export const metadata = { title: "Vacation Management — plANARCHY" };
|
export const metadata = { title: "Vacation Management — CapaKraken" };
|
||||||
|
|
||||||
export default function AdminVacationsPage() {
|
export default function AdminVacationsPage() {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ export function EstimatesClient() {
|
|||||||
No estimates yet
|
No estimates yet
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-2 text-sm text-gray-400 dark:text-gray-500">
|
<p className="mt-2 text-sm text-gray-400 dark:text-gray-500">
|
||||||
Start with the wizard to create a connected estimate from plANARCHY data.
|
Start with the wizard to create a connected estimate from CapaKraken data.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@@ -1001,7 +1001,7 @@ export function ResourcesClient() {
|
|||||||
sortField={sortField}
|
sortField={sortField}
|
||||||
sortDir={sortDir}
|
sortDir={sortDir}
|
||||||
onSort={toggle}
|
onSort={toggle}
|
||||||
tooltip="Unique employee identifier used across all plANARCHY records."
|
tooltip="Unique employee identifier used across all CapaKraken records."
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case "displayName":
|
case "displayName":
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ export async function generateMetadata(
|
|||||||
try {
|
try {
|
||||||
const trpc = await createCaller();
|
const trpc = await createCaller();
|
||||||
const resource = await trpc.resource.getById({ id });
|
const resource = await trpc.resource.getById({ id });
|
||||||
return { title: `${resource.displayName} — Resources | plANARCHY` };
|
return { title: `${resource.displayName} — Resources | CapaKraken` };
|
||||||
} catch {
|
} catch {
|
||||||
return { title: "Resource — plANARCHY" };
|
return { title: "Resource — CapaKraken" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { MyVacationsClient } from "~/components/vacations/MyVacationsClient.js";
|
import { MyVacationsClient } from "~/components/vacations/MyVacationsClient.js";
|
||||||
|
|
||||||
export const metadata = { title: "My Vacations — plANARCHY" };
|
export const metadata = { title: "My Vacations — CapaKraken" };
|
||||||
|
|
||||||
export default function MyVacationsPage() {
|
export default function MyVacationsPage() {
|
||||||
return <MyVacationsClient />;
|
return <MyVacationsClient />;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export default function SignInPage() {
|
|||||||
<div className="hidden rounded-[2rem] border border-white/70 bg-white/75 p-10 shadow-2xl backdrop-blur lg:flex lg:flex-col lg:justify-between dark:border-slate-800 dark:bg-slate-950/60">
|
<div className="hidden rounded-[2rem] border border-white/70 bg-white/75 p-10 shadow-2xl backdrop-blur lg:flex lg:flex-col lg:justify-between dark:border-slate-800 dark:bg-slate-950/60">
|
||||||
<div>
|
<div>
|
||||||
<span className="inline-flex rounded-full border border-brand-200 bg-brand-50 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.18em] text-brand-700 dark:border-brand-900/50 dark:bg-brand-900/20 dark:text-brand-300">
|
<span className="inline-flex rounded-full border border-brand-200 bg-brand-50 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.18em] text-brand-700 dark:border-brand-900/50 dark:bg-brand-900/20 dark:text-brand-300">
|
||||||
plANARCHY Control Center
|
CapaKraken Control Center
|
||||||
</span>
|
</span>
|
||||||
<h1 className="mt-6 font-display text-5xl font-semibold leading-tight text-gray-900 dark:text-gray-50">
|
<h1 className="mt-6 font-display text-5xl font-semibold leading-tight text-gray-900 dark:text-gray-50">
|
||||||
Resource planning that stays readable under pressure.
|
Resource planning that stays readable under pressure.
|
||||||
@@ -66,7 +66,7 @@ export default function SignInPage() {
|
|||||||
<div className="app-surface-strong p-8">
|
<div className="app-surface-strong p-8">
|
||||||
<div className="mb-8">
|
<div className="mb-8">
|
||||||
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-brand-600">Welcome Back</p>
|
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-brand-600">Welcome Back</p>
|
||||||
<h2 className="mt-3 font-display text-4xl font-semibold text-gray-900 dark:text-gray-50">Sign in to plANARCHY</h2>
|
<h2 className="mt-3 font-display text-4xl font-semibold text-gray-900 dark:text-gray-50">Sign in to CapaKraken</h2>
|
||||||
<p className="mt-2 text-sm text-gray-500">Resource Planning, staffing, and forecasting.</p>
|
<p className="mt-2 text-sm text-gray-500">Resource Planning, staffing, and forecasting.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -19,23 +19,23 @@ const displayFont = Manrope({
|
|||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
metadataBase: new URL("https://planarchy.hartmut-noerenberg.com"),
|
metadataBase: new URL("https://planarchy.hartmut-noerenberg.com"),
|
||||||
title: "plANARCHY — Resource Planning",
|
title: "CapaKraken — Resource & Capacity Planning",
|
||||||
description: "Interactive resource planning and project staffing tool",
|
description: "Interactive resource planning and project staffing tool",
|
||||||
manifest: "/manifest.json",
|
manifest: "/manifest.json",
|
||||||
appleWebApp: {
|
appleWebApp: {
|
||||||
capable: true,
|
capable: true,
|
||||||
statusBarStyle: "default",
|
statusBarStyle: "default",
|
||||||
title: "Planarchy",
|
title: "CapaKraken",
|
||||||
},
|
},
|
||||||
openGraph: {
|
openGraph: {
|
||||||
title: "plANARCHY — Resource Planning",
|
title: "CapaKraken — Resource & Capacity Planning",
|
||||||
description: "Estimates, staffing, chargeability, and timelines in one workspace.",
|
description: "Estimates, staffing, chargeability, and timelines in one workspace.",
|
||||||
images: [{ url: "/og-image.png", width: 1024, height: 1024, alt: "plANARCHY Logo" }],
|
images: [{ url: "/og-image.png", width: 1024, height: 1024, alt: "CapaKraken Logo" }],
|
||||||
type: "website",
|
type: "website",
|
||||||
},
|
},
|
||||||
twitter: {
|
twitter: {
|
||||||
card: "summary_large_image",
|
card: "summary_large_image",
|
||||||
title: "plANARCHY — Resource Planning",
|
title: "CapaKraken — Resource & Capacity Planning",
|
||||||
description: "Estimates, staffing, chargeability, and timelines in one workspace.",
|
description: "Estimates, staffing, chargeability, and timelines in one workspace.",
|
||||||
images: ["/og-image.png"],
|
images: ["/og-image.png"],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ export function WebhooksClient() {
|
|||||||
<div>
|
<div>
|
||||||
<h1 className="text-2xl font-bold text-gray-900 dark:text-white">Webhooks</h1>
|
<h1 className="text-2xl font-bold text-gray-900 dark:text-white">Webhooks</h1>
|
||||||
<p className="mt-1 text-sm text-gray-500 dark:text-gray-400">
|
<p className="mt-1 text-sm text-gray-500 dark:text-gray-400">
|
||||||
Configure outbound webhooks to notify external services about events in Planarchy.
|
Configure outbound webhooks to notify external services about events in CapaKraken.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<button className={PRIMARY_BUTTON} onClick={openCreateModal}>
|
<button className={PRIMARY_BUTTON} onClick={openCreateModal}>
|
||||||
|
|||||||
@@ -441,7 +441,7 @@ export function EstimateWizard({ onClose }: { onClose: () => void }) {
|
|||||||
<p className="text-xs font-semibold uppercase tracking-[0.24em] text-brand-600">Estimate Wizard</p>
|
<p className="text-xs font-semibold uppercase tracking-[0.24em] text-brand-600">Estimate Wizard</p>
|
||||||
<h2 className="mt-2 text-2xl font-semibold text-gray-900">Create a connected estimate</h2>
|
<h2 className="mt-2 text-2xl font-semibold text-gray-900">Create a connected estimate</h2>
|
||||||
<p className="mt-1 text-sm text-gray-500">
|
<p className="mt-1 text-sm text-gray-500">
|
||||||
Rates, resource snapshots, and project linkage are pulled from existing plANARCHY data.
|
Rates, resource snapshots, and project linkage are pulled from existing CapaKraken data.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
@@ -490,7 +490,7 @@ export function EstimateWizard({ onClose }: { onClose: () => void }) {
|
|||||||
<input value={name} onChange={(event) => setName(event.target.value)} className={INPUT_CLS} placeholder="CGI Breakdown Q2 2026" />
|
<input value={name} onChange={(event) => setName(event.target.value)} className={INPUT_CLS} placeholder="CGI Breakdown Q2 2026" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label className={LABEL_CLS}>Linked Project <InfoTooltip content="Link to an existing plANARCHY project. This enables automatic date-based phasing and planning handoff." /></label>
|
<label className={LABEL_CLS}>Linked Project <InfoTooltip content="Link to an existing CapaKraken project. This enables automatic date-based phasing and planning handoff." /></label>
|
||||||
<ProjectCombobox value={projectId} onChange={setProjectId} placeholder="Link to project" />
|
<ProjectCombobox value={projectId} onChange={setProjectId} placeholder="Link to project" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -640,7 +640,7 @@ export function EstimateWizard({ onClose }: { onClose: () => void }) {
|
|||||||
<div key={line.id} className="rounded-3xl border border-gray-100 p-4">
|
<div key={line.id} className="rounded-3xl border border-gray-100 p-4">
|
||||||
<div className="grid gap-4 lg:grid-cols-2">
|
<div className="grid gap-4 lg:grid-cols-2">
|
||||||
<div>
|
<div>
|
||||||
<label className={LABEL_CLS}>Resource <InfoTooltip content="Link to a live plANARCHY resource. Auto-fills rates, chapter, and role." /></label>
|
<label className={LABEL_CLS}>Resource <InfoTooltip content="Link to a live CapaKraken resource. Auto-fills rates, chapter, and role." /></label>
|
||||||
<ResourceCombobox value={line.resourceId} onChange={(resourceId) => applyResource(resourceId, line.id)} placeholder="Search resource" />
|
<ResourceCombobox value={line.resourceId} onChange={(resourceId) => applyResource(resourceId, line.id)} placeholder="Search resource" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -336,7 +336,7 @@ export function DemandLineEditor({
|
|||||||
|
|
||||||
<div className="mb-4 grid gap-4 md:grid-cols-2">
|
<div className="mb-4 grid gap-4 md:grid-cols-2">
|
||||||
<label>
|
<label>
|
||||||
<span className={LABEL_CLS}>Linked resource <InfoTooltip content="Link to a plANARCHY resource. Live-linked rates refresh automatically; manual overrides are persisted." /></span>
|
<span className={LABEL_CLS}>Linked resource <InfoTooltip content="Link to a CapaKraken resource. Live-linked rates refresh automatically; manual overrides are persisted." /></span>
|
||||||
<select
|
<select
|
||||||
className={INPUT_CLS}
|
className={INPUT_CLS}
|
||||||
value={line.resourceId ?? ""}
|
value={line.resourceId ?? ""}
|
||||||
@@ -353,7 +353,7 @@ export function DemandLineEditor({
|
|||||||
<div className="rounded-2xl bg-gray-50 px-4 py-3">
|
<div className="rounded-2xl bg-gray-50 px-4 py-3">
|
||||||
<p className="text-xs uppercase tracking-wide text-gray-400">Snapshot behavior</p>
|
<p className="text-xs uppercase tracking-wide text-gray-400">Snapshot behavior</p>
|
||||||
<p className="mt-1 text-sm text-gray-700">
|
<p className="mt-1 text-sm text-gray-700">
|
||||||
Linked resources refresh from live plANARCHY rates when a rate is set to live mode. Manual overrides are persisted on the demand line.
|
Linked resources refresh from live CapaKraken rates when a rate is set to live mode. Manual overrides are persisted on the demand line.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -381,9 +381,9 @@ function SidebarContent({
|
|||||||
{!sidebarCollapsed && (
|
{!sidebarCollapsed && (
|
||||||
<div className="overflow-hidden">
|
<div className="overflow-hidden">
|
||||||
<h1 className="font-display text-xl font-semibold text-gray-900 dark:text-gray-50">
|
<h1 className="font-display text-xl font-semibold text-gray-900 dark:text-gray-50">
|
||||||
Pl<span className="text-brand-600">anarchy</span>
|
Capa<span className="text-brand-600">Kraken</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-xs uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400">Resource Planning</p>
|
<p className="text-xs uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400">Resource & Capacity Planning</p>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -852,7 +852,7 @@ export function AppShell({ children, userRole = "USER" }: { children: React.Reac
|
|||||||
<HamburgerIcon />
|
<HamburgerIcon />
|
||||||
</button>
|
</button>
|
||||||
<span className="ml-3 font-display text-sm font-semibold text-gray-900 dark:text-gray-50">
|
<span className="ml-3 font-display text-sm font-semibold text-gray-900 dark:text-gray-50">
|
||||||
Pl<span className="text-brand-600">anarchy</span>
|
Capa<span className="text-brand-600">Kraken</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<PageTransition>{children}</PageTransition>
|
<PageTransition>{children}</PageTransition>
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ export function InstallPrompt() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="min-w-0 flex-1">
|
<div className="min-w-0 flex-1">
|
||||||
<p className="text-sm font-medium text-gray-900 dark:text-gray-50">
|
<p className="text-sm font-medium text-gray-900 dark:text-gray-50">
|
||||||
Install Planarchy
|
Install CapaKraken
|
||||||
</p>
|
</p>
|
||||||
<p className="text-xs text-gray-500 dark:text-gray-400">
|
<p className="text-xs text-gray-500 dark:text-gray-400">
|
||||||
Add to home screen for quick access
|
Add to home screen for quick access
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ export function AllocationReport({ title, generatedAt, rows }: AllocationReportP
|
|||||||
))}
|
))}
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<Text style={styles.footer}>plANARCHY · Confidential · {rows.length} allocations</Text>
|
<Text style={styles.footer}>CapaKraken · Confidential · {rows.length} allocations</Text>
|
||||||
</Page>
|
</Page>
|
||||||
</Document>
|
</Document>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ export function SkillMatrixUpload({ resourceId, isOwner, onClose, onSuccess }: P
|
|||||||
|
|
||||||
{preview.matchedRoleName && (
|
{preview.matchedRoleName && (
|
||||||
<p className="text-xs text-gray-600">
|
<p className="text-xs text-gray-600">
|
||||||
<span className="font-medium">Area of expertise</span> matched to plANARCHY role:{" "}
|
<span className="font-medium">Area of expertise</span> matched to CapaKraken role:{" "}
|
||||||
<span className="font-semibold text-brand-700">{preview.matchedRoleName}</span>
|
<span className="font-semibold text-brand-700">{preview.matchedRoleName}</span>
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ export function StaffingPanel() {
|
|||||||
<div className="app-surface max-w-xl p-4">
|
<div className="app-surface max-w-xl p-4">
|
||||||
<p className="text-sm font-medium text-gray-900 dark:text-gray-100">How scoring works</p>
|
<p className="text-sm font-medium text-gray-900 dark:text-gray-100">How scoring works</p>
|
||||||
<p className="mt-1 text-sm text-gray-500">
|
<p className="mt-1 text-sm text-gray-500">
|
||||||
plANARCHY blends skill fit, free capacity, cost, and current utilization. Add the must-have skills first, then narrow the date window to get cleaner results.
|
CapaKraken blends skill fit, free capacity, cost, and current utilization. Add the must-have skills first, then narrow the date window to get cleaner results.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ export const TOOL_DEFINITIONS: ToolDef[] = [
|
|||||||
type: "function",
|
type: "function",
|
||||||
function: {
|
function: {
|
||||||
name: "navigate_to_page",
|
name: "navigate_to_page",
|
||||||
description: "Navigate the user to a specific page in Planarchy, optionally with filters. Use this when the user wants to see data on a specific page (e.g. 'show me on the timeline', 'open the resources page').",
|
description: "Navigate the user to a specific page in CapaKraken, optionally with filters. Use this when the user wants to see data on a specific page (e.g. 'show me on the timeline', 'open the resources page').",
|
||||||
parameters: {
|
parameters: {
|
||||||
type: "object",
|
type: "object",
|
||||||
properties: {
|
properties: {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import { TOOL_DEFINITIONS, executeTool, type ToolContext, type ToolAction } from
|
|||||||
|
|
||||||
const MAX_TOOL_ITERATIONS = 8;
|
const MAX_TOOL_ITERATIONS = 8;
|
||||||
|
|
||||||
const SYSTEM_PROMPT = `Du bist der plANARCHY-Assistent — ein hilfreicher AI-Assistent für Ressourcenplanung und Projektmanagement in einer 3D-Produktionsumgebung.
|
const SYSTEM_PROMPT = `Du bist der CapaKraken-Assistent — ein hilfreicher AI-Assistent für Ressourcenplanung und Projektmanagement in einer 3D-Produktionsumgebung.
|
||||||
|
|
||||||
Deine Fähigkeiten:
|
Deine Fähigkeiten:
|
||||||
- Fragen über Ressourcen, Projekte, Allokationen, Budget, Urlaub, Estimates, Org-Struktur, Rollen, Blueprints, Rate Cards beantworten
|
- Fragen über Ressourcen, Projekte, Allokationen, Budget, Urlaub, Estimates, Org-Struktur, Rollen, Blueprints, Rate Cards beantworten
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ async function notifyVacationStatus(
|
|||||||
if (resource.user.email) {
|
if (resource.user.email) {
|
||||||
void sendEmail({
|
void sendEmail({
|
||||||
to: resource.user.email,
|
to: resource.user.email,
|
||||||
subject: `Planarchy — ${title}`,
|
subject: `CapaKraken — ${title}`,
|
||||||
text: body,
|
text: body,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ export const webhookRouter = createTRPCRouter({
|
|||||||
payload: {
|
payload: {
|
||||||
webhookId: wh.id,
|
webhookId: wh.id,
|
||||||
webhookName: wh.name,
|
webhookName: wh.name,
|
||||||
message: "This is a test payload from Planarchy.",
|
message: "This is a test payload from CapaKraken.",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user