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";