@penclipai/create-paperclip-plugin 2026.401.0-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,55 @@
1
+ # @penclipai/create-paperclip-plugin
2
+
3
+ Scaffolding tool for creating new Paperclip plugins.
4
+
5
+ ```bash
6
+ npx @penclipai/create-paperclip-plugin my-plugin
7
+ ```
8
+
9
+ Or with options:
10
+
11
+ ```bash
12
+ npx @penclipai/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 keeps compatibility imports from `@paperclipai/plugin-sdk*` and resolves them to the workspace packages published as `@penclipai/*`.
33
+
34
+ Outside this repo, the scaffold keeps those same compatibility imports and snapshots local compatibility tarballs into `.paperclip-sdk/` so the generated plugin can install immediately without waiting for npm publish.
35
+
36
+ If you want the generated package to target already-published npm artifacts instead, pass `--published`:
37
+
38
+ ```bash
39
+ node packages/plugins/create-paperclip-plugin/dist/index.js @acme/my-plugin \
40
+ --output /absolute/path/to/plugins \
41
+ --sdk-path /absolute/path/to/paperclip/packages/plugins/sdk \
42
+ --published
43
+ ```
44
+
45
+ That keeps generated plugins compatible with both upstream Paperclip hosts and Paperclip CN hosts without requiring dual-published packages.
46
+
47
+ ## Workflow after scaffolding
48
+
49
+ ```bash
50
+ cd my-plugin
51
+ pnpm install
52
+ pnpm dev # watch worker + manifest + ui bundles
53
+ pnpm dev:ui # local UI preview server with hot-reload events
54
+ pnpm test
55
+ ```
@@ -0,0 +1,25 @@
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
+ publishedPackages?: boolean;
14
+ }
15
+ /** Validate npm-style plugin package names (scoped or unscoped). */
16
+ export declare function isValidPluginName(name: string): boolean;
17
+ /**
18
+ * Generate a complete Paperclip plugin starter project.
19
+ *
20
+ * Output includes manifest/worker/UI entries, SDK harness tests, bundler presets,
21
+ * and a local dev server script for hot-reload workflow.
22
+ */
23
+ export declare function scaffoldPluginProject(options: ScaffoldPluginOptions): string;
24
+ export {};
25
+ //# 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;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIvD;AAsOD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAgX5E"}
package/dist/index.js ADDED
@@ -0,0 +1,551 @@
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 formatRelativeFileDependency(baseDir, targetPath) {
47
+ return `file:${toPosixPath(path.relative(baseDir, targetPath))}`;
48
+ }
49
+ function copyDir(sourceDir, targetDir) {
50
+ fs.mkdirSync(targetDir, { recursive: true });
51
+ fs.cpSync(sourceDir, targetDir, { recursive: true });
52
+ }
53
+ function runPnpm(args, cwd) {
54
+ execFileSync("pnpm", args, {
55
+ cwd,
56
+ stdio: "pipe",
57
+ shell: process.platform === "win32",
58
+ });
59
+ }
60
+ function getLocalSdkPackagePath() {
61
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "sdk");
62
+ }
63
+ function getRepoRootFromSdkPath(sdkPath) {
64
+ return path.resolve(sdkPath, "..", "..", "..");
65
+ }
66
+ function getLocalSharedPackagePath(sdkPath) {
67
+ return path.resolve(getRepoRootFromSdkPath(sdkPath), "packages", "shared");
68
+ }
69
+ function isInsideDir(targetPath, parentPath) {
70
+ const relative = path.relative(parentPath, targetPath);
71
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
72
+ }
73
+ function packLocalPackage(packagePath, outputDir) {
74
+ const packageJsonPath = path.join(packagePath, "package.json");
75
+ if (!fs.existsSync(packageJsonPath)) {
76
+ throw new Error(`Package package.json not found at ${packageJsonPath}`);
77
+ }
78
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
79
+ const packageName = packageJson.name ?? path.basename(packagePath);
80
+ const packageVersion = packageJson.version ?? "0.0.0";
81
+ const tarballFileName = `${packageName.replace(/^@/, "").replace("/", "-")}-${packageVersion}.tgz`;
82
+ const sdkBundleDir = path.join(outputDir, ".paperclip-sdk");
83
+ fs.mkdirSync(sdkBundleDir, { recursive: true });
84
+ runPnpm(["build"], packagePath);
85
+ runPnpm(["pack", "--pack-destination", sdkBundleDir], packagePath);
86
+ const tarballPath = path.join(sdkBundleDir, tarballFileName);
87
+ if (!fs.existsSync(tarballPath)) {
88
+ throw new Error(`Packed tarball was not created at ${tarballPath}`);
89
+ }
90
+ return tarballPath;
91
+ }
92
+ function rewriteWorkspaceDependencyVersions(deps, rewrites) {
93
+ if (!deps)
94
+ return deps;
95
+ const next = {};
96
+ for (const [name, value] of Object.entries(deps)) {
97
+ const rewrite = rewrites[name];
98
+ const nextName = rewrite?.name ?? name;
99
+ const nextValue = rewrite?.version ?? (value.startsWith("workspace:") ? value.slice("workspace:".length) || "*" : value);
100
+ next[nextName] = nextValue;
101
+ }
102
+ return next;
103
+ }
104
+ function rewritePackageFileContents(rootDir, replacements) {
105
+ const textExtensions = new Set([".js", ".mjs", ".cjs", ".d.ts", ".map"]);
106
+ const stack = [rootDir];
107
+ while (stack.length > 0) {
108
+ const current = stack.pop();
109
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
110
+ const fullPath = path.join(current, entry.name);
111
+ if (entry.isDirectory()) {
112
+ stack.push(fullPath);
113
+ continue;
114
+ }
115
+ if (!textExtensions.has(path.extname(entry.name)))
116
+ continue;
117
+ let content = fs.readFileSync(fullPath, "utf8");
118
+ let changed = false;
119
+ for (const [from, to] of replacements) {
120
+ if (!content.includes(from))
121
+ continue;
122
+ content = content.split(from).join(to);
123
+ changed = true;
124
+ }
125
+ if (changed) {
126
+ fs.writeFileSync(fullPath, content);
127
+ }
128
+ }
129
+ }
130
+ }
131
+ function packCompatibilityPackage(packagePath, outputDir, options) {
132
+ const packageJsonPath = path.join(packagePath, "package.json");
133
+ if (!fs.existsSync(packageJsonPath)) {
134
+ throw new Error(`Package package.json not found at ${packageJsonPath}`);
135
+ }
136
+ runPnpm(["build"], packagePath);
137
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
138
+ const publishConfig = typeof packageJson.publishConfig === "object" && packageJson.publishConfig !== null
139
+ ? packageJson.publishConfig
140
+ : {};
141
+ const packageVersion = typeof packageJson.version === "string" ? packageJson.version : "0.0.0";
142
+ const bundleDir = path.join(outputDir, ".paperclip-sdk");
143
+ const compatDir = path.join(bundleDir, options.aliasName.replace(/^@/, "").replace("/", "__"));
144
+ fs.rmSync(compatDir, { recursive: true, force: true });
145
+ fs.mkdirSync(compatDir, { recursive: true });
146
+ const distSource = path.join(packagePath, "dist");
147
+ if (fs.existsSync(distSource)) {
148
+ copyDir(distSource, path.join(compatDir, "dist"));
149
+ }
150
+ const readmeSource = path.join(packagePath, "README.md");
151
+ if (fs.existsSync(readmeSource)) {
152
+ fs.copyFileSync(readmeSource, path.join(compatDir, "README.md"));
153
+ }
154
+ if (options.contentReplacements?.length) {
155
+ rewritePackageFileContents(path.join(compatDir, "dist"), options.contentReplacements);
156
+ }
157
+ const compatPackageJson = {
158
+ name: options.aliasName,
159
+ version: packageVersion,
160
+ description: packageJson.description,
161
+ type: packageJson.type ?? "module",
162
+ keywords: packageJson.keywords,
163
+ license: packageJson.license,
164
+ repository: packageJson.repository,
165
+ homepage: packageJson.homepage,
166
+ bugs: packageJson.bugs,
167
+ bin: publishConfig.bin ?? packageJson.bin,
168
+ exports: publishConfig.exports ?? packageJson.exports,
169
+ main: publishConfig.main ?? packageJson.main,
170
+ types: publishConfig.types ?? packageJson.types,
171
+ files: ["dist", "README.md"],
172
+ dependencies: rewriteWorkspaceDependencyVersions(packageJson.dependencies, options.dependencyRewrites ?? {}),
173
+ optionalDependencies: rewriteWorkspaceDependencyVersions(packageJson.optionalDependencies, options.dependencyRewrites ?? {}),
174
+ peerDependencies: packageJson.peerDependencies,
175
+ peerDependenciesMeta: packageJson.peerDependenciesMeta,
176
+ };
177
+ writeFile(path.join(compatDir, "package.json"), `${JSON.stringify(compatPackageJson, null, 2)}\n`);
178
+ runPnpm(["pack", "--pack-destination", bundleDir], compatDir);
179
+ const tarballFileName = `${options.aliasName.replace(/^@/, "").replace("/", "-")}-${packageVersion}.tgz`;
180
+ const tarballPath = path.join(bundleDir, tarballFileName);
181
+ if (!fs.existsSync(tarballPath)) {
182
+ throw new Error(`Packed compatibility tarball was not created at ${tarballPath}`);
183
+ }
184
+ return tarballPath;
185
+ }
186
+ /**
187
+ * Generate a complete Paperclip plugin starter project.
188
+ *
189
+ * Output includes manifest/worker/UI entries, SDK harness tests, bundler presets,
190
+ * and a local dev server script for hot-reload workflow.
191
+ */
192
+ export function scaffoldPluginProject(options) {
193
+ const template = options.template ?? "default";
194
+ if (!VALID_TEMPLATES.includes(template)) {
195
+ throw new Error(`Invalid template '${template}'. Expected one of: ${VALID_TEMPLATES.join(", ")}`);
196
+ }
197
+ if (!isValidPluginName(options.pluginName)) {
198
+ throw new Error("Invalid plugin name. Must be lowercase and may include scope, dots, underscores, or hyphens.");
199
+ }
200
+ if (options.category && !VALID_CATEGORIES.has(options.category)) {
201
+ throw new Error(`Invalid category '${options.category}'. Expected one of: ${[...VALID_CATEGORIES].join(", ")}`);
202
+ }
203
+ const outputDir = path.resolve(options.outputDir);
204
+ if (fs.existsSync(outputDir)) {
205
+ throw new Error(`Directory already exists: ${outputDir}`);
206
+ }
207
+ const displayName = options.displayName ?? makeDisplayName(options.pluginName);
208
+ const description = options.description ?? "A Paperclip plugin";
209
+ const author = options.author ?? "Plugin Author";
210
+ const category = options.category ?? (template === "workspace" ? "workspace" : "connector");
211
+ const manifestId = packageToManifestId(options.pluginName);
212
+ const localSdkPath = path.resolve(options.sdkPath ?? getLocalSdkPackagePath());
213
+ const localSharedPath = getLocalSharedPackagePath(localSdkPath);
214
+ const repoRoot = getRepoRootFromSdkPath(localSdkPath);
215
+ const useWorkspaceSdk = isInsideDir(outputDir, repoRoot);
216
+ const usePublishedPackages = options.publishedPackages === true && !useWorkspaceSdk;
217
+ const sdkVersion = JSON.parse(fs.readFileSync(path.join(localSdkPath, "package.json"), "utf8")).version ?? "latest";
218
+ const sharedVersion = JSON.parse(fs.readFileSync(path.join(localSharedPath, "package.json"), "utf8")).version ?? "latest";
219
+ fs.mkdirSync(outputDir, { recursive: true });
220
+ const packedCompatSdkTarball = useWorkspaceSdk || usePublishedPackages
221
+ ? null
222
+ : packCompatibilityPackage(localSdkPath, outputDir, {
223
+ aliasName: "@paperclipai/plugin-sdk",
224
+ dependencyRewrites: {
225
+ "@penclipai/shared": {
226
+ name: "@paperclipai/shared",
227
+ version: sharedVersion,
228
+ },
229
+ },
230
+ contentReplacements: [
231
+ ["@penclipai/shared", "@paperclipai/shared"],
232
+ ],
233
+ });
234
+ const packedCompatSharedTarball = useWorkspaceSdk || usePublishedPackages
235
+ ? null
236
+ : packCompatibilityPackage(localSharedPath, outputDir, {
237
+ aliasName: "@paperclipai/shared",
238
+ });
239
+ const sdkDependency = useWorkspaceSdk
240
+ ? "workspace:@penclipai/plugin-sdk@*"
241
+ : usePublishedPackages
242
+ ? `npm:@penclipai/plugin-sdk@${sdkVersion}`
243
+ : formatRelativeFileDependency(outputDir, packedCompatSdkTarball);
244
+ const sharedDependency = useWorkspaceSdk
245
+ ? "workspace:@penclipai/shared@*"
246
+ : usePublishedPackages
247
+ ? `npm:@penclipai/shared@${sharedVersion}`
248
+ : formatRelativeFileDependency(outputDir, packedCompatSharedTarball);
249
+ const packageJson = {
250
+ name: options.pluginName,
251
+ version: "0.1.0",
252
+ type: "module",
253
+ private: true,
254
+ description,
255
+ scripts: {
256
+ build: "node ./esbuild.config.mjs",
257
+ "build:rollup": "rollup -c",
258
+ dev: "node ./esbuild.config.mjs --watch",
259
+ "dev:ui": "paperclip-plugin-dev-server --root . --ui-dir dist/ui --port 4177",
260
+ test: "vitest run --config ./vitest.config.ts",
261
+ typecheck: "tsc --noEmit"
262
+ },
263
+ paperclipPlugin: {
264
+ manifest: "./dist/manifest.js",
265
+ worker: "./dist/worker.js",
266
+ ui: "./dist/ui/"
267
+ },
268
+ keywords: ["paperclip", "plugin", category],
269
+ author,
270
+ license: "MIT",
271
+ ...(packedCompatSharedTarball
272
+ ? {
273
+ pnpm: {
274
+ overrides: {
275
+ "@paperclipai/shared": formatRelativeFileDependency(outputDir, packedCompatSharedTarball),
276
+ },
277
+ },
278
+ }
279
+ : {}),
280
+ devDependencies: {
281
+ "@paperclipai/plugin-sdk": sdkDependency,
282
+ "@paperclipai/shared": sharedDependency,
283
+ "@rollup/plugin-node-resolve": "^16.0.1",
284
+ "@rollup/plugin-typescript": "^12.1.2",
285
+ "@types/node": "^24.6.0",
286
+ "@types/react": "^19.0.8",
287
+ esbuild: "^0.27.3",
288
+ rollup: "^4.38.0",
289
+ tslib: "^2.8.1",
290
+ typescript: "^5.7.3",
291
+ vitest: "^3.0.5"
292
+ },
293
+ peerDependencies: {
294
+ react: ">=18"
295
+ }
296
+ };
297
+ writeFile(path.join(outputDir, "package.json"), `${JSON.stringify(packageJson, null, 2)}\n`);
298
+ const tsconfig = {
299
+ compilerOptions: {
300
+ target: "ES2022",
301
+ module: "NodeNext",
302
+ moduleResolution: "NodeNext",
303
+ lib: ["ES2022", "DOM"],
304
+ jsx: "react-jsx",
305
+ strict: true,
306
+ skipLibCheck: true,
307
+ declaration: true,
308
+ declarationMap: true,
309
+ sourceMap: true,
310
+ outDir: "dist",
311
+ rootDir: "."
312
+ },
313
+ include: ["src", "tests"],
314
+ exclude: ["dist", "node_modules"]
315
+ };
316
+ writeFile(path.join(outputDir, "tsconfig.json"), `${JSON.stringify(tsconfig, null, 2)}\n`);
317
+ writeFile(path.join(outputDir, "esbuild.config.mjs"), `import esbuild from "esbuild";
318
+ import { createPluginBundlerPresets } from "@paperclipai/plugin-sdk/bundlers";
319
+
320
+ const presets = createPluginBundlerPresets({ uiEntry: "src/ui/index.tsx" });
321
+ const watch = process.argv.includes("--watch");
322
+
323
+ const workerCtx = await esbuild.context(presets.esbuild.worker);
324
+ const manifestCtx = await esbuild.context(presets.esbuild.manifest);
325
+ const uiCtx = await esbuild.context(presets.esbuild.ui);
326
+
327
+ if (watch) {
328
+ await Promise.all([workerCtx.watch(), manifestCtx.watch(), uiCtx.watch()]);
329
+ console.log("esbuild watch mode enabled for worker, manifest, and ui");
330
+ } else {
331
+ await Promise.all([workerCtx.rebuild(), manifestCtx.rebuild(), uiCtx.rebuild()]);
332
+ await Promise.all([workerCtx.dispose(), manifestCtx.dispose(), uiCtx.dispose()]);
333
+ }
334
+ `);
335
+ writeFile(path.join(outputDir, "rollup.config.mjs"), `import { nodeResolve } from "@rollup/plugin-node-resolve";
336
+ import typescript from "@rollup/plugin-typescript";
337
+ import { createPluginBundlerPresets } from "@paperclipai/plugin-sdk/bundlers";
338
+
339
+ const presets = createPluginBundlerPresets({ uiEntry: "src/ui/index.tsx" });
340
+
341
+ function withPlugins(config) {
342
+ if (!config) return null;
343
+ return {
344
+ ...config,
345
+ plugins: [
346
+ nodeResolve({
347
+ extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs"],
348
+ }),
349
+ typescript({
350
+ tsconfig: "./tsconfig.json",
351
+ declaration: false,
352
+ declarationMap: false,
353
+ }),
354
+ ],
355
+ };
356
+ }
357
+
358
+ export default [
359
+ withPlugins(presets.rollup.manifest),
360
+ withPlugins(presets.rollup.worker),
361
+ withPlugins(presets.rollup.ui),
362
+ ].filter(Boolean);
363
+ `);
364
+ writeFile(path.join(outputDir, "vitest.config.ts"), `import { defineConfig } from "vitest/config";
365
+
366
+ export default defineConfig({
367
+ test: {
368
+ include: ["tests/**/*.spec.ts"],
369
+ environment: "node",
370
+ },
371
+ });
372
+ `);
373
+ writeFile(path.join(outputDir, "src", "manifest.ts"), `import type { PaperclipPluginManifestV1 } from "@paperclipai/plugin-sdk";
374
+
375
+ const manifest: PaperclipPluginManifestV1 = {
376
+ id: ${quote(manifestId)},
377
+ apiVersion: 1,
378
+ version: "0.1.0",
379
+ displayName: ${quote(displayName)},
380
+ description: ${quote(description)},
381
+ author: ${quote(author)},
382
+ categories: [${quote(category)}],
383
+ capabilities: [
384
+ "events.subscribe",
385
+ "plugin.state.read",
386
+ "plugin.state.write"
387
+ ],
388
+ entrypoints: {
389
+ worker: "./dist/worker.js",
390
+ ui: "./dist/ui"
391
+ },
392
+ ui: {
393
+ slots: [
394
+ {
395
+ type: "dashboardWidget",
396
+ id: "health-widget",
397
+ displayName: ${quote(`${displayName} Health`)},
398
+ exportName: "DashboardWidget"
399
+ }
400
+ ]
401
+ }
402
+ };
403
+
404
+ export default manifest;
405
+ `);
406
+ writeFile(path.join(outputDir, "src", "worker.ts"), `import { definePlugin, runWorker } from "@paperclipai/plugin-sdk";
407
+
408
+ const plugin = definePlugin({
409
+ async setup(ctx) {
410
+ ctx.events.on("issue.created", async (event) => {
411
+ const issueId = event.entityId ?? "unknown";
412
+ await ctx.state.set({ scopeKind: "issue", scopeId: issueId, stateKey: "seen" }, true);
413
+ ctx.logger.info("Observed issue.created", { issueId });
414
+ });
415
+
416
+ ctx.data.register("health", async () => {
417
+ return { status: "ok", checkedAt: new Date().toISOString() };
418
+ });
419
+
420
+ ctx.actions.register("ping", async () => {
421
+ ctx.logger.info("Ping action invoked");
422
+ return { pong: true, at: new Date().toISOString() };
423
+ });
424
+ },
425
+
426
+ async onHealth() {
427
+ return { status: "ok", message: "Plugin worker is running" };
428
+ }
429
+ });
430
+
431
+ export default plugin;
432
+ runWorker(plugin, import.meta.url);
433
+ `);
434
+ writeFile(path.join(outputDir, "src", "ui", "index.tsx"), `import { usePluginAction, usePluginData, type PluginWidgetProps } from "@paperclipai/plugin-sdk/ui";
435
+
436
+ type HealthData = {
437
+ status: "ok" | "degraded" | "error";
438
+ checkedAt: string;
439
+ };
440
+
441
+ export function DashboardWidget(_props: PluginWidgetProps) {
442
+ const { data, loading, error } = usePluginData<HealthData>("health");
443
+ const ping = usePluginAction("ping");
444
+
445
+ if (loading) return <div>Loading plugin health...</div>;
446
+ if (error) return <div>Plugin error: {error.message}</div>;
447
+
448
+ return (
449
+ <div style={{ display: "grid", gap: "0.5rem" }}>
450
+ <strong>${displayName}</strong>
451
+ <div>Health: {data?.status ?? "unknown"}</div>
452
+ <div>Checked: {data?.checkedAt ?? "never"}</div>
453
+ <button onClick={() => void ping()}>Ping Worker</button>
454
+ </div>
455
+ );
456
+ }
457
+ `);
458
+ writeFile(path.join(outputDir, "tests", "plugin.spec.ts"), `import { describe, expect, it } from "vitest";
459
+ import { createTestHarness } from "@paperclipai/plugin-sdk/testing";
460
+ import manifest from "../src/manifest.js";
461
+ import plugin from "../src/worker.js";
462
+
463
+ describe("plugin scaffold", () => {
464
+ it("registers data + actions and handles events", async () => {
465
+ const harness = createTestHarness({ manifest, capabilities: [...manifest.capabilities, "events.emit"] });
466
+ await plugin.definition.setup(harness.ctx);
467
+
468
+ await harness.emit("issue.created", { issueId: "iss_1" }, { entityId: "iss_1", entityType: "issue" });
469
+ expect(harness.getState({ scopeKind: "issue", scopeId: "iss_1", stateKey: "seen" })).toBe(true);
470
+
471
+ const data = await harness.getData<{ status: string }>("health");
472
+ expect(data.status).toBe("ok");
473
+
474
+ const action = await harness.performAction<{ pong: boolean }>("ping");
475
+ expect(action.pong).toBe(true);
476
+ });
477
+ });
478
+ `);
479
+ writeFile(path.join(outputDir, "README.md"), `# ${displayName}
480
+
481
+ ${description}
482
+
483
+ ## Development
484
+
485
+ \`\`\`bash
486
+ pnpm install
487
+ pnpm dev # watch builds
488
+ pnpm dev:ui # local dev server with hot-reload events
489
+ pnpm test
490
+ \`\`\`
491
+
492
+ ${useWorkspaceSdk
493
+ ? `This scaffold keeps compatibility imports from \`@paperclipai/plugin-sdk*\` while resolving them to the workspace packages published as \`@penclipai/*\`.\n\n`
494
+ : usePublishedPackages
495
+ ? `This scaffold keeps compatibility imports from \`@paperclipai/plugin-sdk*\` while installing the published packages from \`@penclipai/*\` via npm alias dependencies pinned from your local Paperclip checkout at:\n\n\`${toPosixPath(localSdkPath)}\`\n\n`
496
+ : `This scaffold snapshots compatibility packages for \`@paperclipai/plugin-sdk\` and \`@paperclipai/shared\` from your local Paperclip checkout at:\n\n\`${toPosixPath(localSdkPath)}\`\n\nThe packed tarballs live in \`.paperclip-sdk/\` so the generated plugin can install immediately without waiting for npm publish.\n\n`}
497
+
498
+ ## Install Into Paperclip
499
+
500
+ \`\`\`bash
501
+ curl -X POST http://127.0.0.1:3100/api/plugins/install \\
502
+ -H "Content-Type: application/json" \\
503
+ -d '{"packageName":"${toPosixPath(outputDir)}","isLocalPath":true}'
504
+ \`\`\`
505
+
506
+ ## Build Options
507
+
508
+ - \`pnpm build\` uses esbuild presets from \`@paperclipai/plugin-sdk/bundlers\`.
509
+ - \`pnpm build:rollup\` uses rollup presets from the same SDK.
510
+ `);
511
+ writeFile(path.join(outputDir, ".gitignore"), "dist\nnode_modules\n.paperclip-sdk\n");
512
+ return outputDir;
513
+ }
514
+ function parseArg(name) {
515
+ const index = process.argv.indexOf(name);
516
+ if (index === -1)
517
+ return undefined;
518
+ return process.argv[index + 1];
519
+ }
520
+ function hasFlag(name) {
521
+ return process.argv.includes(name);
522
+ }
523
+ /** CLI wrapper for `scaffoldPluginProject`. */
524
+ function runCli() {
525
+ const pluginName = process.argv[2];
526
+ if (!pluginName) {
527
+ // eslint-disable-next-line no-console
528
+ console.error("Usage: create-paperclip-plugin <name> [--template default|connector|workspace] [--output <dir>] [--sdk-path <paperclip-sdk-path>] [--published]");
529
+ process.exit(1);
530
+ }
531
+ const template = (parseArg("--template") ?? "default");
532
+ const outputRoot = parseArg("--output") ?? process.cwd();
533
+ const targetDir = path.resolve(outputRoot, packageToDirName(pluginName));
534
+ const out = scaffoldPluginProject({
535
+ pluginName,
536
+ outputDir: targetDir,
537
+ template,
538
+ displayName: parseArg("--display-name"),
539
+ description: parseArg("--description"),
540
+ author: parseArg("--author"),
541
+ category: parseArg("--category"),
542
+ sdkPath: parseArg("--sdk-path"),
543
+ publishedPackages: hasFlag("--published"),
544
+ });
545
+ // eslint-disable-next-line no-console
546
+ console.log(`Created plugin scaffold at ${out}`);
547
+ }
548
+ if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {
549
+ runCli();
550
+ }
551
+ //# 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": "@penclipai/create-paperclip-plugin",
3
+ "version": "2026.401.0-canary.0",
4
+ "license": "MIT",
5
+ "homepage": "https://github.com/penclipai/paperclip-cn",
6
+ "bugs": {
7
+ "url": "https://github.com/penclipai/paperclip-cn/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/penclipai/paperclip-cn",
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
+ "@penclipai/plugin-sdk": "2026.401.0-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
+ }