@aiderdesk/aiderdesk 0.61.0 → 0.61.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.
- package/out/resources/skills/extension-creator/SKILL.md +320 -0
- package/out/resources/skills/extension-creator/assets/templates/Component.jsx.template +76 -0
- package/out/resources/skills/extension-creator/assets/templates/ConfigComponent.jsx.template +38 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension/config.ts.template +29 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension/index.ts.template +42 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension/package.json +12 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension/tsconfig.json +23 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension-with-config/index.ts.template +80 -0
- package/out/resources/skills/extension-creator/assets/templates/single-file.ts.template +30 -0
- package/out/resources/skills/extension-creator/assets/templates/ui-component-external.ts.template +91 -0
- package/out/resources/skills/extension-creator/assets/templates/ui-component.ts.template +79 -0
- package/out/resources/skills/extension-creator/references/command-definition.md +170 -0
- package/out/resources/skills/extension-creator/references/config-components.md +427 -0
- package/out/resources/skills/extension-creator/references/event-types.md +156 -0
- package/out/resources/skills/extension-creator/references/examples-gallery.md +583 -0
- package/out/resources/skills/extension-creator/references/extension-interface.md +240 -0
- package/out/resources/skills/extension-creator/references/extension-types.md +186 -0
- package/out/resources/skills/extension-creator/references/in-repo-flow.md +132 -0
- package/out/resources/skills/extension-creator/references/install-targets.md +96 -0
- package/out/resources/skills/extension-creator/references/project-global-flow.md +76 -0
- package/out/resources/skills/extension-creator/references/ui-components.md +663 -0
- package/package.json +1 -1
package/out/resources/skills/extension-creator/assets/templates/ui-component-external.ts.template
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* {{EXTENSION_NAME}} Extension
|
|
3
|
+
*
|
|
4
|
+
* {{DESCRIPTION}}
|
|
5
|
+
*
|
|
6
|
+
* This extension uses external JSX files for UI components.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFileSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import type {
|
|
12
|
+
Extension,
|
|
13
|
+
ExtensionContext,
|
|
14
|
+
UIComponentDefinition
|
|
15
|
+
} from '@aiderdesk/extensions';
|
|
16
|
+
|
|
17
|
+
interface ComponentData {
|
|
18
|
+
// Define data structure passed to component
|
|
19
|
+
message: string;
|
|
20
|
+
count: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default class {{CLASS_NAME}}Extension implements Extension {
|
|
24
|
+
static metadata = {
|
|
25
|
+
name: '{{EXTENSION_NAME}}',
|
|
26
|
+
version: '1.0.0',
|
|
27
|
+
description: '{{DESCRIPTION}}',
|
|
28
|
+
author: '{{AUTHOR}}',
|
|
29
|
+
capabilities: ['ui'],
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
private state = {
|
|
33
|
+
count: 0,
|
|
34
|
+
message: 'Hello!',
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
async onLoad(context: ExtensionContext): Promise<void> {
|
|
38
|
+
context.log('{{EXTENSION_NAME}} extension loaded', 'info');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
getUIComponents(_context: ExtensionContext): UIComponentDefinition[] {
|
|
42
|
+
// Load JSX from external file
|
|
43
|
+
const jsx = readFileSync(join(__dirname, './Component.jsx'), 'utf-8');
|
|
44
|
+
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
id: '{{COMPONENT_ID}}',
|
|
48
|
+
placement: '{{PLACEMENT}}',
|
|
49
|
+
jsx,
|
|
50
|
+
loadData: true,
|
|
51
|
+
noDataCache: false, // Set to true if data should always be fresh
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async getUIExtensionData(
|
|
57
|
+
componentId: string,
|
|
58
|
+
_context: ExtensionContext
|
|
59
|
+
): Promise<ComponentData | undefined> {
|
|
60
|
+
if (componentId === '{{COMPONENT_ID}}') {
|
|
61
|
+
return {
|
|
62
|
+
message: this.state.message,
|
|
63
|
+
count: this.state.count,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async executeUIExtensionAction(
|
|
70
|
+
componentId: string,
|
|
71
|
+
action: string,
|
|
72
|
+
args: unknown[],
|
|
73
|
+
context: ExtensionContext
|
|
74
|
+
): Promise<unknown> {
|
|
75
|
+
if (componentId !== '{{COMPONENT_ID}}') return;
|
|
76
|
+
|
|
77
|
+
if (action === 'increment') {
|
|
78
|
+
this.state.count++;
|
|
79
|
+
context.triggerUIDataRefresh('{{COMPONENT_ID}}');
|
|
80
|
+
return { success: true, count: this.state.count };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (action === 'set-message') {
|
|
84
|
+
this.state.message = args[0] as string;
|
|
85
|
+
context.triggerUIDataRefresh('{{COMPONENT_ID}}');
|
|
86
|
+
return { success: true };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* {{EXTENSION_NAME}} Extension
|
|
3
|
+
*
|
|
4
|
+
* {{DESCRIPTION}}
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
Extension,
|
|
9
|
+
ExtensionContext,
|
|
10
|
+
UIComponentDefinition
|
|
11
|
+
} from '@aiderdesk/extensions';
|
|
12
|
+
|
|
13
|
+
export default class {{CLASS_NAME}}Extension implements Extension {
|
|
14
|
+
static metadata = {
|
|
15
|
+
name: '{{EXTENSION_NAME}}',
|
|
16
|
+
version: '1.0.0',
|
|
17
|
+
description: '{{DESCRIPTION}}',
|
|
18
|
+
author: '{{AUTHOR}}',
|
|
19
|
+
capabilities: ['ui'],
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
async onLoad(context: ExtensionContext): Promise<void> {
|
|
23
|
+
context.log('{{EXTENSION_NAME}} extension loaded', 'info');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getUIComponents(_context: ExtensionContext): UIComponentDefinition[] {
|
|
27
|
+
return [
|
|
28
|
+
{
|
|
29
|
+
id: '{{COMPONENT_ID}}',
|
|
30
|
+
placement: '{{PLACEMENT}}', // e.g., 'task-status-bar-right'
|
|
31
|
+
jsx: `
|
|
32
|
+
({ data, task, ui }) => {
|
|
33
|
+
// Component implementation
|
|
34
|
+
return (
|
|
35
|
+
<div className="flex items-center gap-2 text-sm">
|
|
36
|
+
<span>Hello from {{EXTENSION_NAME}}</span>
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
`,
|
|
41
|
+
loadData: false, // Set to true if component needs data
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Optional: Provide data to components
|
|
47
|
+
async getUIExtensionData(
|
|
48
|
+
componentId: string,
|
|
49
|
+
_context: ExtensionContext
|
|
50
|
+
): Promise<unknown> {
|
|
51
|
+
if (componentId === '{{COMPONENT_ID}}') {
|
|
52
|
+
return {
|
|
53
|
+
// Data to pass to component
|
|
54
|
+
message: 'Hello from extension!',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Optional: Handle actions from components
|
|
61
|
+
async executeUIExtensionAction(
|
|
62
|
+
componentId: string,
|
|
63
|
+
action: string,
|
|
64
|
+
args: unknown[],
|
|
65
|
+
context: ExtensionContext
|
|
66
|
+
): Promise<unknown> {
|
|
67
|
+
if (componentId === '{{COMPONENT_ID}}') {
|
|
68
|
+
if (action === 'my-action') {
|
|
69
|
+
context.log('Action executed with args: ' + JSON.stringify(args), 'info');
|
|
70
|
+
|
|
71
|
+
// Trigger UI refresh if needed
|
|
72
|
+
context.triggerUIDataRefresh('{{COMPONENT_ID}}');
|
|
73
|
+
|
|
74
|
+
return { success: true };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Command Definition
|
|
2
|
+
|
|
3
|
+
Structure for defining slash commands in extensions.
|
|
4
|
+
|
|
5
|
+
## CommandDefinition Interface
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
interface CommandDefinition {
|
|
9
|
+
name: string; // Command name (without /)
|
|
10
|
+
description: string; // Shown in command palette
|
|
11
|
+
arguments?: CommandArgument[];
|
|
12
|
+
execute(args: string[], context: ExtensionContext): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface CommandArgument {
|
|
16
|
+
description: string;
|
|
17
|
+
required: boolean;
|
|
18
|
+
options?: string[]; // Predefined options for autocomplete
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Simple Command Example
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
const HELLO_COMMAND: CommandDefinition = {
|
|
26
|
+
name: 'hello',
|
|
27
|
+
description: 'Say hello',
|
|
28
|
+
arguments: [
|
|
29
|
+
{ description: 'Name to greet', required: true }
|
|
30
|
+
],
|
|
31
|
+
async execute(args: string[], context: ExtensionContext): Promise<void> {
|
|
32
|
+
const taskContext = context.getTaskContext();
|
|
33
|
+
if (!taskContext) {
|
|
34
|
+
context.log('No task context', 'error');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const name = args[0] || 'World';
|
|
39
|
+
taskContext.addLogMessage('info', `Hello, ${name}!`);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Command with Options
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
const THEME_COMMAND: CommandDefinition = {
|
|
48
|
+
name: 'theme',
|
|
49
|
+
description: 'Switch the AiderDesk theme',
|
|
50
|
+
arguments: [
|
|
51
|
+
{
|
|
52
|
+
description: 'Name of the theme to apply',
|
|
53
|
+
required: true,
|
|
54
|
+
options: ['dark', 'light', 'ocean', 'forest']
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
async execute(args: string[], context: ExtensionContext): Promise<void> {
|
|
58
|
+
const taskContext = context.getTaskContext();
|
|
59
|
+
const themeName = args[0];
|
|
60
|
+
|
|
61
|
+
if (!themeName) {
|
|
62
|
+
taskContext?.addLogMessage('warning', 'Usage: /theme <theme-name>');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
await context.updateSettings({ theme: themeName });
|
|
67
|
+
taskContext?.addLogMessage('info', `Theme changed to: ${themeName}`);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Command with Config
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// In extension class
|
|
76
|
+
private config: MyConfig;
|
|
77
|
+
|
|
78
|
+
async onLoad(context: ExtensionContext): Promise<void> {
|
|
79
|
+
this.config = await loadConfig();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
getCommands(_context: ExtensionContext): CommandDefinition[] {
|
|
83
|
+
return [{
|
|
84
|
+
name: 'my-setting',
|
|
85
|
+
description: 'Get or set a value',
|
|
86
|
+
arguments: [
|
|
87
|
+
{ description: 'Value to set (optional)', required: false }
|
|
88
|
+
],
|
|
89
|
+
execute: async (args: string[], context: ExtensionContext) => {
|
|
90
|
+
const taskContext = context.getTaskContext();
|
|
91
|
+
const [value] = args;
|
|
92
|
+
|
|
93
|
+
if (!value) {
|
|
94
|
+
// Show current value
|
|
95
|
+
taskContext?.addLogMessage('info', `Current: ${this.config.mySetting}`);
|
|
96
|
+
} else {
|
|
97
|
+
// Update value
|
|
98
|
+
this.config.mySetting = value;
|
|
99
|
+
await saveConfig(this.config);
|
|
100
|
+
taskContext?.addLogMessage('info', `Updated to: ${value}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}];
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Multi-Argument Commands
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const CONFIG_COMMAND: CommandDefinition = {
|
|
111
|
+
name: 'config',
|
|
112
|
+
description: 'Manage extension settings',
|
|
113
|
+
arguments: [
|
|
114
|
+
{ description: 'Setting name', required: true },
|
|
115
|
+
{ description: 'Setting value', required: false }
|
|
116
|
+
],
|
|
117
|
+
async execute(args: string[], context: ExtensionContext): Promise<void> {
|
|
118
|
+
const taskContext = context.getTaskContext();
|
|
119
|
+
const [setting, value] = args;
|
|
120
|
+
|
|
121
|
+
if (!setting) {
|
|
122
|
+
// Show all settings
|
|
123
|
+
const config = await loadConfig();
|
|
124
|
+
taskContext?.addLogMessage('info', `Settings:\n${JSON.stringify(config, null, 2)}`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (!value) {
|
|
129
|
+
// Show specific setting
|
|
130
|
+
const config = await loadConfig();
|
|
131
|
+
taskContext?.addLogMessage('info', `${setting}: ${config[setting]}`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Update setting
|
|
136
|
+
const config = await loadConfig();
|
|
137
|
+
config[setting] = value;
|
|
138
|
+
await saveConfig(config);
|
|
139
|
+
taskContext?.addLogMessage('info', `${setting} updated to: ${value}`);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Error Handling
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
execute: async (args: string[], context: ExtensionContext) => {
|
|
148
|
+
const taskContext = context.getTaskContext();
|
|
149
|
+
if (!taskContext) {
|
|
150
|
+
context.log('No active task context', 'error');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
// Command logic
|
|
156
|
+
} catch (error) {
|
|
157
|
+
taskContext.addLogMessage('error', `Command failed: ${error}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Registering Commands
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
class MyExtension implements Extension {
|
|
166
|
+
getCommands(_context: ExtensionContext): CommandDefinition[] {
|
|
167
|
+
return [COMMAND_1, COMMAND_2];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|