refactor: rename packages to @paperclipai and CLI binary to paperclipai
Rename all workspace packages from @paperclip/* to @paperclipai/* and the CLI binary from `paperclip` to `paperclipai` in preparation for npm publishing. Bump CLI version to 0.1.0 and add package metadata (description, keywords, license, repository, files). Update all imports, documentation, user-facing messages, and tests accordingly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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>): Company {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
export { getCLIAdapter } from "./registry.js";
|
||||
export type { CLIAdapterModule } from "@paperclip/adapter-utils";
|
||||
export type { CLIAdapterModule } from "@paperclipai/adapter-utils";
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -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)",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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`",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ export async function llmCheck(config: PaperclipConfig): Promise<CheckResult> {
|
||||
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<CheckResult> {
|
||||
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<CheckResult> {
|
||||
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<CheckResult> {
|
||||
status: "fail",
|
||||
message: "OpenAI API key is invalid (401)",
|
||||
canRepair: false,
|
||||
repairHint: "Run `paperclip configure --section llm`",
|
||||
repairHint: "Run `paperclipai configure --section llm`",
|
||||
};
|
||||
}
|
||||
return {
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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`",
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Command } from "commander";
|
||||
import type { ActivityEvent } from "@paperclip/shared";
|
||||
import type { ActivityEvent } from "@paperclipai/shared";
|
||||
import {
|
||||
addCommonClientOptions,
|
||||
formatInlineRecord,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Command } from "commander";
|
||||
import type { Agent } from "@paperclip/shared";
|
||||
import type { Agent } from "@paperclipai/shared";
|
||||
import {
|
||||
addCommonClientOptions,
|
||||
formatInlineRecord,
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
resubmitApprovalSchema,
|
||||
type Approval,
|
||||
type ApprovalComment,
|
||||
} from "@paperclip/shared";
|
||||
} from "@paperclipai/shared";
|
||||
import {
|
||||
addCommonClientOptions,
|
||||
formatInlineRecord,
|
||||
|
||||
@@ -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`.",
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import type {
|
||||
CompanyPortabilityManifest,
|
||||
CompanyPortabilityPreviewResult,
|
||||
CompanyPortabilityImportResult,
|
||||
} from "@paperclip/shared";
|
||||
} from "@paperclipai/shared";
|
||||
import { ApiRequestError } from "../../client/http.js";
|
||||
import {
|
||||
addCommonClientOptions,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Command } from "commander";
|
||||
import type { DashboardSummary } from "@paperclip/shared";
|
||||
import type { DashboardSummary } from "@paperclipai/shared";
|
||||
import {
|
||||
addCommonClientOptions,
|
||||
handleCommandError,
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
updateIssueSchema,
|
||||
type Issue,
|
||||
type IssueComment,
|
||||
} from "@paperclip/shared";
|
||||
} from "@paperclipai/shared";
|
||||
import {
|
||||
addCommonClientOptions,
|
||||
formatInlineRecord,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import { describeLocalInstancePaths, resolvePaperclipInstanceId } from "../confi
|
||||
import { bootstrapCeoInvite } from "./auth-bootstrap-ceo.js";
|
||||
|
||||
export async function onboard(opts: { config?: string }): Promise<void> {
|
||||
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<void> {
|
||||
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<void> {
|
||||
"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`)})`,
|
||||
);
|
||||
|
||||
@@ -32,7 +32,7 @@ export async function runCommand(opts: RunOptions): Promise<void> {
|
||||
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<void> {
|
||||
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<void> {
|
||||
];
|
||||
|
||||
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[] = [];
|
||||
|
||||
@@ -25,7 +25,7 @@ function parseEnvFile(contents: string) {
|
||||
function renderEnvFile(entries: Record<string, string>) {
|
||||
const lines = [
|
||||
"# Paperclip environment variables",
|
||||
"# Generated by `paperclip onboard`",
|
||||
"# Generated by `paperclipai onboard`",
|
||||
...Object.entries(entries).map(([key, value]) => `${key}=${value}`),
|
||||
"",
|
||||
];
|
||||
|
||||
@@ -23,4 +23,4 @@ export {
|
||||
type SecretsConfig,
|
||||
type SecretsLocalEncryptedConfig,
|
||||
type ConfigMeta,
|
||||
} from "@paperclip/shared";
|
||||
} from "@paperclipai/shared";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user