@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.
Files changed (22) hide show
  1. package/out/resources/skills/extension-creator/SKILL.md +320 -0
  2. package/out/resources/skills/extension-creator/assets/templates/Component.jsx.template +76 -0
  3. package/out/resources/skills/extension-creator/assets/templates/ConfigComponent.jsx.template +38 -0
  4. package/out/resources/skills/extension-creator/assets/templates/folder-extension/config.ts.template +29 -0
  5. package/out/resources/skills/extension-creator/assets/templates/folder-extension/index.ts.template +42 -0
  6. package/out/resources/skills/extension-creator/assets/templates/folder-extension/package.json +12 -0
  7. package/out/resources/skills/extension-creator/assets/templates/folder-extension/tsconfig.json +23 -0
  8. package/out/resources/skills/extension-creator/assets/templates/folder-extension-with-config/index.ts.template +80 -0
  9. package/out/resources/skills/extension-creator/assets/templates/single-file.ts.template +30 -0
  10. package/out/resources/skills/extension-creator/assets/templates/ui-component-external.ts.template +91 -0
  11. package/out/resources/skills/extension-creator/assets/templates/ui-component.ts.template +79 -0
  12. package/out/resources/skills/extension-creator/references/command-definition.md +170 -0
  13. package/out/resources/skills/extension-creator/references/config-components.md +427 -0
  14. package/out/resources/skills/extension-creator/references/event-types.md +156 -0
  15. package/out/resources/skills/extension-creator/references/examples-gallery.md +583 -0
  16. package/out/resources/skills/extension-creator/references/extension-interface.md +240 -0
  17. package/out/resources/skills/extension-creator/references/extension-types.md +186 -0
  18. package/out/resources/skills/extension-creator/references/in-repo-flow.md +132 -0
  19. package/out/resources/skills/extension-creator/references/install-targets.md +96 -0
  20. package/out/resources/skills/extension-creator/references/project-global-flow.md +76 -0
  21. package/out/resources/skills/extension-creator/references/ui-components.md +663 -0
  22. package/package.json +1 -1
@@ -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
+ ```