@openacp/cli 2026.330.3 → 2026.331.2
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/README.md +19 -1
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +25134 -278
- package/dist/cli.js.map +1 -1
- package/dist/data/registry-snapshot.json +1 -1
- package/dist/index.d.ts +259 -30
- package/dist/index.js +17632 -404
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/adapter-AWSI4GML.js +0 -13
- package/dist/adapter-AWSI4GML.js.map +0 -1
- package/dist/agent-catalog-SZQQERV7.js +0 -10
- package/dist/agent-catalog-SZQQERV7.js.map +0 -1
- package/dist/agent-dependencies-ED2ZTUHG.js +0 -23
- package/dist/agent-dependencies-ED2ZTUHG.js.map +0 -1
- package/dist/agent-registry-YOGP656W.js +0 -8
- package/dist/agent-registry-YOGP656W.js.map +0 -1
- package/dist/agent-store-5UHZH2XI.js +0 -8
- package/dist/agent-store-5UHZH2XI.js.map +0 -1
- package/dist/api-client-XTLRRFPX.js +0 -13
- package/dist/api-client-XTLRRFPX.js.map +0 -1
- package/dist/api-server-5VNYFWJE.js +0 -7
- package/dist/api-server-5VNYFWJE.js.map +0 -1
- package/dist/api-server-JLBDKCU4.js +0 -10
- package/dist/api-server-JLBDKCU4.js.map +0 -1
- package/dist/autostart-CUPZMKKC.js +0 -22
- package/dist/autostart-CUPZMKKC.js.map +0 -1
- package/dist/chunk-237WYH6H.js +0 -235
- package/dist/chunk-237WYH6H.js.map +0 -1
- package/dist/chunk-2HEFALTZ.js +0 -44
- package/dist/chunk-2HEFALTZ.js.map +0 -1
- package/dist/chunk-2KT6TROD.js +0 -129
- package/dist/chunk-2KT6TROD.js.map +0 -1
- package/dist/chunk-2R5XM3ES.js +0 -154
- package/dist/chunk-2R5XM3ES.js.map +0 -1
- package/dist/chunk-3EWTPOF7.js +0 -51
- package/dist/chunk-3EWTPOF7.js.map +0 -1
- package/dist/chunk-3NAFXVQM.js +0 -67
- package/dist/chunk-3NAFXVQM.js.map +0 -1
- package/dist/chunk-4WXALZA3.js +0 -45
- package/dist/chunk-4WXALZA3.js.map +0 -1
- package/dist/chunk-566W6INH.js +0 -83
- package/dist/chunk-566W6INH.js.map +0 -1
- package/dist/chunk-5HKQCYOI.js +0 -145
- package/dist/chunk-5HKQCYOI.js.map +0 -1
- package/dist/chunk-5OCGO27U.js +0 -125
- package/dist/chunk-5OCGO27U.js.map +0 -1
- package/dist/chunk-5WGVYX3C.js +0 -55
- package/dist/chunk-5WGVYX3C.js.map +0 -1
- package/dist/chunk-7ZCQF6QM.js +0 -27
- package/dist/chunk-7ZCQF6QM.js.map +0 -1
- package/dist/chunk-AFKX424Q.js +0 -92
- package/dist/chunk-AFKX424Q.js.map +0 -1
- package/dist/chunk-APS6UEFU.js +0 -259
- package/dist/chunk-APS6UEFU.js.map +0 -1
- package/dist/chunk-BTJHGSLM.js +0 -1116
- package/dist/chunk-BTJHGSLM.js.map +0 -1
- package/dist/chunk-CDAUYTVP.js +0 -41
- package/dist/chunk-CDAUYTVP.js.map +0 -1
- package/dist/chunk-FCTC7KDT.js +0 -101
- package/dist/chunk-FCTC7KDT.js.map +0 -1
- package/dist/chunk-FNRSWA2K.js +0 -1
- package/dist/chunk-FNRSWA2K.js.map +0 -1
- package/dist/chunk-GEOXPGCO.js +0 -650
- package/dist/chunk-GEOXPGCO.js.map +0 -1
- package/dist/chunk-IZ5UEZF7.js +0 -138
- package/dist/chunk-IZ5UEZF7.js.map +0 -1
- package/dist/chunk-KDU3ZEWT.js +0 -97
- package/dist/chunk-KDU3ZEWT.js.map +0 -1
- package/dist/chunk-LGFWH3AE.js +0 -26
- package/dist/chunk-LGFWH3AE.js.map +0 -1
- package/dist/chunk-MITTQMGZ.js +0 -543
- package/dist/chunk-MITTQMGZ.js.map +0 -1
- package/dist/chunk-MLF4W5R6.js +0 -101
- package/dist/chunk-MLF4W5R6.js.map +0 -1
- package/dist/chunk-MPGEHTGE.js +0 -679
- package/dist/chunk-MPGEHTGE.js.map +0 -1
- package/dist/chunk-OYSAN7UX.js +0 -15
- package/dist/chunk-OYSAN7UX.js.map +0 -1
- package/dist/chunk-PA6MNBG4.js +0 -190
- package/dist/chunk-PA6MNBG4.js.map +0 -1
- package/dist/chunk-QWVHCTCA.js +0 -172
- package/dist/chunk-QWVHCTCA.js.map +0 -1
- package/dist/chunk-R6KZYF7D.js +0 -231
- package/dist/chunk-R6KZYF7D.js.map +0 -1
- package/dist/chunk-S64CB6J3.js +0 -98
- package/dist/chunk-S64CB6J3.js.map +0 -1
- package/dist/chunk-TMVTSWVH.js +0 -228
- package/dist/chunk-TMVTSWVH.js.map +0 -1
- package/dist/chunk-UCIZM5SW.js +0 -3917
- package/dist/chunk-UCIZM5SW.js.map +0 -1
- package/dist/chunk-UWH7KIAA.js +0 -701
- package/dist/chunk-UWH7KIAA.js.map +0 -1
- package/dist/chunk-V2YZWYXT.js +0 -484
- package/dist/chunk-V2YZWYXT.js.map +0 -1
- package/dist/chunk-W26AUH5B.js +0 -61
- package/dist/chunk-W26AUH5B.js.map +0 -1
- package/dist/chunk-W4LK6WJP.js +0 -446
- package/dist/chunk-W4LK6WJP.js.map +0 -1
- package/dist/chunk-WQCJTU2C.js +0 -84
- package/dist/chunk-WQCJTU2C.js.map +0 -1
- package/dist/chunk-XBZIHNKV.js +0 -6410
- package/dist/chunk-XBZIHNKV.js.map +0 -1
- package/dist/chunk-ZSLHHQPQ.js +0 -282
- package/dist/chunk-ZSLHHQPQ.js.map +0 -1
- package/dist/config-KN6NKKPF.js +0 -20
- package/dist/config-KN6NKKPF.js.map +0 -1
- package/dist/config-editor-76RVZS4B.js +0 -10
- package/dist/config-editor-76RVZS4B.js.map +0 -1
- package/dist/config-registry-ZXAIJNYB.js +0 -17
- package/dist/config-registry-ZXAIJNYB.js.map +0 -1
- package/dist/context-NXXW62NJ.js +0 -9
- package/dist/context-NXXW62NJ.js.map +0 -1
- package/dist/core-plugins-BPZY7SEB.js +0 -22
- package/dist/core-plugins-BPZY7SEB.js.map +0 -1
- package/dist/daemon-XFEMMJSZ.js +0 -29
- package/dist/daemon-XFEMMJSZ.js.map +0 -1
- package/dist/dev-loader-7P3HZCIA.js +0 -37
- package/dist/dev-loader-7P3HZCIA.js.map +0 -1
- package/dist/doctor-AV6AUO22.js +0 -9
- package/dist/doctor-AV6AUO22.js.map +0 -1
- package/dist/file-service-HHB3JQIO.js +0 -8
- package/dist/file-service-HHB3JQIO.js.map +0 -1
- package/dist/install-cloudflared-JRJ4BSOM.js +0 -32
- package/dist/install-cloudflared-JRJ4BSOM.js.map +0 -1
- package/dist/install-context-EHYV5WRY.js +0 -77
- package/dist/install-context-EHYV5WRY.js.map +0 -1
- package/dist/install-jq-ISTGT263.js +0 -31
- package/dist/install-jq-ISTGT263.js.map +0 -1
- package/dist/integrate-JIEZYDOR.js +0 -371
- package/dist/integrate-JIEZYDOR.js.map +0 -1
- package/dist/log-YZ243M5G.js +0 -25
- package/dist/log-YZ243M5G.js.map +0 -1
- package/dist/main-VEJCG5PY.js +0 -654
- package/dist/main-VEJCG5PY.js.map +0 -1
- package/dist/menu-ALFN37IR.js +0 -15
- package/dist/menu-ALFN37IR.js.map +0 -1
- package/dist/notifications-MO23S7S3.js +0 -8
- package/dist/notifications-MO23S7S3.js.map +0 -1
- package/dist/plugin-create-EHL76ZZG.js +0 -966
- package/dist/plugin-create-EHL76ZZG.js.map +0 -1
- package/dist/plugin-installer-VSTYZSXC.js +0 -9
- package/dist/plugin-installer-VSTYZSXC.js.map +0 -1
- package/dist/plugin-registry-6J3YSFHF.js +0 -7
- package/dist/plugin-registry-6J3YSFHF.js.map +0 -1
- package/dist/plugin-search-MGKAL5JM.js +0 -39
- package/dist/plugin-search-MGKAL5JM.js.map +0 -1
- package/dist/post-upgrade-Y26S2ZQ7.js +0 -79
- package/dist/post-upgrade-Y26S2ZQ7.js.map +0 -1
- package/dist/read-text-file-DJBTITIB.js +0 -7
- package/dist/read-text-file-DJBTITIB.js.map +0 -1
- package/dist/registry-client-GTBWLXYU.js +0 -7
- package/dist/registry-client-GTBWLXYU.js.map +0 -1
- package/dist/security-2BA265LN.js +0 -8
- package/dist/security-2BA265LN.js.map +0 -1
- package/dist/settings-manager-B4UN2LAC.js +0 -7
- package/dist/settings-manager-B4UN2LAC.js.map +0 -1
- package/dist/setup-DISPNDEK.js +0 -802
- package/dist/setup-DISPNDEK.js.map +0 -1
- package/dist/speech-SG62JYIF.js +0 -9
- package/dist/speech-SG62JYIF.js.map +0 -1
- package/dist/suggest-RST5VOHB.js +0 -36
- package/dist/suggest-RST5VOHB.js.map +0 -1
- package/dist/telegram-L3YM6SQJ.js +0 -7
- package/dist/telegram-L3YM6SQJ.js.map +0 -1
- package/dist/tunnel-HWJ27WDH.js +0 -7
- package/dist/tunnel-HWJ27WDH.js.map +0 -1
- package/dist/tunnel-service-ZMO4THKE.js +0 -1261
- package/dist/tunnel-service-ZMO4THKE.js.map +0 -1
- package/dist/validators-GITLOFXC.js +0 -11
- package/dist/validators-GITLOFXC.js.map +0 -1
- package/dist/version-AXXV6IV2.js +0 -15
- package/dist/version-AXXV6IV2.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/plugin-create.ts","../../src/cli/plugin-template/package-json.ts","../../src/cli/plugin-template/tsconfig.ts","../../src/cli/plugin-template/dotfiles.ts","../../src/cli/plugin-template/readme.ts","../../src/cli/plugin-template/plugin-source.ts","../../src/cli/plugin-template/plugin-test.ts","../../src/cli/plugin-template/claude-md.ts","../../src/cli/plugin-template/plugin-guide.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { getCurrentVersion } from '../version.js'\nimport {\n type TemplateParams,\n generatePackageJson,\n generateTsconfig,\n generateGitignore,\n generateNpmignore,\n generateEditorconfig,\n generateReadme,\n generatePluginSource,\n generatePluginTest,\n generateClaudeMd,\n generatePluginGuide,\n} from '../plugin-template/index.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 // Collect template params\n const params: TemplateParams = {\n pluginName,\n description: (result.description as string) || '',\n author: (result.author as string) || '',\n license: result.license as string,\n cliVersion: getCurrentVersion(),\n }\n\n // Generate and write all files\n const files: Array<{ relativePath: string; content: string }> = [\n { relativePath: 'package.json', content: generatePackageJson(params) },\n { relativePath: 'tsconfig.json', content: generateTsconfig() },\n { relativePath: '.gitignore', content: generateGitignore() },\n { relativePath: '.npmignore', content: generateNpmignore() },\n { relativePath: '.editorconfig', content: generateEditorconfig() },\n { relativePath: 'README.md', content: generateReadme(params) },\n { relativePath: 'CLAUDE.md', content: generateClaudeMd(params) },\n { relativePath: 'PLUGIN_GUIDE.md', content: generatePluginGuide(params) },\n { relativePath: path.join('src', 'index.ts'), content: generatePluginSource(params) },\n { relativePath: path.join('src', '__tests__', 'index.test.ts'), content: generatePluginTest(params) },\n ]\n\n for (const file of files) {\n fs.writeFileSync(path.join(targetDir, file.relativePath), file.content)\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","export interface TemplateParams {\n pluginName: string\n description: string\n author: string\n license: string\n cliVersion: string\n}\n\nexport function generatePackageJson(params: TemplateParams): string {\n const packageJson = {\n name: params.pluginName,\n version: '0.1.0',\n description: params.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: params.author || '',\n license: params.license,\n keywords: ['openacp', 'openacp-plugin'],\n engines: {\n openacp: `>=${params.cliVersion}`,\n },\n peerDependencies: {\n '@openacp/cli': `>=${params.cliVersion}`,\n },\n devDependencies: {\n '@openacp/plugin-sdk': params.cliVersion,\n typescript: '^5.4.0',\n vitest: '^3.0.0',\n },\n }\n return JSON.stringify(packageJson, null, 2) + '\\n'\n}\n","export function generateTsconfig(): string {\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 return JSON.stringify(tsconfig, null, 2) + '\\n'\n}\n","export function generateGitignore(): string {\n return ['node_modules/', 'dist/', '*.tsbuildinfo', '.DS_Store', ''].join('\\n')\n}\n\nexport function generateNpmignore(): string {\n return ['src/', 'tsconfig.json', '.editorconfig', '.gitignore', '*.test.ts', '__tests__/', ''].join('\\n')\n}\n\nexport function generateEditorconfig(): string {\n return [\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","import type { TemplateParams } from './package-json.js'\n\nexport function generateReadme(params: TemplateParams): string {\n return [\n `# ${params.pluginName}`,\n '',\n params.description || 'An OpenACP plugin.',\n '',\n '## Installation',\n '',\n '```bash',\n `openacp plugin add ${params.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 params.license,\n '',\n ].join('\\n')\n}\n","import type { TemplateParams } from './package-json.js'\n\nexport function generatePluginSource(params: TemplateParams): string {\n const dirName = params.pluginName.replace(/^@[^/]+\\//, '')\n const escapedDescription = (params.description || '').replace(/'/g, \"\\\\'\")\n\n return `import type { OpenACPPlugin, PluginContext, InstallContext, MigrateContext } from '@openacp/plugin-sdk'\n\nconst plugin: OpenACPPlugin = {\n name: '${params.pluginName}',\n version: '0.1.0',\n description: '${escapedDescription}',\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 ${params.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 ${params.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 ${params.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 ${params.pluginName}\\`.\n * Re-run configuration prompts to update settings.\n */\n async configure(ctx: InstallContext): Promise<void> {\n ctx.terminal.log.info('Configuring ${params.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 ${params.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 ${params.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","import type { TemplateParams } from './package-json.js'\n\nexport function generatePluginTest(params: TemplateParams): string {\n return `import { describe, it, expect } from 'vitest'\nimport { createTestContext, createTestInstallContext } from '@openacp/plugin-sdk/testing'\nimport plugin from '../index.js'\n\ndescribe('${params.pluginName}', () => {\n it('has correct metadata', () => {\n expect(plugin.name).toBe('${params.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: '${params.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: '${params.pluginName}',\n terminalResponses: { password: [''], confirm: [true], select: ['apiKey'] },\n })\n await expect(plugin.install(ctx)).resolves.not.toThrow()\n }\n })\n})\n`\n}\n","import type { TemplateParams } from './package-json.js'\n\nexport function generateClaudeMd(params: TemplateParams): string {\n return `# CLAUDE.md\n\nThis file provides context for AI coding agents (Claude, Cursor, etc.) working on this plugin.\n\n## What is OpenACP?\n\nOpenACP is an open-source platform that bridges AI coding agents (Claude Code, Codex, etc.) to messaging platforms (Telegram, Discord, Slack) and custom UIs via the Agent Client Protocol (ACP). It features a microkernel plugin architecture where all features — adapters, services, commands — are plugins.\n\n- **Website & Docs**: https://openacp.gitbook.io/docs\n- **GitHub**: https://github.com/Open-ACP/OpenACP\n- **Plugin Registry**: https://github.com/Open-ACP/plugin-registry\n\nKey documentation pages:\n- [Getting Started](https://openacp.gitbook.io/docs/getting-started) — What is OpenACP, quickstart\n- [Plugin Development](https://openacp.gitbook.io/docs/extending/building-plugins) — How to build plugins\n- [Architecture](https://openacp.gitbook.io/docs/extending/architecture) — System design, plugin lifecycle\n- [Dev Mode](https://openacp.gitbook.io/docs/extending/dev-mode) — Hot-reload development workflow\n- [CLI Commands](https://openacp.gitbook.io/docs/api-reference/cli-commands) — Full CLI reference\n- [Platform Setup](https://openacp.gitbook.io/docs/platform-setup) — Telegram, Discord, Slack guides\n- [Configuration](https://openacp.gitbook.io/docs/self-hosting/configuration) — Config and settings reference\n\n## Project Overview\n\nThis is an OpenACP plugin. Plugins extend OpenACP with new adapters, services, commands, and middleware.\n\n- **Package**: ${params.pluginName}\n- **SDK**: \\`@openacp/plugin-sdk\\` (types, base classes, testing utilities)\n- **Entry point**: \\`src/index.ts\\` (default export of \\`OpenACPPlugin\\` object)\n\n## Build & Run\n\n\\`\\`\\`bash\nnpm install # Install dependencies\nnpm run build # Compile TypeScript (tsc)\nnpm run dev # Watch mode (tsc --watch)\nnpm test # Run tests (vitest)\n\\`\\`\\`\n\n### Development with hot-reload\n\n\\`\\`\\`bash\nopenacp dev . # Compiles, watches, and reloads plugin on changes\n\\`\\`\\`\n\n## File Structure\n\n\\`\\`\\`\nsrc/\n index.ts — Plugin entry point (exports OpenACPPlugin)\n __tests__/\n index.test.ts — Tests using @openacp/plugin-sdk/testing\npackage.json — engines.openacp declares minimum CLI version\ntsconfig.json — ES2022, NodeNext, strict mode\nCLAUDE.md — This file (AI agent context)\nPLUGIN_GUIDE.md — Human-readable developer guide\n\\`\\`\\`\n\n## Architecture: How OpenACP Plugins Work\n\n### Plugin Lifecycle\n\n\\`\\`\\`\ninstall ──> [reboot] ──> migrate? ──> setup ──> [running] ──> teardown ──> uninstall\n\\`\\`\\`\n\n| Hook | Trigger | Interactive? | Has Services? |\n|------|---------|-------------|---------------|\n| \\`install(ctx)\\` | \\`openacp plugin add <name>\\` | Yes | No |\n| \\`migrate(ctx, oldSettings, oldVersion)\\` | Boot — stored version differs from plugin version | No | No |\n| \\`configure(ctx)\\` | \\`openacp plugin configure <name>\\` | Yes | No |\n| \\`setup(ctx)\\` | Every boot, after migrate | No | Yes |\n| \\`teardown()\\` | Shutdown (10s timeout) | No | Yes |\n| \\`uninstall(ctx, opts)\\` | \\`openacp plugin remove <name>\\` | Yes | No |\n\n### OpenACPPlugin Interface\n\n\\`\\`\\`typescript\ninterface OpenACPPlugin {\n name: string // unique identifier, e.g. '@myorg/my-plugin'\n version: string // semver\n description?: string\n permissions?: PluginPermission[]\n pluginDependencies?: Record<string, string> // name -> semver range\n optionalPluginDependencies?: Record<string, string> // used if available\n overrides?: string // replace a built-in plugin entirely\n settingsSchema?: ZodSchema // Zod validation for settings\n essential?: boolean // true = needs setup before system can run\n\n setup(ctx: PluginContext): Promise<void>\n teardown?(): Promise<void>\n install?(ctx: InstallContext): Promise<void>\n configure?(ctx: InstallContext): Promise<void>\n migrate?(ctx: MigrateContext, oldSettings: unknown, oldVersion: string): Promise<unknown>\n uninstall?(ctx: InstallContext, opts: { purge: boolean }): Promise<void>\n}\n\\`\\`\\`\n\n### PluginContext API (available in setup)\n\n\\`\\`\\`typescript\ninterface PluginContext {\n pluginName: string\n pluginConfig: Record<string, unknown> // from settings.json\n\n // Events (requires 'events:read' / 'events:emit')\n on(event: string, handler: (...args: unknown[]) => void): void\n off(event: string, handler: (...args: unknown[]) => void): void\n emit(event: string, payload: unknown): void\n\n // Services (requires 'services:register' / 'services:use')\n registerService<T>(name: string, implementation: T): void\n getService<T>(name: string): T | undefined\n\n // Middleware (requires 'middleware:register')\n registerMiddleware<H extends MiddlewareHook>(hook: H, opts: MiddlewareOptions<MiddlewarePayloadMap[H]>): void\n\n // Commands (requires 'commands:register')\n registerCommand(def: CommandDef): void\n\n // Storage (requires 'storage:read' / 'storage:write')\n storage: PluginStorage // get, set, delete, list, getDataDir\n\n // Messaging (requires 'services:use')\n sendMessage(sessionId: string, content: OutgoingMessage): Promise<void>\n\n // Kernel access (requires 'kernel:access')\n sessions: SessionManager\n config: ConfigManager\n eventBus: EventBus\n\n // Always available\n log: Logger // trace, debug, info, warn, error, fatal, child\n}\n\\`\\`\\`\n\n### CommandDef and CommandResponse\n\n\\`\\`\\`typescript\ninterface CommandDef {\n name: string // command name without slash\n description: string // shown in /help\n usage?: string // e.g. '<city>' or 'on|off'\n category: 'system' | 'plugin'\n handler(args: CommandArgs): Promise<CommandResponse | void>\n}\n\ninterface CommandArgs {\n raw: string // text after command name\n sessionId: string | null\n channelId: string // 'telegram', 'discord', 'slack'\n userId: string\n reply(content: string | CommandResponse): Promise<void>\n}\n\ntype CommandResponse =\n | { type: 'text'; text: string }\n | { type: 'menu'; title: string; options: MenuOption[] }\n | { type: 'list'; title: string; items: ListItem[] }\n | { type: 'confirm'; question: string; onYes: string; onNo: string }\n | { type: 'error'; message: string }\n | { type: 'silent' }\n\\`\\`\\`\n\n### Settings System\n\n- \\`settingsSchema\\`: Zod schema for validation\n- \\`SettingsAPI\\` (in InstallContext): get, set, getAll, setAll, delete, clear, has\n- Settings stored at \\`~/.openacp/plugins/@scope/name/settings.json\\`\n- \\`PluginStorage\\` (in PluginContext): key-value store at \\`~/.openacp/plugins/data/@scope/name/kv.json\\`\n- \\`storage.getDataDir()\\`: returns path for large files, databases, caches\n\n### InstallContext (for install/configure/uninstall)\n\n\\`\\`\\`typescript\ninterface InstallContext {\n pluginName: string\n terminal: TerminalIO // text, select, confirm, password, multiselect, log, spinner, note\n settings: SettingsAPI\n legacyConfig?: Record<string, unknown>\n dataDir: string\n log: Logger\n}\n\\`\\`\\`\n\n### Service Interfaces (available via ctx.getService)\n\n| Service name | Interface | Description |\n|---|---|---|\n| \\`security\\` | \\`SecurityService\\` | Access control, session limits, user roles |\n| \\`file-service\\` | \\`FileServiceInterface\\` | File saving, resolving, format conversion |\n| \\`notifications\\` | \\`NotificationService\\` | Send notifications to users |\n| \\`usage\\` | \\`UsageService\\` | Token/cost tracking and budget checking |\n| \\`speech\\` | \\`SpeechServiceInterface\\` | Text-to-speech and speech-to-text |\n| \\`tunnel\\` | \\`TunnelServiceInterface\\` | Port tunneling and public URL management |\n| \\`context\\` | \\`ContextService\\` | Context building for agent sessions |\n\n## Plugin Permissions\n\nDeclare in \\`permissions\\` array. Only request what you need.\n\n| Permission | Allows |\n|---|---|\n| \\`events:read\\` | \\`ctx.on()\\` — subscribe to events |\n| \\`events:emit\\` | \\`ctx.emit()\\` — emit custom events (must prefix with plugin name) |\n| \\`services:register\\` | \\`ctx.registerService()\\` — provide services to other plugins |\n| \\`services:use\\` | \\`ctx.getService()\\`, \\`ctx.sendMessage()\\` — consume services |\n| \\`middleware:register\\` | \\`ctx.registerMiddleware()\\` — intercept and modify flows |\n| \\`commands:register\\` | \\`ctx.registerCommand()\\` — add chat commands |\n| \\`storage:read\\` | \\`ctx.storage.get()\\`, \\`ctx.storage.list()\\` |\n| \\`storage:write\\` | \\`ctx.storage.set()\\`, \\`ctx.storage.delete()\\` |\n| \\`kernel:access\\` | \\`ctx.sessions\\`, \\`ctx.config\\`, \\`ctx.eventBus\\`, \\`ctx.core\\` |\n\nCalling a method without the required permission throws \\`PluginPermissionError\\`.\n\n## Middleware Hooks (18 total)\n\nRegister with \\`ctx.registerMiddleware(hook, { priority?, handler })\\`. Return \\`null\\` to block the flow, call \\`next()\\` to continue.\n\n### Message flow\n- \\`message:incoming\\` — incoming user message (channelId, threadId, userId, text, attachments)\n- \\`message:outgoing\\` — outgoing message to user (sessionId, message)\n\n### Agent flow\n- \\`agent:beforePrompt\\` — before prompt is sent to agent (sessionId, text, attachments)\n- \\`agent:beforeEvent\\` — before agent event is processed (sessionId, event)\n- \\`agent:afterEvent\\` — after agent event, before delivery (sessionId, event, outgoingMessage)\n\n### Turn lifecycle\n- \\`turn:start\\` — agent turn begins (sessionId, promptText, promptNumber)\n- \\`turn:end\\` — agent turn ends (sessionId, stopReason, durationMs)\n\n### File system\n- \\`fs:beforeRead\\` — before file read (sessionId, path, line, limit)\n- \\`fs:beforeWrite\\` — before file write (sessionId, path, content)\n\n### Terminal\n- \\`terminal:beforeCreate\\` — before terminal process spawned (sessionId, command, args, env, cwd)\n- \\`terminal:afterExit\\` — after terminal process exits (sessionId, terminalId, command, exitCode, durationMs)\n\n### Permission\n- \\`permission:beforeRequest\\` — before permission prompt (sessionId, request, autoResolve)\n- \\`permission:afterResolve\\` — after permission resolved (sessionId, requestId, decision, userId, durationMs)\n\n### Session\n- \\`session:beforeCreate\\` — before session creation (agentName, workingDir, userId, channelId, threadId)\n- \\`session:afterDestroy\\` — after session destroyed (sessionId, reason, durationMs, promptCount)\n\n### Control\n- \\`mode:beforeChange\\` — before mode change (sessionId, fromMode, toMode)\n- \\`config:beforeChange\\` — before config change (sessionId, configId, oldValue, newValue)\n- \\`model:beforeChange\\` — before model change (sessionId, fromModel, toModel)\n- \\`agent:beforeCancel\\` — before agent cancellation (sessionId, reason)\n\n## Plugin Events (subscribe with ctx.on)\n\n### System\n- \\`kernel:booted\\`, \\`system:ready\\`, \\`system:shutdown\\`, \\`system:commands-ready\\`\n\n### Plugin lifecycle\n- \\`plugin:loaded\\`, \\`plugin:failed\\`, \\`plugin:disabled\\`, \\`plugin:unloaded\\`\n\n### Session\n- \\`session:created\\`, \\`session:ended\\`, \\`session:named\\`, \\`session:updated\\`\n\n### Agent\n- \\`agent:event\\`, \\`agent:prompt\\`\n\n### Permission\n- \\`permission:request\\`, \\`permission:resolved\\`\n\n## Testing\n\nUse \\`@openacp/plugin-sdk/testing\\`:\n\n\\`\\`\\`typescript\nimport { createTestContext, createTestInstallContext, mockServices } from '@openacp/plugin-sdk/testing'\n\\`\\`\\`\n\n### createTestContext(opts)\n\nCreates a test \\`PluginContext\\`. All state is in-memory.\n\n\\`\\`\\`typescript\nconst ctx = createTestContext({\n pluginName: '${params.pluginName}',\n pluginConfig: { enabled: true },\n permissions: plugin.permissions,\n services: { security: mockServices.security() },\n})\nawait plugin.setup(ctx)\nexpect(ctx.registeredCommands.has('mycommand')).toBe(true)\nconst response = await ctx.executeCommand('mycommand', { raw: 'test' })\n\\`\\`\\`\n\nInspection properties: \\`registeredServices\\`, \\`registeredCommands\\`, \\`registeredMiddleware\\`, \\`emittedEvents\\`, \\`sentMessages\\`, \\`executeCommand()\\`.\n\n### createTestInstallContext(opts)\n\nCreates a test \\`InstallContext\\`. Terminal prompts auto-answered from \\`terminalResponses\\`.\n\n\\`\\`\\`typescript\nconst ctx = createTestInstallContext({\n pluginName: '${params.pluginName}',\n terminalResponses: { password: ['sk-test-key'], select: ['en'] },\n})\nawait plugin.install!(ctx)\nexpect(ctx.settingsData.get('apiKey')).toBe('sk-test-key')\n\\`\\`\\`\n\n### mockServices\n\nFactory functions for mock service implementations:\n\n\\`\\`\\`typescript\nmockServices.security(overrides?) // checkAccess, checkSessionLimit, getUserRole\nmockServices.fileService(overrides?) // saveFile, resolveFile, readTextFileWithRange\nmockServices.notifications(overrides?) // notify, notifyAll\nmockServices.usage(overrides?) // trackUsage, checkBudget, getSummary\nmockServices.speech(overrides?) // textToSpeech, speechToText, register*\nmockServices.tunnel(overrides?) // getPublicUrl, start, stop, getStore, fileUrl, diffUrl\nmockServices.context(overrides?) // buildContext, registerProvider\n\\`\\`\\`\n\n## Conventions\n\n- **ESM-only**: \\`\"type\": \"module\"\\` in package.json\n- **Import extensions**: All imports must use \\`.js\\` extension (e.g., \\`import x from './util.js'\\`)\n- **TypeScript strict mode**: \\`strict: true\\` in tsconfig.json\n- **Target**: ES2022, module NodeNext\n- **Test framework**: Vitest\n- **Test files**: \\`src/**/__tests__/*.test.ts\\`\n\n## How to Add a Command\n\n\\`\\`\\`typescript\n// In setup():\nctx.registerCommand({\n name: 'mycommand',\n description: 'Does something useful',\n usage: '<arg>',\n category: 'plugin',\n async handler(args) {\n const input = args.raw.trim()\n if (!input) return { type: 'error', message: 'Usage: /mycommand <arg>' }\n return { type: 'text', text: \\\\\\`Result: \\\\\\${input}\\\\\\` }\n },\n})\n\\`\\`\\`\n\nRequires \\`commands:register\\` permission. Available as \\`/mycommand\\` (if no conflict) and \\`/pluginscope:mycommand\\` (always).\n\n## How to Add a Service\n\n\\`\\`\\`typescript\n// In setup():\nconst myService = new MyService()\nctx.registerService('my-service', myService)\n\\`\\`\\`\n\nRequires \\`services:register\\` permission. Other plugins consume with \\`ctx.getService<MyService>('my-service')\\`.\n\n## How to Add Middleware\n\n\\`\\`\\`typescript\n// In setup():\nctx.registerMiddleware('message:outgoing', {\n priority: 50, // lower = earlier execution\n handler: async (payload, next) => {\n payload.message.text = modifyText(payload.message.text)\n return next() // continue chain; return null to block\n },\n})\n\\`\\`\\`\n\nRequires \\`middleware:register\\` permission.\n\n## How Settings Work\n\n1. Define \\`settingsSchema\\` (Zod) on the plugin object\n2. In \\`install()\\`: use \\`ctx.terminal\\` for interactive prompts, save with \\`ctx.settings.set()\\`\n3. In \\`configure()\\`: re-run prompts with current values pre-filled\n4. In \\`setup()\\`: read settings from \\`ctx.pluginConfig\\`\n5. In \\`migrate()\\`: transform old settings to new format on version change\n\n## Version Compatibility\n\nThe \\`engines.openacp\\` field in package.json declares the minimum CLI version. OpenACP checks this on install and warns if incompatible.\n`\n}\n","import type { TemplateParams } from './package-json.js'\n\nexport function generatePluginGuide(params: TemplateParams): string {\n return `# Plugin Developer Guide\n\n## Overview\n\n**${params.pluginName}** is an OpenACP plugin.\n\n> TODO: Describe what this plugin does.\n\n## Project Structure\n\n\\`\\`\\`\nsrc/\n index.ts — Plugin entry point (exports OpenACPPlugin object)\n __tests__/\n index.test.ts — Tests using Vitest + @openacp/plugin-sdk/testing\npackage.json — npm package config with engines.openacp constraint\ntsconfig.json — TypeScript strict mode, ES2022, NodeNext\nCLAUDE.md — Full technical reference for AI coding agents\nPLUGIN_GUIDE.md — This file\n\\`\\`\\`\n\n## Development Workflow\n\n1. **Edit** \\`src/index.ts\\` — implement your plugin logic\n2. **Dev mode**: \\`openacp dev .\\` — compiles, watches, and hot-reloads your plugin\n3. **Test**: \\`npm test\\` — runs Vitest with SDK testing utilities\n4. **Build**: \\`npm run build\\` — compiles TypeScript to \\`dist/\\`\n\n\\`\\`\\`bash\nnpm install\nopenacp dev . # start developing with hot-reload\nnpm test # run tests\nnpm run build # compile for publishing\n\\`\\`\\`\n\n## Adding a Command\n\nRegister commands in your \\`setup()\\` function. Requires \\`commands:register\\` permission.\n\n\\`\\`\\`typescript\nasync setup(ctx: PluginContext) {\n ctx.registerCommand({\n name: 'greet',\n description: 'Send a greeting',\n usage: '[name]',\n category: 'plugin',\n async handler(args) {\n const name = args.raw.trim() || 'World'\n return { type: 'text', text: \\\\\\`Hello, \\\\\\${name}!\\\\\\` }\n },\n })\n}\n\\`\\`\\`\n\nThe command will be available as \\`/greet\\` in all messaging platforms.\n\n## Adding a Service\n\nProvide a service that other plugins can consume. Requires \\`services:register\\` permission.\n\n\\`\\`\\`typescript\nasync setup(ctx: PluginContext) {\n const myService = {\n doSomething(input: string): string {\n return input.toUpperCase()\n },\n }\n ctx.registerService('my-service', myService)\n}\n\\`\\`\\`\n\nOther plugins access it with \\`ctx.getService<MyServiceType>('my-service')\\`.\n\n## Adding Middleware\n\nIntercept and modify message flows. Requires \\`middleware:register\\` permission.\n\n\\`\\`\\`typescript\nasync setup(ctx: PluginContext) {\n ctx.registerMiddleware('message:outgoing', {\n priority: 50,\n handler: async (payload, next) => {\n // Modify the message before delivery\n payload.message.text += '\\\\n-- sent via ${params.pluginName}'\n return next() // continue the chain\n // return null to block the message entirely\n },\n })\n}\n\\`\\`\\`\n\n## Handling Settings\n\n### Install flow (first-time setup)\n\n\\`\\`\\`typescript\nasync install(ctx: InstallContext) {\n const apiKey = await ctx.terminal.password({\n message: 'Enter your API key:',\n validate: (v) => v.length > 0 ? undefined : 'Required',\n })\n await ctx.settings.set('apiKey', apiKey)\n ctx.terminal.log.success('Configured!')\n}\n\\`\\`\\`\n\n### Configure flow (reconfiguration)\n\n\\`\\`\\`typescript\nasync configure(ctx: InstallContext) {\n const current = await ctx.settings.getAll()\n const apiKey = await ctx.terminal.password({\n message: \\\\\\`API key (current: \\\\\\${current.apiKey ? '***' : 'not set'}):\\\\\\`,\n })\n if (apiKey) await ctx.settings.set('apiKey', apiKey)\n ctx.terminal.log.success('Updated!')\n}\n\\`\\`\\`\n\n### Reading settings at runtime\n\n\\`\\`\\`typescript\nasync setup(ctx: PluginContext) {\n const apiKey = ctx.pluginConfig.apiKey as string\n if (!apiKey) {\n ctx.log.warn('Not configured — run: openacp plugin configure ${params.pluginName}')\n return\n }\n // Use apiKey...\n}\n\\`\\`\\`\n\n## Testing\n\nTests use Vitest and \\`@openacp/plugin-sdk/testing\\`.\n\n\\`\\`\\`typescript\nimport { describe, it, expect } from 'vitest'\nimport { createTestContext, createTestInstallContext, mockServices } from '@openacp/plugin-sdk/testing'\nimport plugin from '../index.js'\n\ndescribe('${params.pluginName}', () => {\n it('registers commands on setup', async () => {\n const ctx = createTestContext({ pluginName: '${params.pluginName}' })\n await plugin.setup(ctx)\n expect(ctx.registeredCommands.has('greet')).toBe(true)\n })\n\n it('command returns expected response', async () => {\n const ctx = createTestContext({ pluginName: '${params.pluginName}' })\n await plugin.setup(ctx)\n const res = await ctx.executeCommand('greet', { raw: 'Alice' })\n expect(res).toEqual({ type: 'text', text: 'Hello, Alice!' })\n })\n\n it('install saves settings', async () => {\n const ctx = createTestInstallContext({\n pluginName: '${params.pluginName}',\n terminalResponses: { password: ['sk-test-key'] },\n })\n await plugin.install!(ctx)\n expect(ctx.settingsData.get('apiKey')).toBe('sk-test-key')\n })\n})\n\\`\\`\\`\n\n### Available mock services\n\n\\`\\`\\`typescript\nconst ctx = createTestContext({\n pluginName: '${params.pluginName}',\n services: {\n security: mockServices.security(),\n usage: mockServices.usage({ async checkBudget() { return { ok: false, percent: 100 } } }),\n },\n})\n\\`\\`\\`\n\n## Publishing\n\n1. Update \\`version\\` in both \\`package.json\\` and \\`src/index.ts\\`\n2. Build and test:\n \\`\\`\\`bash\n npm run build\n npm test\n \\`\\`\\`\n3. Publish:\n \\`\\`\\`bash\n npm publish --access public\n \\`\\`\\`\n4. Users install with:\n \\`\\`\\`bash\n openacp plugin install ${params.pluginName}\n \\`\\`\\`\n5. Submit to the [OpenACP Plugin Registry](https://github.com/Open-ACP/plugin-registry) for discoverability.\n\n## Useful Links\n\n- [Architecture: Plugin System](https://docs.openacp.dev/architecture/plugin-system)\n- [Architecture: Writing Plugins](https://docs.openacp.dev/architecture/writing-plugins)\n- [Architecture: Command System](https://docs.openacp.dev/architecture/command-system)\n- [Plugin SDK Reference](https://docs.openacp.dev/extending/plugin-sdk-reference)\n- [Getting Started: Your First Plugin](https://docs.openacp.dev/extending/getting-started-plugin)\n- [Dev Mode](https://docs.openacp.dev/extending/dev-mode)\n- [Contributing](https://github.com/Open-ACP/OpenACP/blob/main/CONTRIBUTING.md)\n`\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAmQjB,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAkBjB,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["spinner"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
RegistryClient
|
|
3
|
-
} from "./chunk-CDAUYTVP.js";
|
|
4
|
-
|
|
5
|
-
// src/cli/commands/plugin-search.ts
|
|
6
|
-
async function cmdPluginSearch(args) {
|
|
7
|
-
const query = args.join(" ").trim();
|
|
8
|
-
if (!query) {
|
|
9
|
-
console.error("Usage: openacp plugin search <query>");
|
|
10
|
-
process.exit(1);
|
|
11
|
-
}
|
|
12
|
-
const client = new RegistryClient();
|
|
13
|
-
try {
|
|
14
|
-
const results = await client.search(query);
|
|
15
|
-
if (results.length === 0) {
|
|
16
|
-
console.log(`No plugins found matching "${query}"`);
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
console.log(`
|
|
20
|
-
Found ${results.length} plugin${results.length > 1 ? "s" : ""} matching "${query}":
|
|
21
|
-
`);
|
|
22
|
-
for (const p of results) {
|
|
23
|
-
const verified = p.verified ? " \u2713" : "";
|
|
24
|
-
const featured = p.featured ? " \u2B50" : "";
|
|
25
|
-
console.log(` ${p.icon || "\u{1F4E6}"} ${p.displayName ?? p.name}${verified}${featured}`);
|
|
26
|
-
console.log(` ${p.description}`);
|
|
27
|
-
console.log(` ${p.category} | v${p.version} | npm: ${p.npm}`);
|
|
28
|
-
console.log(` Install: openacp plugin install ${p.name}`);
|
|
29
|
-
console.log();
|
|
30
|
-
}
|
|
31
|
-
} catch (err) {
|
|
32
|
-
console.error(`Failed to search registry: ${err}`);
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
export {
|
|
37
|
-
cmdPluginSearch
|
|
38
|
-
};
|
|
39
|
-
//# sourceMappingURL=plugin-search-MGKAL5JM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/plugin-search.ts"],"sourcesContent":["import { RegistryClient } from '../../core/plugin/registry-client.js'\n\nexport async function cmdPluginSearch(args: string[]): Promise<void> {\n const query = args.join(' ').trim()\n if (!query) {\n console.error('Usage: openacp plugin search <query>')\n process.exit(1)\n }\n\n const client = new RegistryClient()\n\n try {\n const results = await client.search(query)\n\n if (results.length === 0) {\n console.log(`No plugins found matching \"${query}\"`)\n return\n }\n\n console.log(`\\nFound ${results.length} plugin${results.length > 1 ? 's' : ''} matching \"${query}\":\\n`)\n for (const p of results) {\n const verified = p.verified ? ' ✓' : ''\n const featured = p.featured ? ' ⭐' : ''\n console.log(` ${p.icon || '📦'} ${p.displayName ?? p.name}${verified}${featured}`)\n console.log(` ${p.description}`)\n console.log(` ${p.category} | v${p.version} | npm: ${p.npm}`)\n console.log(` Install: openacp plugin install ${p.name}`)\n console.log()\n }\n } catch (err) {\n console.error(`Failed to search registry: ${err}`)\n process.exit(1)\n }\n}\n"],"mappings":";;;;;AAEA,eAAsB,gBAAgB,MAA+B;AACnE,QAAM,QAAQ,KAAK,KAAK,GAAG,EAAE,KAAK;AAClC,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,IAAI,eAAe;AAElC,MAAI;AACF,UAAM,UAAU,MAAM,OAAO,OAAO,KAAK;AAEzC,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI,8BAA8B,KAAK,GAAG;AAClD;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,QAAW,QAAQ,MAAM,UAAU,QAAQ,SAAS,IAAI,MAAM,EAAE,cAAc,KAAK;AAAA,CAAM;AACrG,eAAW,KAAK,SAAS;AACvB,YAAM,WAAW,EAAE,WAAW,YAAO;AACrC,YAAM,WAAW,EAAE,WAAW,YAAO;AACrC,cAAQ,IAAI,KAAK,EAAE,QAAQ,WAAI,IAAI,EAAE,eAAe,EAAE,IAAI,GAAG,QAAQ,GAAG,QAAQ,EAAE;AAClF,cAAQ,IAAI,QAAQ,EAAE,WAAW,EAAE;AACnC,cAAQ,IAAI,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,WAAW,EAAE,GAAG,EAAE;AAChE,cAAQ,IAAI,wCAAwC,EAAE,IAAI,EAAE;AAC5D,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,8BAA8B,GAAG,EAAE;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
commandExists
|
|
3
|
-
} from "./chunk-ZSLHHQPQ.js";
|
|
4
|
-
import {
|
|
5
|
-
createChildLogger
|
|
6
|
-
} from "./chunk-R6KZYF7D.js";
|
|
7
|
-
|
|
8
|
-
// src/cli/post-upgrade.ts
|
|
9
|
-
var log = createChildLogger({ module: "post-upgrade" });
|
|
10
|
-
async function runPostUpgradeChecks(config) {
|
|
11
|
-
if (config.tunnel.enabled) {
|
|
12
|
-
if (config.tunnel.provider === "cloudflare") {
|
|
13
|
-
try {
|
|
14
|
-
const { ensureCloudflared } = await import("./install-cloudflared-JRJ4BSOM.js");
|
|
15
|
-
await ensureCloudflared();
|
|
16
|
-
} catch (err) {
|
|
17
|
-
log.warn(
|
|
18
|
-
{ err: err.message },
|
|
19
|
-
"Could not install cloudflared. Tunnel may not work."
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
} else {
|
|
23
|
-
if (!commandExists(config.tunnel.provider)) {
|
|
24
|
-
log.warn(
|
|
25
|
-
`Tunnel provider "${config.tunnel.provider}" is not installed. Install it or switch to cloudflare (free, auto-installed).`
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
try {
|
|
31
|
-
const { getIntegration } = await import("./integrate-JIEZYDOR.js");
|
|
32
|
-
const integration = getIntegration("claude");
|
|
33
|
-
if (integration) {
|
|
34
|
-
const allInstalled = integration.items.every((item) => item.isInstalled());
|
|
35
|
-
if (!allInstalled) {
|
|
36
|
-
log.info(
|
|
37
|
-
'Claude CLI integration not installed. Run "openacp integrate claude" for session transfer + tunnel skill.'
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
const handoff = integration.items.find((i) => i.id === "handoff");
|
|
41
|
-
if (handoff?.isInstalled() && !commandExists("jq")) {
|
|
42
|
-
try {
|
|
43
|
-
const { ensureJq } = await import("./install-jq-ISTGT263.js");
|
|
44
|
-
await ensureJq();
|
|
45
|
-
} catch (err) {
|
|
46
|
-
log.warn(
|
|
47
|
-
{ err: err.message },
|
|
48
|
-
"Could not install jq. Handoff hooks may not work."
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
} catch {
|
|
54
|
-
}
|
|
55
|
-
if (!commandExists("unzip")) {
|
|
56
|
-
log.warn(
|
|
57
|
-
"unzip is not installed. Some agent installations (binary distribution) may fail. Install: brew install unzip (macOS) or apt install unzip (Linux)"
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
try {
|
|
61
|
-
const { AgentStore } = await import("./agent-store-5UHZH2XI.js");
|
|
62
|
-
const store = new AgentStore();
|
|
63
|
-
store.load();
|
|
64
|
-
const entries = store.getInstalled();
|
|
65
|
-
const hasUvxAgent = Object.values(entries).some(
|
|
66
|
-
(a) => a.distribution === "uvx"
|
|
67
|
-
);
|
|
68
|
-
if (hasUvxAgent && !commandExists("uvx")) {
|
|
69
|
-
log.warn(
|
|
70
|
-
"uvx is not installed but you have Python-based agents. Install: pip install uv"
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
} catch {
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
export {
|
|
77
|
-
runPostUpgradeChecks
|
|
78
|
-
};
|
|
79
|
-
//# sourceMappingURL=post-upgrade-Y26S2ZQ7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/post-upgrade.ts"],"sourcesContent":["import { createChildLogger } from \"../core/utils/log.js\";\nimport { commandExists } from \"../core/agents/agent-dependencies.js\";\nimport type { Config } from \"../core/config/config.js\";\n\nconst log = createChildLogger({ module: \"post-upgrade\" });\n\n/**\n * Post-upgrade dependency check — runs on every start.\n * Centralized source of truth for all binary dependency management.\n * Silent if everything is OK.\n */\nexport async function runPostUpgradeChecks(config: Config): Promise<void> {\n // 1. Tunnel provider binary\n if (config.tunnel.enabled) {\n if (config.tunnel.provider === \"cloudflare\") {\n try {\n const { ensureCloudflared } = await import(\n \"../plugins/tunnel/providers/install-cloudflared.js\"\n );\n await ensureCloudflared();\n } catch (err) {\n log.warn(\n { err: (err as Error).message },\n \"Could not install cloudflared. Tunnel may not work.\",\n );\n }\n } else {\n if (!commandExists(config.tunnel.provider)) {\n log.warn(\n `Tunnel provider \"${config.tunnel.provider}\" is not installed. Install it or switch to cloudflare (free, auto-installed).`,\n );\n }\n }\n }\n\n // 2. Claude CLI integration + jq\n try {\n const { getIntegration } = await import(\"./integrate.js\");\n const integration = getIntegration(\"claude\");\n if (integration) {\n const allInstalled = integration.items.every((item) => item.isInstalled());\n if (!allInstalled) {\n log.info(\n 'Claude CLI integration not installed. Run \"openacp integrate claude\" for session transfer + tunnel skill.',\n );\n }\n\n const handoff = integration.items.find((i) => i.id === \"handoff\");\n if (handoff?.isInstalled() && !commandExists(\"jq\")) {\n try {\n const { ensureJq } = await import(\"../core/utils/install-jq.js\");\n await ensureJq();\n } catch (err) {\n log.warn(\n { err: (err as Error).message },\n \"Could not install jq. Handoff hooks may not work.\",\n );\n }\n }\n }\n } catch {\n // integrate module not available — skip\n }\n\n // 3. unzip (needed for binary agent installs)\n if (!commandExists(\"unzip\")) {\n log.warn(\n \"unzip is not installed. Some agent installations (binary distribution) may fail. Install: brew install unzip (macOS) or apt install unzip (Linux)\",\n );\n }\n\n // 4. uvx (needed for Python-based agents)\n try {\n const { AgentStore } = await import(\"../core/agents/agent-store.js\");\n const store = new AgentStore();\n store.load();\n const entries = store.getInstalled();\n const hasUvxAgent = Object.values(entries).some(\n (a: { distribution?: string }) => a.distribution === \"uvx\",\n );\n if (hasUvxAgent && !commandExists(\"uvx\")) {\n log.warn(\n \"uvx is not installed but you have Python-based agents. Install: pip install uv\",\n );\n }\n } catch {\n // skip\n }\n}\n"],"mappings":";;;;;;;;AAIA,IAAM,MAAM,kBAAkB,EAAE,QAAQ,eAAe,CAAC;AAOxD,eAAsB,qBAAqB,QAA+B;AAExE,MAAI,OAAO,OAAO,SAAS;AACzB,QAAI,OAAO,OAAO,aAAa,cAAc;AAC3C,UAAI;AACF,cAAM,EAAE,kBAAkB,IAAI,MAAM,OAClC,mCACF;AACA,cAAM,kBAAkB;AAAA,MAC1B,SAAS,KAAK;AACZ,YAAI;AAAA,UACF,EAAE,KAAM,IAAc,QAAQ;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,CAAC,cAAc,OAAO,OAAO,QAAQ,GAAG;AAC1C,YAAI;AAAA,UACF,oBAAoB,OAAO,OAAO,QAAQ;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,yBAAgB;AACxD,UAAM,cAAc,eAAe,QAAQ;AAC3C,QAAI,aAAa;AACf,YAAM,eAAe,YAAY,MAAM,MAAM,CAAC,SAAS,KAAK,YAAY,CAAC;AACzE,UAAI,CAAC,cAAc;AACjB,YAAI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,YAAY,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AAChE,UAAI,SAAS,YAAY,KAAK,CAAC,cAAc,IAAI,GAAG;AAClD,YAAI;AACF,gBAAM,EAAE,SAAS,IAAI,MAAM,OAAO,0BAA6B;AAC/D,gBAAM,SAAS;AAAA,QACjB,SAAS,KAAK;AACZ,cAAI;AAAA,YACF,EAAE,KAAM,IAAc,QAAQ;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,QAAI;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,2BAA+B;AACnE,UAAM,QAAQ,IAAI,WAAW;AAC7B,UAAM,KAAK;AACX,UAAM,UAAU,MAAM,aAAa;AACnC,UAAM,cAAc,OAAO,OAAO,OAAO,EAAE;AAAA,MACzC,CAAC,MAAiC,EAAE,iBAAiB;AAAA,IACvD;AACA,QAAI,eAAe,CAAC,cAAc,KAAK,GAAG;AACxC,UAAI;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|