@agentuity/cli 0.0.101 → 0.0.102

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 (210) hide show
  1. package/AGENTS.md +19 -188
  2. package/bin/cli.ts +13 -6
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +41 -12
  5. package/dist/cli.js.map +1 -1
  6. package/dist/cmd/ai/index.d.ts.map +1 -1
  7. package/dist/cmd/ai/index.js +6 -1
  8. package/dist/cmd/ai/index.js.map +1 -1
  9. package/dist/cmd/ai/prompt/agent.d.ts +7 -0
  10. package/dist/cmd/ai/prompt/agent.d.ts.map +1 -1
  11. package/dist/cmd/ai/prompt/agent.js +12 -323
  12. package/dist/cmd/ai/prompt/agent.js.map +1 -1
  13. package/dist/cmd/ai/prompt/api.d.ts +7 -0
  14. package/dist/cmd/ai/prompt/api.d.ts.map +1 -1
  15. package/dist/cmd/ai/prompt/api.js +12 -260
  16. package/dist/cmd/ai/prompt/api.js.map +1 -1
  17. package/dist/cmd/ai/prompt/version.d.ts +35 -0
  18. package/dist/cmd/ai/prompt/version.d.ts.map +1 -0
  19. package/dist/cmd/ai/prompt/version.js +55 -0
  20. package/dist/cmd/ai/prompt/version.js.map +1 -0
  21. package/dist/cmd/ai/prompt/web.d.ts +7 -0
  22. package/dist/cmd/ai/prompt/web.d.ts.map +1 -1
  23. package/dist/cmd/ai/prompt/web.js +12 -283
  24. package/dist/cmd/ai/prompt/web.js.map +1 -1
  25. package/dist/cmd/ai/skills/generate.d.ts +3 -0
  26. package/dist/cmd/ai/skills/generate.d.ts.map +1 -0
  27. package/dist/cmd/ai/skills/generate.js +65 -0
  28. package/dist/cmd/ai/skills/generate.js.map +1 -0
  29. package/dist/cmd/ai/skills/generator.d.ts +4 -0
  30. package/dist/cmd/ai/skills/generator.d.ts.map +1 -0
  31. package/dist/cmd/ai/skills/generator.js +402 -0
  32. package/dist/cmd/ai/skills/generator.js.map +1 -0
  33. package/dist/cmd/ai/skills/index.d.ts +4 -0
  34. package/dist/cmd/ai/skills/index.d.ts.map +1 -0
  35. package/dist/cmd/ai/skills/index.js +21 -0
  36. package/dist/cmd/ai/skills/index.js.map +1 -0
  37. package/dist/cmd/auth/signup.d.ts.map +1 -1
  38. package/dist/cmd/auth/signup.js +1 -0
  39. package/dist/cmd/auth/signup.js.map +1 -1
  40. package/dist/cmd/build/entry-generator.d.ts.map +1 -1
  41. package/dist/cmd/build/entry-generator.js +40 -5
  42. package/dist/cmd/build/entry-generator.js.map +1 -1
  43. package/dist/cmd/build/vite/bun-dev-server.d.ts +7 -1
  44. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
  45. package/dist/cmd/build/vite/bun-dev-server.js +52 -26
  46. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
  47. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -1
  48. package/dist/cmd/build/vite/metadata-generator.js +58 -7
  49. package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
  50. package/dist/cmd/build/vite/prompt-generator.d.ts +23 -0
  51. package/dist/cmd/build/vite/prompt-generator.d.ts.map +1 -0
  52. package/dist/cmd/build/vite/prompt-generator.js +123 -0
  53. package/dist/cmd/build/vite/prompt-generator.js.map +1 -0
  54. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
  55. package/dist/cmd/build/vite/registry-generator.js +28 -11
  56. package/dist/cmd/build/vite/registry-generator.js.map +1 -1
  57. package/dist/cmd/build/vite/server-bundler.d.ts +4 -0
  58. package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -1
  59. package/dist/cmd/build/vite/server-bundler.js +45 -16
  60. package/dist/cmd/build/vite/server-bundler.js.map +1 -1
  61. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
  62. package/dist/cmd/build/vite/vite-asset-server-config.js +4 -0
  63. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
  64. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  65. package/dist/cmd/build/vite/vite-builder.js +99 -87
  66. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  67. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  68. package/dist/cmd/cloud/deploy.js +78 -27
  69. package/dist/cmd/cloud/deploy.js.map +1 -1
  70. package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -1
  71. package/dist/cmd/cloud/keyvalue/create-namespace.js +3 -1
  72. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -1
  73. package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -1
  74. package/dist/cmd/cloud/keyvalue/delete-namespace.js +3 -1
  75. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
  76. package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -1
  77. package/dist/cmd/cloud/keyvalue/delete.js +3 -1
  78. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
  79. package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -1
  80. package/dist/cmd/cloud/keyvalue/set.js +4 -2
  81. package/dist/cmd/cloud/keyvalue/set.js.map +1 -1
  82. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  83. package/dist/cmd/cloud/stream/get.js +2 -13
  84. package/dist/cmd/cloud/stream/get.js.map +1 -1
  85. package/dist/cmd/cloud/vector/delete-namespace.d.ts +3 -0
  86. package/dist/cmd/cloud/vector/delete-namespace.d.ts.map +1 -0
  87. package/dist/cmd/cloud/vector/delete-namespace.js +77 -0
  88. package/dist/cmd/cloud/vector/delete-namespace.js.map +1 -0
  89. package/dist/cmd/cloud/vector/index.d.ts.map +1 -1
  90. package/dist/cmd/cloud/vector/index.js +21 -4
  91. package/dist/cmd/cloud/vector/index.js.map +1 -1
  92. package/dist/cmd/cloud/vector/list-namespaces.d.ts +3 -0
  93. package/dist/cmd/cloud/vector/list-namespaces.d.ts.map +1 -0
  94. package/dist/cmd/cloud/vector/list-namespaces.js +42 -0
  95. package/dist/cmd/cloud/vector/list-namespaces.js.map +1 -0
  96. package/dist/cmd/cloud/vector/stats.d.ts +3 -0
  97. package/dist/cmd/cloud/vector/stats.d.ts.map +1 -0
  98. package/dist/cmd/cloud/vector/stats.js +142 -0
  99. package/dist/cmd/cloud/vector/stats.js.map +1 -0
  100. package/dist/cmd/cloud/vector/upsert.d.ts +3 -0
  101. package/dist/cmd/cloud/vector/upsert.d.ts.map +1 -0
  102. package/dist/cmd/cloud/vector/upsert.js +192 -0
  103. package/dist/cmd/cloud/vector/upsert.js.map +1 -0
  104. package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
  105. package/dist/cmd/dev/file-watcher.js +90 -31
  106. package/dist/cmd/dev/file-watcher.js.map +1 -1
  107. package/dist/cmd/dev/index.d.ts.map +1 -1
  108. package/dist/cmd/dev/index.js +213 -57
  109. package/dist/cmd/dev/index.js.map +1 -1
  110. package/dist/cmd/dev/skills.d.ts +10 -0
  111. package/dist/cmd/dev/skills.d.ts.map +1 -0
  112. package/dist/cmd/dev/skills.js +57 -0
  113. package/dist/cmd/dev/skills.js.map +1 -0
  114. package/dist/cmd/dev/sync.js +7 -7
  115. package/dist/cmd/dev/sync.js.map +1 -1
  116. package/dist/cmd/index.d.ts.map +1 -1
  117. package/dist/cmd/index.js +1 -0
  118. package/dist/cmd/index.js.map +1 -1
  119. package/dist/cmd/project/create.d.ts.map +1 -1
  120. package/dist/cmd/project/create.js +3 -0
  121. package/dist/cmd/project/create.js.map +1 -1
  122. package/dist/cmd/project/template-flow.d.ts +1 -0
  123. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  124. package/dist/cmd/project/template-flow.js +30 -5
  125. package/dist/cmd/project/template-flow.js.map +1 -1
  126. package/dist/cmd/setup/index.d.ts.map +1 -1
  127. package/dist/cmd/setup/index.js +1 -0
  128. package/dist/cmd/setup/index.js.map +1 -1
  129. package/dist/cmd/upgrade/index.d.ts +15 -0
  130. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  131. package/dist/cmd/upgrade/index.js +59 -4
  132. package/dist/cmd/upgrade/index.js.map +1 -1
  133. package/dist/domain.d.ts +45 -0
  134. package/dist/domain.d.ts.map +1 -0
  135. package/dist/domain.js +200 -0
  136. package/dist/domain.js.map +1 -0
  137. package/dist/schema-generator.d.ts +2 -0
  138. package/dist/schema-generator.d.ts.map +1 -1
  139. package/dist/schema-generator.js +18 -0
  140. package/dist/schema-generator.js.map +1 -1
  141. package/dist/steps.d.ts +1 -1
  142. package/dist/steps.d.ts.map +1 -1
  143. package/dist/steps.js +16 -5
  144. package/dist/steps.js.map +1 -1
  145. package/dist/tui/prompt.d.ts +1 -2
  146. package/dist/tui/prompt.d.ts.map +1 -1
  147. package/dist/tui/prompt.js +8 -4
  148. package/dist/tui/prompt.js.map +1 -1
  149. package/dist/tui.d.ts +16 -0
  150. package/dist/tui.d.ts.map +1 -1
  151. package/dist/tui.js +23 -2
  152. package/dist/tui.js.map +1 -1
  153. package/dist/types.d.ts +9 -2
  154. package/dist/types.d.ts.map +1 -1
  155. package/dist/types.js +3 -3
  156. package/dist/types.js.map +1 -1
  157. package/package.json +4 -4
  158. package/src/cli.ts +47 -12
  159. package/src/cmd/ai/index.ts +6 -1
  160. package/src/cmd/ai/prompt/agent.md +306 -0
  161. package/src/cmd/ai/prompt/agent.ts +12 -322
  162. package/src/cmd/ai/prompt/api.md +360 -0
  163. package/src/cmd/ai/prompt/api.ts +13 -260
  164. package/src/cmd/ai/prompt/version.ts +61 -0
  165. package/src/cmd/ai/prompt/web.md +509 -0
  166. package/src/cmd/ai/prompt/web.ts +12 -282
  167. package/src/cmd/ai/skills/generate.ts +75 -0
  168. package/src/cmd/ai/skills/generator.ts +519 -0
  169. package/src/cmd/ai/skills/index.ts +23 -0
  170. package/src/cmd/auth/signup.ts +1 -0
  171. package/src/cmd/build/entry-generator.ts +43 -7
  172. package/src/cmd/build/vite/bun-dev-server.ts +57 -27
  173. package/src/cmd/build/vite/metadata-generator.ts +73 -7
  174. package/src/cmd/build/vite/prompt-generator.ts +169 -0
  175. package/src/cmd/build/vite/registry-generator.ts +33 -10
  176. package/src/cmd/build/vite/server-bundler.ts +53 -22
  177. package/src/cmd/build/vite/vite-asset-server-config.ts +5 -0
  178. package/src/cmd/build/vite/vite-builder.ts +107 -87
  179. package/src/cmd/cloud/deploy.ts +99 -31
  180. package/src/cmd/cloud/keyvalue/create-namespace.ts +3 -1
  181. package/src/cmd/cloud/keyvalue/delete-namespace.ts +3 -1
  182. package/src/cmd/cloud/keyvalue/delete.ts +3 -1
  183. package/src/cmd/cloud/keyvalue/set.ts +4 -2
  184. package/src/cmd/cloud/stream/get.ts +2 -9
  185. package/src/cmd/cloud/vector/delete-namespace.ts +89 -0
  186. package/src/cmd/cloud/vector/index.ts +21 -4
  187. package/src/cmd/cloud/vector/list-namespaces.ts +46 -0
  188. package/src/cmd/cloud/vector/stats.ts +160 -0
  189. package/src/cmd/cloud/vector/upsert.ts +216 -0
  190. package/src/cmd/dev/file-watcher.ts +101 -32
  191. package/src/cmd/dev/index.ts +304 -111
  192. package/src/cmd/dev/skills.ts +82 -0
  193. package/src/cmd/dev/sync.ts +7 -7
  194. package/src/cmd/index.ts +1 -0
  195. package/src/cmd/project/create.ts +3 -0
  196. package/src/cmd/project/template-flow.ts +37 -5
  197. package/src/cmd/setup/index.ts +1 -0
  198. package/src/cmd/upgrade/index.ts +68 -4
  199. package/src/domain.ts +273 -0
  200. package/src/schema-generator.ts +23 -0
  201. package/src/steps.ts +16 -5
  202. package/src/tui/prompt.ts +11 -5
  203. package/src/tui.ts +21 -2
  204. package/src/types/md.d.ts +8 -0
  205. package/src/types.ts +12 -3
  206. package/dist/cmd/cloud/domain.d.ts +0 -17
  207. package/dist/cmd/cloud/domain.d.ts.map +0 -1
  208. package/dist/cmd/cloud/domain.js +0 -79
  209. package/dist/cmd/cloud/domain.js.map +0 -1
  210. package/src/cmd/cloud/domain.ts +0 -100
@@ -1,6 +1,8 @@
1
1
  import { createSubcommand } from '../../../types';
2
2
  import type { CommandContext } from '../../../types';
3
3
  import { getCommand } from '../../../command-prefix';
4
+ import { appendHashComment } from './version';
5
+ import webPromptContent from './web.md' with { type: 'text' };
4
6
 
5
7
  export const webSubcommand = createSubcommand({
6
8
  name: 'web',
@@ -14,288 +16,16 @@ export const webSubcommand = createSubcommand({
14
16
  },
15
17
  });
16
18
 
17
- export function generateLLMPrompt(): string {
18
- return `# Web Folder Guide
19
-
20
- This folder contains your React-based web application that communicates with your Agentuity agents.
21
-
22
- ## Directory Structure
23
-
24
- Required files:
25
- - **App.tsx** (required) - Main React application component
26
- - **frontend.tsx** (required) - Frontend entry point with client-side rendering
27
- - **index.html** (required) - HTML template
28
- - **public/** (optional) - Static assets (images, CSS, JS files)
29
-
30
- Example structure:
31
- \`\`\`
32
- src/web/
33
- ├── App.tsx
34
- ├── frontend.tsx
35
- ├── index.html
36
- └── public/
37
- ├── styles.css
38
- ├── logo.svg
39
- └── script.js
40
- \`\`\`
41
-
42
- ## Creating the Web App
43
-
44
- ### App.tsx - Main Component
45
-
46
- \`\`\`typescript
47
- import { AgentuityProvider, useAgent } from '@agentuity/react';
48
- import { useState } from 'react';
49
-
50
- export function App() {
51
- const [name, setName] = useState('World');
52
- const { run, running, data: greeting } = useAgent('hello');
53
-
54
- return (
55
- <div style={{ fontFamily: 'sans-serif', padding: '2rem' }}>
56
- <AgentuityProvider>
57
- <h1>Welcome to Agentuity</h1>
58
-
59
- <input
60
- type="text"
61
- value={name}
62
- onChange={(e) => setName(e.target.value)}
63
- disabled={running}
64
- />
65
-
66
- <button
67
- onClick={() => run({ name })}
68
- disabled={running}
69
- >
70
- {running ? 'Running...' : 'Say Hello'}
71
- </button>
72
-
73
- <div>{greeting ?? 'Waiting for response'}</div>
74
- </AgentuityProvider>
75
- </div>
76
- );
77
- }
78
- \`\`\`
79
-
80
- ### frontend.tsx - Entry Point
81
-
82
- \`\`\`typescript
83
- import { createRoot } from 'react-dom/client';
84
- import { App } from './App';
85
-
86
- const root = document.getElementById('root');
87
- if (!root) throw new Error('Root element not found');
88
-
89
- createRoot(root).render(<App />);
90
- \`\`\`
91
-
92
- ### index.html - HTML Template
93
-
94
- \`\`\`html
95
- <!DOCTYPE html>
96
- <html lang="en">
97
- <head>
98
- <meta charset="UTF-8">
99
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
100
- <title>My Agentuity App</title>
101
- </head>
102
- <body>
103
- <div id="root"></div>
104
- <script type="module" src="/web/frontend.tsx"></script>
105
- </body>
106
- </html>
107
- \`\`\`
108
-
109
- ## React Hooks
110
-
111
- ### useAgent - Call Agents
112
-
113
- \`\`\`typescript
114
- import { useAgent } from '@agentuity/react';
115
-
116
- function MyComponent() {
117
- const { run, running, data, error } = useAgent('myAgent');
118
-
119
- return (
120
- <button onClick={() => run({ input: 'value' })}>
121
- {running ? 'Running...' : 'Call Agent'}
122
- </button>
123
- );
19
+ /**
20
+ * Get the raw prompt content without hash.
21
+ */
22
+ export function getPromptContent(): string {
23
+ return webPromptContent;
124
24
  }
125
- \`\`\`
126
25
 
127
- ### useAgentWebsocket - WebSocket Connection
128
-
129
- \`\`\`typescript
130
- import { useAgentWebsocket } from '@agentuity/react';
131
-
132
- function MyComponent() {
133
- const { connected, send, data } = useAgentWebsocket('websocket');
134
-
135
- return (
136
- <div>
137
- <p>Status: {connected ? 'Connected' : 'Disconnected'}</p>
138
- <button onClick={() => send('Hello')}>Send Message</button>
139
- <p>Received: {data}</p>
140
- </div>
141
- );
142
- }
143
- \`\`\`
144
-
145
- ### useAgentEventStream - Server-Sent Events
146
-
147
- \`\`\`typescript
148
- import { useAgentEventStream } from '@agentuity/react';
149
-
150
- function MyComponent() {
151
- const { connected, data, error } = useAgentEventStream('sse');
152
-
153
- return (
154
- <div>
155
- <p>Connected: {connected ? 'Yes' : 'No'}</p>
156
- {error && <p>Error: {error.message}</p>}
157
- <p>Data: {data}</p>
158
- </div>
159
- );
160
- }
161
- \`\`\`
162
-
163
- ## Complete Example
164
-
165
- \`\`\`typescript
166
- import { AgentuityProvider, useAgent, useAgentWebsocket } from '@agentuity/react';
167
- import { useEffect, useState } from 'react';
168
-
169
- export function App() {
170
- const [count, setCount] = useState(0);
171
- const { run, data: agentResult } = useAgent('simple');
172
- const { connected, send, data: wsMessage } = useAgentWebsocket('websocket');
173
-
174
- useEffect(() => {
175
- // Send WebSocket message every second
176
- const interval = setInterval(() => {
177
- send(\`Message at \${new Date().toISOString()}\`);
178
- }, 1000);
179
- return () => clearInterval(interval);
180
- }, [send]);
181
-
182
- return (
183
- <div style={{ fontFamily: 'sans-serif', padding: '2rem' }}>
184
- <AgentuityProvider>
185
- <h1>My Agentuity App</h1>
186
-
187
- <div>
188
- <p>Count: {count}</p>
189
- <button onClick={() => setCount(c => c + 1)}>
190
- Increment
191
- </button>
192
- </div>
193
-
194
- <div>
195
- <button onClick={() => run({ name: 'Jeff', age: 30 })}>
196
- Call Agent
197
- </button>
198
- <p>{agentResult}</p>
199
- </div>
200
-
201
- <div>
202
- <strong>WebSocket:</strong>
203
- {connected ? JSON.stringify(wsMessage) : 'Not connected'}
204
- </div>
205
- </AgentuityProvider>
206
- </div>
207
- );
208
- }
209
- \`\`\`
210
-
211
- ## Static Assets
212
-
213
- Place static files in the **public/** folder:
214
-
215
- \`\`\`
216
- src/web/public/
217
- ├── logo.svg
218
- ├── styles.css
219
- └── script.js
220
- \`\`\`
221
-
222
- Reference them in your HTML or components:
223
-
224
- \`\`\`html
225
- <!-- In index.html -->
226
- <link rel="stylesheet" href="/public/styles.css">
227
- <script src="/public/script.js"></script>
228
- \`\`\`
229
-
230
- \`\`\`typescript
231
- // In React components
232
- <img src="/public/logo.svg" alt="Logo" />
233
- \`\`\`
234
-
235
- ## Styling
236
-
237
- ### Inline Styles
238
-
239
- \`\`\`typescript
240
- <div style={{ backgroundColor: '#000', color: '#fff', padding: '1rem' }}>
241
- Styled content
242
- </div>
243
- \`\`\`
244
-
245
- ### CSS Files
246
-
247
- Create \`public/styles.css\`:
248
-
249
- \`\`\`css
250
- body {
251
- background-color: #09090b;
252
- color: #fff;
253
- font-family: sans-serif;
254
- }
255
- \`\`\`
256
-
257
- Import in \`index.html\`:
258
-
259
- \`\`\`html
260
- <link rel="stylesheet" href="/public/styles.css">
261
- \`\`\`
262
-
263
- ### Style Tag in Component
264
-
265
- \`\`\`typescript
266
- <div>
267
- <button className="glow-btn">Click me</button>
268
- <style>{\`
269
- .glow-btn {
270
- background: linear-gradient(to right, #155e75, #3b82f6);
271
- border: none;
272
- padding: 0.75rem 1.5rem;
273
- color: white;
274
- cursor: pointer;
275
- }
276
- \`}</style>
277
- </div>
278
- \`\`\`
279
-
280
- ## Best Practices
281
-
282
- - Wrap your app with **AgentuityProvider** for hooks to work
283
- - Use **useAgent** for one-off agent calls
284
- - Use **useAgentWebsocket** for bidirectional real-time communication
285
- - Use **useAgentEventStream** for server-to-client streaming
286
- - Place reusable components in separate files
287
- - Keep static assets in the **public/** folder
288
- - Use TypeScript for type safety
289
- - Handle loading and error states in UI
290
-
291
- ## Rules
292
-
293
- - **App.tsx** must export a function named \`App\`
294
- - **frontend.tsx** must render the \`App\` component to \`#root\`
295
- - **index.html** must have a \`<div id="root"></div>\`
296
- - All agents are accessible via \`useAgent('agentName')\`
297
- - The web app is served at \`/\` by default
298
- - Static files in \`public/\` are served at \`/public/*\`
299
- - Module script tag: \`<script type="module" src="/web/frontend.tsx"></script>\`
300
- `;
26
+ /**
27
+ * Generate the web prompt with hash comment.
28
+ */
29
+ export function generateLLMPrompt(): string {
30
+ return appendHashComment(webPromptContent);
301
31
  }
@@ -0,0 +1,75 @@
1
+ import { z } from 'zod';
2
+ import { createSubcommand, type CommandContext } from '../../../types';
3
+ import { getCommand } from '../../../command-prefix';
4
+ import { ErrorCode } from '../../../errors';
5
+ import type { CLISchema } from '../../../schema-generator';
6
+ import * as tui from '../../../tui';
7
+ import * as path from 'node:path';
8
+ import { generateSkills, collectSkillsForPreview } from './generator';
9
+
10
+ const OptionsSchema = z.object({
11
+ output: z.string().describe('Output directory for generated skills'),
12
+ includeHidden: z.boolean().default(false).describe('Include hidden commands'),
13
+ });
14
+
15
+ export const generateSubcommand = createSubcommand({
16
+ name: 'generate',
17
+ description: 'Generate Agent Skills from CLI schema',
18
+ tags: ['fast'],
19
+ idempotent: true,
20
+ examples: [
21
+ {
22
+ command: getCommand('ai skills generate --output ./skills'),
23
+ description: 'Generate skills to a directory',
24
+ },
25
+ {
26
+ command: getCommand('--dry-run ai skills generate --output ./skills'),
27
+ description: 'Preview without writing files',
28
+ },
29
+ {
30
+ command: getCommand('ai skills generate --output ./skills --include-hidden'),
31
+ description: 'Include hidden commands',
32
+ },
33
+ ],
34
+ schema: {
35
+ options: OptionsSchema,
36
+ },
37
+ async handler(ctx: CommandContext<undefined, undefined, undefined, typeof OptionsSchema>) {
38
+ const { logger, opts, options } = ctx;
39
+ const { output, includeHidden } = opts;
40
+ const dryRun = options.dryRun === true;
41
+
42
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ const schema = (global as any).__CLI_SCHEMA__ as CLISchema | undefined;
44
+
45
+ if (!schema) {
46
+ return logger.fatal('Schema not available. This is a CLI bug.', ErrorCode.INTERNAL_ERROR);
47
+ }
48
+
49
+ const baseDir = path.join(output, 'skills', 'agentuity', 'cli');
50
+
51
+ if (dryRun) {
52
+ const skills = collectSkillsForPreview(schema, output, includeHidden);
53
+ if (skills.length === 0) {
54
+ logger.warn('No skills to generate');
55
+ return;
56
+ }
57
+ tui.info(`Would generate ${skills.length} skills:`);
58
+ for (const skillPath of skills) {
59
+ console.log(tui.muted(` ${skillPath}`));
60
+ }
61
+ return;
62
+ }
63
+
64
+ const created = await generateSkills(schema, output, includeHidden);
65
+
66
+ if (created === 0) {
67
+ logger.warn('No skills to generate');
68
+ return;
69
+ }
70
+
71
+ tui.success(`Generated ${created} skills to ${baseDir}`);
72
+ },
73
+ });
74
+
75
+ export default generateSubcommand;