@paperclipai/create-paperclip-plugin 2026.3.17-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Paperclip AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # @paperclipai/create-paperclip-plugin
2
+
3
+ Scaffolding tool for creating new Paperclip plugins.
4
+
5
+ ```bash
6
+ npx @paperclipai/create-paperclip-plugin my-plugin
7
+ ```
8
+
9
+ Or with options:
10
+
11
+ ```bash
12
+ npx @paperclipai/create-paperclip-plugin @acme/my-plugin \
13
+ --template connector \
14
+ --category connector \
15
+ --display-name "Acme Connector" \
16
+ --description "Syncs Acme data into Paperclip" \
17
+ --author "Acme Inc"
18
+ ```
19
+
20
+ Supported templates: `default`, `connector`, `workspace`
21
+ Supported categories: `connector`, `workspace`, `automation`, `ui`
22
+
23
+ Generates:
24
+ - typed manifest + worker entrypoint
25
+ - example UI widget using the supported `@paperclipai/plugin-sdk/ui` hooks
26
+ - test file using `@paperclipai/plugin-sdk/testing`
27
+ - `esbuild` and `rollup` config files using SDK bundler presets
28
+ - dev server script for hot-reload (`paperclip-plugin-dev-server`)
29
+
30
+ The scaffold intentionally uses plain React elements rather than host-provided UI kit components, because the current plugin runtime does not ship a stable shared component library yet.
31
+
32
+ Inside this repo, the generated package uses `@paperclipai/plugin-sdk` via `workspace:*`.
33
+
34
+ Outside this repo, the scaffold snapshots `@paperclipai/plugin-sdk` from your local Paperclip checkout into a `.paperclip-sdk/` tarball and points the generated package at that local file by default. You can override the SDK source explicitly:
35
+
36
+ ```bash
37
+ node packages/plugins/create-paperclip-plugin/dist/index.js @acme/my-plugin \
38
+ --output /absolute/path/to/plugins \
39
+ --sdk-path /absolute/path/to/paperclip/packages/plugins/sdk
40
+ ```
41
+
42
+ That gives you an outside-repo local development path before the SDK is published to npm.
43
+
44
+ ## Workflow after scaffolding
45
+
46
+ ```bash
47
+ cd my-plugin
48
+ pnpm install
49
+ pnpm dev # watch worker + manifest + ui bundles
50
+ pnpm dev:ui # local UI preview server with hot-reload events
51
+ pnpm test
52
+ ```
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ declare const VALID_TEMPLATES: readonly ["default", "connector", "workspace"];
3
+ type PluginTemplate = (typeof VALID_TEMPLATES)[number];
4
+ export interface ScaffoldPluginOptions {
5
+ pluginName: string;
6
+ outputDir: string;
7
+ template?: PluginTemplate;
8
+ displayName?: string;
9
+ description?: string;
10
+ author?: string;
11
+ category?: "connector" | "workspace" | "automation" | "ui";
12
+ sdkPath?: string;
13
+ }
14
+ /** Validate npm-style plugin package names (scoped or unscoped). */
15
+ export declare function isValidPluginName(name: string): boolean;
16
+ /**
17
+ * Generate a complete Paperclip plugin starter project.
18
+ *
19
+ * Output includes manifest/worker/UI entries, SDK harness tests, bundler presets,
20
+ * and a local dev server script for hot-reload workflow.
21
+ */
22
+ export declare function scaffoldPluginProject(options: ScaffoldPluginOptions): string;
23
+ export {};
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,QAAA,MAAM,eAAe,gDAAiD,CAAC;AACvE,KAAK,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAGvD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,IAAI,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIvD;AAsFD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAmV5E"}
package/dist/index.js ADDED
@@ -0,0 +1,413 @@
1
+ #!/usr/bin/env node
2
+ import { execFileSync } from "node:child_process";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const VALID_TEMPLATES = ["default", "connector", "workspace"];
7
+ const VALID_CATEGORIES = new Set(["connector", "workspace", "automation", "ui"]);
8
+ /** Validate npm-style plugin package names (scoped or unscoped). */
9
+ export function isValidPluginName(name) {
10
+ const scopedPattern = /^@[a-z0-9_-]+\/[a-z0-9._-]+$/;
11
+ const unscopedPattern = /^[a-z0-9._-]+$/;
12
+ return scopedPattern.test(name) || unscopedPattern.test(name);
13
+ }
14
+ /** Convert `@scope/name` to an output directory basename (`name`). */
15
+ function packageToDirName(pluginName) {
16
+ return pluginName.replace(/^@[^/]+\//, "");
17
+ }
18
+ /** Convert an npm package name into a manifest-safe plugin id. */
19
+ function packageToManifestId(pluginName) {
20
+ if (!pluginName.startsWith("@")) {
21
+ return pluginName;
22
+ }
23
+ return pluginName.slice(1).replace("/", ".");
24
+ }
25
+ /** Build a human-readable display name from package name tokens. */
26
+ function makeDisplayName(pluginName) {
27
+ const raw = packageToDirName(pluginName).replace(/[._-]+/g, " ").trim();
28
+ return raw
29
+ .split(/\s+/)
30
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
31
+ .join(" ");
32
+ }
33
+ function writeFile(target, content) {
34
+ fs.mkdirSync(path.dirname(target), { recursive: true });
35
+ fs.writeFileSync(target, content);
36
+ }
37
+ function quote(value) {
38
+ return JSON.stringify(value);
39
+ }
40
+ function toPosixPath(value) {
41
+ return value.split(path.sep).join("/");
42
+ }
43
+ function formatFileDependency(absPath) {
44
+ return `file:${toPosixPath(path.resolve(absPath))}`;
45
+ }
46
+ function getLocalSdkPackagePath() {
47
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "sdk");
48
+ }
49
+ function getRepoRootFromSdkPath(sdkPath) {
50
+ return path.resolve(sdkPath, "..", "..", "..");
51
+ }
52
+ function getLocalSharedPackagePath(sdkPath) {
53
+ return path.resolve(getRepoRootFromSdkPath(sdkPath), "packages", "shared");
54
+ }
55
+ function isInsideDir(targetPath, parentPath) {
56
+ const relative = path.relative(parentPath, targetPath);
57
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
58
+ }
59
+ function packLocalPackage(packagePath, outputDir) {
60
+ const packageJsonPath = path.join(packagePath, "package.json");
61
+ if (!fs.existsSync(packageJsonPath)) {
62
+ throw new Error(`Package package.json not found at ${packageJsonPath}`);
63
+ }
64
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
65
+ const packageName = packageJson.name ?? path.basename(packagePath);
66
+ const packageVersion = packageJson.version ?? "0.0.0";
67
+ const tarballFileName = `${packageName.replace(/^@/, "").replace("/", "-")}-${packageVersion}.tgz`;
68
+ const sdkBundleDir = path.join(outputDir, ".paperclip-sdk");
69
+ fs.mkdirSync(sdkBundleDir, { recursive: true });
70
+ execFileSync("pnpm", ["build"], { cwd: packagePath, stdio: "pipe" });
71
+ execFileSync("pnpm", ["pack", "--pack-destination", sdkBundleDir], { cwd: packagePath, stdio: "pipe" });
72
+ const tarballPath = path.join(sdkBundleDir, tarballFileName);
73
+ if (!fs.existsSync(tarballPath)) {
74
+ throw new Error(`Packed tarball was not created at ${tarballPath}`);
75
+ }
76
+ return tarballPath;
77
+ }
78
+ /**
79
+ * Generate a complete Paperclip plugin starter project.
80
+ *
81
+ * Output includes manifest/worker/UI entries, SDK harness tests, bundler presets,
82
+ * and a local dev server script for hot-reload workflow.
83
+ */
84
+ export function scaffoldPluginProject(options) {
85
+ const template = options.template ?? "default";
86
+ if (!VALID_TEMPLATES.includes(template)) {
87
+ throw new Error(`Invalid template '${template}'. Expected one of: ${VALID_TEMPLATES.join(", ")}`);
88
+ }
89
+ if (!isValidPluginName(options.pluginName)) {
90
+ throw new Error("Invalid plugin name. Must be lowercase and may include scope, dots, underscores, or hyphens.");
91
+ }
92
+ if (options.category && !VALID_CATEGORIES.has(options.category)) {
93
+ throw new Error(`Invalid category '${options.category}'. Expected one of: ${[...VALID_CATEGORIES].join(", ")}`);
94
+ }
95
+ const outputDir = path.resolve(options.outputDir);
96
+ if (fs.existsSync(outputDir)) {
97
+ throw new Error(`Directory already exists: ${outputDir}`);
98
+ }
99
+ const displayName = options.displayName ?? makeDisplayName(options.pluginName);
100
+ const description = options.description ?? "A Paperclip plugin";
101
+ const author = options.author ?? "Plugin Author";
102
+ const category = options.category ?? (template === "workspace" ? "workspace" : "connector");
103
+ const manifestId = packageToManifestId(options.pluginName);
104
+ const localSdkPath = path.resolve(options.sdkPath ?? getLocalSdkPackagePath());
105
+ const localSharedPath = getLocalSharedPackagePath(localSdkPath);
106
+ const repoRoot = getRepoRootFromSdkPath(localSdkPath);
107
+ const useWorkspaceSdk = isInsideDir(outputDir, repoRoot);
108
+ fs.mkdirSync(outputDir, { recursive: true });
109
+ const packedSharedTarball = useWorkspaceSdk ? null : packLocalPackage(localSharedPath, outputDir);
110
+ const sdkDependency = useWorkspaceSdk
111
+ ? "workspace:*"
112
+ : `file:${toPosixPath(path.relative(outputDir, packLocalPackage(localSdkPath, outputDir)))}`;
113
+ const packageJson = {
114
+ name: options.pluginName,
115
+ version: "0.1.0",
116
+ type: "module",
117
+ private: true,
118
+ description,
119
+ scripts: {
120
+ build: "node ./esbuild.config.mjs",
121
+ "build:rollup": "rollup -c",
122
+ dev: "node ./esbuild.config.mjs --watch",
123
+ "dev:ui": "paperclip-plugin-dev-server --root . --ui-dir dist/ui --port 4177",
124
+ test: "vitest run --config ./vitest.config.ts",
125
+ typecheck: "tsc --noEmit"
126
+ },
127
+ paperclipPlugin: {
128
+ manifest: "./dist/manifest.js",
129
+ worker: "./dist/worker.js",
130
+ ui: "./dist/ui/"
131
+ },
132
+ keywords: ["paperclip", "plugin", category],
133
+ author,
134
+ license: "MIT",
135
+ ...(packedSharedTarball
136
+ ? {
137
+ pnpm: {
138
+ overrides: {
139
+ "@paperclipai/shared": `file:${toPosixPath(path.relative(outputDir, packedSharedTarball))}`,
140
+ },
141
+ },
142
+ }
143
+ : {}),
144
+ devDependencies: {
145
+ ...(packedSharedTarball
146
+ ? {
147
+ "@paperclipai/shared": `file:${toPosixPath(path.relative(outputDir, packedSharedTarball))}`,
148
+ }
149
+ : {}),
150
+ "@paperclipai/plugin-sdk": sdkDependency,
151
+ "@rollup/plugin-node-resolve": "^16.0.1",
152
+ "@rollup/plugin-typescript": "^12.1.2",
153
+ "@types/node": "^24.6.0",
154
+ "@types/react": "^19.0.8",
155
+ esbuild: "^0.27.3",
156
+ rollup: "^4.38.0",
157
+ tslib: "^2.8.1",
158
+ typescript: "^5.7.3",
159
+ vitest: "^3.0.5"
160
+ },
161
+ peerDependencies: {
162
+ react: ">=18"
163
+ }
164
+ };
165
+ writeFile(path.join(outputDir, "package.json"), `${JSON.stringify(packageJson, null, 2)}\n`);
166
+ const tsconfig = {
167
+ compilerOptions: {
168
+ target: "ES2022",
169
+ module: "NodeNext",
170
+ moduleResolution: "NodeNext",
171
+ lib: ["ES2022", "DOM"],
172
+ jsx: "react-jsx",
173
+ strict: true,
174
+ skipLibCheck: true,
175
+ declaration: true,
176
+ declarationMap: true,
177
+ sourceMap: true,
178
+ outDir: "dist",
179
+ rootDir: "."
180
+ },
181
+ include: ["src", "tests"],
182
+ exclude: ["dist", "node_modules"]
183
+ };
184
+ writeFile(path.join(outputDir, "tsconfig.json"), `${JSON.stringify(tsconfig, null, 2)}\n`);
185
+ writeFile(path.join(outputDir, "esbuild.config.mjs"), `import esbuild from "esbuild";
186
+ import { createPluginBundlerPresets } from "@paperclipai/plugin-sdk/bundlers";
187
+
188
+ const presets = createPluginBundlerPresets({ uiEntry: "src/ui/index.tsx" });
189
+ const watch = process.argv.includes("--watch");
190
+
191
+ const workerCtx = await esbuild.context(presets.esbuild.worker);
192
+ const manifestCtx = await esbuild.context(presets.esbuild.manifest);
193
+ const uiCtx = await esbuild.context(presets.esbuild.ui);
194
+
195
+ if (watch) {
196
+ await Promise.all([workerCtx.watch(), manifestCtx.watch(), uiCtx.watch()]);
197
+ console.log("esbuild watch mode enabled for worker, manifest, and ui");
198
+ } else {
199
+ await Promise.all([workerCtx.rebuild(), manifestCtx.rebuild(), uiCtx.rebuild()]);
200
+ await Promise.all([workerCtx.dispose(), manifestCtx.dispose(), uiCtx.dispose()]);
201
+ }
202
+ `);
203
+ writeFile(path.join(outputDir, "rollup.config.mjs"), `import { nodeResolve } from "@rollup/plugin-node-resolve";
204
+ import typescript from "@rollup/plugin-typescript";
205
+ import { createPluginBundlerPresets } from "@paperclipai/plugin-sdk/bundlers";
206
+
207
+ const presets = createPluginBundlerPresets({ uiEntry: "src/ui/index.tsx" });
208
+
209
+ function withPlugins(config) {
210
+ if (!config) return null;
211
+ return {
212
+ ...config,
213
+ plugins: [
214
+ nodeResolve({
215
+ extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs"],
216
+ }),
217
+ typescript({
218
+ tsconfig: "./tsconfig.json",
219
+ declaration: false,
220
+ declarationMap: false,
221
+ }),
222
+ ],
223
+ };
224
+ }
225
+
226
+ export default [
227
+ withPlugins(presets.rollup.manifest),
228
+ withPlugins(presets.rollup.worker),
229
+ withPlugins(presets.rollup.ui),
230
+ ].filter(Boolean);
231
+ `);
232
+ writeFile(path.join(outputDir, "vitest.config.ts"), `import { defineConfig } from "vitest/config";
233
+
234
+ export default defineConfig({
235
+ test: {
236
+ include: ["tests/**/*.spec.ts"],
237
+ environment: "node",
238
+ },
239
+ });
240
+ `);
241
+ writeFile(path.join(outputDir, "src", "manifest.ts"), `import type { PaperclipPluginManifestV1 } from "@paperclipai/plugin-sdk";
242
+
243
+ const manifest: PaperclipPluginManifestV1 = {
244
+ id: ${quote(manifestId)},
245
+ apiVersion: 1,
246
+ version: "0.1.0",
247
+ displayName: ${quote(displayName)},
248
+ description: ${quote(description)},
249
+ author: ${quote(author)},
250
+ categories: [${quote(category)}],
251
+ capabilities: [
252
+ "events.subscribe",
253
+ "plugin.state.read",
254
+ "plugin.state.write"
255
+ ],
256
+ entrypoints: {
257
+ worker: "./dist/worker.js",
258
+ ui: "./dist/ui"
259
+ },
260
+ ui: {
261
+ slots: [
262
+ {
263
+ type: "dashboardWidget",
264
+ id: "health-widget",
265
+ displayName: ${quote(`${displayName} Health`)},
266
+ exportName: "DashboardWidget"
267
+ }
268
+ ]
269
+ }
270
+ };
271
+
272
+ export default manifest;
273
+ `);
274
+ writeFile(path.join(outputDir, "src", "worker.ts"), `import { definePlugin, runWorker } from "@paperclipai/plugin-sdk";
275
+
276
+ const plugin = definePlugin({
277
+ async setup(ctx) {
278
+ ctx.events.on("issue.created", async (event) => {
279
+ const issueId = event.entityId ?? "unknown";
280
+ await ctx.state.set({ scopeKind: "issue", scopeId: issueId, stateKey: "seen" }, true);
281
+ ctx.logger.info("Observed issue.created", { issueId });
282
+ });
283
+
284
+ ctx.data.register("health", async () => {
285
+ return { status: "ok", checkedAt: new Date().toISOString() };
286
+ });
287
+
288
+ ctx.actions.register("ping", async () => {
289
+ ctx.logger.info("Ping action invoked");
290
+ return { pong: true, at: new Date().toISOString() };
291
+ });
292
+ },
293
+
294
+ async onHealth() {
295
+ return { status: "ok", message: "Plugin worker is running" };
296
+ }
297
+ });
298
+
299
+ export default plugin;
300
+ runWorker(plugin, import.meta.url);
301
+ `);
302
+ writeFile(path.join(outputDir, "src", "ui", "index.tsx"), `import { usePluginAction, usePluginData, type PluginWidgetProps } from "@paperclipai/plugin-sdk/ui";
303
+
304
+ type HealthData = {
305
+ status: "ok" | "degraded" | "error";
306
+ checkedAt: string;
307
+ };
308
+
309
+ export function DashboardWidget(_props: PluginWidgetProps) {
310
+ const { data, loading, error } = usePluginData<HealthData>("health");
311
+ const ping = usePluginAction("ping");
312
+
313
+ if (loading) return <div>Loading plugin health...</div>;
314
+ if (error) return <div>Plugin error: {error.message}</div>;
315
+
316
+ return (
317
+ <div style={{ display: "grid", gap: "0.5rem" }}>
318
+ <strong>${displayName}</strong>
319
+ <div>Health: {data?.status ?? "unknown"}</div>
320
+ <div>Checked: {data?.checkedAt ?? "never"}</div>
321
+ <button onClick={() => void ping()}>Ping Worker</button>
322
+ </div>
323
+ );
324
+ }
325
+ `);
326
+ writeFile(path.join(outputDir, "tests", "plugin.spec.ts"), `import { describe, expect, it } from "vitest";
327
+ import { createTestHarness } from "@paperclipai/plugin-sdk/testing";
328
+ import manifest from "../src/manifest.js";
329
+ import plugin from "../src/worker.js";
330
+
331
+ describe("plugin scaffold", () => {
332
+ it("registers data + actions and handles events", async () => {
333
+ const harness = createTestHarness({ manifest, capabilities: [...manifest.capabilities, "events.emit"] });
334
+ await plugin.definition.setup(harness.ctx);
335
+
336
+ await harness.emit("issue.created", { issueId: "iss_1" }, { entityId: "iss_1", entityType: "issue" });
337
+ expect(harness.getState({ scopeKind: "issue", scopeId: "iss_1", stateKey: "seen" })).toBe(true);
338
+
339
+ const data = await harness.getData<{ status: string }>("health");
340
+ expect(data.status).toBe("ok");
341
+
342
+ const action = await harness.performAction<{ pong: boolean }>("ping");
343
+ expect(action.pong).toBe(true);
344
+ });
345
+ });
346
+ `);
347
+ writeFile(path.join(outputDir, "README.md"), `# ${displayName}
348
+
349
+ ${description}
350
+
351
+ ## Development
352
+
353
+ \`\`\`bash
354
+ pnpm install
355
+ pnpm dev # watch builds
356
+ pnpm dev:ui # local dev server with hot-reload events
357
+ pnpm test
358
+ \`\`\`
359
+
360
+ ${sdkDependency.startsWith("file:")
361
+ ? `This scaffold snapshots \`@paperclipai/plugin-sdk\` and \`@paperclipai/shared\` from a local Paperclip checkout at:\n\n\`${toPosixPath(localSdkPath)}\`\n\nThe packed tarballs live in \`.paperclip-sdk/\` for local development. Before publishing this plugin, switch those dependencies to published package versions once they are available on npm.\n\n`
362
+ : ""}
363
+
364
+ ## Install Into Paperclip
365
+
366
+ \`\`\`bash
367
+ curl -X POST http://127.0.0.1:3100/api/plugins/install \\
368
+ -H "Content-Type: application/json" \\
369
+ -d '{"packageName":"${toPosixPath(outputDir)}","isLocalPath":true}'
370
+ \`\`\`
371
+
372
+ ## Build Options
373
+
374
+ - \`pnpm build\` uses esbuild presets from \`@paperclipai/plugin-sdk/bundlers\`.
375
+ - \`pnpm build:rollup\` uses rollup presets from the same SDK.
376
+ `);
377
+ writeFile(path.join(outputDir, ".gitignore"), "dist\nnode_modules\n.paperclip-sdk\n");
378
+ return outputDir;
379
+ }
380
+ function parseArg(name) {
381
+ const index = process.argv.indexOf(name);
382
+ if (index === -1)
383
+ return undefined;
384
+ return process.argv[index + 1];
385
+ }
386
+ /** CLI wrapper for `scaffoldPluginProject`. */
387
+ function runCli() {
388
+ const pluginName = process.argv[2];
389
+ if (!pluginName) {
390
+ // eslint-disable-next-line no-console
391
+ console.error("Usage: create-paperclip-plugin <name> [--template default|connector|workspace] [--output <dir>] [--sdk-path <paperclip-sdk-path>]");
392
+ process.exit(1);
393
+ }
394
+ const template = (parseArg("--template") ?? "default");
395
+ const outputRoot = parseArg("--output") ?? process.cwd();
396
+ const targetDir = path.resolve(outputRoot, packageToDirName(pluginName));
397
+ const out = scaffoldPluginProject({
398
+ pluginName,
399
+ outputDir: targetDir,
400
+ template,
401
+ displayName: parseArg("--display-name"),
402
+ description: parseArg("--description"),
403
+ author: parseArg("--author"),
404
+ category: parseArg("--category"),
405
+ sdkPath: parseArg("--sdk-path"),
406
+ });
407
+ // eslint-disable-next-line no-console
408
+ console.log(`Created plugin scaffold at ${out}`);
409
+ }
410
+ if (import.meta.url === `file://${process.argv[1]}`) {
411
+ runCli();
412
+ }
413
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@paperclipai/create-paperclip-plugin",
3
+ "version": "2026.3.17-canary.0",
4
+ "license": "MIT",
5
+ "homepage": "https://github.com/paperclipai/paperclip",
6
+ "bugs": {
7
+ "url": "https://github.com/paperclipai/paperclip/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/paperclipai/paperclip",
12
+ "directory": "packages/plugins/create-paperclip-plugin"
13
+ },
14
+ "type": "module",
15
+ "bin": {
16
+ "create-paperclip-plugin": "./dist/index.js"
17
+ },
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "dependencies": {
31
+ "@paperclipai/plugin-sdk": "2026.3.17-canary.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^24.6.0",
35
+ "typescript": "^5.7.3"
36
+ },
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "clean": "rm -rf dist",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "main": "./dist/index.js",
43
+ "types": "./dist/index.d.ts"
44
+ }