diff --git a/README.md b/README.md
index b527ad1f..6bebbce9 100644
--- a/README.md
+++ b/README.md
@@ -172,7 +172,7 @@ Paperclip handles the hard orchestration details correctly.
Open source. Self-hosted. No Paperclip account required.
```bash
-npx paperclip onboard
+npx paperclipai onboard
```
Or manually:
diff --git a/cli/package.json b/cli/package.json
index da9736c2..1fd8e99f 100644
--- a/cli/package.json
+++ b/cli/package.json
@@ -1,11 +1,22 @@
{
- "name": "@paperclip/cli",
- "version": "0.0.1",
- "private": true,
+ "name": "paperclipai",
+ "version": "0.1.0",
+ "description": "Paperclip CLI — orchestrate AI agent teams to run a business",
"type": "module",
"bin": {
- "paperclip": "./dist/index.js"
+ "paperclipai": "./dist/index.js"
},
+ "keywords": ["paperclip", "ai", "agents", "orchestration", "cli"],
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/paperclipai/paperclip.git",
+ "directory": "cli"
+ },
+ "homepage": "https://github.com/paperclipai/paperclip",
+ "files": [
+ "dist"
+ ],
"scripts": {
"dev": "tsx src/index.ts",
"build": "tsc",
@@ -13,13 +24,13 @@
},
"dependencies": {
"@clack/prompts": "^0.10.0",
- "@paperclip/adapter-claude-local": "workspace:*",
- "@paperclip/adapter-codex-local": "workspace:*",
- "@paperclip/adapter-openclaw": "workspace:*",
- "@paperclip/adapter-utils": "workspace:*",
- "@paperclip/db": "workspace:*",
- "@paperclip/server": "workspace:*",
- "@paperclip/shared": "workspace:*",
+ "@paperclipai/adapter-claude-local": "workspace:*",
+ "@paperclipai/adapter-codex-local": "workspace:*",
+ "@paperclipai/adapter-openclaw": "workspace:*",
+ "@paperclipai/adapter-utils": "workspace:*",
+ "@paperclipai/db": "workspace:*",
+ "@paperclipai/server": "workspace:*",
+ "@paperclipai/shared": "workspace:*",
"drizzle-orm": "0.38.4",
"dotenv": "^17.0.1",
"commander": "^13.1.0",
diff --git a/cli/src/__tests__/company-delete.test.ts b/cli/src/__tests__/company-delete.test.ts
index a0cf5bf0..6858a3d1 100644
--- a/cli/src/__tests__/company-delete.test.ts
+++ b/cli/src/__tests__/company-delete.test.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import type { Company } from "@paperclip/shared";
+import type { Company } from "@paperclipai/shared";
import { assertDeleteConfirmation, resolveCompanyForDeletion } from "../commands/client/company.js";
function makeCompany(overrides: Partial): Company {
diff --git a/cli/src/adapters/http/index.ts b/cli/src/adapters/http/index.ts
index f4b48cdc..25003d94 100644
--- a/cli/src/adapters/http/index.ts
+++ b/cli/src/adapters/http/index.ts
@@ -1,4 +1,4 @@
-import type { CLIAdapterModule } from "@paperclip/adapter-utils";
+import type { CLIAdapterModule } from "@paperclipai/adapter-utils";
import { printHttpStdoutEvent } from "./format-event.js";
export const httpCLIAdapter: CLIAdapterModule = {
diff --git a/cli/src/adapters/index.ts b/cli/src/adapters/index.ts
index 20fd16db..17067548 100644
--- a/cli/src/adapters/index.ts
+++ b/cli/src/adapters/index.ts
@@ -1,2 +1,2 @@
export { getCLIAdapter } from "./registry.js";
-export type { CLIAdapterModule } from "@paperclip/adapter-utils";
+export type { CLIAdapterModule } from "@paperclipai/adapter-utils";
diff --git a/cli/src/adapters/process/index.ts b/cli/src/adapters/process/index.ts
index be521b12..9df83c4b 100644
--- a/cli/src/adapters/process/index.ts
+++ b/cli/src/adapters/process/index.ts
@@ -1,4 +1,4 @@
-import type { CLIAdapterModule } from "@paperclip/adapter-utils";
+import type { CLIAdapterModule } from "@paperclipai/adapter-utils";
import { printProcessStdoutEvent } from "./format-event.js";
export const processCLIAdapter: CLIAdapterModule = {
diff --git a/cli/src/adapters/registry.ts b/cli/src/adapters/registry.ts
index 5b65874e..b97dd5df 100644
--- a/cli/src/adapters/registry.ts
+++ b/cli/src/adapters/registry.ts
@@ -1,7 +1,7 @@
-import type { CLIAdapterModule } from "@paperclip/adapter-utils";
-import { printClaudeStreamEvent } from "@paperclip/adapter-claude-local/cli";
-import { printCodexStreamEvent } from "@paperclip/adapter-codex-local/cli";
-import { printOpenClawStreamEvent } from "@paperclip/adapter-openclaw/cli";
+import type { CLIAdapterModule } from "@paperclipai/adapter-utils";
+import { printClaudeStreamEvent } from "@paperclipai/adapter-claude-local/cli";
+import { printCodexStreamEvent } from "@paperclipai/adapter-codex-local/cli";
+import { printOpenClawStreamEvent } from "@paperclipai/adapter-openclaw/cli";
import { processCLIAdapter } from "./process/index.js";
import { httpCLIAdapter } from "./http/index.js";
diff --git a/cli/src/checks/config-check.ts b/cli/src/checks/config-check.ts
index e74a24d0..bf3f6361 100644
--- a/cli/src/checks/config-check.ts
+++ b/cli/src/checks/config-check.ts
@@ -10,7 +10,7 @@ export function configCheck(configPath?: string): CheckResult {
status: "fail",
message: `Config file not found at ${filePath}`,
canRepair: false,
- repairHint: "Run `paperclip onboard` to create one",
+ repairHint: "Run `paperclipai onboard` to create one",
};
}
@@ -27,7 +27,7 @@ export function configCheck(configPath?: string): CheckResult {
status: "fail",
message: `Invalid config: ${err instanceof Error ? err.message : String(err)}`,
canRepair: false,
- repairHint: "Run `paperclip configure --section database` (or `paperclip onboard` to recreate)",
+ repairHint: "Run `paperclipai configure --section database` (or `paperclipai onboard` to recreate)",
};
}
}
diff --git a/cli/src/checks/database-check.ts b/cli/src/checks/database-check.ts
index 783d7a4c..43aff1d2 100644
--- a/cli/src/checks/database-check.ts
+++ b/cli/src/checks/database-check.ts
@@ -11,12 +11,12 @@ export async function databaseCheck(config: PaperclipConfig, configPath?: string
status: "fail",
message: "PostgreSQL mode selected but no connection string configured",
canRepair: false,
- repairHint: "Run `paperclip configure --section database`",
+ repairHint: "Run `paperclipai configure --section database`",
};
}
try {
- const { createDb } = await import("@paperclip/db");
+ const { createDb } = await import("@paperclipai/db");
const db = createDb(config.database.connectionString);
await db.execute("SELECT 1");
return {
@@ -62,6 +62,6 @@ export async function databaseCheck(config: PaperclipConfig, configPath?: string
status: "fail",
message: `Unknown database mode: ${String(config.database.mode)}`,
canRepair: false,
- repairHint: "Run `paperclip configure --section database`",
+ repairHint: "Run `paperclipai configure --section database`",
};
}
diff --git a/cli/src/checks/deployment-auth-check.ts b/cli/src/checks/deployment-auth-check.ts
index 404ecdec..580e7e08 100644
--- a/cli/src/checks/deployment-auth-check.ts
+++ b/cli/src/checks/deployment-auth-check.ts
@@ -18,7 +18,7 @@ export function deploymentAuthCheck(config: PaperclipConfig): CheckResult {
status: "fail",
message: `local_trusted requires loopback host binding (found ${config.server.host})`,
canRepair: false,
- repairHint: "Run `paperclip configure --section server` and set host to 127.0.0.1",
+ repairHint: "Run `paperclipai configure --section server` and set host to 127.0.0.1",
};
}
return {
@@ -47,7 +47,7 @@ export function deploymentAuthCheck(config: PaperclipConfig): CheckResult {
status: "fail",
message: "auth.baseUrlMode=explicit requires auth.publicBaseUrl",
canRepair: false,
- repairHint: "Run `paperclip configure --section server` and provide a base URL",
+ repairHint: "Run `paperclipai configure --section server` and provide a base URL",
};
}
@@ -58,7 +58,7 @@ export function deploymentAuthCheck(config: PaperclipConfig): CheckResult {
status: "fail",
message: "authenticated/public requires explicit auth.publicBaseUrl",
canRepair: false,
- repairHint: "Run `paperclip configure --section server` and select public exposure",
+ repairHint: "Run `paperclipai configure --section server` and select public exposure",
};
}
try {
@@ -78,7 +78,7 @@ export function deploymentAuthCheck(config: PaperclipConfig): CheckResult {
status: "fail",
message: "auth.publicBaseUrl is not a valid URL",
canRepair: false,
- repairHint: "Run `paperclip configure --section server` and provide a valid URL",
+ repairHint: "Run `paperclipai configure --section server` and provide a valid URL",
};
}
}
diff --git a/cli/src/checks/llm-check.ts b/cli/src/checks/llm-check.ts
index ca14515b..3a4dd0c7 100644
--- a/cli/src/checks/llm-check.ts
+++ b/cli/src/checks/llm-check.ts
@@ -8,7 +8,7 @@ export async function llmCheck(config: PaperclipConfig): Promise {
status: "warn",
message: "No LLM provider configured",
canRepair: false,
- repairHint: "Run `paperclip configure --section llm` to set one up",
+ repairHint: "Run `paperclipai configure --section llm` to set one up",
};
}
@@ -18,7 +18,7 @@ export async function llmCheck(config: PaperclipConfig): Promise {
status: "warn",
message: `${config.llm.provider} configured but no API key set`,
canRepair: false,
- repairHint: "Run `paperclip configure --section llm`",
+ repairHint: "Run `paperclipai configure --section llm`",
};
}
@@ -46,7 +46,7 @@ export async function llmCheck(config: PaperclipConfig): Promise {
status: "fail",
message: "Claude API key is invalid (401)",
canRepair: false,
- repairHint: "Run `paperclip configure --section llm`",
+ repairHint: "Run `paperclipai configure --section llm`",
};
}
return {
@@ -67,7 +67,7 @@ export async function llmCheck(config: PaperclipConfig): Promise {
status: "fail",
message: "OpenAI API key is invalid (401)",
canRepair: false,
- repairHint: "Run `paperclip configure --section llm`",
+ repairHint: "Run `paperclipai configure --section llm`",
};
}
return {
diff --git a/cli/src/checks/secrets-check.ts b/cli/src/checks/secrets-check.ts
index 4b739a41..49c6a90b 100644
--- a/cli/src/checks/secrets-check.ts
+++ b/cli/src/checks/secrets-check.ts
@@ -53,7 +53,7 @@ export function secretsCheck(config: PaperclipConfig, configPath?: string): Chec
status: "fail",
message: `${provider} is configured, but this build only supports local_encrypted`,
canRepair: false,
- repairHint: "Run `paperclip configure --section secrets` and set provider to local_encrypted",
+ repairHint: "Run `paperclipai configure --section secrets` and set provider to local_encrypted",
};
}
diff --git a/cli/src/checks/storage-check.ts b/cli/src/checks/storage-check.ts
index 228a3b83..aff69b36 100644
--- a/cli/src/checks/storage-check.ts
+++ b/cli/src/checks/storage-check.ts
@@ -45,7 +45,7 @@ export function storageCheck(config: PaperclipConfig, configPath?: string): Chec
status: "fail",
message: "S3 storage requires non-empty bucket and region",
canRepair: false,
- repairHint: "Run `paperclip configure --section storage`",
+ repairHint: "Run `paperclipai configure --section storage`",
};
}
diff --git a/cli/src/commands/auth-bootstrap-ceo.ts b/cli/src/commands/auth-bootstrap-ceo.ts
index 785fce62..63490f2d 100644
--- a/cli/src/commands/auth-bootstrap-ceo.ts
+++ b/cli/src/commands/auth-bootstrap-ceo.ts
@@ -2,7 +2,7 @@ import { createHash, randomBytes } from "node:crypto";
import * as p from "@clack/prompts";
import pc from "picocolors";
import { and, eq, gt, isNull } from "drizzle-orm";
-import { createDb, instanceUserRoles, invites } from "@paperclip/db";
+import { createDb, instanceUserRoles, invites } from "@paperclipai/db";
import { readConfig, resolveConfigPath } from "../config/store.js";
function hashToken(token: string) {
diff --git a/cli/src/commands/client/activity.ts b/cli/src/commands/client/activity.ts
index 82ff5bb5..0ae83d95 100644
--- a/cli/src/commands/client/activity.ts
+++ b/cli/src/commands/client/activity.ts
@@ -1,5 +1,5 @@
import { Command } from "commander";
-import type { ActivityEvent } from "@paperclip/shared";
+import type { ActivityEvent } from "@paperclipai/shared";
import {
addCommonClientOptions,
formatInlineRecord,
diff --git a/cli/src/commands/client/agent.ts b/cli/src/commands/client/agent.ts
index efbdb8ea..2a1b4243 100644
--- a/cli/src/commands/client/agent.ts
+++ b/cli/src/commands/client/agent.ts
@@ -1,5 +1,5 @@
import { Command } from "commander";
-import type { Agent } from "@paperclip/shared";
+import type { Agent } from "@paperclipai/shared";
import {
addCommonClientOptions,
formatInlineRecord,
diff --git a/cli/src/commands/client/approval.ts b/cli/src/commands/client/approval.ts
index 866b783b..16d97d45 100644
--- a/cli/src/commands/client/approval.ts
+++ b/cli/src/commands/client/approval.ts
@@ -6,7 +6,7 @@ import {
resubmitApprovalSchema,
type Approval,
type ApprovalComment,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import {
addCommonClientOptions,
formatInlineRecord,
diff --git a/cli/src/commands/client/common.ts b/cli/src/commands/client/common.ts
index 10c943df..14de3ccf 100644
--- a/cli/src/commands/client/common.ts
+++ b/cli/src/commands/client/common.ts
@@ -65,7 +65,7 @@ export function resolveCommandContext(
if (opts?.requireCompany && !companyId) {
throw new Error(
- "Company ID is required. Pass --company-id, set PAPERCLIP_COMPANY_ID, or set context profile companyId via `paperclip context set`.",
+ "Company ID is required. Pass --company-id, set PAPERCLIP_COMPANY_ID, or set context profile companyId via `paperclipai context set`.",
);
}
diff --git a/cli/src/commands/client/company.ts b/cli/src/commands/client/company.ts
index 5931fb3a..b8ab3644 100644
--- a/cli/src/commands/client/company.ts
+++ b/cli/src/commands/client/company.ts
@@ -8,7 +8,7 @@ import type {
CompanyPortabilityManifest,
CompanyPortabilityPreviewResult,
CompanyPortabilityImportResult,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import { ApiRequestError } from "../../client/http.js";
import {
addCommonClientOptions,
diff --git a/cli/src/commands/client/dashboard.ts b/cli/src/commands/client/dashboard.ts
index b8216cda..920ca292 100644
--- a/cli/src/commands/client/dashboard.ts
+++ b/cli/src/commands/client/dashboard.ts
@@ -1,5 +1,5 @@
import { Command } from "commander";
-import type { DashboardSummary } from "@paperclip/shared";
+import type { DashboardSummary } from "@paperclipai/shared";
import {
addCommonClientOptions,
handleCommandError,
diff --git a/cli/src/commands/client/issue.ts b/cli/src/commands/client/issue.ts
index 3a54c447..8db617d9 100644
--- a/cli/src/commands/client/issue.ts
+++ b/cli/src/commands/client/issue.ts
@@ -6,7 +6,7 @@ import {
updateIssueSchema,
type Issue,
type IssueComment,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import {
addCommonClientOptions,
formatInlineRecord,
diff --git a/cli/src/commands/configure.ts b/cli/src/commands/configure.ts
index b0c9f721..f4ce1818 100644
--- a/cli/src/commands/configure.ts
+++ b/cli/src/commands/configure.ts
@@ -67,7 +67,7 @@ export async function configure(opts: {
const configPath = resolveConfigPath(opts.config);
if (!configExists(opts.config)) {
- p.log.error("No config file found. Run `paperclip onboard` first.");
+ p.log.error("No config file found. Run `paperclipai onboard` first.");
p.outro("");
return;
}
diff --git a/cli/src/commands/doctor.ts b/cli/src/commands/doctor.ts
index 5d8ba086..4eda9c7e 100644
--- a/cli/src/commands/doctor.ts
+++ b/cli/src/commands/doctor.ts
@@ -49,7 +49,7 @@ export async function doctor(opts: {
status: "fail",
message: `Could not read config: ${err instanceof Error ? err.message : String(err)}`,
canRepair: false,
- repairHint: "Run `paperclip configure --section database` or `paperclip onboard`",
+ repairHint: "Run `paperclipai configure --section database` or `paperclipai onboard`",
};
results.push(readResult);
printResult(readResult);
diff --git a/cli/src/commands/heartbeat-run.ts b/cli/src/commands/heartbeat-run.ts
index 76122a73..d2260a74 100644
--- a/cli/src/commands/heartbeat-run.ts
+++ b/cli/src/commands/heartbeat-run.ts
@@ -1,6 +1,6 @@
import { setTimeout as delay } from "node:timers/promises";
import pc from "picocolors";
-import type { Agent, HeartbeatRun, HeartbeatRunEvent, HeartbeatRunStatus } from "@paperclip/shared";
+import type { Agent, HeartbeatRun, HeartbeatRunEvent, HeartbeatRunStatus } from "@paperclipai/shared";
import { getCLIAdapter } from "../adapters/index.js";
import { resolveCommandContext } from "./client/common.js";
diff --git a/cli/src/commands/onboard.ts b/cli/src/commands/onboard.ts
index 67bb2eab..0e3c744c 100644
--- a/cli/src/commands/onboard.ts
+++ b/cli/src/commands/onboard.ts
@@ -14,7 +14,7 @@ import { describeLocalInstancePaths, resolvePaperclipInstanceId } from "../confi
import { bootstrapCeoInvite } from "./auth-bootstrap-ceo.js";
export async function onboard(opts: { config?: string }): Promise {
- p.intro(pc.bgCyan(pc.black(" paperclip onboard ")));
+ p.intro(pc.bgCyan(pc.black(" paperclipai onboard ")));
const instance = describeLocalInstancePaths(resolvePaperclipInstanceId());
p.log.message(
pc.dim(
@@ -46,12 +46,12 @@ export async function onboard(opts: { config?: string }): Promise {
const s = p.spinner();
s.start("Testing database connection...");
try {
- const { createDb } = await import("@paperclip/db");
+ const { createDb } = await import("@paperclipai/db");
const db = createDb(database.connectionString);
await db.execute("SELECT 1");
s.stop("Database connection successful");
} catch (err) {
- s.stop(pc.yellow("Could not connect to database — you can fix this later with `paperclip doctor`"));
+ s.stop(pc.yellow("Could not connect to database — you can fix this later with `paperclipai doctor`"));
}
}
@@ -172,7 +172,7 @@ export async function onboard(opts: { config?: string }): Promise {
"Configuration saved",
);
- p.log.info(`Run ${pc.cyan("pnpm paperclip doctor")} to verify your setup.`);
+ p.log.info(`Run ${pc.cyan("pnpm paperclipai doctor")} to verify your setup.`);
p.log.message(
`Before starting Paperclip, export ${pc.cyan("PAPERCLIP_AGENT_JWT_SECRET")} from ${pc.dim(envFilePath)} (for example: ${pc.dim(`set -a; source ${envFilePath}; set +a`)})`,
);
diff --git a/cli/src/commands/run.ts b/cli/src/commands/run.ts
index d7baa27f..9b54b52f 100644
--- a/cli/src/commands/run.ts
+++ b/cli/src/commands/run.ts
@@ -32,7 +32,7 @@ export async function runCommand(opts: RunOptions): Promise {
const configPath = resolveConfigPath(opts.config);
process.env.PAPERCLIP_CONFIG = configPath;
- p.intro(pc.bgCyan(pc.black(" paperclip run ")));
+ p.intro(pc.bgCyan(pc.black(" paperclipai run ")));
p.log.message(pc.dim(`Home: ${paths.homeDir}`));
p.log.message(pc.dim(`Instance: ${paths.instanceId}`));
p.log.message(pc.dim(`Config: ${configPath}`));
@@ -40,7 +40,7 @@ export async function runCommand(opts: RunOptions): Promise {
if (!configExists(configPath)) {
if (!process.stdin.isTTY || !process.stdout.isTTY) {
p.log.error("No config found and terminal is non-interactive.");
- p.log.message(`Run ${pc.cyan("paperclip onboard")} once, then retry ${pc.cyan("paperclip run")}.`);
+ p.log.message(`Run ${pc.cyan("paperclipai onboard")} once, then retry ${pc.cyan("paperclipai run")}.`);
process.exit(1);
}
@@ -72,8 +72,8 @@ async function importServerEntry(): Promise {
];
const specifierCandidates: string[] = [
- "@paperclip/server/dist/index.js",
- "@paperclip/server/src/index.ts",
+ "@paperclipai/server/dist/index.js",
+ "@paperclipai/server/src/index.ts",
];
const importErrors: string[] = [];
diff --git a/cli/src/config/env.ts b/cli/src/config/env.ts
index 7a0fb1e8..a0291a33 100644
--- a/cli/src/config/env.ts
+++ b/cli/src/config/env.ts
@@ -25,7 +25,7 @@ function parseEnvFile(contents: string) {
function renderEnvFile(entries: Record) {
const lines = [
"# Paperclip environment variables",
- "# Generated by `paperclip onboard`",
+ "# Generated by `paperclipai onboard`",
...Object.entries(entries).map(([key, value]) => `${key}=${value}`),
"",
];
diff --git a/cli/src/config/schema.ts b/cli/src/config/schema.ts
index 1edf6630..76fb93ca 100644
--- a/cli/src/config/schema.ts
+++ b/cli/src/config/schema.ts
@@ -23,4 +23,4 @@ export {
type SecretsConfig,
type SecretsLocalEncryptedConfig,
type ConfigMeta,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
diff --git a/cli/src/index.ts b/cli/src/index.ts
index 30f0f6bd..67cc09b4 100644
--- a/cli/src/index.ts
+++ b/cli/src/index.ts
@@ -22,9 +22,9 @@ const DATA_DIR_OPTION_HELP =
"Paperclip data directory root (isolates state from ~/.paperclip)";
program
- .name("paperclip")
+ .name("paperclipai")
.description("Paperclip CLI — setup, diagnose, and configure your instance")
- .version("0.0.1");
+ .version("0.1.0");
program.hook("preAction", (_thisCommand, actionCommand) => {
const options = actionCommand.optsWithGlobals() as DataDirOptionLike;
diff --git a/cli/src/prompts/secrets.ts b/cli/src/prompts/secrets.ts
index 56e0c67f..c65ef0bc 100644
--- a/cli/src/prompts/secrets.ts
+++ b/cli/src/prompts/secrets.ts
@@ -1,5 +1,5 @@
import * as p from "@clack/prompts";
-import type { SecretProvider } from "@paperclip/shared";
+import type { SecretProvider } from "@paperclipai/shared";
import type { SecretsConfig } from "../config/schema.js";
import { resolveDefaultSecretsKeyFilePath, resolvePaperclipInstanceId } from "../config/home.js";
diff --git a/doc/CLI.md b/doc/CLI.md
index c8da955a..b56abf75 100644
--- a/doc/CLI.md
+++ b/doc/CLI.md
@@ -10,19 +10,19 @@ Paperclip CLI now supports both:
Use repo script in development:
```sh
-pnpm paperclip --help
+pnpm paperclipai --help
```
First-time local bootstrap + run:
```sh
-pnpm paperclip run
+pnpm paperclipai run
```
Choose local instance:
```sh
-pnpm paperclip run --instance dev
+pnpm paperclipai run --instance dev
```
## Deployment Modes
@@ -31,16 +31,16 @@ Mode taxonomy and design intent are documented in `doc/DEPLOYMENT-MODES.md`.
Current CLI behavior:
-- `paperclip onboard` and `paperclip configure --section server` set deployment mode in config
+- `paperclipai onboard` and `paperclipai configure --section server` set deployment mode in config
- runtime can override mode with `PAPERCLIP_DEPLOYMENT_MODE`
-- `paperclip run` and `paperclip doctor` do not yet expose a direct `--mode` flag
+- `paperclipai run` and `paperclipai doctor` do not yet expose a direct `--mode` flag
Target behavior (planned) is documented in `doc/DEPLOYMENT-MODES.md` section 5.
Allow an authenticated/private hostname (for example custom Tailscale DNS):
```sh
-pnpm paperclip allowed-hostname dotta-macbook-pro
+pnpm paperclipai allowed-hostname dotta-macbook-pro
```
All client commands support:
@@ -57,8 +57,8 @@ Company-scoped commands also support `--company-id `.
Use `--data-dir` on any CLI command to isolate all default local state (config/context/db/logs/storage/secrets) away from `~/.paperclip`:
```sh
-pnpm paperclip run --data-dir ./tmp/paperclip-dev
-pnpm paperclip issue list --data-dir ./tmp/paperclip-dev
+pnpm paperclipai run --data-dir ./tmp/paperclip-dev
+pnpm paperclipai issue list --data-dir ./tmp/paperclip-dev
```
## Context Profiles
@@ -66,32 +66,32 @@ pnpm paperclip issue list --data-dir ./tmp/paperclip-dev
Store local defaults in `~/.paperclip/context.json`:
```sh
-pnpm paperclip context set --api-base http://localhost:3100 --company-id
-pnpm paperclip context show
-pnpm paperclip context list
-pnpm paperclip context use default
+pnpm paperclipai context set --api-base http://localhost:3100 --company-id
+pnpm paperclipai context show
+pnpm paperclipai context list
+pnpm paperclipai context use default
```
To avoid storing secrets in context, set `apiKeyEnvVarName` and keep the key in env:
```sh
-pnpm paperclip context set --api-key-env-var-name PAPERCLIP_API_KEY
+pnpm paperclipai context set --api-key-env-var-name PAPERCLIP_API_KEY
export PAPERCLIP_API_KEY=...
```
## Company Commands
```sh
-pnpm paperclip company list
-pnpm paperclip company get
-pnpm paperclip company delete --yes --confirm
+pnpm paperclipai company list
+pnpm paperclipai company get
+pnpm paperclipai company delete --yes --confirm
```
Examples:
```sh
-pnpm paperclip company delete PAP --yes --confirm PAP
-pnpm paperclip company delete 5cbe79ee-acb3-4597-896e-7662742593cd --yes --confirm 5cbe79ee-acb3-4597-896e-7662742593cd
+pnpm paperclipai company delete PAP --yes --confirm PAP
+pnpm paperclipai company delete 5cbe79ee-acb3-4597-896e-7662742593cd --yes --confirm 5cbe79ee-acb3-4597-896e-7662742593cd
```
Notes:
@@ -102,45 +102,45 @@ Notes:
## Issue Commands
```sh
-pnpm paperclip issue list --company-id [--status todo,in_progress] [--assignee-agent-id ] [--match text]
-pnpm paperclip issue get
-pnpm paperclip issue create --company-id --title "..." [--description "..."] [--status todo] [--priority high]
-pnpm paperclip issue update [--status in_progress] [--comment "..."]
-pnpm paperclip issue comment --body "..." [--reopen]
-pnpm paperclip issue checkout --agent-id [--expected-statuses todo,backlog,blocked]
-pnpm paperclip issue release
+pnpm paperclipai issue list --company-id [--status todo,in_progress] [--assignee-agent-id ] [--match text]
+pnpm paperclipai issue get
+pnpm paperclipai issue create --company-id --title "..." [--description "..."] [--status todo] [--priority high]
+pnpm paperclipai issue update [--status in_progress] [--comment "..."]
+pnpm paperclipai issue comment --body "..." [--reopen]
+pnpm paperclipai issue checkout --agent-id [--expected-statuses todo,backlog,blocked]
+pnpm paperclipai issue release
```
## Agent Commands
```sh
-pnpm paperclip agent list --company-id
-pnpm paperclip agent get
+pnpm paperclipai agent list --company-id
+pnpm paperclipai agent get
```
## Approval Commands
```sh
-pnpm paperclip approval list --company-id [--status pending]
-pnpm paperclip approval get
-pnpm paperclip approval create --company-id --type hire_agent --payload '{"name":"..."}' [--issue-ids ]
-pnpm paperclip approval approve [--decision-note "..."]
-pnpm paperclip approval reject [--decision-note "..."]
-pnpm paperclip approval request-revision [--decision-note "..."]
-pnpm paperclip approval resubmit [--payload '{"...":"..."}']
-pnpm paperclip approval comment --body "..."
+pnpm paperclipai approval list --company-id [--status pending]
+pnpm paperclipai approval get
+pnpm paperclipai approval create --company-id --type hire_agent --payload '{"name":"..."}' [--issue-ids ]
+pnpm paperclipai approval approve [--decision-note "..."]
+pnpm paperclipai approval reject [--decision-note "..."]
+pnpm paperclipai approval request-revision [--decision-note "..."]
+pnpm paperclipai approval resubmit [--payload '{"...":"..."}']
+pnpm paperclipai approval comment --body "..."
```
## Activity Commands
```sh
-pnpm paperclip activity list --company-id [--agent-id ] [--entity-type issue] [--entity-id ]
+pnpm paperclipai activity list --company-id [--agent-id ] [--entity-type issue] [--entity-id ]
```
## Dashboard Commands
```sh
-pnpm paperclip dashboard get --company-id
+pnpm paperclipai dashboard get --company-id
```
## Heartbeat Command
@@ -148,7 +148,7 @@ pnpm paperclip dashboard get --company-id
`heartbeat run` now also supports context/api-key options and uses the shared client stack:
```sh
-pnpm paperclip heartbeat run --agent-id [--api-base http://localhost:3100] [--api-key ]
+pnpm paperclipai heartbeat run --agent-id [--api-base http://localhost:3100] [--api-key ]
```
## Local Storage Defaults
@@ -164,7 +164,7 @@ Default local instance root is `~/.paperclip/instances/default`:
Override base home or instance with env vars:
```sh
-PAPERCLIP_HOME=/custom/home PAPERCLIP_INSTANCE_ID=dev pnpm paperclip run
+PAPERCLIP_HOME=/custom/home PAPERCLIP_INSTANCE_ID=dev pnpm paperclipai run
```
## Storage Configuration
@@ -172,7 +172,7 @@ PAPERCLIP_HOME=/custom/home PAPERCLIP_INSTANCE_ID=dev pnpm paperclip run
Configure storage provider and settings:
```sh
-pnpm paperclip configure --section storage
+pnpm paperclipai configure --section storage
```
Supported providers:
diff --git a/doc/CLIPHUB.md b/doc/CLIPHUB.md
index 30e7c280..0d70d9db 100644
--- a/doc/CLIPHUB.md
+++ b/doc/CLIPHUB.md
@@ -209,7 +209,7 @@ ClipHub is a **separate service** from Paperclip itself. Paperclip is self-hoste
|---|---|
| **ClipHub Web** | Browse, search, discover, comment, star — the website |
| **ClipHub API** | Registry API for publishing, downloading, searching programmatically |
-| **Paperclip CLI** | `paperclip install`, `paperclip publish`, `paperclip cliphub sync` — built into Paperclip |
+| **Paperclip CLI** | `paperclipai install`, `paperclipai publish`, `paperclipai cliphub sync` — built into Paperclip |
| **Paperclip UI** | "Browse ClipHub" panel in the Paperclip web UI for discovering templates without leaving the app |
### Tech Stack
@@ -260,7 +260,7 @@ Report
1. Open ClipHub, browse by category or search "dev shop for building SaaS"
2. Find a template that fits — "Lean SaaS Dev Shop (CEO + CTO + 3 Engineers)"
3. Read the description, inspect the org chart, check the comments
-4. Run `paperclip install cliphub:acme/lean-saas-shop`
+4. Run `paperclipai install cliphub:acme/lean-saas-shop`
5. Paperclip creates the company locally with all agents pre-configured
6. Set your API keys, adjust budgets, add your initial tasks
7. Hit go
@@ -268,8 +268,8 @@ Report
### "I built something great and want to share it"
1. Build and iterate on a company in Paperclip until it works well
-2. Export: `paperclip export --template my-agency`
-3. Publish: `paperclip publish cliphub my-agency`
+2. Export: `paperclipai export --template my-agency`
+3. Publish: `paperclipai publish cliphub my-agency`
4. Fill in description, category, tags on the web UI
5. Template is live — others can find and install it
@@ -285,7 +285,7 @@ Report
1. Search ClipHub for agent templates: "senior python engineer"
2. Find a well-starred agent config
-3. Install just that agent: `paperclip install cliphub:acme/senior-python-eng --agent`
+3. Install just that agent: `paperclipai install cliphub:acme/senior-python-eng --agent`
4. Assign it to a manager in your existing company
5. Done
@@ -311,7 +311,7 @@ ClipHub is to Paperclip what a package registry is to a language runtime: option
- [ ] Template browsing (list, filter by category)
- [ ] Template detail page (description, org chart, agent list, install command)
- [ ] Semantic search (vector embeddings)
-- [ ] `paperclip install cliphub:/` CLI command
+- [ ] `paperclipai install cliphub:/` CLI command
- [ ] GitHub OAuth authentication
- [ ] Stars
- [ ] Download counts
@@ -326,7 +326,7 @@ ClipHub is to Paperclip what a package registry is to a language runtime: option
- [ ] Verified publisher badges
- [ ] Automated security scanning of adapter configs
- [ ] "Browse ClipHub" panel in Paperclip web UI
-- [ ] `paperclip cliphub sync` for bulk publishing
+- [ ] `paperclipai cliphub sync` for bulk publishing
- [ ] Publisher profiles and portfolios
### Not in Scope
diff --git a/doc/DATABASE.md b/doc/DATABASE.md
index 34640964..8f46f382 100644
--- a/doc/DATABASE.md
+++ b/doc/DATABASE.md
@@ -150,7 +150,7 @@ PAPERCLIP_SECRETS_STRICT_MODE=true
You can set strict mode and provider defaults via:
```sh
-pnpm paperclip configure --section secrets
+pnpm paperclipai configure --section secrets
```
Inline secret migration command:
diff --git a/doc/DEPLOYMENT-MODES.md b/doc/DEPLOYMENT-MODES.md
index 93b4a00e..9d58d50a 100644
--- a/doc/DEPLOYMENT-MODES.md
+++ b/doc/DEPLOYMENT-MODES.md
@@ -50,7 +50,7 @@ This keeps one authenticated auth stack while still separating low-friction priv
Default onboarding remains interactive and flagless:
```sh
-pnpm paperclip onboard
+pnpm paperclipai onboard
```
Server prompt behavior:
@@ -71,7 +71,7 @@ Server prompt behavior:
Default doctor remains flagless:
```sh
-pnpm paperclip doctor
+pnpm paperclipai doctor
```
Doctor reads configured mode/exposure and applies mode-aware checks. Optional override flags are secondary.
diff --git a/doc/DEVELOPING.md b/doc/DEVELOPING.md
index d949d44f..6b25e6eb 100644
--- a/doc/DEVELOPING.md
+++ b/doc/DEVELOPING.md
@@ -40,7 +40,7 @@ This runs dev as `authenticated/private` and binds the server to `0.0.0.0` for p
Allow additional private hostnames (for example custom Tailscale hostnames):
```sh
-pnpm paperclip allowed-hostname dotta-macbook-pro
+pnpm paperclipai allowed-hostname dotta-macbook-pro
```
## One-Command Local Run
@@ -48,13 +48,13 @@ pnpm paperclip allowed-hostname dotta-macbook-pro
For a first-time local install, you can bootstrap and run in one command:
```sh
-pnpm paperclip run
+pnpm paperclipai run
```
-`paperclip run` does:
+`paperclipai run` does:
1. auto-onboard if config is missing
-2. `paperclip doctor` with repair enabled
+2. `paperclipai doctor` with repair enabled
3. starts the server when checks pass
## Docker Quickstart (No local Node install)
@@ -89,7 +89,7 @@ The server will automatically use embedded PostgreSQL and persist data at:
Override home and instance:
```sh
-PAPERCLIP_HOME=/custom/path PAPERCLIP_INSTANCE_ID=dev pnpm paperclip run
+PAPERCLIP_HOME=/custom/path PAPERCLIP_INSTANCE_ID=dev pnpm paperclipai run
```
No Docker or external database is required for this mode.
@@ -103,7 +103,7 @@ For local development, the default storage provider is `local_disk`, which persi
Configure storage provider/settings:
```sh
-pnpm paperclip configure --section storage
+pnpm paperclipai configure --section storage
```
## Default Agent Workspaces
@@ -159,9 +159,9 @@ When strict mode is enabled, sensitive env keys (for example `*_API_KEY`, `*_TOK
CLI configuration support:
-- `pnpm paperclip onboard` writes a default `secrets` config section (`local_encrypted`, strict mode off, key file path set) and creates a local key file when needed.
-- `pnpm paperclip configure --section secrets` lets you update provider/strict mode/key path and creates the local key file when needed.
-- `pnpm paperclip doctor` validates secrets adapter configuration and can create a missing local key file with `--repair`.
+- `pnpm paperclipai onboard` writes a default `secrets` config section (`local_encrypted`, strict mode off, key file path set) and creates a local key file when needed.
+- `pnpm paperclipai configure --section secrets` lets you update provider/strict mode/key path and creates the local key file when needed.
+- `pnpm paperclipai doctor` validates secrets adapter configuration and can create a missing local key file with `--repair`.
Migration helper for existing inline env secrets:
@@ -190,22 +190,22 @@ Paperclip CLI now includes client-side control-plane commands in addition to set
Quick examples:
```sh
-pnpm paperclip issue list --company-id
-pnpm paperclip issue create --company-id --title "Investigate checkout conflict"
-pnpm paperclip issue update --status in_progress --comment "Started triage"
+pnpm paperclipai issue list --company-id
+pnpm paperclipai issue create --company-id --title "Investigate checkout conflict"
+pnpm paperclipai issue update --status in_progress --comment "Started triage"
```
Set defaults once with context profiles:
```sh
-pnpm paperclip context set --api-base http://localhost:3100 --company-id
+pnpm paperclipai context set --api-base http://localhost:3100 --company-id
```
Then run commands without repeating flags:
```sh
-pnpm paperclip issue list
-pnpm paperclip dashboard get
+pnpm paperclipai issue list
+pnpm paperclipai dashboard get
```
See full command reference in `doc/CLI.md`.
diff --git a/doc/plan/humans-and-permissions-implementation.md b/doc/plan/humans-and-permissions-implementation.md
index c0279542..9de5947f 100644
--- a/doc/plan/humans-and-permissions-implementation.md
+++ b/doc/plan/humans-and-permissions-implementation.md
@@ -455,11 +455,11 @@ Files:
Commands:
-1. `paperclip auth bootstrap-ceo`
+1. `paperclipai auth bootstrap-ceo`
- create bootstrap invite
- print one-time URL
-2. `paperclip onboard`
+2. `paperclipai onboard`
- in cloud mode with `bootstrap_pending`, print bootstrap URL and next steps
- in local mode, skip bootstrap requirement
diff --git a/doc/plan/humans-and-permissions.md b/doc/plan/humans-and-permissions.md
index 611881c7..a64c583b 100644
--- a/doc/plan/humans-and-permissions.md
+++ b/doc/plan/humans-and-permissions.md
@@ -17,7 +17,7 @@ Current V1 assumptions are centered on one board operator. We now need:
- multi-human collaboration with per-user permissions
- safe cloud deployment defaults (no accidental loginless production)
-- local mode that still feels instant (`npx paperclip run` and go)
+- local mode that still feels instant (`npx paperclipai run` and go)
- agent-to-human task delegation, including a human inbox
- one user account with access to multiple companies in one deployment
- instance admins who can manage company access across the instance
@@ -106,9 +106,9 @@ Problem:
Bootstrap flow:
1. If no `instance_admin` user exists for the deployment, instance is in `bootstrap_pending` state.
-2. CLI command `pnpm paperclip auth bootstrap-ceo` creates a one-time CEO onboarding invite URL for that instance.
-3. `pnpm paperclip onboard` runs this bootstrap check and prints the invite URL automatically when `bootstrap_pending`.
-4. Visiting the app while `bootstrap_pending` shows a blocking setup page with the exact CLI command to run (`pnpm paperclip onboard`).
+2. CLI command `pnpm paperclipai auth bootstrap-ceo` creates a one-time CEO onboarding invite URL for that instance.
+3. `pnpm paperclipai onboard` runs this bootstrap check and prints the invite URL automatically when `bootstrap_pending`.
+4. Visiting the app while `bootstrap_pending` shows a blocking setup page with the exact CLI command to run (`pnpm paperclipai onboard`).
5. Accepting that CEO invite creates the first admin user and exits bootstrap mode.
Security rules:
@@ -323,7 +323,7 @@ This plan introduces instance-level concerns (for example bootstrap state, insta
V1 approach:
- add a minimal `Instance Settings` page for instance admins
-- expose key instance settings in API + CLI (`paperclip configure` / `paperclip onboard`)
+- expose key instance settings in API + CLI (`paperclipai configure` / `paperclipai onboard`)
- show read-only instance status indicators in the main UI until full settings UX exists
## Implementation phases
@@ -385,7 +385,7 @@ V1 approach:
4. `cloud_hosted` cannot start without auth configured.
5. No request in `cloud_hosted` can mutate data without authenticated actor.
6. If no initial admin exists, app shows bootstrap instructions with CLI command.
-7. `pnpm paperclip onboard` outputs a CEO onboarding invite URL when bootstrap is pending.
+7. `pnpm paperclipai onboard` outputs a CEO onboarding invite URL when bootstrap is pending.
8. One `company_join` link supports both human and agent onboarding via join-type selection on the invite landing page.
9. Invite delivery in V1 is copy-link only (no built-in email delivery).
10. Share-link acceptance creates a pending join request; it does not grant immediate access.
diff --git a/doc/plans/agent-authentication.md b/doc/plans/agent-authentication.md
index 8eb990f8..ce3574ad 100644
--- a/doc/plans/agent-authentication.md
+++ b/doc/plans/agent-authentication.md
@@ -203,7 +203,7 @@ On approval, the approver sets:
| **P1** | Invite link + onboarding endpoint | `POST /api/companies/:id/invites`, `GET /api/invite/:token`, `POST /api/invite/:token/register`. |
| **P1** | Approval flow | UI + API for reviewing and approving pending agent registrations. |
| **P2** | OpenClaw integration | First real external agent onboarding via invite link. |
-| **P3** | CLI auth flow | `paperclip auth login` for developer-managed remote agents. |
+| **P3** | CLI auth flow | `paperclipai auth login` for developer-managed remote agents. |
## P0 Implementation Plan
diff --git a/doc/plans/deployment-auth-mode-consolidation.md b/doc/plans/deployment-auth-mode-consolidation.md
index c1cd2e99..dbb0f454 100644
--- a/doc/plans/deployment-auth-mode-consolidation.md
+++ b/doc/plans/deployment-auth-mode-consolidation.md
@@ -76,7 +76,7 @@ This is one authenticated mode with two safety policies, not two different auth
Default command remains:
```sh
-pnpm paperclip onboard
+pnpm paperclipai onboard
```
Interactive server step:
@@ -97,7 +97,7 @@ Flags are optional power-user overrides, not required for normal setup.
Default command remains interactive:
```sh
-pnpm paperclip configure --section server
+pnpm paperclipai configure --section server
```
Same mode/exposure questions and defaults as onboarding.
@@ -107,7 +107,7 @@ Same mode/exposure questions and defaults as onboarding.
Default command remains flagless:
```sh
-pnpm paperclip doctor
+pnpm paperclipai doctor
```
Doctor reads configured mode/exposure and applies relevant checks.
@@ -209,9 +209,9 @@ This change is a clean cut:
## Acceptance Criteria
-1. `pnpm paperclip onboard` is interactive-first and defaults to `local_trusted`.
+1. `pnpm paperclipai onboard` is interactive-first and defaults to `local_trusted`.
2. authenticated mode is one runtime mode with `private/public` exposure guidance.
-3. `pnpm paperclip doctor` works flagless with mode-aware checks.
+3. `pnpm paperclipai doctor` works flagless with mode-aware checks.
4. no extra compatibility aliases for dropped naming variants.
5. Board identity is represented by real DB user/role/membership integration points, enabling consistent task assignment and permission behavior.
diff --git a/doc/plans/module-system.md b/doc/plans/module-system.md
index 852c6a49..aef73b66 100644
--- a/doc/plans/module-system.md
+++ b/doc/plans/module-system.md
@@ -104,7 +104,7 @@ Modules live in a top-level `modules/` directory. Each module is a pnpm workspac
Key fields:
-- **`id`**: Unique identifier, used as the npm package name suffix (`@paperclip/mod-observability`)
+- **`id`**: Unique identifier, used as the npm package name suffix (`@paperclipai/mod-observability`)
- **`slot`**: Optional exclusive category. If set, only one module with this slot can be active. Omit for modules that can coexist freely.
- **`hooks`**: Which core events this module subscribes to. Declared upfront so the core knows what to emit.
- **`routes.prefix`**: Mounted under `/api/modules/`. The module owns this namespace.
@@ -118,7 +118,7 @@ Key fields:
The module's `src/index.ts` exports a `register` function that receives the module API:
```typescript
-import type { ModuleAPI } from "@paperclip/core";
+import type { ModuleAPI } from "@paperclipai/core";
import { createRouter } from "./routes.js";
import { onHeartbeat, onBudgetThreshold } from "./hooks.js";
@@ -236,7 +236,7 @@ This keeps the core fast and resilient. If you need pre-commit validation (e.g.,
```typescript
// modules/observability/src/hooks.ts
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import { tokenMetrics } from "./schema.js";
export function createHeartbeatHandler(db: Db) {
@@ -382,7 +382,7 @@ export const modulePages = [
{
path: "/observability",
label: "Observability",
- component: lazy(() => import("@paperclip/mod-observability/ui")),
+ component: lazy(() => import("@paperclipai/mod-observability/ui")),
},
];
@@ -391,7 +391,7 @@ export const dashboardWidgets = [
id: "token-burn-rate",
label: "Token Burn Rate",
placement: "dashboard",
- component: lazy(() => import("@paperclip/mod-observability/ui").then(m => ({ default: m.TokenBurnRateWidget }))),
+ component: lazy(() => import("@paperclipai/mod-observability/ui").then(m => ({ default: m.TokenBurnRateWidget }))),
},
];
```
@@ -587,10 +587,10 @@ The Company Store is a registry for discovering and installing modules and templ
### CLI Commands
```bash
-pnpm paperclip store list # browse available modules and templates
-pnpm paperclip store install # install a module
-pnpm paperclip store import # import a company template
-pnpm paperclip store export # export current company as template
+pnpm paperclipai store list # browse available modules and templates
+pnpm paperclipai store install # install a module
+pnpm paperclipai store import # import a company template
+pnpm paperclipai store export # export current company as template
```
---
@@ -627,7 +627,7 @@ pnpm paperclip store export # export current company as templat
### Phase 1: Core infrastructure
-Add to `@paperclip/server`:
+Add to `@paperclipai/server`:
1. **HookBus** — Event emitter with `register()` and `emit()`, using `Promise.allSettled`
2. **Module loader** — Scans `modules/`, validates manifests, calls `register(api)`
@@ -636,7 +636,7 @@ Add to `@paperclip/server`:
5. **Module migration runner** — Extends `db:migrate` to discover and run module migrations
6. **Emit hooks from core services** — Add `hookBus.emit()` calls to existing CRUD operations
-Add to `@paperclip/ui`:
+Add to `@paperclipai/ui`:
7. **Module page loader** — Reads module manifests, generates lazy routes
8. **Dashboard widget slots** — Render module-contributed widgets on the Dashboard page
@@ -644,7 +644,7 @@ Add to `@paperclip/ui`:
Add new package:
-10. **`@paperclip/module-sdk`** — TypeScript types for `ModuleAPI`, `HookEvent`, `HookHandler`, manifest schema
+10. **`@paperclipai/module-sdk`** — TypeScript types for `ModuleAPI`, `HookEvent`, `HookHandler`, manifest schema
### Phase 2: First module (observability)
diff --git a/doc/plans/storage-system-implementation.md b/doc/plans/storage-system-implementation.md
index 0c5c73c8..d4b9c2fd 100644
--- a/doc/plans/storage-system-implementation.md
+++ b/doc/plans/storage-system-implementation.md
@@ -56,8 +56,8 @@ Add a single storage subsystem for Paperclip that supports:
### Acceptance Criteria
-- `paperclip onboard` writes a valid `storage` config block by default.
-- `paperclip configure --section storage` can switch between local and s3 modes.
+- `paperclipai onboard` writes a valid `storage` config block by default.
+- `paperclipai configure --section storage` can switch between local and s3 modes.
- Server startup reads storage config without env-only hacks.
## Phase 2: Server Storage Subsystem + Providers
@@ -161,7 +161,7 @@ Add a single storage subsystem for Paperclip that supports:
### Acceptance Criteria
-- `paperclip doctor` reports actionable storage status.
+- `paperclipai doctor` reports actionable storage status.
- Local single-user install works without extra cloud credentials.
- Cloud config supports S3-compatible endpoint without code changes.
diff --git a/docs/adapters/creating-an-adapter.md b/docs/adapters/creating-an-adapter.md
index 83029d42..31b1343a 100644
--- a/docs/adapters/creating-an-adapter.md
+++ b/docs/adapters/creating-an-adapter.md
@@ -76,7 +76,7 @@ Return structured diagnostics:
## Step 5: CLI Module
-`format-event.ts` — pretty-prints stdout for `paperclip run --watch` using `picocolors`.
+`format-event.ts` — pretty-prints stdout for `paperclipai run --watch` using `picocolors`.
## Step 6: Register
diff --git a/docs/adapters/overview.md b/docs/adapters/overview.md
index 126a27d1..0d3ccabf 100644
--- a/docs/adapters/overview.md
+++ b/docs/adapters/overview.md
@@ -39,7 +39,7 @@ packages/adapters//
parse-stdout.ts # Stdout -> transcript entries for run viewer
build-config.ts # Form values -> adapterConfig JSON
cli/
- format-event.ts # Terminal output for `paperclip run --watch`
+ format-event.ts # Terminal output for `paperclipai run --watch`
```
Three registries consume these modules:
diff --git a/docs/cli/control-plane-commands.md b/docs/cli/control-plane-commands.md
index 77a4f747..c0d2664c 100644
--- a/docs/cli/control-plane-commands.md
+++ b/docs/cli/control-plane-commands.md
@@ -9,38 +9,38 @@ Client-side commands for managing issues, agents, approvals, and more.
```sh
# List issues
-pnpm paperclip issue list [--status todo,in_progress] [--assignee-agent-id ] [--match text]
+pnpm paperclipai issue list [--status todo,in_progress] [--assignee-agent-id ] [--match text]
# Get issue details
-pnpm paperclip issue get
+pnpm paperclipai issue get
# Create issue
-pnpm paperclip issue create --title "..." [--description "..."] [--status todo] [--priority high]
+pnpm paperclipai issue create --title "..." [--description "..."] [--status todo] [--priority high]
# Update issue
-pnpm paperclip issue update [--status in_progress] [--comment "..."]
+pnpm paperclipai issue update [--status in_progress] [--comment "..."]
# Add comment
-pnpm paperclip issue comment --body "..." [--reopen]
+pnpm paperclipai issue comment --body "..." [--reopen]
# Checkout task
-pnpm paperclip issue checkout --agent-id
+pnpm paperclipai issue checkout --agent-id
# Release task
-pnpm paperclip issue release
+pnpm paperclipai issue release
```
## Company Commands
```sh
-pnpm paperclip company list
-pnpm paperclip company get
+pnpm paperclipai company list
+pnpm paperclipai company get
# Export to portable folder package (writes manifest + markdown files)
-pnpm paperclip company export --out ./exports/acme --include company,agents
+pnpm paperclipai company export --out ./exports/acme --include company,agents
# Preview import (no writes)
-pnpm paperclip company import \
+pnpm paperclipai company import \
--from https://github.com///tree/main/ \
--target existing \
--company-id \
@@ -48,7 +48,7 @@ pnpm paperclip company import \
--dry-run
# Apply import
-pnpm paperclip company import \
+pnpm paperclipai company import \
--from ./exports/acme \
--target new \
--new-company-name "Acme Imported" \
@@ -58,52 +58,52 @@ pnpm paperclip company import \
## Agent Commands
```sh
-pnpm paperclip agent list
-pnpm paperclip agent get
+pnpm paperclipai agent list
+pnpm paperclipai agent get
```
## Approval Commands
```sh
# List approvals
-pnpm paperclip approval list [--status pending]
+pnpm paperclipai approval list [--status pending]
# Get approval
-pnpm paperclip approval get
+pnpm paperclipai approval get
# Create approval
-pnpm paperclip approval create --type hire_agent --payload '{"name":"..."}' [--issue-ids ]
+pnpm paperclipai approval create --type hire_agent --payload '{"name":"..."}' [--issue-ids ]
# Approve
-pnpm paperclip approval approve [--decision-note "..."]
+pnpm paperclipai approval approve [--decision-note "..."]
# Reject
-pnpm paperclip approval reject [--decision-note "..."]
+pnpm paperclipai approval reject [--decision-note "..."]
# Request revision
-pnpm paperclip approval request-revision [--decision-note "..."]
+pnpm paperclipai approval request-revision [--decision-note "..."]
# Resubmit
-pnpm paperclip approval resubmit [--payload '{"..."}']
+pnpm paperclipai approval resubmit [--payload '{"..."}']
# Comment
-pnpm paperclip approval comment --body "..."
+pnpm paperclipai approval comment --body "..."
```
## Activity Commands
```sh
-pnpm paperclip activity list [--agent-id ] [--entity-type issue] [--entity-id ]
+pnpm paperclipai activity list [--agent-id ] [--entity-type issue] [--entity-id ]
```
## Dashboard
```sh
-pnpm paperclip dashboard get
+pnpm paperclipai dashboard get
```
## Heartbeat
```sh
-pnpm paperclip heartbeat run --agent-id [--api-base http://localhost:3100]
+pnpm paperclipai heartbeat run --agent-id [--api-base http://localhost:3100]
```
diff --git a/docs/cli/overview.md b/docs/cli/overview.md
index b2166d57..8bcf78aa 100644
--- a/docs/cli/overview.md
+++ b/docs/cli/overview.md
@@ -8,7 +8,7 @@ The Paperclip CLI handles instance setup, diagnostics, and control-plane operati
## Usage
```sh
-pnpm paperclip --help
+pnpm paperclipai --help
```
## Global Options
@@ -29,7 +29,7 @@ Company-scoped commands also accept `--company-id `.
For clean local instances, pass `--data-dir` on the command you run:
```sh
-pnpm paperclip run --data-dir ./tmp/paperclip-dev
+pnpm paperclipai run --data-dir ./tmp/paperclip-dev
```
## Context Profiles
@@ -38,22 +38,22 @@ Store defaults to avoid repeating flags:
```sh
# Set defaults
-pnpm paperclip context set --api-base http://localhost:3100 --company-id
+pnpm paperclipai context set --api-base http://localhost:3100 --company-id
# View current context
-pnpm paperclip context show
+pnpm paperclipai context show
# List profiles
-pnpm paperclip context list
+pnpm paperclipai context list
# Switch profile
-pnpm paperclip context use default
+pnpm paperclipai context use default
```
To avoid storing secrets in context, use an env var:
```sh
-pnpm paperclip context set --api-key-env-var-name PAPERCLIP_API_KEY
+pnpm paperclipai context set --api-key-env-var-name PAPERCLIP_API_KEY
export PAPERCLIP_API_KEY=...
```
diff --git a/docs/cli/setup-commands.md b/docs/cli/setup-commands.md
index 22d875c0..11798ce1 100644
--- a/docs/cli/setup-commands.md
+++ b/docs/cli/setup-commands.md
@@ -5,32 +5,32 @@ summary: Onboard, run, doctor, and configure
Instance setup and diagnostics commands.
-## `paperclip run`
+## `paperclipai run`
One-command bootstrap and start:
```sh
-pnpm paperclip run
+pnpm paperclipai run
```
Does:
1. Auto-onboards if config is missing
-2. Runs `paperclip doctor` with repair enabled
+2. Runs `paperclipai doctor` with repair enabled
3. Starts the server when checks pass
Choose a specific instance:
```sh
-pnpm paperclip run --instance dev
+pnpm paperclipai run --instance dev
```
-## `paperclip onboard`
+## `paperclipai onboard`
Interactive first-time setup:
```sh
-pnpm paperclip onboard
+pnpm paperclipai onboard
```
Prompts for:
@@ -40,13 +40,13 @@ Prompts for:
3. Public URL (if authenticated + public)
4. Database and secrets configuration
-## `paperclip doctor`
+## `paperclipai doctor`
Health checks with optional auto-repair:
```sh
-pnpm paperclip doctor
-pnpm paperclip doctor --repair
+pnpm paperclipai doctor
+pnpm paperclipai doctor --repair
```
Validates:
@@ -57,30 +57,30 @@ Validates:
- Storage configuration
- Missing key files
-## `paperclip configure`
+## `paperclipai configure`
Update configuration sections:
```sh
-pnpm paperclip configure --section server
-pnpm paperclip configure --section secrets
-pnpm paperclip configure --section storage
+pnpm paperclipai configure --section server
+pnpm paperclipai configure --section secrets
+pnpm paperclipai configure --section storage
```
-## `paperclip env`
+## `paperclipai env`
Show resolved environment configuration:
```sh
-pnpm paperclip env
+pnpm paperclipai env
```
-## `paperclip allowed-hostname`
+## `paperclipai allowed-hostname`
Allow a private hostname for authenticated/private mode:
```sh
-pnpm paperclip allowed-hostname my-tailscale-host
+pnpm paperclipai allowed-hostname my-tailscale-host
```
## Local Storage Paths
@@ -96,12 +96,12 @@ pnpm paperclip allowed-hostname my-tailscale-host
Override with:
```sh
-PAPERCLIP_HOME=/custom/home PAPERCLIP_INSTANCE_ID=dev pnpm paperclip run
+PAPERCLIP_HOME=/custom/home PAPERCLIP_INSTANCE_ID=dev pnpm paperclipai run
```
Or pass `--data-dir` directly on any command:
```sh
-pnpm paperclip run --data-dir ./tmp/paperclip-dev
-pnpm paperclip doctor --data-dir ./tmp/paperclip-dev
+pnpm paperclipai run --data-dir ./tmp/paperclip-dev
+pnpm paperclipai doctor --data-dir ./tmp/paperclip-dev
```
diff --git a/docs/deploy/deployment-modes.md b/docs/deploy/deployment-modes.md
index b5708635..ae567f49 100644
--- a/docs/deploy/deployment-modes.md
+++ b/docs/deploy/deployment-modes.md
@@ -16,7 +16,7 @@ The default mode. Optimized for single-operator local use.
```sh
# Set during onboard
-pnpm paperclip onboard
+pnpm paperclipai onboard
# Choose "local_trusted"
```
@@ -33,14 +33,14 @@ For private network access (Tailscale, VPN, LAN).
- **Host trust**: private-host trust policy required
```sh
-pnpm paperclip onboard
+pnpm paperclipai onboard
# Choose "authenticated" -> "private"
```
Allow custom Tailscale hostnames:
```sh
-pnpm paperclip allowed-hostname my-machine
+pnpm paperclipai allowed-hostname my-machine
```
### `authenticated` + `public`
@@ -52,7 +52,7 @@ For internet-facing deployment.
- **Security**: stricter deployment checks in doctor
```sh
-pnpm paperclip onboard
+pnpm paperclipai onboard
# Choose "authenticated" -> "public"
```
@@ -75,11 +75,11 @@ A signed-in user visits this URL to claim board ownership. This:
Update the deployment mode:
```sh
-pnpm paperclip configure --section server
+pnpm paperclipai configure --section server
```
Runtime override via environment variable:
```sh
-PAPERCLIP_DEPLOYMENT_MODE=authenticated pnpm paperclip run
+PAPERCLIP_DEPLOYMENT_MODE=authenticated pnpm paperclipai run
```
diff --git a/docs/deploy/local-development.md b/docs/deploy/local-development.md
index 188facc3..b664e13a 100644
--- a/docs/deploy/local-development.md
+++ b/docs/deploy/local-development.md
@@ -29,13 +29,13 @@ No Docker or external database required. Paperclip uses embedded PostgreSQL auto
For a first-time install:
```sh
-pnpm paperclip run
+pnpm paperclipai run
```
This does:
1. Auto-onboards if config is missing
-2. Runs `paperclip doctor` with repair enabled
+2. Runs `paperclipai doctor` with repair enabled
3. Starts the server when checks pass
## Tailscale/Private Auth Dev Mode
@@ -51,7 +51,7 @@ This binds the server to `0.0.0.0` for private-network access.
Allow additional private hostnames:
```sh
-pnpm paperclip allowed-hostname dotta-macbook-pro
+pnpm paperclipai allowed-hostname dotta-macbook-pro
```
## Health Checks
@@ -86,5 +86,5 @@ pnpm dev
Override with environment variables:
```sh
-PAPERCLIP_HOME=/custom/path PAPERCLIP_INSTANCE_ID=dev pnpm paperclip run
+PAPERCLIP_HOME=/custom/path PAPERCLIP_INSTANCE_ID=dev pnpm paperclipai run
```
diff --git a/docs/deploy/overview.md b/docs/deploy/overview.md
index ba4e8aae..3820642f 100644
--- a/docs/deploy/overview.md
+++ b/docs/deploy/overview.md
@@ -45,11 +45,11 @@ Paperclip supports three deployment configurations, from zero-friction local to
Set the mode during onboarding:
```sh
-pnpm paperclip onboard
+pnpm paperclipai onboard
```
Or update it later:
```sh
-pnpm paperclip configure --section server
+pnpm paperclipai configure --section server
```
diff --git a/docs/deploy/secrets.md b/docs/deploy/secrets.md
index 41d4fbc6..3ef1c689 100644
--- a/docs/deploy/secrets.md
+++ b/docs/deploy/secrets.md
@@ -22,19 +22,19 @@ This key is auto-created during onboarding. The key never leaves your machine.
Onboarding writes default secrets config:
```sh
-pnpm paperclip onboard
+pnpm paperclipai onboard
```
Update secrets settings:
```sh
-pnpm paperclip configure --section secrets
+pnpm paperclipai configure --section secrets
```
Validate secrets config:
```sh
-pnpm paperclip doctor
+pnpm paperclipai doctor
```
### Environment Overrides
diff --git a/docs/deploy/storage.md b/docs/deploy/storage.md
index 32b1da98..9c0ff5b8 100644
--- a/docs/deploy/storage.md
+++ b/docs/deploy/storage.md
@@ -22,7 +22,7 @@ For production or multi-node deployments, use S3-compatible object storage (AWS
Configure via CLI:
```sh
-pnpm paperclip configure --section storage
+pnpm paperclipai configure --section storage
```
## Configuration
diff --git a/docs/start/architecture.md b/docs/start/architecture.md
index 786bb134..27d72575 100644
--- a/docs/start/architecture.md
+++ b/docs/start/architecture.md
@@ -85,7 +85,7 @@ Adapters are the bridge between Paperclip and agent runtimes. Each adapter is a
- **Server module** — `execute()` function that spawns/calls the agent, plus environment diagnostics
- **UI module** — stdout parser for the run viewer, config form fields for agent creation
-- **CLI module** — terminal formatter for `paperclip run --watch`
+- **CLI module** — terminal formatter for `paperclipai run --watch`
Built-in adapters: `claude_local`, `codex_local`, `process`, `http`. You can create custom adapters for any runtime.
diff --git a/docs/start/quickstart.md b/docs/start/quickstart.md
index 8c53f1b2..62dfe6d6 100644
--- a/docs/start/quickstart.md
+++ b/docs/start/quickstart.md
@@ -38,7 +38,7 @@ No Docker or external database required — Paperclip uses an embedded PostgreSQ
## Option 3: One-Command Bootstrap
```sh
-pnpm paperclip run
+pnpm paperclipai run
```
This auto-onboards if config is missing, runs health checks with auto-repair, and starts the server.
diff --git a/package.json b/package.json
index 943dedc9..a5f4ecd3 100644
--- a/package.json
+++ b/package.json
@@ -5,17 +5,17 @@
"scripts": {
"dev": "node scripts/dev-runner.mjs dev",
"dev:watch": "PAPERCLIP_MIGRATION_PROMPT=never node scripts/dev-runner.mjs watch",
- "dev:server": "pnpm --filter @paperclip/server dev",
- "dev:ui": "pnpm --filter @paperclip/ui dev",
+ "dev:server": "pnpm --filter @paperclipai/server dev",
+ "dev:ui": "pnpm --filter @paperclipai/ui dev",
"build": "pnpm -r build",
"typecheck": "pnpm -r typecheck",
"test": "vitest",
"test:run": "vitest run",
- "db:generate": "pnpm --filter @paperclip/db generate",
- "db:migrate": "pnpm --filter @paperclip/db migrate",
+ "db:generate": "pnpm --filter @paperclipai/db generate",
+ "db:migrate": "pnpm --filter @paperclipai/db migrate",
"secrets:migrate-inline-env": "tsx scripts/migrate-inline-env-secrets.ts",
"db:backup": "./scripts/backup-db.sh",
- "paperclip": "node cli/node_modules/tsx/dist/cli.mjs cli/src/index.ts",
+ "paperclipai": "node cli/node_modules/tsx/dist/cli.mjs cli/src/index.ts",
"docs:dev": "cd docs && npx mintlify dev"
},
"devDependencies": {
diff --git a/packages/adapter-utils/package.json b/packages/adapter-utils/package.json
index 47ed6525..7625ec3b 100644
--- a/packages/adapter-utils/package.json
+++ b/packages/adapter-utils/package.json
@@ -1,5 +1,5 @@
{
- "name": "@paperclip/adapter-utils",
+ "name": "@paperclipai/adapter-utils",
"version": "0.0.1",
"private": true,
"type": "module",
diff --git a/packages/adapters/claude-local/package.json b/packages/adapters/claude-local/package.json
index badddd2b..9e620167 100644
--- a/packages/adapters/claude-local/package.json
+++ b/packages/adapters/claude-local/package.json
@@ -1,5 +1,5 @@
{
- "name": "@paperclip/adapter-claude-local",
+ "name": "@paperclipai/adapter-claude-local",
"version": "0.0.1",
"private": true,
"type": "module",
@@ -13,7 +13,7 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
- "@paperclip/adapter-utils": "workspace:*",
+ "@paperclipai/adapter-utils": "workspace:*",
"picocolors": "^1.1.1"
},
"devDependencies": {
diff --git a/packages/adapters/claude-local/src/server/execute.ts b/packages/adapters/claude-local/src/server/execute.ts
index d7d1de5f..eeef39b5 100644
--- a/packages/adapters/claude-local/src/server/execute.ts
+++ b/packages/adapters/claude-local/src/server/execute.ts
@@ -2,8 +2,8 @@ import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { fileURLToPath } from "node:url";
-import type { AdapterExecutionContext, AdapterExecutionResult } from "@paperclip/adapter-utils";
-import type { RunProcessResult } from "@paperclip/adapter-utils/server-utils";
+import type { AdapterExecutionContext, AdapterExecutionResult } from "@paperclipai/adapter-utils";
+import type { RunProcessResult } from "@paperclipai/adapter-utils/server-utils";
import {
asString,
asNumber,
@@ -18,7 +18,7 @@ import {
ensurePathInEnv,
renderTemplate,
runChildProcess,
-} from "@paperclip/adapter-utils/server-utils";
+} from "@paperclipai/adapter-utils/server-utils";
import {
parseClaudeStreamJson,
describeClaudeFailure,
diff --git a/packages/adapters/claude-local/src/server/index.ts b/packages/adapters/claude-local/src/server/index.ts
index b2c15c28..6b4ccb3e 100644
--- a/packages/adapters/claude-local/src/server/index.ts
+++ b/packages/adapters/claude-local/src/server/index.ts
@@ -6,7 +6,7 @@ export {
isClaudeMaxTurnsResult,
isClaudeUnknownSessionError,
} from "./parse.js";
-import type { AdapterSessionCodec } from "@paperclip/adapter-utils";
+import type { AdapterSessionCodec } from "@paperclipai/adapter-utils";
function readNonEmptyString(value: unknown): string | null {
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
diff --git a/packages/adapters/claude-local/src/server/parse.ts b/packages/adapters/claude-local/src/server/parse.ts
index 30c12015..c41e16cd 100644
--- a/packages/adapters/claude-local/src/server/parse.ts
+++ b/packages/adapters/claude-local/src/server/parse.ts
@@ -1,5 +1,5 @@
-import type { UsageSummary } from "@paperclip/adapter-utils";
-import { asString, asNumber, parseObject, parseJson } from "@paperclip/adapter-utils/server-utils";
+import type { UsageSummary } from "@paperclipai/adapter-utils";
+import { asString, asNumber, parseObject, parseJson } from "@paperclipai/adapter-utils/server-utils";
const CLAUDE_AUTH_REQUIRED_RE = /(?:not\s+logged\s+in|please\s+log\s+in|please\s+run\s+`?claude\s+login`?|login\s+required|requires\s+login|unauthorized|authentication\s+required)/i;
const URL_RE = /(https?:\/\/[^\s'"`<>()[\]{};,!?]+[^\s'"`<>()[\]{};,!.?:]+)/gi;
diff --git a/packages/adapters/claude-local/src/server/test.ts b/packages/adapters/claude-local/src/server/test.ts
index 41d6869a..d74703e2 100644
--- a/packages/adapters/claude-local/src/server/test.ts
+++ b/packages/adapters/claude-local/src/server/test.ts
@@ -2,14 +2,14 @@ import type {
AdapterEnvironmentCheck,
AdapterEnvironmentTestContext,
AdapterEnvironmentTestResult,
-} from "@paperclip/adapter-utils";
+} from "@paperclipai/adapter-utils";
import {
asString,
parseObject,
ensureAbsoluteDirectory,
ensureCommandResolvable,
ensurePathInEnv,
-} from "@paperclip/adapter-utils/server-utils";
+} from "@paperclipai/adapter-utils/server-utils";
function summarizeStatus(checks: AdapterEnvironmentCheck[]): AdapterEnvironmentTestResult["status"] {
if (checks.some((check) => check.level === "error")) return "fail";
diff --git a/packages/adapters/claude-local/src/ui/build-config.ts b/packages/adapters/claude-local/src/ui/build-config.ts
index 72a0ac29..00368c28 100644
--- a/packages/adapters/claude-local/src/ui/build-config.ts
+++ b/packages/adapters/claude-local/src/ui/build-config.ts
@@ -1,4 +1,4 @@
-import type { CreateConfigValues } from "@paperclip/adapter-utils";
+import type { CreateConfigValues } from "@paperclipai/adapter-utils";
function parseCommaArgs(value: string): string[] {
return value
diff --git a/packages/adapters/claude-local/src/ui/parse-stdout.ts b/packages/adapters/claude-local/src/ui/parse-stdout.ts
index 0ff66139..51c2b3c6 100644
--- a/packages/adapters/claude-local/src/ui/parse-stdout.ts
+++ b/packages/adapters/claude-local/src/ui/parse-stdout.ts
@@ -1,4 +1,4 @@
-import type { TranscriptEntry } from "@paperclip/adapter-utils";
+import type { TranscriptEntry } from "@paperclipai/adapter-utils";
function asRecord(value: unknown): Record | null {
if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
diff --git a/packages/adapters/codex-local/package.json b/packages/adapters/codex-local/package.json
index 0dacb1ad..82dfd6a7 100644
--- a/packages/adapters/codex-local/package.json
+++ b/packages/adapters/codex-local/package.json
@@ -1,5 +1,5 @@
{
- "name": "@paperclip/adapter-codex-local",
+ "name": "@paperclipai/adapter-codex-local",
"version": "0.0.1",
"private": true,
"type": "module",
@@ -13,7 +13,7 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
- "@paperclip/adapter-utils": "workspace:*",
+ "@paperclipai/adapter-utils": "workspace:*",
"picocolors": "^1.1.1"
},
"devDependencies": {
diff --git a/packages/adapters/codex-local/src/server/execute.ts b/packages/adapters/codex-local/src/server/execute.ts
index fa880591..0e21b9f4 100644
--- a/packages/adapters/codex-local/src/server/execute.ts
+++ b/packages/adapters/codex-local/src/server/execute.ts
@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { fileURLToPath } from "node:url";
-import type { AdapterExecutionContext, AdapterExecutionResult } from "@paperclip/adapter-utils";
+import type { AdapterExecutionContext, AdapterExecutionResult } from "@paperclipai/adapter-utils";
import {
asString,
asNumber,
@@ -16,7 +16,7 @@ import {
ensurePathInEnv,
renderTemplate,
runChildProcess,
-} from "@paperclip/adapter-utils/server-utils";
+} from "@paperclipai/adapter-utils/server-utils";
import { parseCodexJsonl, isCodexUnknownSessionError } from "./parse.js";
const PAPERCLIP_SKILLS_DIR = path.resolve(
diff --git a/packages/adapters/codex-local/src/server/index.ts b/packages/adapters/codex-local/src/server/index.ts
index 160db87c..1b8dad75 100644
--- a/packages/adapters/codex-local/src/server/index.ts
+++ b/packages/adapters/codex-local/src/server/index.ts
@@ -1,7 +1,7 @@
export { execute } from "./execute.js";
export { testEnvironment } from "./test.js";
export { parseCodexJsonl, isCodexUnknownSessionError } from "./parse.js";
-import type { AdapterSessionCodec } from "@paperclip/adapter-utils";
+import type { AdapterSessionCodec } from "@paperclipai/adapter-utils";
function readNonEmptyString(value: unknown): string | null {
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
diff --git a/packages/adapters/codex-local/src/server/parse.ts b/packages/adapters/codex-local/src/server/parse.ts
index d4fedf7b..afcf935c 100644
--- a/packages/adapters/codex-local/src/server/parse.ts
+++ b/packages/adapters/codex-local/src/server/parse.ts
@@ -1,4 +1,4 @@
-import { asString, asNumber, parseObject, parseJson } from "@paperclip/adapter-utils/server-utils";
+import { asString, asNumber, parseObject, parseJson } from "@paperclipai/adapter-utils/server-utils";
export function parseCodexJsonl(stdout: string) {
let sessionId: string | null = null;
diff --git a/packages/adapters/codex-local/src/server/test.ts b/packages/adapters/codex-local/src/server/test.ts
index db60fa9f..8f89cbd6 100644
--- a/packages/adapters/codex-local/src/server/test.ts
+++ b/packages/adapters/codex-local/src/server/test.ts
@@ -2,14 +2,14 @@ import type {
AdapterEnvironmentCheck,
AdapterEnvironmentTestContext,
AdapterEnvironmentTestResult,
-} from "@paperclip/adapter-utils";
+} from "@paperclipai/adapter-utils";
import {
asString,
parseObject,
ensureAbsoluteDirectory,
ensureCommandResolvable,
ensurePathInEnv,
-} from "@paperclip/adapter-utils/server-utils";
+} from "@paperclipai/adapter-utils/server-utils";
function summarizeStatus(checks: AdapterEnvironmentCheck[]): AdapterEnvironmentTestResult["status"] {
if (checks.some((check) => check.level === "error")) return "fail";
diff --git a/packages/adapters/codex-local/src/ui/build-config.ts b/packages/adapters/codex-local/src/ui/build-config.ts
index 8e2d8f8d..3c745c8e 100644
--- a/packages/adapters/codex-local/src/ui/build-config.ts
+++ b/packages/adapters/codex-local/src/ui/build-config.ts
@@ -1,4 +1,4 @@
-import type { CreateConfigValues } from "@paperclip/adapter-utils";
+import type { CreateConfigValues } from "@paperclipai/adapter-utils";
function parseCommaArgs(value: string): string[] {
return value
diff --git a/packages/adapters/codex-local/src/ui/parse-stdout.ts b/packages/adapters/codex-local/src/ui/parse-stdout.ts
index 2468841e..bc28f510 100644
--- a/packages/adapters/codex-local/src/ui/parse-stdout.ts
+++ b/packages/adapters/codex-local/src/ui/parse-stdout.ts
@@ -1,4 +1,4 @@
-import type { TranscriptEntry } from "@paperclip/adapter-utils";
+import type { TranscriptEntry } from "@paperclipai/adapter-utils";
function safeJsonParse(text: string): unknown {
try {
diff --git a/packages/adapters/openclaw/package.json b/packages/adapters/openclaw/package.json
index 0725040c..6c995e36 100644
--- a/packages/adapters/openclaw/package.json
+++ b/packages/adapters/openclaw/package.json
@@ -1,5 +1,5 @@
{
- "name": "@paperclip/adapter-openclaw",
+ "name": "@paperclipai/adapter-openclaw",
"version": "0.0.1",
"private": true,
"type": "module",
@@ -13,7 +13,7 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
- "@paperclip/adapter-utils": "workspace:*",
+ "@paperclipai/adapter-utils": "workspace:*",
"picocolors": "^1.1.1"
},
"devDependencies": {
diff --git a/packages/adapters/openclaw/src/server/execute.ts b/packages/adapters/openclaw/src/server/execute.ts
index 3c675577..c0de9f4e 100644
--- a/packages/adapters/openclaw/src/server/execute.ts
+++ b/packages/adapters/openclaw/src/server/execute.ts
@@ -1,5 +1,5 @@
-import type { AdapterExecutionContext, AdapterExecutionResult } from "@paperclip/adapter-utils";
-import { asNumber, asString, parseObject } from "@paperclip/adapter-utils/server-utils";
+import type { AdapterExecutionContext, AdapterExecutionResult } from "@paperclipai/adapter-utils";
+import { asNumber, asString, parseObject } from "@paperclipai/adapter-utils/server-utils";
import { parseOpenClawResponse } from "./parse.js";
function nonEmpty(value: unknown): string | null {
diff --git a/packages/adapters/openclaw/src/server/test.ts b/packages/adapters/openclaw/src/server/test.ts
index 9ae42ef4..ecc1e43c 100644
--- a/packages/adapters/openclaw/src/server/test.ts
+++ b/packages/adapters/openclaw/src/server/test.ts
@@ -2,8 +2,8 @@ import type {
AdapterEnvironmentCheck,
AdapterEnvironmentTestContext,
AdapterEnvironmentTestResult,
-} from "@paperclip/adapter-utils";
-import { asString, parseObject } from "@paperclip/adapter-utils/server-utils";
+} from "@paperclipai/adapter-utils";
+import { asString, parseObject } from "@paperclipai/adapter-utils/server-utils";
function summarizeStatus(checks: AdapterEnvironmentCheck[]): AdapterEnvironmentTestResult["status"] {
if (checks.some((check) => check.level === "error")) return "fail";
@@ -58,7 +58,7 @@ function pushDeploymentDiagnostics(
code: "openclaw_private_bind_hostname_not_allowed",
level: "warn",
message: `Paperclip bind host "${bindHost}" is not in allowed hostnames.`,
- hint: `Run pnpm paperclip allowed-hostname ${bindHost} so remote OpenClaw callbacks can pass host checks.`,
+ hint: `Run pnpm paperclipai allowed-hostname ${bindHost} so remote OpenClaw callbacks can pass host checks.`,
});
}
@@ -76,7 +76,7 @@ function pushDeploymentDiagnostics(
code: "openclaw_private_no_allowed_hostnames",
level: "warn",
message: "No explicit allowed hostnames are configured for authenticated/private mode.",
- hint: "Set one with pnpm paperclip allowed-hostname when OpenClaw runs on another machine.",
+ hint: "Set one with pnpm paperclipai allowed-hostname when OpenClaw runs on another machine.",
});
}
}
diff --git a/packages/adapters/openclaw/src/ui/build-config.ts b/packages/adapters/openclaw/src/ui/build-config.ts
index 376909c5..54bb2fe2 100644
--- a/packages/adapters/openclaw/src/ui/build-config.ts
+++ b/packages/adapters/openclaw/src/ui/build-config.ts
@@ -1,4 +1,4 @@
-import type { CreateConfigValues } from "@paperclip/adapter-utils";
+import type { CreateConfigValues } from "@paperclipai/adapter-utils";
export function buildOpenClawConfig(v: CreateConfigValues): Record {
const ac: Record = {};
diff --git a/packages/adapters/openclaw/src/ui/parse-stdout.ts b/packages/adapters/openclaw/src/ui/parse-stdout.ts
index 8941fa94..4be215e8 100644
--- a/packages/adapters/openclaw/src/ui/parse-stdout.ts
+++ b/packages/adapters/openclaw/src/ui/parse-stdout.ts
@@ -1,4 +1,4 @@
-import type { TranscriptEntry } from "@paperclip/adapter-utils";
+import type { TranscriptEntry } from "@paperclipai/adapter-utils";
export function parseOpenClawStdoutLine(line: string, ts: string): TranscriptEntry[] {
return [{ kind: "stdout", ts, text: line }];
diff --git a/packages/db/package.json b/packages/db/package.json
index 7e788ddc..3ea0b836 100644
--- a/packages/db/package.json
+++ b/packages/db/package.json
@@ -1,5 +1,5 @@
{
- "name": "@paperclip/db",
+ "name": "@paperclipai/db",
"version": "0.0.1",
"private": true,
"type": "module",
@@ -14,7 +14,7 @@
"seed": "tsx src/seed.ts"
},
"dependencies": {
- "@paperclip/shared": "workspace:*",
+ "@paperclipai/shared": "workspace:*",
"drizzle-orm": "^0.38.4",
"postgres": "^3.4.5"
},
diff --git a/packages/shared/package.json b/packages/shared/package.json
index ba38b06a..35c387c8 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,5 +1,5 @@
{
- "name": "@paperclip/shared",
+ "name": "@paperclipai/shared",
"version": "0.0.1",
"private": true,
"type": "module",
diff --git a/scripts/dev-runner.mjs b/scripts/dev-runner.mjs
index 49c4c8d6..71039492 100644
--- a/scripts/dev-runner.mjs
+++ b/scripts/dev-runner.mjs
@@ -46,7 +46,7 @@ const pnpmBin = process.platform === "win32" ? "pnpm.cmd" : "pnpm";
const serverScript = mode === "watch" ? "dev:watch" : "dev";
const child = spawn(
pnpmBin,
- ["--filter", "@paperclip/server", serverScript, ...forwardedArgs],
+ ["--filter", "@paperclipai/server", serverScript, ...forwardedArgs],
{ stdio: "inherit", env },
);
diff --git a/scripts/migrate-inline-env-secrets.ts b/scripts/migrate-inline-env-secrets.ts
index add77560..a3c625b7 100644
--- a/scripts/migrate-inline-env-secrets.ts
+++ b/scripts/migrate-inline-env-secrets.ts
@@ -1,5 +1,5 @@
import { eq } from "drizzle-orm";
-import { agents, createDb } from "@paperclip/db";
+import { agents, createDb } from "@paperclipai/db";
import { secretService } from "../server/src/services/secrets.js";
const SENSITIVE_ENV_KEY_RE =
diff --git a/server/package.json b/server/package.json
index 8120640b..f8e9ff4f 100644
--- a/server/package.json
+++ b/server/package.json
@@ -1,5 +1,5 @@
{
- "name": "@paperclip/server",
+ "name": "@paperclipai/server",
"version": "0.0.1",
"private": true,
"type": "module",
@@ -11,12 +11,12 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
- "@paperclip/adapter-claude-local": "workspace:*",
- "@paperclip/adapter-codex-local": "workspace:*",
- "@paperclip/adapter-openclaw": "workspace:*",
- "@paperclip/adapter-utils": "workspace:*",
- "@paperclip/db": "workspace:*",
- "@paperclip/shared": "workspace:*",
+ "@paperclipai/adapter-claude-local": "workspace:*",
+ "@paperclipai/adapter-codex-local": "workspace:*",
+ "@paperclipai/adapter-openclaw": "workspace:*",
+ "@paperclipai/adapter-utils": "workspace:*",
+ "@paperclipai/db": "workspace:*",
+ "@paperclipai/shared": "workspace:*",
"@aws-sdk/client-s3": "^3.888.0",
"better-auth": "^1.3.8",
"detect-port": "^2.1.0",
diff --git a/server/src/__tests__/adapter-models.test.ts b/server/src/__tests__/adapter-models.test.ts
index a4fa6217..f97fc48d 100644
--- a/server/src/__tests__/adapter-models.test.ts
+++ b/server/src/__tests__/adapter-models.test.ts
@@ -1,5 +1,5 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
-import { models as codexFallbackModels } from "@paperclip/adapter-codex-local";
+import { models as codexFallbackModels } from "@paperclipai/adapter-codex-local";
import { listAdapterModels } from "../adapters/index.js";
import { resetCodexModelsCacheForTests } from "../adapters/codex-models.js";
diff --git a/server/src/__tests__/adapter-session-codecs.test.ts b/server/src/__tests__/adapter-session-codecs.test.ts
index 33cffc14..21d3dda6 100644
--- a/server/src/__tests__/adapter-session-codecs.test.ts
+++ b/server/src/__tests__/adapter-session-codecs.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
-import { sessionCodec as claudeSessionCodec } from "@paperclip/adapter-claude-local/server";
-import { sessionCodec as codexSessionCodec, isCodexUnknownSessionError } from "@paperclip/adapter-codex-local/server";
+import { sessionCodec as claudeSessionCodec } from "@paperclipai/adapter-claude-local/server";
+import { sessionCodec as codexSessionCodec, isCodexUnknownSessionError } from "@paperclipai/adapter-codex-local/server";
describe("adapter session codecs", () => {
it("normalizes claude session params with cwd", () => {
diff --git a/server/src/__tests__/claude-local-adapter-environment.test.ts b/server/src/__tests__/claude-local-adapter-environment.test.ts
index 3c3c3496..8fe62025 100644
--- a/server/src/__tests__/claude-local-adapter-environment.test.ts
+++ b/server/src/__tests__/claude-local-adapter-environment.test.ts
@@ -1,5 +1,5 @@
import { afterEach, describe, expect, it } from "vitest";
-import { testEnvironment } from "@paperclip/adapter-claude-local/server";
+import { testEnvironment } from "@paperclipai/adapter-claude-local/server";
const ORIGINAL_ANTHROPIC = process.env.ANTHROPIC_API_KEY;
diff --git a/server/src/__tests__/claude-local-adapter.test.ts b/server/src/__tests__/claude-local-adapter.test.ts
index a67a30a8..26fc4531 100644
--- a/server/src/__tests__/claude-local-adapter.test.ts
+++ b/server/src/__tests__/claude-local-adapter.test.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { isClaudeMaxTurnsResult } from "@paperclip/adapter-claude-local/server";
+import { isClaudeMaxTurnsResult } from "@paperclipai/adapter-claude-local/server";
describe("claude_local max-turn detection", () => {
it("detects max-turn exhaustion by subtype", () => {
diff --git a/server/src/__tests__/codex-local-adapter.test.ts b/server/src/__tests__/codex-local-adapter.test.ts
index 89caf049..6136f76a 100644
--- a/server/src/__tests__/codex-local-adapter.test.ts
+++ b/server/src/__tests__/codex-local-adapter.test.ts
@@ -1,7 +1,7 @@
import { describe, expect, it, vi } from "vitest";
-import { isCodexUnknownSessionError, parseCodexJsonl } from "@paperclip/adapter-codex-local/server";
-import { parseCodexStdoutLine } from "@paperclip/adapter-codex-local/ui";
-import { printCodexStreamEvent } from "@paperclip/adapter-codex-local/cli";
+import { isCodexUnknownSessionError, parseCodexJsonl } from "@paperclipai/adapter-codex-local/server";
+import { parseCodexStdoutLine } from "@paperclipai/adapter-codex-local/ui";
+import { printCodexStreamEvent } from "@paperclipai/adapter-codex-local/cli";
describe("codex_local parser", () => {
it("extracts session, summary, usage, and terminal error message", () => {
diff --git a/server/src/__tests__/private-hostname-guard.test.ts b/server/src/__tests__/private-hostname-guard.test.ts
index 8aeddb69..e0e74d56 100644
--- a/server/src/__tests__/private-hostname-guard.test.ts
+++ b/server/src/__tests__/private-hostname-guard.test.ts
@@ -44,13 +44,13 @@ describe("privateHostnameGuard", () => {
const app = createApp({ enabled: true, allowedHostnames: ["some-other-host"] });
const res = await request(app).get("/api/health").set("Host", "dotta-macbook-pro:3100");
expect(res.status).toBe(403);
- expect(res.body?.error).toContain("please run pnpm paperclip allowed-hostname dotta-macbook-pro");
+ expect(res.body?.error).toContain("please run pnpm paperclipai allowed-hostname dotta-macbook-pro");
});
it("blocks unknown hostnames on page routes with plain-text remediation command", async () => {
const app = createApp({ enabled: true, allowedHostnames: ["some-other-host"] });
const res = await request(app).get("/dashboard").set("Host", "dotta-macbook-pro:3100");
expect(res.status).toBe(403);
- expect(res.text).toContain("please run pnpm paperclip allowed-hostname dotta-macbook-pro");
+ expect(res.text).toContain("please run pnpm paperclipai allowed-hostname dotta-macbook-pro");
});
});
diff --git a/server/src/adapters/codex-models.ts b/server/src/adapters/codex-models.ts
index abef28c4..418bb6c7 100644
--- a/server/src/adapters/codex-models.ts
+++ b/server/src/adapters/codex-models.ts
@@ -1,5 +1,5 @@
import type { AdapterModel } from "./types.js";
-import { models as codexFallbackModels } from "@paperclip/adapter-codex-local";
+import { models as codexFallbackModels } from "@paperclipai/adapter-codex-local";
import { readConfigFile } from "../config-file.js";
const OPENAI_MODELS_ENDPOINT = "https://api.openai.com/v1/models";
diff --git a/server/src/adapters/index.ts b/server/src/adapters/index.ts
index 7f218a83..8d86eb52 100644
--- a/server/src/adapters/index.ts
+++ b/server/src/adapters/index.ts
@@ -13,5 +13,5 @@ export type {
UsageSummary,
AdapterAgent,
AdapterRuntime,
-} from "@paperclip/adapter-utils";
+} from "@paperclipai/adapter-utils";
export { runningProcesses } from "./utils.js";
diff --git a/server/src/adapters/registry.ts b/server/src/adapters/registry.ts
index 17f8e96b..33359b14 100644
--- a/server/src/adapters/registry.ts
+++ b/server/src/adapters/registry.ts
@@ -3,22 +3,22 @@ import {
execute as claudeExecute,
testEnvironment as claudeTestEnvironment,
sessionCodec as claudeSessionCodec,
-} from "@paperclip/adapter-claude-local/server";
-import { agentConfigurationDoc as claudeAgentConfigurationDoc, models as claudeModels } from "@paperclip/adapter-claude-local";
+} from "@paperclipai/adapter-claude-local/server";
+import { agentConfigurationDoc as claudeAgentConfigurationDoc, models as claudeModels } from "@paperclipai/adapter-claude-local";
import {
execute as codexExecute,
testEnvironment as codexTestEnvironment,
sessionCodec as codexSessionCodec,
-} from "@paperclip/adapter-codex-local/server";
-import { agentConfigurationDoc as codexAgentConfigurationDoc, models as codexModels } from "@paperclip/adapter-codex-local";
+} from "@paperclipai/adapter-codex-local/server";
+import { agentConfigurationDoc as codexAgentConfigurationDoc, models as codexModels } from "@paperclipai/adapter-codex-local";
import {
execute as openclawExecute,
testEnvironment as openclawTestEnvironment,
-} from "@paperclip/adapter-openclaw/server";
+} from "@paperclipai/adapter-openclaw/server";
import {
agentConfigurationDoc as openclawAgentConfigurationDoc,
models as openclawModels,
-} from "@paperclip/adapter-openclaw";
+} from "@paperclipai/adapter-openclaw";
import { listCodexModels } from "./codex-models.js";
import { processAdapter } from "./process/index.js";
import { httpAdapter } from "./http/index.js";
diff --git a/server/src/adapters/types.ts b/server/src/adapters/types.ts
index 4ac0086b..c5708d8a 100644
--- a/server/src/adapters/types.ts
+++ b/server/src/adapters/types.ts
@@ -16,4 +16,4 @@ export type {
AdapterSessionCodec,
AdapterModel,
ServerAdapterModule,
-} from "@paperclip/adapter-utils";
+} from "@paperclipai/adapter-utils";
diff --git a/server/src/adapters/utils.ts b/server/src/adapters/utils.ts
index da1090f5..cb4ec4b9 100644
--- a/server/src/adapters/utils.ts
+++ b/server/src/adapters/utils.ts
@@ -22,11 +22,11 @@ export {
ensurePathInEnv,
ensureAbsoluteDirectory,
ensureCommandResolvable,
-} from "@paperclip/adapter-utils/server-utils";
+} from "@paperclipai/adapter-utils/server-utils";
// Re-export runChildProcess with the server's pino logger wired in.
-import { runChildProcess as _runChildProcess } from "@paperclip/adapter-utils/server-utils";
-import type { RunProcessResult } from "@paperclip/adapter-utils/server-utils";
+import { runChildProcess as _runChildProcess } from "@paperclipai/adapter-utils/server-utils";
+import type { RunProcessResult } from "@paperclipai/adapter-utils/server-utils";
export async function runChildProcess(
runId: string,
diff --git a/server/src/app.ts b/server/src/app.ts
index 761087ab..e14e7de2 100644
--- a/server/src/app.ts
+++ b/server/src/app.ts
@@ -2,8 +2,8 @@ import express, { Router, type Request as ExpressRequest } from "express";
import path from "node:path";
import fs from "node:fs";
import { fileURLToPath } from "node:url";
-import type { Db } from "@paperclip/db";
-import type { DeploymentExposure, DeploymentMode } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
import type { StorageService } from "./storage/types.js";
import { httpLogger, errorHandler } from "./middleware/index.js";
import { actorMiddleware } from "./middleware/auth.js";
diff --git a/server/src/auth/better-auth.ts b/server/src/auth/better-auth.ts
index 351d5926..db117a00 100644
--- a/server/src/auth/better-auth.ts
+++ b/server/src/auth/better-auth.ts
@@ -3,13 +3,13 @@ import type { IncomingHttpHeaders } from "node:http";
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { toNodeHandler } from "better-auth/node";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
authAccounts,
authSessions,
authUsers,
authVerifications,
-} from "@paperclip/db";
+} from "@paperclipai/db";
import type { Config } from "../config.js";
export type BetterAuthSessionUser = {
diff --git a/server/src/board-claim.ts b/server/src/board-claim.ts
index 886ca1b4..4c87b732 100644
--- a/server/src/board-claim.ts
+++ b/server/src/board-claim.ts
@@ -1,8 +1,8 @@
import { randomBytes } from "node:crypto";
import { and, eq } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { companies, companyMemberships, instanceUserRoles } from "@paperclip/db";
-import type { DeploymentMode } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import { companies, companyMemberships, instanceUserRoles } from "@paperclipai/db";
+import type { DeploymentMode } from "@paperclipai/shared";
const LOCAL_BOARD_USER_ID = "local-board";
const CLAIM_TTL_MS = 1000 * 60 * 60 * 24;
diff --git a/server/src/config-file.ts b/server/src/config-file.ts
index 19167786..a25d4db5 100644
--- a/server/src/config-file.ts
+++ b/server/src/config-file.ts
@@ -1,5 +1,5 @@
import fs from "node:fs";
-import { paperclipConfigSchema, type PaperclipConfig } from "@paperclip/shared";
+import { paperclipConfigSchema, type PaperclipConfig } from "@paperclipai/shared";
import { resolvePaperclipConfigPath } from "./paths.js";
export function readConfigFile(): PaperclipConfig | null {
diff --git a/server/src/config.ts b/server/src/config.ts
index 56c14907..ff46d34e 100644
--- a/server/src/config.ts
+++ b/server/src/config.ts
@@ -13,7 +13,7 @@ import {
type DeploymentMode,
type SecretProvider,
type StorageProvider,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import {
resolveDefaultEmbeddedPostgresDir,
resolveDefaultSecretsKeyFilePath,
diff --git a/server/src/index.ts b/server/src/index.ts
index d4eaad2a..2018db16 100644
--- a/server/src/index.ts
+++ b/server/src/index.ts
@@ -15,7 +15,7 @@ import {
companies,
companyMemberships,
instanceUserRoles,
-} from "@paperclip/db";
+} from "@paperclipai/db";
import detectPort from "detect-port";
import { createApp } from "./app.js";
import { loadConfig } from "./config.js";
diff --git a/server/src/middleware/auth.ts b/server/src/middleware/auth.ts
index 8aca256a..41d3a76a 100644
--- a/server/src/middleware/auth.ts
+++ b/server/src/middleware/auth.ts
@@ -1,10 +1,10 @@
import { createHash } from "node:crypto";
import type { Request, RequestHandler } from "express";
import { and, eq, isNull } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { agentApiKeys, agents, companyMemberships, instanceUserRoles } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { agentApiKeys, agents, companyMemberships, instanceUserRoles } from "@paperclipai/db";
import { verifyLocalAgentJwt } from "../agent-auth-jwt.js";
-import type { DeploymentMode } from "@paperclip/shared";
+import type { DeploymentMode } from "@paperclipai/shared";
import type { BetterAuthSessionResult } from "../auth/better-auth.js";
import { logger } from "./logger.js";
diff --git a/server/src/middleware/private-hostname-guard.ts b/server/src/middleware/private-hostname-guard.ts
index bc83462b..a5d743dc 100644
--- a/server/src/middleware/private-hostname-guard.ts
+++ b/server/src/middleware/private-hostname-guard.ts
@@ -45,7 +45,7 @@ export function resolvePrivateHostnameAllowSet(opts: { allowedHostnames: string[
function blockedHostnameMessage(hostname: string): string {
return (
`Hostname '${hostname}' is not allowed for this Paperclip instance. ` +
- `If you want to allow this hostname, please run pnpm paperclip allowed-hostname ${hostname}`
+ `If you want to allow this hostname, please run pnpm paperclipai allowed-hostname ${hostname}`
);
}
@@ -68,7 +68,7 @@ export function privateHostnameGuard(opts: {
const wantsJson = req.path.startsWith("/api") || req.accepts(["json", "html", "text"]) === "json";
if (!hostname) {
- const error = "Missing Host header. If you want to allow a hostname, run pnpm paperclip allowed-hostname .";
+ const error = "Missing Host header. If you want to allow a hostname, run pnpm paperclipai allowed-hostname .";
if (wantsJson) {
res.status(403).json({ error });
} else {
diff --git a/server/src/realtime/live-events-ws.ts b/server/src/realtime/live-events-ws.ts
index 442ac05a..b082ecb6 100644
--- a/server/src/realtime/live-events-ws.ts
+++ b/server/src/realtime/live-events-ws.ts
@@ -2,9 +2,9 @@ import { createHash } from "node:crypto";
import type { IncomingMessage, Server as HttpServer } from "node:http";
import type { Duplex } from "node:stream";
import { and, eq, isNull } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { agentApiKeys, companyMemberships, instanceUserRoles } from "@paperclip/db";
-import type { DeploymentMode } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import { agentApiKeys, companyMemberships, instanceUserRoles } from "@paperclipai/db";
+import type { DeploymentMode } from "@paperclipai/shared";
import { WebSocket, WebSocketServer } from "ws";
import type { BetterAuthSessionResult } from "../auth/better-auth.js";
import { logger } from "../middleware/logger.js";
diff --git a/server/src/routes/access.ts b/server/src/routes/access.ts
index fcba4ea0..64e1b881 100644
--- a/server/src/routes/access.ts
+++ b/server/src/routes/access.ts
@@ -5,13 +5,13 @@ import { fileURLToPath } from "node:url";
import { Router } from "express";
import type { Request } from "express";
import { and, eq, isNull, desc } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
agentApiKeys,
authUsers,
invites,
joinRequests,
-} from "@paperclip/db";
+} from "@paperclipai/db";
import {
acceptInviteSchema,
claimJoinRequestApiKeySchema,
@@ -20,8 +20,8 @@ import {
updateMemberPermissionsSchema,
updateUserCompanyAccessSchema,
PERMISSION_KEYS,
-} from "@paperclip/shared";
-import type { DeploymentExposure, DeploymentMode } from "@paperclip/shared";
+} from "@paperclipai/shared";
+import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
import { forbidden, conflict, notFound, unauthorized, badRequest } from "../errors.js";
import { validate } from "../middleware/validate.js";
import { accessService, agentService, logActivity } from "../services/index.js";
@@ -155,7 +155,7 @@ function buildJoinConnectivityDiagnostics(input: {
code: "openclaw_private_bind_not_allowed",
level: "warn",
message: `Paperclip bind host \"${bindHost}\" is not in allowed hostnames.`,
- hint: `Run pnpm paperclip allowed-hostname ${bindHost}`,
+ hint: `Run pnpm paperclipai allowed-hostname ${bindHost}`,
});
}
if (callbackHost && !isLoopbackHost(callbackHost) && allowSet.size === 0) {
@@ -163,7 +163,7 @@ function buildJoinConnectivityDiagnostics(input: {
code: "openclaw_private_allowed_hostnames_empty",
level: "warn",
message: "No explicit allowed hostnames are configured for authenticated/private mode.",
- hint: "Set one with pnpm paperclip allowed-hostname when OpenClaw runs off-host.",
+ hint: "Set one with pnpm paperclipai allowed-hostname when OpenClaw runs off-host.",
});
}
}
@@ -355,7 +355,7 @@ function buildInviteOnboardingManifest(
allowedHostnames: opts.allowedHostnames,
guidance:
opts.deploymentMode === "authenticated" && opts.deploymentExposure === "private"
- ? "If OpenClaw runs on another machine, ensure the Paperclip hostname is reachable and allowed via `pnpm paperclip allowed-hostname `."
+ ? "If OpenClaw runs on another machine, ensure the Paperclip hostname is reachable and allowed via `pnpm paperclipai allowed-hostname `."
: "Ensure OpenClaw can reach this Paperclip API base URL for callbacks and claims.",
},
skill: {
diff --git a/server/src/routes/activity.ts b/server/src/routes/activity.ts
index 087aea56..8dfd9768 100644
--- a/server/src/routes/activity.ts
+++ b/server/src/routes/activity.ts
@@ -1,6 +1,6 @@
import { Router } from "express";
import { z } from "zod";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import { validate } from "../middleware/validate.js";
import { activityService } from "../services/activity.js";
import { assertBoard, assertCompanyAccess } from "./authz.js";
diff --git a/server/src/routes/agents.ts b/server/src/routes/agents.ts
index 83105d44..f0a00a45 100644
--- a/server/src/routes/agents.ts
+++ b/server/src/routes/agents.ts
@@ -1,8 +1,8 @@
import { Router, type Request } from "express";
import { randomUUID } from "node:crypto";
import path from "node:path";
-import type { Db } from "@paperclip/db";
-import { agents as agentsTable, companies, heartbeatRuns } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { agents as agentsTable, companies, heartbeatRuns } from "@paperclipai/db";
import { and, desc, eq, inArray, not, sql } from "drizzle-orm";
import {
createAgentKeySchema,
@@ -15,7 +15,7 @@ import {
updateAgentInstructionsPathSchema,
wakeAgentSchema,
updateAgentSchema,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import {
agentService,
@@ -31,7 +31,7 @@ import { conflict, forbidden, unprocessable } from "../errors.js";
import { assertBoard, assertCompanyAccess, getActorInfo } from "./authz.js";
import { findServerAdapter, listAdapterModels } from "../adapters/index.js";
import { redactEventPayload } from "../redaction.js";
-import { runClaudeLogin } from "@paperclip/adapter-claude-local/server";
+import { runClaudeLogin } from "@paperclipai/adapter-claude-local/server";
export function agentRoutes(db: Db) {
const DEFAULT_INSTRUCTIONS_PATH_KEYS: Record = {
diff --git a/server/src/routes/approvals.ts b/server/src/routes/approvals.ts
index 3de2fb40..f9903435 100644
--- a/server/src/routes/approvals.ts
+++ b/server/src/routes/approvals.ts
@@ -1,12 +1,12 @@
import { Router } from "express";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
addApprovalCommentSchema,
createApprovalSchema,
requestApprovalRevisionSchema,
resolveApprovalSchema,
resubmitApprovalSchema,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { logger } from "../middleware/logger.js";
import {
diff --git a/server/src/routes/assets.ts b/server/src/routes/assets.ts
index 803ef773..cde29ada 100644
--- a/server/src/routes/assets.ts
+++ b/server/src/routes/assets.ts
@@ -1,7 +1,7 @@
import { Router, type Request, type Response } from "express";
import multer from "multer";
-import type { Db } from "@paperclip/db";
-import { createAssetImageMetadataSchema } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import { createAssetImageMetadataSchema } from "@paperclipai/shared";
import type { StorageService } from "../storage/types.js";
import { assetService, logActivity } from "../services/index.js";
import { assertCompanyAccess, getActorInfo } from "./authz.js";
diff --git a/server/src/routes/companies.ts b/server/src/routes/companies.ts
index 10e4e1a5..e0505fbb 100644
--- a/server/src/routes/companies.ts
+++ b/server/src/routes/companies.ts
@@ -1,12 +1,12 @@
import { Router } from "express";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
companyPortabilityExportSchema,
companyPortabilityImportSchema,
companyPortabilityPreviewSchema,
createCompanySchema,
updateCompanySchema,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import { forbidden } from "../errors.js";
import { validate } from "../middleware/validate.js";
import { accessService, companyPortabilityService, companyService, logActivity } from "../services/index.js";
diff --git a/server/src/routes/costs.ts b/server/src/routes/costs.ts
index 47f732ff..e4527bff 100644
--- a/server/src/routes/costs.ts
+++ b/server/src/routes/costs.ts
@@ -1,6 +1,6 @@
import { Router } from "express";
-import type { Db } from "@paperclip/db";
-import { createCostEventSchema, updateBudgetSchema } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import { createCostEventSchema, updateBudgetSchema } from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { costService, companyService, agentService, logActivity } from "../services/index.js";
import { assertBoard, assertCompanyAccess, getActorInfo } from "./authz.js";
diff --git a/server/src/routes/dashboard.ts b/server/src/routes/dashboard.ts
index 30709716..2a10ca9d 100644
--- a/server/src/routes/dashboard.ts
+++ b/server/src/routes/dashboard.ts
@@ -1,5 +1,5 @@
import { Router } from "express";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import { dashboardService } from "../services/dashboard.js";
import { assertCompanyAccess } from "./authz.js";
diff --git a/server/src/routes/goals.ts b/server/src/routes/goals.ts
index ee13f978..450f9467 100644
--- a/server/src/routes/goals.ts
+++ b/server/src/routes/goals.ts
@@ -1,6 +1,6 @@
import { Router } from "express";
-import type { Db } from "@paperclip/db";
-import { createGoalSchema, updateGoalSchema } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import { createGoalSchema, updateGoalSchema } from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { goalService, logActivity } from "../services/index.js";
import { assertCompanyAccess, getActorInfo } from "./authz.js";
diff --git a/server/src/routes/health.ts b/server/src/routes/health.ts
index 2bb49026..9a95f6e8 100644
--- a/server/src/routes/health.ts
+++ b/server/src/routes/health.ts
@@ -1,8 +1,8 @@
import { Router } from "express";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import { count, sql } from "drizzle-orm";
-import { instanceUserRoles } from "@paperclip/db";
-import type { DeploymentExposure, DeploymentMode } from "@paperclip/shared";
+import { instanceUserRoles } from "@paperclipai/db";
+import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
export function healthRoutes(
db?: Db,
diff --git a/server/src/routes/issues.ts b/server/src/routes/issues.ts
index 3fe6d6f1..67b43c04 100644
--- a/server/src/routes/issues.ts
+++ b/server/src/routes/issues.ts
@@ -1,6 +1,6 @@
import { Router, type Request, type Response } from "express";
import multer from "multer";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
addIssueCommentSchema,
createIssueAttachmentMetadataSchema,
@@ -9,7 +9,7 @@ import {
createIssueSchema,
linkIssueApprovalSchema,
updateIssueSchema,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import type { StorageService } from "../storage/types.js";
import { validate } from "../middleware/validate.js";
import {
diff --git a/server/src/routes/llms.ts b/server/src/routes/llms.ts
index c4215940..4418c76f 100644
--- a/server/src/routes/llms.ts
+++ b/server/src/routes/llms.ts
@@ -1,6 +1,6 @@
import { Router, type Request } from "express";
-import type { Db } from "@paperclip/db";
-import { AGENT_ICON_NAMES } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import { AGENT_ICON_NAMES } from "@paperclipai/shared";
import { forbidden } from "../errors.js";
import { listServerAdapters } from "../adapters/index.js";
import { agentService } from "../services/agents.js";
diff --git a/server/src/routes/projects.ts b/server/src/routes/projects.ts
index 3e42b990..d9da3094 100644
--- a/server/src/routes/projects.ts
+++ b/server/src/routes/projects.ts
@@ -1,12 +1,12 @@
import { Router, type Request } from "express";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
createProjectSchema,
createProjectWorkspaceSchema,
isUuidLike,
updateProjectSchema,
updateProjectWorkspaceSchema,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { projectService, logActivity } from "../services/index.js";
import { conflict } from "../errors.js";
diff --git a/server/src/routes/secrets.ts b/server/src/routes/secrets.ts
index eff2c37a..1ea99ee1 100644
--- a/server/src/routes/secrets.ts
+++ b/server/src/routes/secrets.ts
@@ -1,12 +1,12 @@
import { Router } from "express";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
SECRET_PROVIDERS,
type SecretProvider,
createSecretSchema,
rotateSecretSchema,
updateSecretSchema,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { assertBoard, assertCompanyAccess } from "./authz.js";
import { logActivity, secretService } from "../services/index.js";
diff --git a/server/src/routes/sidebar-badges.ts b/server/src/routes/sidebar-badges.ts
index 1dd03904..f908e86e 100644
--- a/server/src/routes/sidebar-badges.ts
+++ b/server/src/routes/sidebar-badges.ts
@@ -1,7 +1,7 @@
import { Router } from "express";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import { and, eq, inArray, isNull, sql } from "drizzle-orm";
-import { issues, joinRequests } from "@paperclip/db";
+import { issues, joinRequests } from "@paperclipai/db";
import { sidebarBadgeService } from "../services/sidebar-badges.js";
import { accessService } from "../services/access.js";
import { assertCompanyAccess } from "./authz.js";
diff --git a/server/src/secrets/provider-registry.ts b/server/src/secrets/provider-registry.ts
index d928b88a..95e16de8 100644
--- a/server/src/secrets/provider-registry.ts
+++ b/server/src/secrets/provider-registry.ts
@@ -1,4 +1,4 @@
-import type { SecretProvider, SecretProviderDescriptor } from "@paperclip/shared";
+import type { SecretProvider, SecretProviderDescriptor } from "@paperclipai/shared";
import { localEncryptedProvider } from "./local-encrypted-provider.js";
import {
awsSecretsManagerProvider,
diff --git a/server/src/secrets/types.ts b/server/src/secrets/types.ts
index 13a7270b..5f9ed1b9 100644
--- a/server/src/secrets/types.ts
+++ b/server/src/secrets/types.ts
@@ -1,4 +1,4 @@
-import type { SecretProvider, SecretProviderDescriptor } from "@paperclip/shared";
+import type { SecretProvider, SecretProviderDescriptor } from "@paperclipai/shared";
export interface StoredSecretVersionMaterial {
[key: string]: unknown;
diff --git a/server/src/services/access.ts b/server/src/services/access.ts
index 59bb1804..9ec0387d 100644
--- a/server/src/services/access.ts
+++ b/server/src/services/access.ts
@@ -1,11 +1,11 @@
import { and, eq, inArray, sql } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
companyMemberships,
instanceUserRoles,
principalPermissionGrants,
-} from "@paperclip/db";
-import type { PermissionKey, PrincipalType } from "@paperclip/shared";
+} from "@paperclipai/db";
+import type { PermissionKey, PrincipalType } from "@paperclipai/shared";
type MembershipRow = typeof companyMemberships.$inferSelect;
type GrantInput = {
diff --git a/server/src/services/activity-log.ts b/server/src/services/activity-log.ts
index 971d9c62..41cd2938 100644
--- a/server/src/services/activity-log.ts
+++ b/server/src/services/activity-log.ts
@@ -1,5 +1,5 @@
-import type { Db } from "@paperclip/db";
-import { activityLog } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { activityLog } from "@paperclipai/db";
import { publishLiveEvent } from "./live-events.js";
import { sanitizeRecord } from "../redaction.js";
diff --git a/server/src/services/activity.ts b/server/src/services/activity.ts
index 8bf235a0..a86d7f68 100644
--- a/server/src/services/activity.ts
+++ b/server/src/services/activity.ts
@@ -1,6 +1,6 @@
import { and, desc, eq, isNull, or, sql } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { activityLog, heartbeatRuns, issues } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { activityLog, heartbeatRuns, issues } from "@paperclipai/db";
export interface ActivityFilters {
companyId: string;
diff --git a/server/src/services/agents.ts b/server/src/services/agents.ts
index 94c93708..54d48045 100644
--- a/server/src/services/agents.ts
+++ b/server/src/services/agents.ts
@@ -1,6 +1,6 @@
import { createHash, randomBytes } from "node:crypto";
import { and, desc, eq, inArray } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
agents,
agentConfigRevisions,
@@ -10,8 +10,8 @@ import {
agentWakeupRequests,
heartbeatRunEvents,
heartbeatRuns,
-} from "@paperclip/db";
-import { isUuidLike, normalizeAgentUrlKey } from "@paperclip/shared";
+} from "@paperclipai/db";
+import { isUuidLike, normalizeAgentUrlKey } from "@paperclipai/shared";
import { conflict, notFound, unprocessable } from "../errors.js";
import { normalizeAgentPermissions } from "./agent-permissions.js";
import { REDACTED_EVENT_VALUE, sanitizeRecord } from "../redaction.js";
diff --git a/server/src/services/approvals.ts b/server/src/services/approvals.ts
index ba9e4500..39810cdc 100644
--- a/server/src/services/approvals.ts
+++ b/server/src/services/approvals.ts
@@ -1,6 +1,6 @@
import { and, asc, eq } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { approvalComments, approvals } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { approvalComments, approvals } from "@paperclipai/db";
import { notFound, unprocessable } from "../errors.js";
import { agentService } from "./agents.js";
diff --git a/server/src/services/assets.ts b/server/src/services/assets.ts
index 3d696ccd..19fe5cc5 100644
--- a/server/src/services/assets.ts
+++ b/server/src/services/assets.ts
@@ -1,6 +1,6 @@
import { eq } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { assets } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { assets } from "@paperclipai/db";
export function assetService(db: Db) {
return {
diff --git a/server/src/services/companies.ts b/server/src/services/companies.ts
index 6533802d..38a1f12f 100644
--- a/server/src/services/companies.ts
+++ b/server/src/services/companies.ts
@@ -1,5 +1,5 @@
import { eq, count } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
companies,
agents,
@@ -22,7 +22,7 @@ import {
invites,
principalPermissionGrants,
companyMemberships,
-} from "@paperclip/db";
+} from "@paperclipai/db";
export function companyService(db: Db) {
const ISSUE_PREFIX_FALLBACK = "CMP";
diff --git a/server/src/services/company-portability.ts b/server/src/services/company-portability.ts
index adc6f520..84575881 100644
--- a/server/src/services/company-portability.ts
+++ b/server/src/services/company-portability.ts
@@ -1,6 +1,6 @@
import { promises as fs } from "node:fs";
import path from "node:path";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import type {
CompanyPortabilityAgentManifestEntry,
CompanyPortabilityCollisionStrategy,
@@ -13,8 +13,8 @@ import type {
CompanyPortabilityPreview,
CompanyPortabilityPreviewAgentPlan,
CompanyPortabilityPreviewResult,
-} from "@paperclip/shared";
-import { normalizeAgentUrlKey, portabilityManifestSchema } from "@paperclip/shared";
+} from "@paperclipai/shared";
+import { normalizeAgentUrlKey, portabilityManifestSchema } from "@paperclipai/shared";
import { notFound, unprocessable } from "../errors.js";
import { accessService } from "./access.js";
import { agentService } from "./agents.js";
diff --git a/server/src/services/costs.ts b/server/src/services/costs.ts
index 853805ca..2d430aa9 100644
--- a/server/src/services/costs.ts
+++ b/server/src/services/costs.ts
@@ -1,6 +1,6 @@
import { and, desc, eq, gte, isNotNull, lte, sql } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { activityLog, agents, companies, costEvents, heartbeatRuns, issues, projects } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { activityLog, agents, companies, costEvents, heartbeatRuns, issues, projects } from "@paperclipai/db";
import { notFound, unprocessable } from "../errors.js";
export interface CostDateRange {
diff --git a/server/src/services/dashboard.ts b/server/src/services/dashboard.ts
index 0828d914..cf7f32cf 100644
--- a/server/src/services/dashboard.ts
+++ b/server/src/services/dashboard.ts
@@ -1,6 +1,6 @@
import { and, eq, gte, sql } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { agents, approvals, companies, costEvents, issues } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { agents, approvals, companies, costEvents, issues } from "@paperclipai/db";
import { notFound } from "../errors.js";
export function dashboardService(db: Db) {
diff --git a/server/src/services/goals.ts b/server/src/services/goals.ts
index 2de962ee..9045ebc1 100644
--- a/server/src/services/goals.ts
+++ b/server/src/services/goals.ts
@@ -1,6 +1,6 @@
import { eq } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { goals } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { goals } from "@paperclipai/db";
export function goalService(db: Db) {
return {
diff --git a/server/src/services/heartbeat.ts b/server/src/services/heartbeat.ts
index 3fd3fa30..aa649adb 100644
--- a/server/src/services/heartbeat.ts
+++ b/server/src/services/heartbeat.ts
@@ -1,6 +1,6 @@
import fs from "node:fs/promises";
import { and, asc, desc, eq, gt, inArray, sql } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
agents,
agentRuntimeState,
@@ -11,7 +11,7 @@ import {
costEvents,
issues,
projectWorkspaces,
-} from "@paperclip/db";
+} from "@paperclipai/db";
import { conflict, notFound } from "../errors.js";
import { logger } from "../middleware/logger.js";
import { publishLiveEvent } from "./live-events.js";
diff --git a/server/src/services/issue-approvals.ts b/server/src/services/issue-approvals.ts
index c737644a..9d2d0a37 100644
--- a/server/src/services/issue-approvals.ts
+++ b/server/src/services/issue-approvals.ts
@@ -1,6 +1,6 @@
import { and, desc, eq, inArray } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { approvals, issueApprovals, issues } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { approvals, issueApprovals, issues } from "@paperclipai/db";
import { notFound, unprocessable } from "../errors.js";
import { redactEventPayload } from "../redaction.js";
diff --git a/server/src/services/issues.ts b/server/src/services/issues.ts
index 5cc24ffd..5a886980 100644
--- a/server/src/services/issues.ts
+++ b/server/src/services/issues.ts
@@ -1,5 +1,5 @@
import { and, asc, desc, eq, inArray, isNull, or, sql } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
import {
agents,
assets,
@@ -14,8 +14,8 @@ import {
labels,
projectWorkspaces,
projects,
-} from "@paperclip/db";
-import { extractProjectMentionIds } from "@paperclip/shared";
+} from "@paperclipai/db";
+import { extractProjectMentionIds } from "@paperclipai/shared";
import { conflict, notFound, unprocessable } from "../errors.js";
const ALL_ISSUE_STATUSES = ["backlog", "todo", "in_progress", "in_review", "blocked", "done", "cancelled"];
diff --git a/server/src/services/live-events.ts b/server/src/services/live-events.ts
index 97f344ea..1421d07d 100644
--- a/server/src/services/live-events.ts
+++ b/server/src/services/live-events.ts
@@ -1,5 +1,5 @@
import { EventEmitter } from "node:events";
-import type { LiveEvent, LiveEventType } from "@paperclip/shared";
+import type { LiveEvent, LiveEventType } from "@paperclipai/shared";
type LiveEventPayload = Record;
type LiveEventListener = (event: LiveEvent) => void;
diff --git a/server/src/services/projects.ts b/server/src/services/projects.ts
index 18596cb9..3ff3b53b 100644
--- a/server/src/services/projects.ts
+++ b/server/src/services/projects.ts
@@ -1,6 +1,6 @@
import { and, asc, desc, eq, inArray } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { projects, projectGoals, goals, projectWorkspaces } from "@paperclip/db";
+import type { Db } from "@paperclipai/db";
+import { projects, projectGoals, goals, projectWorkspaces } from "@paperclipai/db";
import {
PROJECT_COLORS,
deriveProjectUrlKey,
@@ -8,7 +8,7 @@ import {
normalizeProjectUrlKey,
type ProjectGoalRef,
type ProjectWorkspace,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
type ProjectRow = typeof projects.$inferSelect;
type ProjectWorkspaceRow = typeof projectWorkspaces.$inferSelect;
diff --git a/server/src/services/secrets.ts b/server/src/services/secrets.ts
index 148e8b10..8a3595b4 100644
--- a/server/src/services/secrets.ts
+++ b/server/src/services/secrets.ts
@@ -1,8 +1,8 @@
import { and, desc, eq } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { companySecrets, companySecretVersions } from "@paperclip/db";
-import type { AgentEnvConfig, EnvBinding, SecretProvider } from "@paperclip/shared";
-import { envBindingSchema } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import { companySecrets, companySecretVersions } from "@paperclipai/db";
+import type { AgentEnvConfig, EnvBinding, SecretProvider } from "@paperclipai/shared";
+import { envBindingSchema } from "@paperclipai/shared";
import { conflict, notFound, unprocessable } from "../errors.js";
import { getSecretProvider, listSecretProviders } from "../secrets/provider-registry.js";
diff --git a/server/src/services/sidebar-badges.ts b/server/src/services/sidebar-badges.ts
index d4675f7b..a9c87887 100644
--- a/server/src/services/sidebar-badges.ts
+++ b/server/src/services/sidebar-badges.ts
@@ -1,7 +1,7 @@
import { and, desc, eq, inArray, not, sql } from "drizzle-orm";
-import type { Db } from "@paperclip/db";
-import { agents, approvals, heartbeatRuns } from "@paperclip/db";
-import type { SidebarBadges } from "@paperclip/shared";
+import type { Db } from "@paperclipai/db";
+import { agents, approvals, heartbeatRuns } from "@paperclipai/db";
+import type { SidebarBadges } from "@paperclipai/shared";
const ACTIONABLE_APPROVAL_STATUSES = ["pending", "revision_requested"];
const FAILED_HEARTBEAT_STATUSES = ["failed", "timed_out"];
diff --git a/server/src/startup-banner.ts b/server/src/startup-banner.ts
index a260b976..fb22cb74 100644
--- a/server/src/startup-banner.ts
+++ b/server/src/startup-banner.ts
@@ -1,6 +1,6 @@
import { existsSync, readFileSync } from "node:fs";
import { resolvePaperclipConfigPath, resolvePaperclipEnvPath } from "./paths.js";
-import type { DeploymentExposure, DeploymentMode } from "@paperclip/shared";
+import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
import { parse as parseEnvFileContents } from "dotenv";
@@ -88,7 +88,7 @@ function resolveAgentJwtSecretStatus(
return {
status: "warn",
- message: "missing (run `pnpm paperclip onboard`)",
+ message: "missing (run `pnpm paperclipai onboard`)",
};
}
diff --git a/server/src/storage/types.ts b/server/src/storage/types.ts
index 6855cda6..22325f23 100644
--- a/server/src/storage/types.ts
+++ b/server/src/storage/types.ts
@@ -1,4 +1,4 @@
-import type { StorageProvider as StorageProviderId } from "@paperclip/shared";
+import type { StorageProvider as StorageProviderId } from "@paperclipai/shared";
import type { Readable } from "node:stream";
export interface PutObjectInput {
diff --git a/skills/create-agent-adapter/SKILL.md b/skills/create-agent-adapter/SKILL.md
index 6d476f40..dcd6456e 100644
--- a/skills/create-agent-adapter/SKILL.md
+++ b/skills/create-agent-adapter/SKILL.md
@@ -30,7 +30,7 @@ packages/adapters//
build-config.ts # CreateConfigValues -> adapterConfig JSON for agent creation form
cli/
index.ts # CLI exports: formatStdoutEvent
- format-event.ts # Colored terminal output for `paperclip run --watch`
+ format-event.ts # Colored terminal output for `paperclipai run --watch`
package.json
tsconfig.json
```
@@ -45,9 +45,9 @@ Three separate registries consume adapter modules:
---
-## 2. Shared Types (`@paperclip/adapter-utils`)
+## 2. Shared Types (`@paperclipai/adapter-utils`)
-All adapter interfaces live in `packages/adapter-utils/src/types.ts`. Import from `@paperclip/adapter-utils` (types) or `@paperclip/adapter-utils/server-utils` (runtime helpers).
+All adapter interfaces live in `packages/adapter-utils/src/types.ts`. Import from `@paperclipai/adapter-utils` (types) or `@paperclipai/adapter-utils/server-utils` (runtime helpers).
### Core Interfaces
@@ -186,7 +186,7 @@ packages/adapters//
```json
{
- "name": "@paperclip/adapter-",
+ "name": "@paperclipai/adapter-",
"version": "0.0.1",
"private": true,
"type": "module",
@@ -197,7 +197,7 @@ packages/adapters//
"./cli": "./src/cli/index.ts"
},
"dependencies": {
- "@paperclip/adapter-utils": "workspace:*",
+ "@paperclipai/adapter-utils": "workspace:*",
"picocolors": "^1.1.1"
},
"devDependencies": {
@@ -265,7 +265,7 @@ This is the most important file. It receives an `AdapterExecutionContext` and mu
**Required behavior:**
-1. **Read config** — extract typed values from `ctx.config` using helpers (`asString`, `asNumber`, `asBoolean`, `asStringArray`, `parseObject` from `@paperclip/adapter-utils/server-utils`)
+1. **Read config** — extract typed values from `ctx.config` using helpers (`asString`, `asNumber`, `asBoolean`, `asStringArray`, `parseObject` from `@paperclipai/adapter-utils/server-utils`)
2. **Build environment** — call `buildPaperclipEnv(agent)` then layer in `PAPERCLIP_RUN_ID`, context vars (`PAPERCLIP_TASK_ID`, `PAPERCLIP_WAKE_REASON`, `PAPERCLIP_WAKE_COMMENT_ID`, `PAPERCLIP_APPROVAL_ID`, `PAPERCLIP_APPROVAL_STATUS`, `PAPERCLIP_LINKED_ISSUE_IDS`), user env overrides, and auth token
3. **Resolve session** — check `runtime.sessionParams` / `runtime.sessionId` for an existing session; validate it's compatible (e.g. same cwd); decide whether to resume or start fresh
4. **Render prompt** — use `renderTemplate(template, data)` with the template variables: `agentId`, `companyId`, `runId`, `company`, `agent`, `run`, `context`
@@ -395,7 +395,7 @@ The component must support both `create` mode (using `values`/`set`) and `edit`
#### `cli/format-event.ts` — Terminal Formatter
-Pretty-prints stdout lines for `paperclip run --watch`. Use `picocolors` for coloring.
+Pretty-prints stdout lines for `paperclipai run --watch`. Use `picocolors` for coloring.
```ts
import pc from "picocolors";
@@ -416,8 +416,8 @@ After creating the adapter package, register it in all three consumers:
### 4.1 Server Registry (`server/src/adapters/registry.ts`)
```ts
-import { execute as myExecute, sessionCodec as mySessionCodec } from "@paperclip/adapter-my-agent/server";
-import { agentConfigurationDoc as myDoc, models as myModels } from "@paperclip/adapter-my-agent";
+import { execute as myExecute, sessionCodec as mySessionCodec } from "@paperclipai/adapter-my-agent/server";
+import { agentConfigurationDoc as myDoc, models as myModels } from "@paperclipai/adapter-my-agent";
const myAgentAdapter: ServerAdapterModule = {
type: "my_agent",
@@ -448,9 +448,9 @@ With `ui/src/adapters/my-agent/index.ts`:
```ts
import type { UIAdapterModule } from "../types";
-import { parseMyAgentStdoutLine } from "@paperclip/adapter-my-agent/ui";
+import { parseMyAgentStdoutLine } from "@paperclipai/adapter-my-agent/ui";
import { MyAgentConfigFields } from "./config-fields";
-import { buildMyAgentConfig } from "@paperclip/adapter-my-agent/ui";
+import { buildMyAgentConfig } from "@paperclipai/adapter-my-agent/ui";
export const myAgentUIAdapter: UIAdapterModule = {
type: "my_agent",
@@ -464,7 +464,7 @@ export const myAgentUIAdapter: UIAdapterModule = {
### 4.3 CLI Registry (`cli/src/adapters/registry.ts`)
```ts
-import { printMyAgentStreamEvent } from "@paperclip/adapter-my-agent/cli";
+import { printMyAgentStreamEvent } from "@paperclipai/adapter-my-agent/cli";
const myAgentCLIAdapter: CLIAdapterModule = {
type: "my_agent",
@@ -513,7 +513,7 @@ if (sessionId && !proc.timedOut && exitCode !== 0 && isUnknownSessionError(outpu
## 6. Server-Utils Helpers
-Import from `@paperclip/adapter-utils/server-utils`:
+Import from `@paperclipai/adapter-utils/server-utils`:
| Helper | Purpose |
|--------|---------|
@@ -537,7 +537,7 @@ Import from `@paperclip/adapter-utils/server-utils`:
### Naming
- Adapter type: `snake_case` (e.g. `claude_local`, `codex_local`)
-- Package name: `@paperclip/adapter-`
+- Package name: `@paperclipai/adapter-`
- Package directory: `packages/adapters//`
### Config Parsing
diff --git a/ui/package.json b/ui/package.json
index 67125b15..586d37cc 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -1,5 +1,5 @@
{
- "name": "@paperclip/ui",
+ "name": "@paperclipai/ui",
"version": "0.0.1",
"private": true,
"type": "module",
@@ -14,11 +14,11 @@
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@mdxeditor/editor": "^3.52.4",
- "@paperclip/adapter-claude-local": "workspace:*",
- "@paperclip/adapter-codex-local": "workspace:*",
- "@paperclip/adapter-openclaw": "workspace:*",
- "@paperclip/adapter-utils": "workspace:*",
- "@paperclip/shared": "workspace:*",
+ "@paperclipai/adapter-claude-local": "workspace:*",
+ "@paperclipai/adapter-codex-local": "workspace:*",
+ "@paperclipai/adapter-openclaw": "workspace:*",
+ "@paperclipai/adapter-utils": "workspace:*",
+ "@paperclipai/shared": "workspace:*",
"@radix-ui/react-slot": "^1.2.4",
"@tailwindcss/typography": "^0.5.19",
"@tanstack/react-query": "^5.90.21",
diff --git a/ui/src/App.tsx b/ui/src/App.tsx
index ddfe4b8d..a9967433 100644
--- a/ui/src/App.tsx
+++ b/ui/src/App.tsx
@@ -37,7 +37,7 @@ function BootstrapPendingPage() {
the first admin invite URL:
-{`pnpm paperclip auth bootstrap-ceo`}
+{`pnpm paperclipai auth bootstrap-ceo`}
diff --git a/ui/src/adapters/claude-local/index.ts b/ui/src/adapters/claude-local/index.ts
index c310a873..fc2904d0 100644
--- a/ui/src/adapters/claude-local/index.ts
+++ b/ui/src/adapters/claude-local/index.ts
@@ -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",
diff --git a/ui/src/adapters/codex-local/index.ts b/ui/src/adapters/codex-local/index.ts
index 2aeabd76..31a11bf3 100644
--- a/ui/src/adapters/codex-local/index.ts
+++ b/ui/src/adapters/codex-local/index.ts
@@ -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",
diff --git a/ui/src/adapters/openclaw/index.ts b/ui/src/adapters/openclaw/index.ts
index 5f03ec0b..890d83bc 100644
--- a/ui/src/adapters/openclaw/index.ts
+++ b/ui/src/adapters/openclaw/index.ts
@@ -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 = {
diff --git a/ui/src/adapters/types.ts b/ui/src/adapters/types.ts
index 59a65d6a..65d9836b 100644
--- a/ui/src/adapters/types.ts
+++ b/ui/src/adapters/types.ts
@@ -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;
buildAdapterConfig: (values: CreateConfigValues) => Record;
}
diff --git a/ui/src/api/access.ts b/ui/src/api/access.ts
index 31ada979..5bc9d614 100644
--- a/ui/src/api/access.ts
+++ b/ui/src/api/access.ts
@@ -1,4 +1,4 @@
-import type { AgentAdapterType, JoinRequest } from "@paperclip/shared";
+import type { AgentAdapterType, JoinRequest } from "@paperclipai/shared";
import { api } from "./client";
type InviteSummary = {
diff --git a/ui/src/api/activity.ts b/ui/src/api/activity.ts
index 711133ae..7a8259e7 100644
--- a/ui/src/api/activity.ts
+++ b/ui/src/api/activity.ts
@@ -1,4 +1,4 @@
-import type { ActivityEvent } from "@paperclip/shared";
+import type { ActivityEvent } from "@paperclipai/shared";
import { api } from "./client";
export interface RunForIssue {
diff --git a/ui/src/api/agents.ts b/ui/src/api/agents.ts
index dd73eb5b..0b91f694 100644
--- a/ui/src/api/agents.ts
+++ b/ui/src/api/agents.ts
@@ -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 {
diff --git a/ui/src/api/approvals.ts b/ui/src/api/approvals.ts
index 61fae055..06b4713a 100644
--- a/ui/src/api/approvals.ts
+++ b/ui/src/api/approvals.ts
@@ -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 = {
diff --git a/ui/src/api/assets.ts b/ui/src/api/assets.ts
index 25555a6a..8b3d056c 100644
--- a/ui/src/api/assets.ts
+++ b/ui/src/api/assets.ts
@@ -1,4 +1,4 @@
-import type { AssetImage } from "@paperclip/shared";
+import type { AssetImage } from "@paperclipai/shared";
import { api } from "./client";
export const assetsApi = {
diff --git a/ui/src/api/companies.ts b/ui/src/api/companies.ts
index 4697a7ad..583d9e69 100644
--- a/ui/src/api/companies.ts
+++ b/ui/src/api/companies.ts
@@ -5,7 +5,7 @@ import type {
CompanyPortabilityImportResult,
CompanyPortabilityPreviewRequest,
CompanyPortabilityPreviewResult,
-} from "@paperclip/shared";
+} from "@paperclipai/shared";
import { api } from "./client";
export type CompanyStats = Record;
diff --git a/ui/src/api/costs.ts b/ui/src/api/costs.ts
index 1187e4d0..2bfa2ecb 100644
--- a/ui/src/api/costs.ts
+++ b/ui/src/api/costs.ts
@@ -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 {
diff --git a/ui/src/api/dashboard.ts b/ui/src/api/dashboard.ts
index 5831237e..179d27d7 100644
--- a/ui/src/api/dashboard.ts
+++ b/ui/src/api/dashboard.ts
@@ -1,4 +1,4 @@
-import type { DashboardSummary } from "@paperclip/shared";
+import type { DashboardSummary } from "@paperclipai/shared";
import { api } from "./client";
export const dashboardApi = {
diff --git a/ui/src/api/goals.ts b/ui/src/api/goals.ts
index 2a5a2dd5..da08546a 100644
--- a/ui/src/api/goals.ts
+++ b/ui/src/api/goals.ts
@@ -1,4 +1,4 @@
-import type { Goal } from "@paperclip/shared";
+import type { Goal } from "@paperclipai/shared";
import { api } from "./client";
export const goalsApi = {
diff --git a/ui/src/api/heartbeats.ts b/ui/src/api/heartbeats.ts
index 6ceb40f5..680412da 100644
--- a/ui/src/api/heartbeats.ts
+++ b/ui/src/api/heartbeats.ts
@@ -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 {
diff --git a/ui/src/api/issues.ts b/ui/src/api/issues.ts
index 50c29258..05175f71 100644
--- a/ui/src/api/issues.ts
+++ b/ui/src/api/issues.ts
@@ -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 = {
diff --git a/ui/src/api/projects.ts b/ui/src/api/projects.ts
index 80d26f58..c7177ac6 100644
--- a/ui/src/api/projects.ts
+++ b/ui/src/api/projects.ts
@@ -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) {
diff --git a/ui/src/api/secrets.ts b/ui/src/api/secrets.ts
index b782687f..b39aa560 100644
--- a/ui/src/api/secrets.ts
+++ b/ui/src/api/secrets.ts
@@ -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 = {
diff --git a/ui/src/api/sidebarBadges.ts b/ui/src/api/sidebarBadges.ts
index 0883673c..3d47ac9d 100644
--- a/ui/src/api/sidebarBadges.ts
+++ b/ui/src/api/sidebarBadges.ts
@@ -1,4 +1,4 @@
-import type { SidebarBadges } from "@paperclip/shared";
+import type { SidebarBadges } from "@paperclipai/shared";
import { api } from "./client";
export const sidebarBadgesApi = {
diff --git a/ui/src/components/ActiveAgentsPanel.tsx b/ui/src/components/ActiveAgentsPanel.tsx
index b6b767ee..cf8c8baf 100644
--- a/ui/src/components/ActiveAgentsPanel.tsx
+++ b/ui/src/components/ActiveAgentsPanel.tsx
@@ -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";
diff --git a/ui/src/components/ActivityCharts.tsx b/ui/src/components/ActivityCharts.tsx
index 24c996f4..f72e4e57 100644
--- a/ui/src/components/ActivityCharts.tsx
+++ b/ui/src/components/ActivityCharts.tsx
@@ -1,4 +1,4 @@
-import type { HeartbeatRun } from "@paperclip/shared";
+import type { HeartbeatRun } from "@paperclipai/shared";
/* ---- Utilities ---- */
diff --git a/ui/src/components/ActivityRow.tsx b/ui/src/components/ActivityRow.tsx
index ab600fac..3ca8ac02 100644
--- a/ui/src/components/ActivityRow.tsx
+++ b/ui/src/components/ActivityRow.tsx
@@ -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 = {
"issue.created": "created",
diff --git a/ui/src/components/AgentConfigForm.tsx b/ui/src/components/AgentConfigForm.tsx
index 5073f4af..391c3af8 100644
--- a/ui/src/components/AgentConfigForm.tsx
+++ b/ui/src/components/AgentConfigForm.tsx
@@ -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 ---- */
diff --git a/ui/src/components/AgentIconPicker.tsx b/ui/src/components/AgentIconPicker.tsx
index 9ab18c14..8f53d87d 100644
--- a/ui/src/components/AgentIconPicker.tsx
+++ b/ui/src/components/AgentIconPicker.tsx
@@ -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,
diff --git a/ui/src/components/AgentProperties.tsx b/ui/src/components/AgentProperties.tsx
index d9445879..ad96d8ae 100644
--- a/ui/src/components/AgentProperties.tsx
+++ b/ui/src/components/AgentProperties.tsx
@@ -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";
diff --git a/ui/src/components/ApprovalCard.tsx b/ui/src/components/ApprovalCard.tsx
index 19512fdd..2a1e6e82 100644
--- a/ui/src/components/ApprovalCard.tsx
+++ b/ui/src/components/ApprovalCard.tsx
@@ -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 ;
diff --git a/ui/src/components/CommentThread.tsx b/ui/src/components/CommentThread.tsx
index 7c9f0e6a..3ebcb0bf 100644
--- a/ui/src/components/CommentThread.tsx
+++ b/ui/src/components/CommentThread.tsx
@@ -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";
diff --git a/ui/src/components/CompanyRail.tsx b/ui/src/components/CompanyRail.tsx
index d8bef454..62a8bf3e 100644
--- a/ui/src/components/CompanyRail.tsx
+++ b/ui/src/components/CompanyRail.tsx
@@ -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";
diff --git a/ui/src/components/GoalProperties.tsx b/ui/src/components/GoalProperties.tsx
index ee8ce80b..fdc4da2a 100644
--- a/ui/src/components/GoalProperties.tsx
+++ b/ui/src/components/GoalProperties.tsx
@@ -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";
diff --git a/ui/src/components/GoalTree.tsx b/ui/src/components/GoalTree.tsx
index 6bfd3643..fe20ee64 100644
--- a/ui/src/components/GoalTree.tsx
+++ b/ui/src/components/GoalTree.tsx
@@ -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";
diff --git a/ui/src/components/IssueProperties.tsx b/ui/src/components/IssueProperties.tsx
index 23ddbb14..d95c5f8d 100644
--- a/ui/src/components/IssueProperties.tsx
+++ b/ui/src/components/IssueProperties.tsx
@@ -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";
diff --git a/ui/src/components/IssuesList.tsx b/ui/src/components/IssuesList.tsx
index 0e390553..00c77508 100644
--- a/ui/src/components/IssuesList.tsx
+++ b/ui/src/components/IssuesList.tsx
@@ -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 ── */
diff --git a/ui/src/components/KanbanBoard.tsx b/ui/src/components/KanbanBoard.tsx
index 646cf6c5..3e8feb65 100644
--- a/ui/src/components/KanbanBoard.tsx
+++ b/ui/src/components/KanbanBoard.tsx
@@ -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",
diff --git a/ui/src/components/LiveRunWidget.tsx b/ui/src/components/LiveRunWidget.tsx
index 8a12040f..cbe6d5e1 100644
--- a/ui/src/components/LiveRunWidget.tsx
+++ b/ui/src/components/LiveRunWidget.tsx
@@ -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";
diff --git a/ui/src/components/MarkdownEditor.tsx b/ui/src/components/MarkdownEditor.tsx
index 5d40909d..d9ec6fe7 100644
--- a/ui/src/components/MarkdownEditor.tsx
+++ b/ui/src/components/MarkdownEditor.tsx
@@ -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 ---- */
diff --git a/ui/src/components/NewAgentDialog.tsx b/ui/src/components/NewAgentDialog.tsx
index 42153597..14a902cb 100644
--- a/ui/src/components/NewAgentDialog.tsx
+++ b/ui/src/components/NewAgentDialog.tsx
@@ -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,
diff --git a/ui/src/components/NewGoalDialog.tsx b/ui/src/components/NewGoalDialog.tsx
index 41e711fb..0bb9ffcb 100644
--- a/ui/src/components/NewGoalDialog.tsx
+++ b/ui/src/components/NewGoalDialog.tsx
@@ -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";
diff --git a/ui/src/components/NewProjectDialog.tsx b/ui/src/components/NewProjectDialog.tsx
index 4db14c26..08fda5c4 100644
--- a/ui/src/components/NewProjectDialog.tsx
+++ b/ui/src/components/NewProjectDialog.tsx
@@ -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";
diff --git a/ui/src/components/ProjectProperties.tsx b/ui/src/components/ProjectProperties.tsx
index d4e8ca0e..277ee687 100644
--- a/ui/src/components/ProjectProperties.tsx
+++ b/ui/src/components/ProjectProperties.tsx
@@ -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";
diff --git a/ui/src/components/SidebarAgents.tsx b/ui/src/components/SidebarAgents.tsx
index 7b469771..25b59814 100644
--- a/ui/src/components/SidebarAgents.tsx
+++ b/ui/src/components/SidebarAgents.tsx
@@ -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[] {
diff --git a/ui/src/components/SidebarProjects.tsx b/ui/src/components/SidebarProjects.tsx
index f32e6b40..17fc1101 100644
--- a/ui/src/components/SidebarProjects.tsx
+++ b/ui/src/components/SidebarProjects.tsx
@@ -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,
diff --git a/ui/src/components/agent-config-defaults.ts b/ui/src/components/agent-config-defaults.ts
index 3434f08d..4072de01 100644
--- a/ui/src/components/agent-config-defaults.ts
+++ b/ui/src/components/agent-config-defaults.ts
@@ -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",
diff --git a/ui/src/context/CompanyContext.tsx b/ui/src/context/CompanyContext.tsx
index 63cf3b3e..eafc7f55 100644
--- a/ui/src/context/CompanyContext.tsx
+++ b/ui/src/context/CompanyContext.tsx
@@ -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";
diff --git a/ui/src/context/LiveUpdatesProvider.tsx b/ui/src/context/LiveUpdatesProvider.tsx
index 6bcbab0c..34ff5c0a 100644
--- a/ui/src/context/LiveUpdatesProvider.tsx
+++ b/ui/src/context/LiveUpdatesProvider.tsx
@@ -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";
diff --git a/ui/src/hooks/useProjectOrder.ts b/ui/src/hooks/useProjectOrder.ts
index 9e87de19..5b9edee4 100644
--- a/ui/src/hooks/useProjectOrder.ts
+++ b/ui/src/hooks/useProjectOrder.ts
@@ -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,
diff --git a/ui/src/lib/project-order.ts b/ui/src/lib/project-order.ts
index 9d118b84..9594a4c6 100644
--- a/ui/src/lib/project-order.ts
+++ b/ui/src/lib/project-order.ts
@@ -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";
diff --git a/ui/src/lib/utils.ts b/ui/src/lib/utils.ts
index bc837c31..b9c3a020 100644
--- a/ui/src/lib/utils.ts
+++ b/ui/src/lib/utils.ts
@@ -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));
diff --git a/ui/src/pages/Activity.tsx b/ui/src/pages/Activity.tsx
index 185d2f3c..cfb347bb 100644
--- a/ui/src/pages/Activity.tsx
+++ b/ui/src/pages/Activity.tsx
@@ -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();
diff --git a/ui/src/pages/AgentDetail.tsx b/ui/src/pages/AgentDetail.tsx
index b57063b8..c0c51928 100644
--- a/ui/src/pages/AgentDetail.tsx
+++ b/ui/src/pages/AgentDetail.tsx
@@ -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 = {
diff --git a/ui/src/pages/Agents.tsx b/ui/src/pages/Agents.tsx
index 89e3fdbd..801d4837 100644
--- a/ui/src/pages/Agents.tsx
+++ b/ui/src/pages/Agents.tsx
@@ -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 = {
claude_local: "Claude",
diff --git a/ui/src/pages/ApprovalDetail.tsx b/ui/src/pages/ApprovalDetail.tsx
index 413ee660..9c962c09 100644
--- a/ui/src/pages/ApprovalDetail.tsx
+++ b/ui/src/pages/ApprovalDetail.tsx
@@ -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() {
diff --git a/ui/src/pages/Dashboard.tsx b/ui/src/pages/Dashboard.tsx
index a0449c02..f4ae5cd0 100644
--- a/ui/src/pages/Dashboard.tsx
+++ b/ui/src/pages/Dashboard.tsx
@@ -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]
diff --git a/ui/src/pages/GoalDetail.tsx b/ui/src/pages/GoalDetail.tsx
index 0673ae90..3eed0ba5 100644
--- a/ui/src/pages/GoalDetail.tsx
+++ b/ui/src/pages/GoalDetail.tsx
@@ -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 }>();
diff --git a/ui/src/pages/Inbox.tsx b/ui/src/pages/Inbox.tsx
index b32e7e5d..b11afecf 100644
--- a/ui/src/pages/Inbox.tsx
+++ b/ui/src/pages/Inbox.tsx
@@ -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"]);
diff --git a/ui/src/pages/InviteLanding.tsx b/ui/src/pages/InviteLanding.tsx
index e5974e39..61466bdb 100644
--- a/ui/src/pages/InviteLanding.tsx
+++ b/ui/src/pages/InviteLanding.tsx
@@ -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[] = [
diff --git a/ui/src/pages/IssueDetail.tsx b/ui/src/pages/IssueDetail.tsx
index 6583dd99..fcc54238 100644
--- a/ui/src/pages/IssueDetail.tsx
+++ b/ui/src/pages/IssueDetail.tsx
@@ -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;
diff --git a/ui/src/pages/OrgChart.tsx b/ui/src/pages/OrgChart.tsx
index c0ed8dd3..bc9edb65 100644
--- a/ui/src/pages/OrgChart.tsx
+++ b/ui/src/pages/OrgChart.tsx
@@ -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;
diff --git a/ui/src/pages/ProjectDetail.tsx b/ui/src/pages/ProjectDetail.tsx
index dfe67885..e9880850 100644
--- a/ui/src/pages/ProjectDetail.tsx
+++ b/ui/src/pages/ProjectDetail.tsx
@@ -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";