@openacp/cli 2026.326.4 → 2026.327.1

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.
Files changed (72) hide show
  1. package/README.md +2 -2
  2. package/dist/{adapter-77ZCVABT.js → adapter-IZNL6AK2.js} +13 -13
  3. package/dist/{adapter-6ANPBSVU.js → adapter-Z435XYBQ.js} +2 -2
  4. package/dist/{api-server-CHVSUDBX.js → api-server-2I7B3MXR.js} +2 -2
  5. package/dist/{api-server-3PYLRBCN.js → api-server-5VEESFOT.js} +2 -2
  6. package/dist/{chunk-Y64XWMJ4.js → chunk-366FOUJG.js} +2 -2
  7. package/dist/{chunk-WVLDNYOJ.js → chunk-5RO42TWV.js} +2 -2
  8. package/dist/{chunk-UNJUWWQO.js → chunk-5YW56UJK.js} +1 -10
  9. package/dist/chunk-5YW56UJK.js.map +1 -0
  10. package/dist/{chunk-NBFIBGAT.js → chunk-7KGWYNWE.js} +1 -1
  11. package/dist/chunk-CDAUYTVP.js +41 -0
  12. package/dist/chunk-CDAUYTVP.js.map +1 -0
  13. package/dist/{chunk-Q6ZXJTZB.js → chunk-CFM4GJ74.js} +7 -11
  14. package/dist/chunk-CFM4GJ74.js.map +1 -0
  15. package/dist/{chunk-RKB2ZK6S.js → chunk-FDLQ5M6W.js} +17 -136
  16. package/dist/chunk-FDLQ5M6W.js.map +1 -0
  17. package/dist/{chunk-FQEBWOZR.js → chunk-QUXTZU36.js} +45 -126
  18. package/dist/chunk-QUXTZU36.js.map +1 -0
  19. package/dist/{chunk-QSDZDHNS.js → chunk-VO3A2NI4.js} +4 -4
  20. package/dist/{chunk-V5JT5TPD.js → chunk-ZPTM4NGK.js} +2 -2
  21. package/dist/cli.js +145 -46
  22. package/dist/cli.js.map +1 -1
  23. package/dist/{config-editor-HNEKXRLQ.js → config-editor-2GYL2SSZ.js} +2 -2
  24. package/dist/{core-plugins-VEUNFTMB.js → core-plugins-I6UPXQBL.js} +7 -10
  25. package/dist/{discord-NOJQ5PZO.js → discord-DXDTGVGS.js} +2 -2
  26. package/dist/index.d.ts +14 -62
  27. package/dist/index.js +15 -21
  28. package/dist/index.js.map +1 -1
  29. package/dist/{integrate-5C6KSU6D.js → integrate-APK4OEQF.js} +2 -2
  30. package/dist/integrate-APK4OEQF.js.map +1 -0
  31. package/dist/{main-T5WVCCFN.js → main-EJBK65NS.js} +33 -52
  32. package/dist/main-EJBK65NS.js.map +1 -0
  33. package/dist/{new-session-AVQCNXRG.js → new-session-HFO5GHSZ.js} +3 -3
  34. package/dist/plugin-create-LCXXNDK6.js +950 -0
  35. package/dist/plugin-create-LCXXNDK6.js.map +1 -0
  36. package/dist/plugin-search-HQ4WQKOF.js +40 -0
  37. package/dist/plugin-search-HQ4WQKOF.js.map +1 -0
  38. package/dist/{post-upgrade-XLHZ6ZB7.js → post-upgrade-2MG3VUDV.js} +2 -2
  39. package/dist/registry-client-AVGRE4CF.js +8 -0
  40. package/dist/{setup-BAI2F24H.js → setup-N7KT56O7.js} +7 -7
  41. package/dist/{telegram-ZDC3JQF2.js → telegram-QWMJU3A6.js} +2 -2
  42. package/package.json +2 -2
  43. package/dist/chunk-2CX4IEEC.js +0 -124
  44. package/dist/chunk-2CX4IEEC.js.map +0 -1
  45. package/dist/chunk-FQEBWOZR.js.map +0 -1
  46. package/dist/chunk-Q6ZXJTZB.js.map +0 -1
  47. package/dist/chunk-RKB2ZK6S.js.map +0 -1
  48. package/dist/chunk-UNJUWWQO.js.map +0 -1
  49. package/dist/chunk-WAAD23KY.js +0 -222
  50. package/dist/chunk-WAAD23KY.js.map +0 -1
  51. package/dist/integrate-5C6KSU6D.js.map +0 -1
  52. package/dist/main-T5WVCCFN.js.map +0 -1
  53. package/dist/plugin-create-AQ3B22BZ.js +0 -334
  54. package/dist/plugin-create-AQ3B22BZ.js.map +0 -1
  55. package/dist/usage-WYNK6ZC5.js +0 -10
  56. /package/dist/{adapter-77ZCVABT.js.map → adapter-IZNL6AK2.js.map} +0 -0
  57. /package/dist/{adapter-6ANPBSVU.js.map → adapter-Z435XYBQ.js.map} +0 -0
  58. /package/dist/{api-server-3PYLRBCN.js.map → api-server-2I7B3MXR.js.map} +0 -0
  59. /package/dist/{api-server-CHVSUDBX.js.map → api-server-5VEESFOT.js.map} +0 -0
  60. /package/dist/{chunk-Y64XWMJ4.js.map → chunk-366FOUJG.js.map} +0 -0
  61. /package/dist/{chunk-WVLDNYOJ.js.map → chunk-5RO42TWV.js.map} +0 -0
  62. /package/dist/{chunk-NBFIBGAT.js.map → chunk-7KGWYNWE.js.map} +0 -0
  63. /package/dist/{chunk-QSDZDHNS.js.map → chunk-VO3A2NI4.js.map} +0 -0
  64. /package/dist/{chunk-V5JT5TPD.js.map → chunk-ZPTM4NGK.js.map} +0 -0
  65. /package/dist/{config-editor-HNEKXRLQ.js.map → config-editor-2GYL2SSZ.js.map} +0 -0
  66. /package/dist/{core-plugins-VEUNFTMB.js.map → core-plugins-I6UPXQBL.js.map} +0 -0
  67. /package/dist/{discord-NOJQ5PZO.js.map → discord-DXDTGVGS.js.map} +0 -0
  68. /package/dist/{new-session-AVQCNXRG.js.map → new-session-HFO5GHSZ.js.map} +0 -0
  69. /package/dist/{post-upgrade-XLHZ6ZB7.js.map → post-upgrade-2MG3VUDV.js.map} +0 -0
  70. /package/dist/{telegram-ZDC3JQF2.js.map → registry-client-AVGRE4CF.js.map} +0 -0
  71. /package/dist/{setup-BAI2F24H.js.map → setup-N7KT56O7.js.map} +0 -0
  72. /package/dist/{usage-WYNK6ZC5.js.map → telegram-QWMJU3A6.js.map} +0 -0
@@ -1,334 +0,0 @@
1
- import {
2
- getCurrentVersion
3
- } from "./chunk-S64CB6J3.js";
4
- import "./chunk-VUNV25KB.js";
5
-
6
- // src/cli/commands/plugin-create.ts
7
- import * as p from "@clack/prompts";
8
- import fs from "fs";
9
- import path from "path";
10
- async function cmdPluginCreate() {
11
- p.intro("Create a new OpenACP plugin");
12
- const result = await p.group(
13
- {
14
- name: () => p.text({
15
- message: "Plugin name (e.g., @myorg/adapter-matrix)",
16
- placeholder: "@myorg/my-plugin",
17
- validate: (value) => {
18
- if (!value || !value.trim()) return "Plugin name is required";
19
- if (!/^(@[a-z0-9-]+\/)?[a-z0-9-]+$/.test(value.trim())) {
20
- return "Must be a valid npm package name (lowercase, hyphens, optional @scope/)";
21
- }
22
- return void 0;
23
- }
24
- }),
25
- description: () => p.text({
26
- message: "Description",
27
- placeholder: "A short description of your plugin"
28
- }),
29
- author: () => p.text({
30
- message: "Author",
31
- placeholder: "Your Name <email@example.com>"
32
- }),
33
- license: () => p.select({
34
- message: "License",
35
- options: [
36
- { value: "MIT", label: "MIT" },
37
- { value: "Apache-2.0", label: "Apache 2.0" },
38
- { value: "ISC", label: "ISC" },
39
- { value: "UNLICENSED", label: "Unlicensed (private)" }
40
- ]
41
- })
42
- },
43
- {
44
- onCancel: () => {
45
- p.cancel("Plugin creation cancelled.");
46
- process.exit(0);
47
- }
48
- }
49
- );
50
- const pluginName = result.name.trim();
51
- const dirName = pluginName.replace(/^@[^/]+\//, "");
52
- const targetDir = path.resolve(process.cwd(), dirName);
53
- if (fs.existsSync(targetDir)) {
54
- p.cancel(`Directory "${dirName}" already exists.`);
55
- process.exit(1);
56
- }
57
- const spinner2 = p.spinner();
58
- spinner2.start("Scaffolding plugin...");
59
- fs.mkdirSync(path.join(targetDir, "src", "__tests__"), { recursive: true });
60
- const cliVersion = getCurrentVersion();
61
- const packageJson = {
62
- name: pluginName,
63
- version: "0.1.0",
64
- description: result.description || "",
65
- type: "module",
66
- main: "dist/index.js",
67
- types: "dist/index.d.ts",
68
- scripts: {
69
- build: "tsc",
70
- dev: "tsc --watch",
71
- test: "vitest",
72
- prepublishOnly: "npm run build"
73
- },
74
- author: result.author || "",
75
- license: result.license,
76
- keywords: ["openacp", "openacp-plugin"],
77
- peerDependencies: {
78
- "@openacp/cli": `>=${cliVersion}`
79
- },
80
- devDependencies: {
81
- "@openacp/plugin-sdk": cliVersion,
82
- typescript: "^5.4.0",
83
- vitest: "^3.0.0"
84
- }
85
- };
86
- fs.writeFileSync(
87
- path.join(targetDir, "package.json"),
88
- JSON.stringify(packageJson, null, 2) + "\n"
89
- );
90
- const tsconfig = {
91
- compilerOptions: {
92
- target: "ES2022",
93
- module: "NodeNext",
94
- moduleResolution: "NodeNext",
95
- declaration: true,
96
- outDir: "dist",
97
- rootDir: "src",
98
- strict: true,
99
- esModuleInterop: true,
100
- skipLibCheck: true,
101
- forceConsistentCasingInFileNames: true
102
- },
103
- include: ["src"],
104
- exclude: ["node_modules", "dist", "src/**/__tests__"]
105
- };
106
- fs.writeFileSync(
107
- path.join(targetDir, "tsconfig.json"),
108
- JSON.stringify(tsconfig, null, 2) + "\n"
109
- );
110
- fs.writeFileSync(
111
- path.join(targetDir, ".gitignore"),
112
- ["node_modules/", "dist/", "*.tsbuildinfo", ".DS_Store", ""].join("\n")
113
- );
114
- fs.writeFileSync(
115
- path.join(targetDir, ".npmignore"),
116
- ["src/", "tsconfig.json", ".editorconfig", ".gitignore", "*.test.ts", "__tests__/", ""].join("\n")
117
- );
118
- fs.writeFileSync(
119
- path.join(targetDir, ".editorconfig"),
120
- [
121
- "root = true",
122
- "",
123
- "[*]",
124
- "indent_style = space",
125
- "indent_size = 2",
126
- "end_of_line = lf",
127
- "charset = utf-8",
128
- "trim_trailing_whitespace = true",
129
- "insert_final_newline = true",
130
- ""
131
- ].join("\n")
132
- );
133
- fs.writeFileSync(
134
- path.join(targetDir, "README.md"),
135
- [
136
- `# ${pluginName}`,
137
- "",
138
- result.description || "An OpenACP plugin.",
139
- "",
140
- "## Installation",
141
- "",
142
- "```bash",
143
- `openacp plugin add ${pluginName}`,
144
- "```",
145
- "",
146
- "## Development",
147
- "",
148
- "```bash",
149
- "npm install",
150
- "npm run build",
151
- "npm test",
152
- "",
153
- "# Live development with hot-reload:",
154
- `openacp dev .`,
155
- "```",
156
- "",
157
- "## License",
158
- "",
159
- result.license,
160
- ""
161
- ].join("\n")
162
- );
163
- const pluginVarName = dirName.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
164
- fs.writeFileSync(
165
- path.join(targetDir, "src", "index.ts"),
166
- `import type { OpenACPPlugin, PluginContext, InstallContext, MigrateContext } from '@openacp/plugin-sdk'
167
-
168
- const plugin: OpenACPPlugin = {
169
- name: '${pluginName}',
170
- version: '0.1.0',
171
- description: '${(result.description || "").replace(/'/g, "\\'")}',
172
-
173
- // Declare which permissions your plugin needs.
174
- // Available: events:read, events:emit, services:register, services:use,
175
- // middleware:register, commands:register, storage:read, storage:write, kernel:access
176
- permissions: ['events:read', 'services:register'],
177
-
178
- // Dependencies on other plugins (loaded before this one).
179
- // pluginDependencies: { '@openacp/security': '>=1.0.0' },
180
-
181
- // Optional dependencies (used if available, gracefully degrade if not).
182
- // optionalPluginDependencies: { '@openacp/usage': '>=1.0.0' },
183
-
184
- /**
185
- * Called during server startup in dependency order.
186
- * Register services, middleware, commands, and event listeners here.
187
- */
188
- async setup(ctx: PluginContext): Promise<void> {
189
- ctx.log.info('Plugin setup started')
190
-
191
- // Example: register a service
192
- // ctx.registerService('my-service', myServiceImpl)
193
-
194
- // Example: listen to events
195
- // ctx.on('session:created', (event) => { ... })
196
-
197
- // Example: register a slash command
198
- // ctx.registerCommand({
199
- // name: 'mycommand',
200
- // description: 'Does something useful',
201
- // category: 'plugin',
202
- // async handler(args) {
203
- // return { type: 'text', text: 'Hello from ${pluginName}!' }
204
- // },
205
- // })
206
-
207
- ctx.log.info('Plugin setup complete')
208
- },
209
-
210
- /**
211
- * Called during server shutdown in reverse dependency order.
212
- * Clean up resources, close connections, stop timers here.
213
- * Has a 10-second timeout.
214
- */
215
- async teardown(): Promise<void> {
216
- // Clean up resources here
217
- },
218
-
219
- /**
220
- * Called when user runs \`openacp plugin add ${pluginName}\`.
221
- * Use ctx.terminal for interactive prompts to gather configuration.
222
- */
223
- async install(ctx: InstallContext): Promise<void> {
224
- ctx.terminal.log.info('Installing ${pluginName}...')
225
-
226
- // Example: prompt for configuration
227
- // const apiKey = await ctx.terminal.text({
228
- // message: 'Enter your API key',
229
- // validate: (v) => v.length === 0 ? 'Required' : undefined,
230
- // })
231
- // await ctx.settings.set('apiKey', apiKey)
232
-
233
- ctx.terminal.log.success('Installation complete!')
234
- },
235
-
236
- /**
237
- * Called when user runs \`openacp plugin configure ${pluginName}\`.
238
- * Re-run configuration prompts to update settings.
239
- */
240
- async configure(ctx: InstallContext): Promise<void> {
241
- ctx.terminal.log.info('Configuring ${pluginName}...')
242
-
243
- // Re-run configuration prompts, pre-filling with current values
244
- // const current = await ctx.settings.getAll()
245
- // ...
246
-
247
- ctx.terminal.log.success('Configuration updated!')
248
- },
249
-
250
- /**
251
- * Called during boot when the plugin version has changed.
252
- * Migrate settings from the old format to the new format.
253
- */
254
- async migrate(ctx: MigrateContext, oldSettings: unknown, oldVersion: string): Promise<unknown> {
255
- ctx.log.info(\`Migrating from v\${oldVersion}\`)
256
- // Return the migrated settings object
257
- return oldSettings
258
- },
259
-
260
- /**
261
- * Called when user runs \`openacp plugin remove ${pluginName}\`.
262
- * Clean up any external resources. If opts.purge is true, delete all data.
263
- */
264
- async uninstall(ctx: InstallContext, opts: { purge: boolean }): Promise<void> {
265
- ctx.terminal.log.info('Uninstalling ${pluginName}...')
266
- if (opts.purge) {
267
- await ctx.settings.clear()
268
- }
269
- ctx.terminal.log.success('Uninstalled!')
270
- },
271
- }
272
-
273
- export default plugin
274
- `
275
- );
276
- fs.writeFileSync(
277
- path.join(targetDir, "src", "__tests__", "index.test.ts"),
278
- `import { describe, it, expect } from 'vitest'
279
- import { createTestContext, createTestInstallContext } from '@openacp/plugin-sdk/testing'
280
- import plugin from '../index.js'
281
-
282
- describe('${pluginName}', () => {
283
- it('has correct metadata', () => {
284
- expect(plugin.name).toBe('${pluginName}')
285
- expect(plugin.version).toBeDefined()
286
- expect(plugin.setup).toBeInstanceOf(Function)
287
- })
288
-
289
- it('sets up without errors', async () => {
290
- const ctx = createTestContext({
291
- pluginName: '${pluginName}',
292
- pluginConfig: { enabled: true },
293
- permissions: plugin.permissions,
294
- })
295
- await expect(plugin.setup(ctx)).resolves.not.toThrow()
296
- })
297
-
298
- it('tears down without errors', async () => {
299
- if (plugin.teardown) {
300
- await expect(plugin.teardown()).resolves.not.toThrow()
301
- }
302
- })
303
-
304
- it('installs without errors', async () => {
305
- if (plugin.install) {
306
- const ctx = createTestInstallContext({
307
- pluginName: '${pluginName}',
308
- terminalResponses: { password: [''], confirm: [true], select: ['apiKey'] },
309
- })
310
- await expect(plugin.install(ctx)).resolves.not.toThrow()
311
- }
312
- })
313
- })
314
- `
315
- );
316
- spinner2.stop("Plugin scaffolded!");
317
- p.note(
318
- [
319
- `cd ${dirName}`,
320
- "npm install",
321
- "npm run build",
322
- "npm test",
323
- "",
324
- "# Start development with hot-reload:",
325
- `openacp dev .`
326
- ].join("\n"),
327
- "Next steps"
328
- );
329
- p.outro(`Plugin ${pluginName} created in ./${dirName}`);
330
- }
331
- export {
332
- cmdPluginCreate
333
- };
334
- //# sourceMappingURL=plugin-create-AQ3B22BZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/commands/plugin-create.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { getCurrentVersion } from '../version.js'\n\nexport async function cmdPluginCreate(): Promise<void> {\n p.intro('Create a new OpenACP plugin')\n\n const result = await p.group(\n {\n name: () =>\n p.text({\n message: 'Plugin name (e.g., @myorg/adapter-matrix)',\n placeholder: '@myorg/my-plugin',\n validate: (value: string | undefined) => {\n if (!value || !value.trim()) return 'Plugin name is required'\n if (!/^(@[a-z0-9-]+\\/)?[a-z0-9-]+$/.test(value.trim())) {\n return 'Must be a valid npm package name (lowercase, hyphens, optional @scope/)'\n }\n return undefined\n },\n }),\n description: () =>\n p.text({\n message: 'Description',\n placeholder: 'A short description of your plugin',\n }),\n author: () =>\n p.text({\n message: 'Author',\n placeholder: 'Your Name <email@example.com>',\n }),\n license: () =>\n p.select({\n message: 'License',\n options: [\n { value: 'MIT', label: 'MIT' },\n { value: 'Apache-2.0', label: 'Apache 2.0' },\n { value: 'ISC', label: 'ISC' },\n { value: 'UNLICENSED', label: 'Unlicensed (private)' },\n ],\n }),\n },\n {\n onCancel: () => {\n p.cancel('Plugin creation cancelled.')\n process.exit(0)\n },\n },\n )\n\n const pluginName = result.name.trim()\n const dirName = pluginName.replace(/^@[^/]+\\//, '') // strip scope for directory name\n const targetDir = path.resolve(process.cwd(), dirName)\n\n if (fs.existsSync(targetDir)) {\n p.cancel(`Directory \"${dirName}\" already exists.`)\n process.exit(1)\n }\n\n const spinner = p.spinner()\n spinner.start('Scaffolding plugin...')\n\n // Create directory structure\n fs.mkdirSync(path.join(targetDir, 'src', '__tests__'), { recursive: true })\n\n // Detect CLI version for dependency pinning\n const cliVersion = getCurrentVersion()\n\n // package.json\n const packageJson = {\n name: pluginName,\n version: '0.1.0',\n description: result.description || '',\n type: 'module',\n main: 'dist/index.js',\n types: 'dist/index.d.ts',\n scripts: {\n build: 'tsc',\n dev: 'tsc --watch',\n test: 'vitest',\n prepublishOnly: 'npm run build',\n },\n author: result.author || '',\n license: result.license as string,\n keywords: ['openacp', 'openacp-plugin'],\n peerDependencies: {\n '@openacp/cli': `>=${cliVersion}`,\n },\n devDependencies: {\n '@openacp/plugin-sdk': cliVersion,\n typescript: '^5.4.0',\n vitest: '^3.0.0',\n },\n }\n fs.writeFileSync(\n path.join(targetDir, 'package.json'),\n JSON.stringify(packageJson, null, 2) + '\\n',\n )\n\n // tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n declaration: true,\n outDir: 'dist',\n rootDir: 'src',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n },\n include: ['src'],\n exclude: ['node_modules', 'dist', 'src/**/__tests__'],\n }\n fs.writeFileSync(\n path.join(targetDir, 'tsconfig.json'),\n JSON.stringify(tsconfig, null, 2) + '\\n',\n )\n\n // .gitignore\n fs.writeFileSync(\n path.join(targetDir, '.gitignore'),\n ['node_modules/', 'dist/', '*.tsbuildinfo', '.DS_Store', ''].join('\\n'),\n )\n\n // .npmignore\n fs.writeFileSync(\n path.join(targetDir, '.npmignore'),\n ['src/', 'tsconfig.json', '.editorconfig', '.gitignore', '*.test.ts', '__tests__/', ''].join('\\n'),\n )\n\n // .editorconfig\n fs.writeFileSync(\n path.join(targetDir, '.editorconfig'),\n [\n 'root = true',\n '',\n '[*]',\n 'indent_style = space',\n 'indent_size = 2',\n 'end_of_line = lf',\n 'charset = utf-8',\n 'trim_trailing_whitespace = true',\n 'insert_final_newline = true',\n '',\n ].join('\\n'),\n )\n\n // README.md\n fs.writeFileSync(\n path.join(targetDir, 'README.md'),\n [\n `# ${pluginName}`,\n '',\n result.description || 'An OpenACP plugin.',\n '',\n '## Installation',\n '',\n '```bash',\n `openacp plugin add ${pluginName}`,\n '```',\n '',\n '## Development',\n '',\n '```bash',\n 'npm install',\n 'npm run build',\n 'npm test',\n '',\n '# Live development with hot-reload:',\n `openacp dev .`,\n '```',\n '',\n '## License',\n '',\n result.license as string,\n '',\n ].join('\\n'),\n )\n\n // src/index.ts — full plugin template with all hooks\n const pluginVarName = dirName.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n fs.writeFileSync(\n path.join(targetDir, 'src', 'index.ts'),\n `import type { OpenACPPlugin, PluginContext, InstallContext, MigrateContext } from '@openacp/plugin-sdk'\n\nconst plugin: OpenACPPlugin = {\n name: '${pluginName}',\n version: '0.1.0',\n description: '${(result.description || '').replace(/'/g, \"\\\\'\")}',\n\n // Declare which permissions your plugin needs.\n // Available: events:read, events:emit, services:register, services:use,\n // middleware:register, commands:register, storage:read, storage:write, kernel:access\n permissions: ['events:read', 'services:register'],\n\n // Dependencies on other plugins (loaded before this one).\n // pluginDependencies: { '@openacp/security': '>=1.0.0' },\n\n // Optional dependencies (used if available, gracefully degrade if not).\n // optionalPluginDependencies: { '@openacp/usage': '>=1.0.0' },\n\n /**\n * Called during server startup in dependency order.\n * Register services, middleware, commands, and event listeners here.\n */\n async setup(ctx: PluginContext): Promise<void> {\n ctx.log.info('Plugin setup started')\n\n // Example: register a service\n // ctx.registerService('my-service', myServiceImpl)\n\n // Example: listen to events\n // ctx.on('session:created', (event) => { ... })\n\n // Example: register a slash command\n // ctx.registerCommand({\n // name: 'mycommand',\n // description: 'Does something useful',\n // category: 'plugin',\n // async handler(args) {\n // return { type: 'text', text: 'Hello from ${pluginName}!' }\n // },\n // })\n\n ctx.log.info('Plugin setup complete')\n },\n\n /**\n * Called during server shutdown in reverse dependency order.\n * Clean up resources, close connections, stop timers here.\n * Has a 10-second timeout.\n */\n async teardown(): Promise<void> {\n // Clean up resources here\n },\n\n /**\n * Called when user runs \\`openacp plugin add ${pluginName}\\`.\n * Use ctx.terminal for interactive prompts to gather configuration.\n */\n async install(ctx: InstallContext): Promise<void> {\n ctx.terminal.log.info('Installing ${pluginName}...')\n\n // Example: prompt for configuration\n // const apiKey = await ctx.terminal.text({\n // message: 'Enter your API key',\n // validate: (v) => v.length === 0 ? 'Required' : undefined,\n // })\n // await ctx.settings.set('apiKey', apiKey)\n\n ctx.terminal.log.success('Installation complete!')\n },\n\n /**\n * Called when user runs \\`openacp plugin configure ${pluginName}\\`.\n * Re-run configuration prompts to update settings.\n */\n async configure(ctx: InstallContext): Promise<void> {\n ctx.terminal.log.info('Configuring ${pluginName}...')\n\n // Re-run configuration prompts, pre-filling with current values\n // const current = await ctx.settings.getAll()\n // ...\n\n ctx.terminal.log.success('Configuration updated!')\n },\n\n /**\n * Called during boot when the plugin version has changed.\n * Migrate settings from the old format to the new format.\n */\n async migrate(ctx: MigrateContext, oldSettings: unknown, oldVersion: string): Promise<unknown> {\n ctx.log.info(\\`Migrating from v\\${oldVersion}\\`)\n // Return the migrated settings object\n return oldSettings\n },\n\n /**\n * Called when user runs \\`openacp plugin remove ${pluginName}\\`.\n * Clean up any external resources. If opts.purge is true, delete all data.\n */\n async uninstall(ctx: InstallContext, opts: { purge: boolean }): Promise<void> {\n ctx.terminal.log.info('Uninstalling ${pluginName}...')\n if (opts.purge) {\n await ctx.settings.clear()\n }\n ctx.terminal.log.success('Uninstalled!')\n },\n}\n\nexport default plugin\n`,\n )\n\n // src/__tests__/index.test.ts\n fs.writeFileSync(\n path.join(targetDir, 'src', '__tests__', 'index.test.ts'),\n `import { describe, it, expect } from 'vitest'\nimport { createTestContext, createTestInstallContext } from '@openacp/plugin-sdk/testing'\nimport plugin from '../index.js'\n\ndescribe('${pluginName}', () => {\n it('has correct metadata', () => {\n expect(plugin.name).toBe('${pluginName}')\n expect(plugin.version).toBeDefined()\n expect(plugin.setup).toBeInstanceOf(Function)\n })\n\n it('sets up without errors', async () => {\n const ctx = createTestContext({\n pluginName: '${pluginName}',\n pluginConfig: { enabled: true },\n permissions: plugin.permissions,\n })\n await expect(plugin.setup(ctx)).resolves.not.toThrow()\n })\n\n it('tears down without errors', async () => {\n if (plugin.teardown) {\n await expect(plugin.teardown()).resolves.not.toThrow()\n }\n })\n\n it('installs without errors', async () => {\n if (plugin.install) {\n const ctx = createTestInstallContext({\n pluginName: '${pluginName}',\n terminalResponses: { password: [''], confirm: [true], select: ['apiKey'] },\n })\n await expect(plugin.install(ctx)).resolves.not.toThrow()\n }\n })\n})\n`,\n )\n\n spinner.stop('Plugin scaffolded!')\n\n p.note(\n [\n `cd ${dirName}`,\n 'npm install',\n 'npm run build',\n 'npm test',\n '',\n '# Start development with hot-reload:',\n `openacp dev .`,\n ].join('\\n'),\n 'Next steps',\n )\n\n p.outro(`Plugin ${pluginName} created in ./${dirName}`)\n}\n"],"mappings":"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","names":["spinner"]}
@@ -1,10 +0,0 @@
1
- import {
2
- usage_default
3
- } from "./chunk-2CX4IEEC.js";
4
- import "./chunk-WAAD23KY.js";
5
- import "./chunk-XMMAGAT4.js";
6
- import "./chunk-VUNV25KB.js";
7
- export {
8
- usage_default as default
9
- };
10
- //# sourceMappingURL=usage-WYNK6ZC5.js.map