@fleettools/opencode-plugin 1.0.1 → 1.1.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/README.md CHANGED
@@ -1,71 +1,79 @@
1
1
  # FleetTools OpenCode Plugin
2
2
 
3
- Integrates FleetTools AI Agent Coordination System into OpenCode.
3
+ Integrates FleetTools CLI functionality into OpenCode.
4
4
 
5
5
  ## Installation
6
6
 
7
- ### From npm (Recommended)
8
- ```bash
9
- npm install @fleettools/opencode-plugin
10
- ```
7
+ Add this plugin to your OpenCode config:
11
8
 
12
- ### From OpenCode CLI
13
- ```bash
14
- opencode plugin install @fleettools/opencode-plugin
9
+ ```json
10
+ {
11
+ "plugin": ["@fleettools/opencode-plugin"]
12
+ }
15
13
  ```
16
14
 
17
- ## Usage
15
+ After restarting OpenCode, the plugin will provide tools and commands for FleetTools management.
18
16
 
19
- Once installed, the plugin provides three tools:
17
+ ## Tools
20
18
 
21
- ### 🚀 `fleet-start`
22
- Start FleetTools services (API, Squawk coordination)
19
+ ### 📊 `fleet-status`
20
+ Get FleetTools service status and configuration
21
+
22
+ **Parameters:**
23
+ - `format` (optional, enum: text|json, default: text) - Output format
23
24
 
25
+ **Examples:**
24
26
  ```bash
25
- # Start all services
26
- fleet-start
27
+ # Human-readable status
28
+ /fleet-status
27
29
 
28
- # Start specific services
29
- fleet-start --services api,squawk
30
+ # JSON format
31
+ /fleet-status --format json
32
+ ```
33
+
34
+ ### 🚀 `fleet-start`
35
+ Start FleetTools services
30
36
 
31
- # Run in foreground
32
- fleet-start --foreground
37
+ **Parameters:**
38
+ - `services` (optional, array: api,squawk) - Services to start (default: all enabled)
39
+
40
+ **Examples:**
41
+ ```bash
42
+ # Start specific services
43
+ /fleet-start --services api,squawk
33
44
  ```
34
45
 
35
46
  ### 🛑 `fleet-stop`
36
47
  Stop FleetTools services
37
48
 
49
+ **Parameters:**
50
+ - `services` (optional, array: api,squawk) - Services to stop (default: all running)
51
+ - `force` (optional, boolean) - Force stop without graceful shutdown
52
+ - `timeoutMs` (optional, number) - Timeout for graceful shutdown (ms)
53
+ - `format` (optional, enum: text|json, default: text) - Output format
54
+
55
+ **Examples:**
38
56
  ```bash
39
- # Graceful stop
40
- fleet-stop
57
+ # Graceful stop specific services
58
+ /fleet-stop --services api,squawk
41
59
 
42
60
  # Force stop
43
- fleet-stop --force
61
+ /fleet-stop --force api,squawk --timeout 5000
44
62
  ```
45
63
 
46
- ### 📊 `fleet-status`
47
- Get FleetTools service status and configuration
48
-
49
- ```bash
50
- # Human-readable status
51
- fleet-status
52
-
53
- # JSON format
54
- fleet-status --format json
55
- ```
64
+ ## Commands
56
65
 
57
- ## Features
66
+ The plugin also provides these slash commands for quick access:
58
67
 
59
- - **Service Management**: Start, stop, and monitor FleetTools services
60
- - **JSON & Text Output**: Flexible output formats for different use cases
61
- - **Error Handling**: Graceful error reporting and process management
62
- - **Background/Foreground**: Choose how services run
63
- - ✅ **Service Selection**: Start specific services or all services
68
+ - **/fleet-status** - Show FleetTools status
69
+ - **/fleet-start** - Start FleetTools services
70
+ - **/fleet-stop** - Stop FleetTools services
71
+ - **/fleet-help** - Show FleetTools help and usage
64
72
 
65
73
  ## Requirements
66
74
 
67
75
  - OpenCode >= 1.0.0
68
- - FleetTools CLI >= 0.1.0
76
+ - FleetTools CLI (must be available in PATH)
69
77
  - Node.js >= 18.0.0
70
78
 
71
79
  ## License
package/dist/index.d.ts CHANGED
@@ -1,65 +1,81 @@
1
- export interface OpenCodeCommand {
2
- id: string;
3
- name: string;
4
- description: string;
5
- handler: () => Promise<void>;
6
- }
7
- export interface OpenCodeCommandRegistry {
8
- registerCommand: (command: OpenCodeCommand) => void;
9
- }
10
- export interface FleetToolsOpenCodePlugin {
11
- name: string;
12
- version: string;
13
- registerCommands: (commands: OpenCodeCommandRegistry) => Promise<void>;
14
- }
15
- export interface FleetToolsStatus {
16
- mode?: 'local' | 'synced';
17
- config?: {
18
- fleet?: {
19
- user_id?: string;
20
- workspace_id?: string;
1
+ /**
2
+ * FleetTools OpenCode Plugin
3
+ *
4
+ * Integrates FleetTools CLI functionality into OpenCode via tools and commands
5
+ */
6
+ export declare const FleetToolsPlugin: ({ client, $, directory, worktree }: any) => Promise<{
7
+ tool: {
8
+ 'fleet-status': {
9
+ description: string;
10
+ parameters: {
11
+ type: string;
12
+ properties: {
13
+ format: {
14
+ type: string;
15
+ enum: string[];
16
+ description: string;
17
+ };
18
+ };
19
+ };
20
+ execute: ({ format }: {
21
+ format?: string | undefined;
22
+ }) => Promise<any>;
21
23
  };
22
- };
23
- podman?: {
24
- available?: boolean;
25
- zero?: {
26
- url?: string;
27
- };
28
- api?: {
29
- url?: string;
30
- };
31
- };
32
- sync?: {
33
- zero?: {
34
- url?: string;
24
+ 'fleet-start': {
25
+ description: string;
26
+ parameters: {
27
+ type: string;
28
+ properties: {
29
+ services: {
30
+ type: string;
31
+ items: {
32
+ type: string;
33
+ enum: string[];
34
+ };
35
+ description: string;
36
+ };
37
+ };
38
+ };
39
+ execute: ({ services }: {
40
+ services?: never[] | undefined;
41
+ }) => Promise<any>;
35
42
  };
36
- api?: {
37
- url?: string;
43
+ 'fleet-stop': {
44
+ description: string;
45
+ parameters: {
46
+ type: string;
47
+ properties: {
48
+ services: {
49
+ type: string;
50
+ items: {
51
+ type: string;
52
+ enum: string[];
53
+ };
54
+ description: string;
55
+ };
56
+ force: {
57
+ type: string;
58
+ description: string;
59
+ };
60
+ timeoutMs: {
61
+ type: string;
62
+ description: string;
63
+ };
64
+ format: {
65
+ type: string;
66
+ enum: string[];
67
+ description: string;
68
+ };
69
+ };
70
+ };
71
+ execute: ({ services, force, timeoutMs, format }: {
72
+ services?: never[] | undefined;
73
+ force?: boolean | undefined;
74
+ timeoutMs?: undefined;
75
+ format?: string | undefined;
76
+ }) => Promise<any>;
38
77
  };
39
78
  };
40
- }
41
- export declare class FleetToolsOpenCodePluginImpl implements FleetToolsOpenCodePlugin {
42
- /** Plugin name */
43
- name: string;
44
- /** Plugin version */
45
- version: string;
46
- registerCommands(commands: OpenCodeCommandRegistry): Promise<void>;
47
- private handleStatus;
48
- private handleSetup;
49
- private handleDoctor;
50
- private handleServices;
51
- private handleHelp;
52
- private showMessage;
53
- private showError;
54
- private showOutput;
55
- private showInOutputPane;
56
- }
57
- export declare function createPlugin(): FleetToolsOpenCodePluginImpl;
58
- export declare const fleetToolsPlugin: {
59
- name: string;
60
- version: string;
61
- register: (commands: OpenCodeCommandRegistry) => Promise<void>;
62
- };
63
- export declare function fallbackRegister(): Promise<void>;
64
- export default fleetToolsPlugin;
79
+ config(config: any): Promise<void>;
80
+ }>;
65
81
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAU,oCAAoC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA0IrD,GAAG;EAoE3B,CAAC"}
package/dist/index.js CHANGED
@@ -1,180 +1,206 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fleetToolsPlugin = exports.FleetToolsOpenCodePluginImpl = void 0;
4
- exports.createPlugin = createPlugin;
5
- exports.fallbackRegister = fallbackRegister;
6
- const child_process_1 = require("child_process");
7
- const util_1 = require("util");
8
- const execAsync = (0, util_1.promisify)(child_process_1.exec);
9
- class FleetToolsOpenCodePluginImpl {
10
- /** Plugin name */
11
- name = 'FleetTools';
12
- /** Plugin version */
13
- version = '0.1.0';
14
- async registerCommands(commands) {
15
- commands.registerCommand({
16
- id: 'fleet-status',
17
- name: '/fleet status',
18
- description: 'Show FleetTools status and configuration',
19
- handler: this.handleStatus.bind(this),
20
- });
21
- commands.registerCommand({
22
- id: 'fleet-setup',
23
- name: '/fleet setup',
24
- description: 'Initialize FleetTools configuration',
25
- handler: this.handleSetup.bind(this),
26
- });
27
- commands.registerCommand({
28
- id: 'fleet-doctor',
29
- name: '/fleet doctor',
30
- description: 'Diagnose FleetTools installation and configuration',
31
- handler: this.handleDoctor.bind(this),
32
- });
33
- commands.registerCommand({
34
- id: 'fleet-services',
35
- name: '/fleet services',
36
- description: 'Manage local services (up/down/status/logs)',
37
- handler: this.handleServices.bind(this),
38
- });
39
- commands.registerCommand({
40
- id: 'fleet-help',
41
- name: '/fleet help',
42
- description: 'Show FleetTools help information',
43
- handler: this.handleHelp.bind(this),
44
- });
45
- }
46
- async handleStatus() {
47
- this.showMessage('Fetching FleetTools status...');
48
- try {
49
- const { stdout } = await execAsync('fleet status --json');
50
- try {
51
- const status = JSON.parse(stdout);
52
- const output = [
53
- 'FleetTools Status',
54
- '================',
55
- '',
56
- `Mode: ${status.mode?.toUpperCase() || 'LOCAL'}`,
57
- '',
58
- `User: ${status.config?.fleet?.user_id || 'Not enrolled'}`,
59
- '',
60
- ];
61
- if (status.mode === 'synced') {
62
- output.push('Sync Status:');
63
- output.push(` Zero: ${status.sync?.zero?.url ? 'Connected' : 'Not configured'}`);
64
- output.push(` API: ${status.sync?.api?.url || 'Not configured'}`);
1
+ /**
2
+ * FleetTools OpenCode Plugin
3
+ *
4
+ * Integrates FleetTools CLI functionality into OpenCode via tools and commands
5
+ */
6
+ export const FleetToolsPlugin = async ({ client, $, directory, worktree }) => {
7
+ // Register custom tools for LLM to call
8
+ return {
9
+ tool: {
10
+ 'fleet-status': {
11
+ description: 'Get FleetTools service status and configuration',
12
+ parameters: {
13
+ type: 'object',
14
+ properties: {
15
+ format: {
16
+ type: 'string',
17
+ enum: ['text', 'json'],
18
+ description: 'Output format (default: text)'
19
+ }
20
+ }
21
+ },
22
+ execute: async ({ format = 'text' }) => {
23
+ try {
24
+ const effectiveCwd = worktree ?? directory;
25
+ const result = await $ `fleet status${format === 'json' ? ' --json' : ''}`.cwd(effectiveCwd).nothrow().text();
26
+ if (format === 'json') {
27
+ try {
28
+ return JSON.parse(result);
29
+ }
30
+ catch {
31
+ return { success: false, error: 'Failed to parse status JSON' };
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ catch (error) {
37
+ await client.app.log({
38
+ service: 'fleettools',
39
+ level: 'error',
40
+ message: 'Failed to get FleetTools status',
41
+ extra: { error: error.message || String(error) }
42
+ });
43
+ return { success: false, error: error.message || String(error) };
44
+ }
65
45
  }
66
- if (status.podman) {
67
- output.push('');
68
- output.push('Podman:');
69
- output.push(` Available: ${status.podman.available ? '✓' : '✗'}`);
46
+ },
47
+ 'fleet-start': {
48
+ description: 'Start FleetTools services',
49
+ parameters: {
50
+ type: 'object',
51
+ properties: {
52
+ services: {
53
+ type: 'array',
54
+ items: { type: 'string', enum: ['api', 'squawk'] },
55
+ description: 'Services to start (api, squawk)'
56
+ }
57
+ }
58
+ },
59
+ execute: async ({ services = [] }) => {
60
+ try {
61
+ const effectiveCwd = worktree ?? directory;
62
+ const servicesArg = services.length > 0 ? `--services ${services.join(',')}` : '';
63
+ const result = await $ `fleet start ${servicesArg}`.cwd(effectiveCwd).nothrow().text();
64
+ await client.app.log({
65
+ service: 'fleettools',
66
+ level: 'info',
67
+ message: 'FleetTools services started',
68
+ extra: { services: services.length > 0 ? services : ['all'], result }
69
+ });
70
+ return result || 'FleetTools services started successfully';
71
+ }
72
+ catch (error) {
73
+ await client.app.log({
74
+ service: 'fleettools',
75
+ level: 'error',
76
+ message: 'Failed to start FleetTools services',
77
+ extra: { error: error.message || String(error) }
78
+ });
79
+ return { success: false, error: error.message || String(error) };
80
+ }
81
+ }
82
+ },
83
+ 'fleet-stop': {
84
+ description: 'Stop FleetTools services',
85
+ parameters: {
86
+ type: 'object',
87
+ properties: {
88
+ services: {
89
+ type: 'array',
90
+ items: { type: 'string', enum: ['api', 'squawk'] },
91
+ description: 'Services to stop (api, squawk)'
92
+ },
93
+ force: {
94
+ type: 'boolean',
95
+ description: 'Force stop without waiting for graceful shutdown'
96
+ },
97
+ timeoutMs: {
98
+ type: 'number',
99
+ description: 'Timeout for graceful shutdown in milliseconds'
100
+ },
101
+ format: {
102
+ type: 'string',
103
+ enum: ['text', 'json'],
104
+ description: 'Output format (default: text)'
105
+ }
106
+ }
107
+ },
108
+ execute: async ({ services = [], force = false, timeoutMs = undefined, format = 'text' }) => {
109
+ try {
110
+ const effectiveCwd = worktree ?? directory;
111
+ const flags = [
112
+ services.length > 0 ? `--services ${services.join(',')}` : '',
113
+ force ? '--force' : '',
114
+ timeoutMs ? `--timeout ${timeoutMs}` : '',
115
+ format === 'json' ? '--json' : ''
116
+ ].filter(Boolean).join(' ');
117
+ const result = await $ `fleet stop ${flags}`.cwd(effectiveCwd).nothrow().text();
118
+ if (format === 'json') {
119
+ try {
120
+ return JSON.parse(result);
121
+ }
122
+ catch {
123
+ return { success: false, error: 'Failed to parse stop JSON' };
124
+ }
125
+ }
126
+ return result;
127
+ }
128
+ catch (error) {
129
+ await client.app.log({
130
+ service: 'fleettools',
131
+ level: 'error',
132
+ message: 'Failed to stop FleetTools services',
133
+ extra: { error: error.message || String(error) }
134
+ });
135
+ return { success: false, error: error.message || String(error) };
136
+ }
70
137
  }
71
- this.showOutput(output);
72
- const details = JSON.stringify(status, null, 2);
73
- this.showInOutputPane('Status Details', details);
74
- }
75
- catch {
76
- this.showOutput(['Failed to parse status output']);
77
- this.showInOutputPane('Status Details', stdout);
78
138
  }
79
- }
80
- catch (error) {
81
- this.showError('Failed to get FleetTools status', error);
82
- }
83
- }
84
- async handleSetup() {
85
- this.showMessage('Running FleetTools setup...');
86
- try {
87
- const { stdout } = await execAsync('fleet setup');
88
- this.showOutput(stdout);
89
- this.showInOutputPane('Setup Output', stdout);
90
- }
91
- catch (error) {
92
- this.showError('Failed to run FleetTools setup', error);
93
- }
94
- }
95
- async handleDoctor() {
96
- this.showMessage('Running FleetTools diagnostics...');
97
- try {
98
- const { stdout } = await execAsync('fleet doctor');
99
- this.showOutput(stdout);
100
- this.showInOutputPane('Diagnostics Output', stdout);
101
- }
102
- catch (error) {
103
- this.showError('Failed to run FleetTools doctor', error);
104
- }
105
- }
106
- async handleServices() {
107
- this.showMessage('Opening FleetTools services menu...');
108
- try {
109
- const { stdout } = await execAsync('fleet services');
110
- this.showOutput(stdout);
111
- this.showInOutputPane('Services Menu', stdout);
112
- }
113
- catch (error) {
114
- this.showError('Failed to open services menu', error);
115
- }
116
- }
117
- async handleHelp() {
118
- const output = [
119
- 'FleetTools Plugin for OpenCode',
120
- '=============================',
121
- '',
122
- 'Commands:',
123
- ' /fleet status - Show FleetTools status',
124
- ' /fleet setup - Initialize FleetTools configuration',
125
- ' /fleet doctor - Diagnose installation and configuration',
126
- ' /fleet services - Manage local services',
127
- ' /fleet help - Show this help',
128
- '',
129
- 'For more information, see: https://github.com/v1truv1us/fleettools',
130
- ];
131
- this.showOutput(output);
132
- }
133
- // ==========================================================================
134
- // ==========================================================================
135
- showMessage(message) {
136
- this.showOutput(`\n${message}\n`);
137
- }
138
- showError(message, error) {
139
- this.showOutput(`\n❌ Error: ${message}\n`);
140
- this.showOutput(` ${error.message}\n`);
141
- }
142
- showOutput(message) {
143
- if (Array.isArray(message)) {
144
- message.forEach((line) => console.log(line));
145
- }
146
- else {
147
- console.log(message);
148
- }
149
- }
150
- showInOutputPane(title, content) {
151
- console.log(`\n--- ${title} ---\n${content}\n`);
152
- }
139
+ },
140
+ // Register custom slash commands via config hook
141
+ async config(config) {
142
+ // Initialize command registry if it doesn't exist
143
+ config.command = config.command ?? {};
144
+ // /fleet-status [format] - Show FleetTools status
145
+ config.command['fleet-status'] = {
146
+ template: `Use the fleet-status tool to get FleetTools status and configuration$ARGUMENTS ? \` with format: $ARGUMENTS\` : ''.`,
147
+ description: 'Show FleetTools status and configuration',
148
+ agent: 'build'
149
+ };
150
+ // /fleet-start [services] - Start FleetTools services
151
+ config.command['fleet-start'] = {
152
+ template: `Use the fleet-start tool to start FleetTools services$ARGUMENTS ? \` with services: $ARGUMENTS\` : ''.\n\nThis runs services in the background. For foreground execution or other options, use the fleet-start tool directly.`,
153
+ description: 'Start FleetTools services',
154
+ agent: 'build'
155
+ };
156
+ // /fleet-stop [services] [force] [timeout] [format] - Stop FleetTools services
157
+ config.command['fleet-stop'] = {
158
+ template: `Use the fleet-stop tool to stop FleetTools services$ARGUMENTS ? \` with: $ARGUMENTS\` : ''.\n\nThis supports selective service stopping and graceful shutdown options. Use the fleet-stop tool directly for advanced options.`,
159
+ description: 'Stop FleetTools services',
160
+ agent: 'build'
161
+ };
162
+ // /fleet-help - Show FleetTools help
163
+ config.command['fleet-help'] = {
164
+ template: `# FleetTools Plugin for OpenCode
165
+
166
+ ## Available Tools
167
+ - **fleet-status** - Get FleetTools service status and configuration
168
+ - **fleet-start** - Start FleetTools services
169
+ - **fleet-stop** - Stop FleetTools services
170
+
171
+ ## Slash Commands
172
+ - **/fleet-status [format]** - Show status (format: text|json)
173
+ - **/fleet-start [services]** - Start services (services: api,squawk)
174
+ - **/fleet-stop [services]** - Stop services (services: api,squawk)
175
+ - **/fleet-help** - Show this help
176
+
177
+ ## Examples
178
+ \`\`\`bash
179
+ # Check FleetTools status
180
+ /fleet-status
181
+
182
+ # Start specific services
183
+ /fleet-start api,squawk
184
+
185
+ # Stop services with force
186
+ /fleet-stop --force api,squawk --timeout 3000
187
+ \`\`\`
188
+
189
+ ## Installation
190
+ Add this plugin to your OpenCode config:
191
+ \`\`\`json
192
+ {
193
+ "plugin": ["@fleettools/opencode-plugin"]
153
194
  }
154
- exports.FleetToolsOpenCodePluginImpl = FleetToolsOpenCodePluginImpl;
155
- let plugin = null;
156
- function createPlugin() {
157
- if (!plugin) {
158
- plugin = new FleetToolsOpenCodePluginImpl();
159
- }
160
- return plugin;
161
- }
162
- exports.fleetToolsPlugin = {
163
- name: 'FleetTools',
164
- version: '0.1.0',
165
- register: async (commands) => {
166
- const fleetPlugin = createPlugin();
167
- await fleetPlugin.registerCommands(commands);
168
- },
195
+ \`\`\`
196
+
197
+ After restarting OpenCode, the tools and commands will be available in your session.
198
+
199
+ For more information, see: https://github.com/v1truv1us/fleettools`,
200
+ description: 'Show FleetTools help and usage',
201
+ agent: 'build'
202
+ };
203
+ }
204
+ };
169
205
  };
170
- async function fallbackRegister() {
171
- console.warn('[FleetTools] OpenCode SDK not available. Running in CLI fallback mode.');
172
- console.warn('[FleetTools] The following commands are available via fleet CLI:');
173
- console.warn(' - fleet status');
174
- console.warn(' - fleet setup');
175
- console.warn(' - fleet doctor');
176
- console.warn(' - fleet services');
177
- console.warn(' - fleet help');
178
- }
179
- exports.default = exports.fleetToolsPlugin;
180
206
  //# 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 CHANGED
@@ -1,13 +1,20 @@
1
1
  {
2
2
  "name": "@fleettools/opencode-plugin",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "FleetTools OpenCode Plugin - AI Agent Coordination System",
5
- "main": "dist/plugin.js",
6
- "types": "dist/plugin.d.ts",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "default": "./dist/index.js"
10
+ }
11
+ },
7
12
  "scripts": {
8
13
  "build": "tsc",
9
14
  "dev": "tsc --watch",
10
- "package": "npm run build && node scripts/package.js"
15
+ "clean": "rm -rf dist",
16
+ "test": "bun test-contract.ts && bun test-exists.ts && bun test-smoke.ts --cwd test",
17
+ "package": "npm run build && npm publish"
11
18
  },
12
19
  "keywords": [
13
20
  "fleettools",
@@ -21,23 +28,16 @@
21
28
  "license": "MIT",
22
29
  "dependencies": {},
23
30
  "devDependencies": {
24
- "typescript": "^5.0.0",
31
+ "typescript": "^5.9.3",
25
32
  "@types/node": "^20.0.0"
26
33
  },
27
- "peerDependencies": {},
28
- "peerDependenciesMeta": {
29
- "opencode": {
30
- "optional": true
31
- }
32
- },
33
- "opencode": {
34
- "displayName": "FleetTools",
35
- "description": "AI Agent Coordination System for FleetTools",
36
- "icon": "assets/icon.svg",
37
- "permissions": [
38
- "bash",
39
- "read",
40
- "write"
41
- ]
34
+ "files": [
35
+ "dist",
36
+ "assets",
37
+ "README.md",
38
+ "package.json"
39
+ ],
40
+ "publishConfig": {
41
+ "access": "public"
42
42
  }
43
43
  }
package/dist/plugin.d.ts DELETED
@@ -1,69 +0,0 @@
1
- /**
2
- * FleetTools OpenCode Plugin
3
- *
4
- * Integrates FleetTools CLI functionality into OpenCode
5
- */
6
- export default function FleetToolsPlugin(): Promise<{
7
- tool: {
8
- 'fleet-status': {
9
- description: string;
10
- parameters: {
11
- type: string;
12
- properties: {
13
- format: {
14
- type: string;
15
- enum: string[];
16
- description: string;
17
- };
18
- };
19
- };
20
- execute: ({ format }: {
21
- format?: string;
22
- }) => Promise<{
23
- success: boolean;
24
- data: string;
25
- error?: undefined;
26
- } | {
27
- success: boolean;
28
- error: string;
29
- data?: undefined;
30
- }>;
31
- };
32
- 'fleet-start': {
33
- description: string;
34
- parameters: {
35
- type: string;
36
- properties: {
37
- services: {
38
- type: string;
39
- description: string;
40
- };
41
- foreground: {
42
- type: string;
43
- description: string;
44
- };
45
- };
46
- };
47
- execute: ({ services, foreground }: {
48
- services?: string;
49
- foreground?: boolean;
50
- }) => Promise<unknown>;
51
- };
52
- 'fleet-stop': {
53
- description: string;
54
- parameters: {
55
- type: string;
56
- properties: {
57
- force: {
58
- type: string;
59
- description: string;
60
- };
61
- };
62
- };
63
- execute: ({ force }: {
64
- force?: boolean;
65
- }) => Promise<unknown>;
66
- };
67
- };
68
- }>;
69
- //# sourceMappingURL=plugin.d.ts.map
package/dist/plugin.js DELETED
@@ -1,141 +0,0 @@
1
- "use strict";
2
- /**
3
- * FleetTools OpenCode Plugin
4
- *
5
- * Integrates FleetTools CLI functionality into OpenCode
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.default = FleetToolsPlugin;
9
- async function FleetToolsPlugin() {
10
- console.log('FleetTools plugin initialized!');
11
- // Return tool definitions for FleetTools
12
- return {
13
- tool: {
14
- 'fleet-status': {
15
- description: 'Get FleetTools service status and configuration',
16
- parameters: {
17
- type: 'object',
18
- properties: {
19
- format: {
20
- type: 'string',
21
- enum: ['json', 'text'],
22
- description: 'Output format (default: text)'
23
- }
24
- }
25
- },
26
- execute: async ({ format = 'text' }) => {
27
- const { execSync } = await import('node:child_process');
28
- try {
29
- const result = execSync(`fleet status${format === 'json' ? ' --json' : ''}`, {
30
- encoding: 'utf-8'
31
- });
32
- return { success: true, data: result };
33
- }
34
- catch (error) {
35
- return {
36
- success: false,
37
- error: error instanceof Error ? error.message : String(error)
38
- };
39
- }
40
- }
41
- },
42
- 'fleet-start': {
43
- description: 'Start FleetTools services',
44
- parameters: {
45
- type: 'object',
46
- properties: {
47
- services: {
48
- type: 'string',
49
- description: 'Comma-separated list of services to start (api,squawk)'
50
- },
51
- foreground: {
52
- type: 'boolean',
53
- description: 'Run in foreground instead of background'
54
- }
55
- }
56
- },
57
- execute: async ({ services, foreground }) => {
58
- const { spawn } = await import('node:child_process');
59
- return new Promise((resolve) => {
60
- const args = ['start'];
61
- if (services)
62
- args.push('--services', services);
63
- if (foreground)
64
- args.push('--foreground');
65
- const process = spawn('fleet', args, { stdio: 'pipe' });
66
- let stdout = '';
67
- let stderr = '';
68
- process.stdout?.on('data', (data) => stdout += data);
69
- process.stderr?.on('data', (data) => stderr += data);
70
- process.on('close', (code) => {
71
- if (code === 0) {
72
- resolve({
73
- success: true,
74
- data: stdout || 'FleetTools services started successfully'
75
- });
76
- }
77
- else {
78
- resolve({
79
- success: false,
80
- error: stderr || `Process exited with code ${code}`
81
- });
82
- }
83
- });
84
- process.on('error', (error) => {
85
- resolve({
86
- success: false,
87
- error: error.message
88
- });
89
- });
90
- });
91
- }
92
- },
93
- 'fleet-stop': {
94
- description: 'Stop FleetTools services',
95
- parameters: {
96
- type: 'object',
97
- properties: {
98
- force: {
99
- type: 'boolean',
100
- description: 'Force stop services'
101
- }
102
- }
103
- },
104
- execute: async ({ force }) => {
105
- const { spawn } = await import('node:child_process');
106
- return new Promise((resolve) => {
107
- const args = ['stop'];
108
- if (force)
109
- args.push('--force');
110
- const process = spawn('fleet', args, { stdio: 'pipe' });
111
- let stdout = '';
112
- let stderr = '';
113
- process.stdout?.on('data', (data) => stdout += data);
114
- process.stderr?.on('data', (data) => stderr += data);
115
- process.on('close', (code) => {
116
- if (code === 0) {
117
- resolve({
118
- success: true,
119
- data: stdout || 'FleetTools services stopped successfully'
120
- });
121
- }
122
- else {
123
- resolve({
124
- success: false,
125
- error: stderr || `Process exited with code ${code}`
126
- });
127
- }
128
- });
129
- process.on('error', (error) => {
130
- resolve({
131
- success: false,
132
- error: error.message
133
- });
134
- });
135
- });
136
- }
137
- }
138
- }
139
- };
140
- }
141
- //# sourceMappingURL=plugin.js.map
package/manifest.json DELETED
@@ -1,28 +0,0 @@
1
- {
2
- "name": "FleetTools",
3
- "description": "AI Agent Coordination System",
4
- "version": "1.0.0",
5
- "author": "FleetTools",
6
- "license": "MIT",
7
- "entry": "dist/plugin.js",
8
- "icon": "assets/icon.svg",
9
- "permissions": [
10
- "bash",
11
- "read",
12
- "write"
13
- ],
14
- "hooks": [
15
- "tool.execute.before",
16
- "chat.params"
17
- ],
18
- "tools": [
19
- "fleet-status",
20
- "fleet-start",
21
- "fleet-stop"
22
- ],
23
- "categories": [
24
- "development",
25
- "automation",
26
- "ai"
27
- ]
28
- }
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Plugin Packaging Script
5
- *
6
- * Creates a distributable plugin package
7
- */
8
-
9
- import { readFileSync, writeFileSync, createWriteStream } from 'node:fs';
10
- import { join } from 'node:path';
11
- import { execSync } from 'node:child_process';
12
- import { fileURLToPath } from 'node:url';
13
- import { dirname } from 'node:path';
14
- import archiver from 'archiver';
15
-
16
- const __filename = fileURLToPath(import.meta.url);
17
- const __dirname = dirname(__filename);
18
-
19
- async function createPluginPackage() {
20
- console.log('📦 Creating FleetTools OpenCode plugin package...');
21
-
22
- try {
23
- // Ensure the build is up to date
24
- execSync('npm run build', { stdio: 'inherit' });
25
-
26
- // Create a zip file
27
- const output = createWriteStream(join(__dirname, '../fleettools-opencode-plugin.zip'));
28
- const archive = archiver('zip', { zlib: { level: 9 } });
29
-
30
- output.on('close', () => {
31
- console.log(`✅ Plugin package created: ${archive.pointer()} bytes`);
32
- });
33
-
34
- archive.on('error', (err) => {
35
- throw err;
36
- });
37
-
38
- archive.pipe(output);
39
-
40
- // Add essential files
41
- archive.file(join(__dirname, '../dist/plugin.js'), { name: 'plugin.js' });
42
- archive.file(join(__dirname, '../dist/plugin.d.ts'), { name: 'plugin.d.ts' });
43
- archive.file(join(__dirname, '../package.json'), { name: 'package.json' });
44
- archive.file(join(__dirname, '../manifest.json'), { name: 'manifest.json' });
45
- archive.file(join(__dirname, '../README.md'), { name: 'README.md' });
46
-
47
- await archive.finalize();
48
-
49
- } catch (error) {
50
- console.error('❌ Failed to create plugin package:', error);
51
- process.exit(1);
52
- }
53
- }
54
-
55
- createPluginPackage();
package/tsconfig.json DELETED
@@ -1,31 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "lib": ["ES2022"],
7
- "outDir": "./dist",
8
- "rootDir": "./src",
9
- "strict": true,
10
- "esModuleInterop": true,
11
- "skipLibCheck": true,
12
- "forceConsistentCasingInFileNames": true,
13
- "resolveJsonModule": true,
14
- "declaration": true,
15
- "declarationMap": true,
16
- "sourceMap": true,
17
- "noImplicitAny": true,
18
- "noUnusedLocals": true,
19
- "noUnusedParameters": true,
20
- "noImplicitReturns": true,
21
- "noFallthroughCasesInSwitch": true,
22
- "noUncheckedIndexedAccess": true
23
- },
24
- "include": [
25
- "src/**/*.ts"
26
- ],
27
- "exclude": [
28
- "node_modules",
29
- "dist"
30
- ]
31
- }