refactor: rename packages to @paperclipai and CLI binary to paperclipai

Rename all workspace packages from @paperclip/* to @paperclipai/* and
the CLI binary from `paperclip` to `paperclipai` in preparation for
npm publishing. Bump CLI version to 0.1.0 and add package metadata
(description, keywords, license, repository, files). Update all
imports, documentation, user-facing messages, and tests accordingly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dotta
2026-03-03 08:45:26 -06:00
parent 5a5549fc54
commit f60c1001ec
196 changed files with 501 additions and 490 deletions

View File

@@ -37,7 +37,7 @@ function BootstrapPendingPage() {
the first admin invite URL:
</p>
<pre className="mt-4 overflow-x-auto rounded-md border border-border bg-muted/30 p-3 text-xs">
{`pnpm paperclip auth bootstrap-ceo`}
{`pnpm paperclipai auth bootstrap-ceo`}
</pre>
</div>
</div>

View File

@@ -1,7 +1,7 @@
import type { UIAdapterModule } from "../types";
import { parseClaudeStdoutLine } from "@paperclip/adapter-claude-local/ui";
import { parseClaudeStdoutLine } from "@paperclipai/adapter-claude-local/ui";
import { ClaudeLocalConfigFields } from "./config-fields";
import { buildClaudeLocalConfig } from "@paperclip/adapter-claude-local/ui";
import { buildClaudeLocalConfig } from "@paperclipai/adapter-claude-local/ui";
export const claudeLocalUIAdapter: UIAdapterModule = {
type: "claude_local",

View File

@@ -1,7 +1,7 @@
import type { UIAdapterModule } from "../types";
import { parseCodexStdoutLine } from "@paperclip/adapter-codex-local/ui";
import { parseCodexStdoutLine } from "@paperclipai/adapter-codex-local/ui";
import { CodexLocalConfigFields } from "./config-fields";
import { buildCodexLocalConfig } from "@paperclip/adapter-codex-local/ui";
import { buildCodexLocalConfig } from "@paperclipai/adapter-codex-local/ui";
export const codexLocalUIAdapter: UIAdapterModule = {
type: "codex_local",

View File

@@ -1,6 +1,6 @@
import type { UIAdapterModule } from "../types";
import { parseOpenClawStdoutLine } from "@paperclip/adapter-openclaw/ui";
import { buildOpenClawConfig } from "@paperclip/adapter-openclaw/ui";
import { parseOpenClawStdoutLine } from "@paperclipai/adapter-openclaw/ui";
import { buildOpenClawConfig } from "@paperclipai/adapter-openclaw/ui";
import { OpenClawConfigFields } from "./config-fields";
export const openClawUIAdapter: UIAdapterModule = {

View File

@@ -1,8 +1,8 @@
import type { ComponentType } from "react";
import type { CreateConfigValues } from "@paperclip/adapter-utils";
import type { CreateConfigValues } from "@paperclipai/adapter-utils";
// Re-export shared types so local consumers don't need to change imports
export type { TranscriptEntry, StdoutLineParser, CreateConfigValues } from "@paperclip/adapter-utils";
export type { TranscriptEntry, StdoutLineParser, CreateConfigValues } from "@paperclipai/adapter-utils";
export interface AdapterConfigFieldsProps {
mode: "create" | "edit";
@@ -25,7 +25,7 @@ export interface AdapterConfigFieldsProps {
export interface UIAdapterModule {
type: string;
label: string;
parseStdoutLine: (line: string, ts: string) => import("@paperclip/adapter-utils").TranscriptEntry[];
parseStdoutLine: (line: string, ts: string) => import("@paperclipai/adapter-utils").TranscriptEntry[];
ConfigFields: ComponentType<AdapterConfigFieldsProps>;
buildAdapterConfig: (values: CreateConfigValues) => Record<string, unknown>;
}

View File

@@ -1,4 +1,4 @@
import type { AgentAdapterType, JoinRequest } from "@paperclip/shared";
import type { AgentAdapterType, JoinRequest } from "@paperclipai/shared";
import { api } from "./client";
type InviteSummary = {

View File

@@ -1,4 +1,4 @@
import type { ActivityEvent } from "@paperclip/shared";
import type { ActivityEvent } from "@paperclipai/shared";
import { api } from "./client";
export interface RunForIssue {

View File

@@ -7,8 +7,8 @@ import type {
HeartbeatRun,
Approval,
AgentConfigRevision,
} from "@paperclip/shared";
import { isUuidLike, normalizeAgentUrlKey } from "@paperclip/shared";
} from "@paperclipai/shared";
import { isUuidLike, normalizeAgentUrlKey } from "@paperclipai/shared";
import { ApiError, api } from "./client";
export interface AgentKey {

View File

@@ -1,4 +1,4 @@
import type { Approval, ApprovalComment, Issue } from "@paperclip/shared";
import type { Approval, ApprovalComment, Issue } from "@paperclipai/shared";
import { api } from "./client";
export const approvalsApi = {

View File

@@ -1,4 +1,4 @@
import type { AssetImage } from "@paperclip/shared";
import type { AssetImage } from "@paperclipai/shared";
import { api } from "./client";
export const assetsApi = {

View File

@@ -5,7 +5,7 @@ import type {
CompanyPortabilityImportResult,
CompanyPortabilityPreviewRequest,
CompanyPortabilityPreviewResult,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import { api } from "./client";
export type CompanyStats = Record<string, { agentCount: number; issueCount: number }>;

View File

@@ -1,4 +1,4 @@
import type { CostSummary, CostByAgent } from "@paperclip/shared";
import type { CostSummary, CostByAgent } from "@paperclipai/shared";
import { api } from "./client";
export interface CostByProject {

View File

@@ -1,4 +1,4 @@
import type { DashboardSummary } from "@paperclip/shared";
import type { DashboardSummary } from "@paperclipai/shared";
import { api } from "./client";
export const dashboardApi = {

View File

@@ -1,4 +1,4 @@
import type { Goal } from "@paperclip/shared";
import type { Goal } from "@paperclipai/shared";
import { api } from "./client";
export const goalsApi = {

View File

@@ -1,4 +1,4 @@
import type { HeartbeatRun, HeartbeatRunEvent } from "@paperclip/shared";
import type { HeartbeatRun, HeartbeatRunEvent } from "@paperclipai/shared";
import { api } from "./client";
export interface ActiveRunForIssue extends HeartbeatRun {

View File

@@ -1,4 +1,4 @@
import type { Approval, Issue, IssueAttachment, IssueComment, IssueLabel } from "@paperclip/shared";
import type { Approval, Issue, IssueAttachment, IssueComment, IssueLabel } from "@paperclipai/shared";
import { api } from "./client";
export const issuesApi = {

View File

@@ -1,4 +1,4 @@
import type { Project, ProjectWorkspace } from "@paperclip/shared";
import type { Project, ProjectWorkspace } from "@paperclipai/shared";
import { api } from "./client";
function withCompanyScope(path: string, companyId?: string) {

View File

@@ -1,4 +1,4 @@
import type { CompanySecret, SecretProviderDescriptor, SecretProvider } from "@paperclip/shared";
import type { CompanySecret, SecretProviderDescriptor, SecretProvider } from "@paperclipai/shared";
import { api } from "./client";
export const secretsApi = {

View File

@@ -1,4 +1,4 @@
import type { SidebarBadges } from "@paperclip/shared";
import type { SidebarBadges } from "@paperclipai/shared";
import { api } from "./client";
export const sidebarBadgesApi = {

View File

@@ -1,7 +1,7 @@
import { useEffect, useMemo, useRef, useState, type MutableRefObject } from "react";
import { Link } from "@/lib/router";
import { useQuery } from "@tanstack/react-query";
import type { Issue, LiveEvent } from "@paperclip/shared";
import type { Issue, LiveEvent } from "@paperclipai/shared";
import { heartbeatsApi, type LiveRunForIssue } from "../api/heartbeats";
import { issuesApi } from "../api/issues";
import { getUIAdapter } from "../adapters";

View File

@@ -1,4 +1,4 @@
import type { HeartbeatRun } from "@paperclip/shared";
import type { HeartbeatRun } from "@paperclipai/shared";
/* ---- Utilities ---- */

View File

@@ -2,7 +2,7 @@ import { Link } from "@/lib/router";
import { Identity } from "./Identity";
import { timeAgo } from "../lib/timeAgo";
import { cn } from "../lib/utils";
import { deriveProjectUrlKey, type ActivityEvent, type Agent } from "@paperclip/shared";
import { deriveProjectUrlKey, type ActivityEvent, type Agent } from "@paperclipai/shared";
const ACTION_VERBS: Record<string, string> = {
"issue.created": "created",

View File

@@ -1,12 +1,12 @@
import { useState, useEffect, useRef, useMemo } from "react";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { AGENT_ADAPTER_TYPES } from "@paperclip/shared";
import { AGENT_ADAPTER_TYPES } from "@paperclipai/shared";
import type {
Agent,
AdapterEnvironmentTestResult,
CompanySecret,
EnvBinding,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import type { AdapterModel } from "../api/agents";
import { agentsApi } from "../api/agents";
import { secretsApi } from "../api/secrets";
@@ -39,10 +39,10 @@ import { ChoosePathButton } from "./PathInstructionsModal";
/* ---- Create mode values ---- */
// Canonical type lives in @paperclip/adapter-utils; re-exported here
// Canonical type lives in @paperclipai/adapter-utils; re-exported here
// so existing imports from this file keep working.
export type { CreateConfigValues } from "@paperclip/adapter-utils";
import type { CreateConfigValues } from "@paperclip/adapter-utils";
export type { CreateConfigValues } from "@paperclipai/adapter-utils";
import type { CreateConfigValues } from "@paperclipai/adapter-utils";
/* ---- Props ---- */

View File

@@ -43,7 +43,7 @@ import {
Fingerprint,
type LucideIcon,
} from "lucide-react";
import { AGENT_ICON_NAMES, type AgentIconName } from "@paperclip/shared";
import { AGENT_ICON_NAMES, type AgentIconName } from "@paperclipai/shared";
import {
Popover,
PopoverContent,

View File

@@ -1,6 +1,6 @@
import { useQuery } from "@tanstack/react-query";
import { Link } from "@/lib/router";
import type { Agent, AgentRuntimeState } from "@paperclip/shared";
import type { Agent, AgentRuntimeState } from "@paperclipai/shared";
import { agentsApi } from "../api/agents";
import { useCompany } from "../context/CompanyContext";
import { queryKeys } from "../lib/queryKeys";

View File

@@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button";
import { Identity } from "./Identity";
import { typeLabel, typeIcon, defaultTypeIcon, ApprovalPayloadRenderer } from "./ApprovalPayload";
import { timeAgo } from "../lib/timeAgo";
import type { Approval, Agent } from "@paperclip/shared";
import type { Approval, Agent } from "@paperclipai/shared";
function statusIcon(status: string) {
if (status === "approved") return <CheckCircle2 className="h-3.5 w-3.5 text-green-600 dark:text-green-400" />;

View File

@@ -1,6 +1,6 @@
import { useEffect, useMemo, useRef, useState, type ChangeEvent } from "react";
import { Link } from "react-router-dom";
import type { IssueComment, Agent } from "@paperclip/shared";
import type { IssueComment, Agent } from "@paperclipai/shared";
import { Button } from "@/components/ui/button";
import { Paperclip } from "lucide-react";
import { Identity } from "./Identity";

View File

@@ -27,7 +27,7 @@ import {
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
import type { Company } from "@paperclip/shared";
import type { Company } from "@paperclipai/shared";
import { CompanyPatternIcon } from "./CompanyPatternIcon";
const ORDER_STORAGE_KEY = "paperclip.companyOrder";

View File

@@ -1,8 +1,8 @@
import { useState } from "react";
import { Link } from "@/lib/router";
import { useQuery } from "@tanstack/react-query";
import type { Goal } from "@paperclip/shared";
import { GOAL_STATUSES, GOAL_LEVELS } from "@paperclip/shared";
import type { Goal } from "@paperclipai/shared";
import { GOAL_STATUSES, GOAL_LEVELS } from "@paperclipai/shared";
import { agentsApi } from "../api/agents";
import { goalsApi } from "../api/goals";
import { useCompany } from "../context/CompanyContext";

View File

@@ -1,4 +1,4 @@
import type { Goal } from "@paperclip/shared";
import type { Goal } from "@paperclipai/shared";
import { Link } from "@/lib/router";
import { StatusBadge } from "./StatusBadge";
import { ChevronRight } from "lucide-react";

View File

@@ -1,6 +1,6 @@
import { useState } from "react";
import { Link } from "@/lib/router";
import type { Issue } from "@paperclip/shared";
import type { Issue } from "@paperclipai/shared";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { agentsApi } from "../api/agents";
import { authApi } from "../api/auth";

View File

@@ -19,7 +19,7 @@ import { Checkbox } from "@/components/ui/checkbox";
import { Collapsible, CollapsibleTrigger, CollapsibleContent } from "@/components/ui/collapsible";
import { CircleDot, Plus, Filter, ArrowUpDown, Layers, Check, X, ChevronRight, List, Columns3, User, Search } from "lucide-react";
import { KanbanBoard } from "./KanbanBoard";
import type { Issue } from "@paperclip/shared";
import type { Issue } from "@paperclipai/shared";
/* ── Helpers ── */

View File

@@ -20,7 +20,7 @@ import {
import { StatusIcon } from "./StatusIcon";
import { PriorityIcon } from "./PriorityIcon";
import { Identity } from "./Identity";
import type { Issue } from "@paperclip/shared";
import type { Issue } from "@paperclipai/shared";
const boardStatuses = [
"backlog",

View File

@@ -1,7 +1,7 @@
import { useEffect, useMemo, useRef, useState, type MutableRefObject } from "react";
import { Link } from "@/lib/router";
import { useQuery, useQueryClient } from "@tanstack/react-query";
import type { LiveEvent } from "@paperclip/shared";
import type { LiveEvent } from "@paperclipai/shared";
import { heartbeatsApi, type LiveRunForIssue } from "../api/heartbeats";
import { getUIAdapter } from "../adapters";
import type { TranscriptEntry } from "../adapters";

View File

@@ -27,7 +27,7 @@ import {
thematicBreakPlugin,
type RealmPlugin,
} from "@mdxeditor/editor";
import { buildProjectMentionHref, parseProjectMentionHref } from "@paperclip/shared";
import { buildProjectMentionHref, parseProjectMentionHref } from "@paperclipai/shared";
import { cn } from "../lib/utils";
/* ---- Mention types ---- */

View File

@@ -5,7 +5,7 @@ import { useDialog } from "../context/DialogContext";
import { useCompany } from "../context/CompanyContext";
import { agentsApi } from "../api/agents";
import { queryKeys } from "../lib/queryKeys";
import { AGENT_ROLES } from "@paperclip/shared";
import { AGENT_ROLES } from "@paperclipai/shared";
import {
Dialog,
DialogContent,

View File

@@ -1,6 +1,6 @@
import { useRef, useState } from "react";
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { GOAL_STATUSES, GOAL_LEVELS } from "@paperclip/shared";
import { GOAL_STATUSES, GOAL_LEVELS } from "@paperclipai/shared";
import { useDialog } from "../context/DialogContext";
import { useCompany } from "../context/CompanyContext";
import { goalsApi } from "../api/goals";

View File

@@ -27,7 +27,7 @@ import {
Github,
GitBranch,
} from "lucide-react";
import { PROJECT_COLORS } from "@paperclip/shared";
import { PROJECT_COLORS } from "@paperclipai/shared";
import { cn } from "../lib/utils";
import { MarkdownEditor, type MarkdownEditorRef } from "./MarkdownEditor";
import { StatusBadge } from "./StatusBadge";

View File

@@ -1,7 +1,7 @@
import { useState } from "react";
import { Link } from "@/lib/router";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import type { Project } from "@paperclip/shared";
import type { Project } from "@paperclipai/shared";
import { StatusBadge } from "./StatusBadge";
import { formatDate } from "../lib/utils";
import { goalsApi } from "../api/goals";

View File

@@ -14,7 +14,7 @@ import {
CollapsibleContent,
CollapsibleTrigger,
} from "@/components/ui/collapsible";
import type { Agent } from "@paperclip/shared";
import type { Agent } from "@paperclipai/shared";
/** BFS sort: roots first (no reportsTo), then their direct reports, etc. */
function sortByHierarchy(agents: Agent[]): Agent[] {

View File

@@ -25,7 +25,7 @@ import {
CollapsibleContent,
CollapsibleTrigger,
} from "@/components/ui/collapsible";
import type { Project } from "@paperclip/shared";
import type { Project } from "@paperclipai/shared";
function SortableProjectItem({
activeProjectRef,

View File

@@ -1,4 +1,4 @@
import type { CreateConfigValues } from "@paperclip/adapter-utils";
import type { CreateConfigValues } from "@paperclipai/adapter-utils";
export const defaultCreateValues: CreateConfigValues = {
adapterType: "claude_local",

View File

@@ -8,7 +8,7 @@ import {
type ReactNode,
} from "react";
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import type { Company } from "@paperclip/shared";
import type { Company } from "@paperclipai/shared";
import { companiesApi } from "../api/companies";
import { ApiError } from "../api/client";
import { queryKeys } from "../lib/queryKeys";

View File

@@ -1,6 +1,6 @@
import { useEffect, useRef, type ReactNode } from "react";
import { useQueryClient, type QueryClient } from "@tanstack/react-query";
import type { Agent, Issue, LiveEvent } from "@paperclip/shared";
import type { Agent, Issue, LiveEvent } from "@paperclipai/shared";
import { useCompany } from "./CompanyContext";
import type { ToastInput } from "./ToastContext";
import { useToast } from "./ToastContext";

View File

@@ -1,5 +1,5 @@
import { useCallback, useEffect, useMemo, useState } from "react";
import type { Project } from "@paperclip/shared";
import type { Project } from "@paperclipai/shared";
import {
getProjectOrderStorageKey,
PROJECT_ORDER_UPDATED_EVENT,

View File

@@ -1,4 +1,4 @@
import type { Project } from "@paperclip/shared";
import type { Project } from "@paperclipai/shared";
export const PROJECT_ORDER_UPDATED_EVENT = "paperclip:project-order-updated";
const PROJECT_ORDER_STORAGE_PREFIX = "paperclip.projectOrder";

View File

@@ -1,6 +1,6 @@
import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";
import { deriveAgentUrlKey, deriveProjectUrlKey } from "@paperclip/shared";
import { deriveAgentUrlKey, deriveProjectUrlKey } from "@paperclipai/shared";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));

View File

@@ -19,7 +19,7 @@ import {
SelectValue,
} from "@/components/ui/select";
import { History } from "lucide-react";
import type { Agent } from "@paperclip/shared";
import type { Agent } from "@paperclipai/shared";
export function Activity() {
const { selectedCompanyId } = useCompany();

View File

@@ -55,7 +55,7 @@ import {
} from "lucide-react";
import { Input } from "@/components/ui/input";
import { AgentIcon, AgentIconPicker } from "../components/AgentIconPicker";
import { isUuidLike, type Agent, type HeartbeatRun, type HeartbeatRunEvent, type AgentRuntimeState } from "@paperclip/shared";
import { isUuidLike, type Agent, type HeartbeatRun, type HeartbeatRunEvent, type AgentRuntimeState } from "@paperclipai/shared";
import { agentRouteRef } from "../lib/utils";
const runStatusIcons: Record<string, { icon: typeof CheckCircle2; color: string }> = {

View File

@@ -18,7 +18,7 @@ import { PageTabBar } from "../components/PageTabBar";
import { Tabs } from "@/components/ui/tabs";
import { Button } from "@/components/ui/button";
import { Bot, Plus, List, GitBranch, SlidersHorizontal } from "lucide-react";
import type { Agent } from "@paperclip/shared";
import type { Agent } from "@paperclipai/shared";
const adapterLabels: Record<string, string> = {
claude_local: "Claude",

View File

@@ -13,7 +13,7 @@ import { PageSkeleton } from "../components/PageSkeleton";
import { Button } from "@/components/ui/button";
import { Textarea } from "@/components/ui/textarea";
import { CheckCircle2, ChevronRight, Sparkles } from "lucide-react";
import type { ApprovalComment } from "@paperclip/shared";
import type { ApprovalComment } from "@paperclipai/shared";
import { MarkdownBody } from "../components/MarkdownBody";
export function ApprovalDetail() {

View File

@@ -23,7 +23,7 @@ import { Bot, CircleDot, DollarSign, ShieldCheck, LayoutDashboard } from "lucide
import { ActiveAgentsPanel } from "../components/ActiveAgentsPanel";
import { ChartCard, RunActivityChart, PriorityChart, IssueStatusChart, SuccessRateChart } from "../components/ActivityCharts";
import { PageSkeleton } from "../components/PageSkeleton";
import type { Agent, Issue } from "@paperclip/shared";
import type { Agent, Issue } from "@paperclipai/shared";
function getRecentIssues(issues: Issue[]): Issue[] {
return [...issues]

View File

@@ -19,7 +19,7 @@ import { projectUrl } from "../lib/utils";
import { Button } from "@/components/ui/button";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Plus } from "lucide-react";
import type { Goal, Project } from "@paperclip/shared";
import type { Goal, Project } from "@paperclipai/shared";
export function GoalDetail() {
const { goalId } = useParams<{ goalId: string }>();

View File

@@ -39,7 +39,7 @@ import {
} from "lucide-react";
import { Identity } from "../components/Identity";
import { PageTabBar } from "../components/PageTabBar";
import type { HeartbeatRun, Issue, JoinRequest } from "@paperclip/shared";
import type { HeartbeatRun, Issue, JoinRequest } from "@paperclipai/shared";
const STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000; // 24 hours
const FAILED_RUN_STATUSES = new Set(["failed", "timed_out"]);

View File

@@ -6,8 +6,8 @@ import { authApi } from "../api/auth";
import { healthApi } from "../api/health";
import { queryKeys } from "../lib/queryKeys";
import { Button } from "@/components/ui/button";
import { AGENT_ADAPTER_TYPES } from "@paperclip/shared";
import type { AgentAdapterType, JoinRequest } from "@paperclip/shared";
import { AGENT_ADAPTER_TYPES } from "@paperclipai/shared";
import type { AgentAdapterType, JoinRequest } from "@paperclipai/shared";
type JoinType = "human" | "agent";
const joinAdapterOptions: AgentAdapterType[] = [

View File

@@ -43,8 +43,8 @@ import {
SlidersHorizontal,
Trash2,
} from "lucide-react";
import type { ActivityEvent } from "@paperclip/shared";
import type { Agent, IssueAttachment } from "@paperclip/shared";
import type { ActivityEvent } from "@paperclipai/shared";
import type { Agent, IssueAttachment } from "@paperclipai/shared";
type CommentReassignment = {
assigneeAgentId: string | null;

View File

@@ -10,7 +10,7 @@ import { EmptyState } from "../components/EmptyState";
import { PageSkeleton } from "../components/PageSkeleton";
import { AgentIcon } from "../components/AgentIconPicker";
import { Network } from "lucide-react";
import type { Agent } from "@paperclip/shared";
import type { Agent } from "@paperclipai/shared";
// Layout constants
const CARD_W = 200;

View File

@@ -1,7 +1,7 @@
import { useEffect, useMemo, useState, useRef } from "react";
import { useParams, useNavigate, useLocation, Navigate } from "@/lib/router";
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { PROJECT_COLORS, isUuidLike } from "@paperclip/shared";
import { PROJECT_COLORS, isUuidLike } from "@paperclipai/shared";
import { projectsApi } from "../api/projects";
import { issuesApi } from "../api/issues";
import { agentsApi } from "../api/agents";