@agentuity/cli 0.0.100 → 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 (264) hide show
  1. package/AGENTS.md +19 -188
  2. package/bin/cli.ts +13 -6
  3. package/dist/api.d.ts +1 -0
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +1 -1
  6. package/dist/api.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +41 -12
  9. package/dist/cli.js.map +1 -1
  10. package/dist/cmd/ai/index.d.ts.map +1 -1
  11. package/dist/cmd/ai/index.js +6 -1
  12. package/dist/cmd/ai/index.js.map +1 -1
  13. package/dist/cmd/ai/prompt/agent.d.ts +7 -0
  14. package/dist/cmd/ai/prompt/agent.d.ts.map +1 -1
  15. package/dist/cmd/ai/prompt/agent.js +12 -323
  16. package/dist/cmd/ai/prompt/agent.js.map +1 -1
  17. package/dist/cmd/ai/prompt/api.d.ts +7 -0
  18. package/dist/cmd/ai/prompt/api.d.ts.map +1 -1
  19. package/dist/cmd/ai/prompt/api.js +12 -260
  20. package/dist/cmd/ai/prompt/api.js.map +1 -1
  21. package/dist/cmd/ai/prompt/version.d.ts +35 -0
  22. package/dist/cmd/ai/prompt/version.d.ts.map +1 -0
  23. package/dist/cmd/ai/prompt/version.js +55 -0
  24. package/dist/cmd/ai/prompt/version.js.map +1 -0
  25. package/dist/cmd/ai/prompt/web.d.ts +7 -0
  26. package/dist/cmd/ai/prompt/web.d.ts.map +1 -1
  27. package/dist/cmd/ai/prompt/web.js +12 -283
  28. package/dist/cmd/ai/prompt/web.js.map +1 -1
  29. package/dist/cmd/ai/skills/generate.d.ts +3 -0
  30. package/dist/cmd/ai/skills/generate.d.ts.map +1 -0
  31. package/dist/cmd/ai/skills/generate.js +65 -0
  32. package/dist/cmd/ai/skills/generate.js.map +1 -0
  33. package/dist/cmd/ai/skills/generator.d.ts +4 -0
  34. package/dist/cmd/ai/skills/generator.d.ts.map +1 -0
  35. package/dist/cmd/ai/skills/generator.js +402 -0
  36. package/dist/cmd/ai/skills/generator.js.map +1 -0
  37. package/dist/cmd/ai/skills/index.d.ts +4 -0
  38. package/dist/cmd/ai/skills/index.d.ts.map +1 -0
  39. package/dist/cmd/ai/skills/index.js +21 -0
  40. package/dist/cmd/ai/skills/index.js.map +1 -0
  41. package/dist/cmd/auth/signup.d.ts.map +1 -1
  42. package/dist/cmd/auth/signup.js +1 -0
  43. package/dist/cmd/auth/signup.js.map +1 -1
  44. package/dist/cmd/build/ast.d.ts +2 -1
  45. package/dist/cmd/build/ast.d.ts.map +1 -1
  46. package/dist/cmd/build/ast.js +135 -47
  47. package/dist/cmd/build/ast.js.map +1 -1
  48. package/dist/cmd/build/entry-generator.d.ts.map +1 -1
  49. package/dist/cmd/build/entry-generator.js +255 -188
  50. package/dist/cmd/build/entry-generator.js.map +1 -1
  51. package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -1
  52. package/dist/cmd/build/vite/agent-discovery.js +103 -45
  53. package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
  54. package/dist/cmd/build/vite/bun-dev-server.d.ts +7 -1
  55. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
  56. package/dist/cmd/build/vite/bun-dev-server.js +52 -26
  57. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
  58. package/dist/cmd/build/vite/docs-generator.d.ts +13 -0
  59. package/dist/cmd/build/vite/docs-generator.d.ts.map +1 -0
  60. package/dist/cmd/build/vite/docs-generator.js +81 -0
  61. package/dist/cmd/build/vite/docs-generator.js.map +1 -0
  62. package/dist/cmd/build/vite/index.d.ts +3 -3
  63. package/dist/cmd/build/vite/index.d.ts.map +1 -1
  64. package/dist/cmd/build/vite/index.js +9 -7
  65. package/dist/cmd/build/vite/index.js.map +1 -1
  66. package/dist/cmd/build/vite/lifecycle-generator.d.ts +1 -1
  67. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -1
  68. package/dist/cmd/build/vite/lifecycle-generator.js +19 -5
  69. package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -1
  70. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -1
  71. package/dist/cmd/build/vite/metadata-generator.js +203 -7
  72. package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
  73. package/dist/cmd/build/vite/prompt-generator.d.ts +23 -0
  74. package/dist/cmd/build/vite/prompt-generator.d.ts.map +1 -0
  75. package/dist/cmd/build/vite/prompt-generator.js +123 -0
  76. package/dist/cmd/build/vite/prompt-generator.js.map +1 -0
  77. package/dist/cmd/build/vite/registry-generator.d.ts +3 -3
  78. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
  79. package/dist/cmd/build/vite/registry-generator.js +644 -103
  80. package/dist/cmd/build/vite/registry-generator.js.map +1 -1
  81. package/dist/cmd/build/vite/route-discovery.d.ts +4 -0
  82. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
  83. package/dist/cmd/build/vite/route-discovery.js.map +1 -1
  84. package/dist/cmd/build/vite/server-bundler.d.ts +4 -0
  85. package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -1
  86. package/dist/cmd/build/vite/server-bundler.js +63 -17
  87. package/dist/cmd/build/vite/server-bundler.js.map +1 -1
  88. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
  89. package/dist/cmd/build/vite/vite-asset-server-config.js +4 -0
  90. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
  91. package/dist/cmd/build/vite/vite-builder.d.ts +1 -1
  92. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  93. package/dist/cmd/build/vite/vite-builder.js +118 -96
  94. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  95. package/dist/cmd/build/vite-bundler.js +6 -6
  96. package/dist/cmd/build/vite-bundler.js.map +1 -1
  97. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  98. package/dist/cmd/cloud/deploy.js +89 -32
  99. package/dist/cmd/cloud/deploy.js.map +1 -1
  100. package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -1
  101. package/dist/cmd/cloud/keyvalue/create-namespace.js +3 -1
  102. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -1
  103. package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -1
  104. package/dist/cmd/cloud/keyvalue/delete-namespace.js +3 -1
  105. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
  106. package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -1
  107. package/dist/cmd/cloud/keyvalue/delete.js +3 -1
  108. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
  109. package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -1
  110. package/dist/cmd/cloud/keyvalue/set.js +4 -2
  111. package/dist/cmd/cloud/keyvalue/set.js.map +1 -1
  112. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  113. package/dist/cmd/cloud/stream/get.js +2 -13
  114. package/dist/cmd/cloud/stream/get.js.map +1 -1
  115. package/dist/cmd/cloud/vector/delete-namespace.d.ts +3 -0
  116. package/dist/cmd/cloud/vector/delete-namespace.d.ts.map +1 -0
  117. package/dist/cmd/cloud/vector/delete-namespace.js +77 -0
  118. package/dist/cmd/cloud/vector/delete-namespace.js.map +1 -0
  119. package/dist/cmd/cloud/vector/index.d.ts.map +1 -1
  120. package/dist/cmd/cloud/vector/index.js +21 -4
  121. package/dist/cmd/cloud/vector/index.js.map +1 -1
  122. package/dist/cmd/cloud/vector/list-namespaces.d.ts +3 -0
  123. package/dist/cmd/cloud/vector/list-namespaces.d.ts.map +1 -0
  124. package/dist/cmd/cloud/vector/list-namespaces.js +42 -0
  125. package/dist/cmd/cloud/vector/list-namespaces.js.map +1 -0
  126. package/dist/cmd/cloud/vector/stats.d.ts +3 -0
  127. package/dist/cmd/cloud/vector/stats.d.ts.map +1 -0
  128. package/dist/cmd/cloud/vector/stats.js +142 -0
  129. package/dist/cmd/cloud/vector/stats.js.map +1 -0
  130. package/dist/cmd/cloud/vector/upsert.d.ts +3 -0
  131. package/dist/cmd/cloud/vector/upsert.d.ts.map +1 -0
  132. package/dist/cmd/cloud/vector/upsert.js +192 -0
  133. package/dist/cmd/cloud/vector/upsert.js.map +1 -0
  134. package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
  135. package/dist/cmd/dev/file-watcher.js +94 -33
  136. package/dist/cmd/dev/file-watcher.js.map +1 -1
  137. package/dist/cmd/dev/index.d.ts.map +1 -1
  138. package/dist/cmd/dev/index.js +298 -61
  139. package/dist/cmd/dev/index.js.map +1 -1
  140. package/dist/cmd/dev/skills.d.ts +10 -0
  141. package/dist/cmd/dev/skills.d.ts.map +1 -0
  142. package/dist/cmd/dev/skills.js +57 -0
  143. package/dist/cmd/dev/skills.js.map +1 -0
  144. package/dist/cmd/dev/sync.d.ts.map +1 -1
  145. package/dist/cmd/dev/sync.js +19 -3
  146. package/dist/cmd/dev/sync.js.map +1 -1
  147. package/dist/cmd/index.d.ts.map +1 -1
  148. package/dist/cmd/index.js +1 -0
  149. package/dist/cmd/index.js.map +1 -1
  150. package/dist/cmd/project/create.d.ts.map +1 -1
  151. package/dist/cmd/project/create.js +3 -0
  152. package/dist/cmd/project/create.js.map +1 -1
  153. package/dist/cmd/project/template-flow.d.ts +1 -0
  154. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  155. package/dist/cmd/project/template-flow.js +30 -5
  156. package/dist/cmd/project/template-flow.js.map +1 -1
  157. package/dist/cmd/setup/index.d.ts.map +1 -1
  158. package/dist/cmd/setup/index.js +1 -0
  159. package/dist/cmd/setup/index.js.map +1 -1
  160. package/dist/cmd/upgrade/index.d.ts +15 -0
  161. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  162. package/dist/cmd/upgrade/index.js +59 -4
  163. package/dist/cmd/upgrade/index.js.map +1 -1
  164. package/dist/config.d.ts.map +1 -1
  165. package/dist/config.js +8 -0
  166. package/dist/config.js.map +1 -1
  167. package/dist/domain.d.ts +45 -0
  168. package/dist/domain.d.ts.map +1 -0
  169. package/dist/domain.js +200 -0
  170. package/dist/domain.js.map +1 -0
  171. package/dist/index.d.ts +0 -1
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +0 -1
  174. package/dist/index.js.map +1 -1
  175. package/dist/schema-generator.d.ts +2 -0
  176. package/dist/schema-generator.d.ts.map +1 -1
  177. package/dist/schema-generator.js +18 -0
  178. package/dist/schema-generator.js.map +1 -1
  179. package/dist/steps.d.ts +1 -1
  180. package/dist/steps.d.ts.map +1 -1
  181. package/dist/steps.js +16 -5
  182. package/dist/steps.js.map +1 -1
  183. package/dist/tui/prompt.d.ts +1 -2
  184. package/dist/tui/prompt.d.ts.map +1 -1
  185. package/dist/tui/prompt.js +8 -4
  186. package/dist/tui/prompt.js.map +1 -1
  187. package/dist/tui.d.ts +16 -0
  188. package/dist/tui.d.ts.map +1 -1
  189. package/dist/tui.js +23 -2
  190. package/dist/tui.js.map +1 -1
  191. package/dist/types.d.ts +9 -2
  192. package/dist/types.d.ts.map +1 -1
  193. package/dist/types.js +3 -3
  194. package/dist/types.js.map +1 -1
  195. package/package.json +5 -8
  196. package/src/api.ts +1 -1
  197. package/src/cli.ts +47 -12
  198. package/src/cmd/ai/index.ts +6 -1
  199. package/src/cmd/ai/prompt/agent.md +306 -0
  200. package/src/cmd/ai/prompt/agent.ts +12 -322
  201. package/src/cmd/ai/prompt/api.md +360 -0
  202. package/src/cmd/ai/prompt/api.ts +13 -260
  203. package/src/cmd/ai/prompt/version.ts +61 -0
  204. package/src/cmd/ai/prompt/web.md +509 -0
  205. package/src/cmd/ai/prompt/web.ts +12 -282
  206. package/src/cmd/ai/skills/generate.ts +75 -0
  207. package/src/cmd/ai/skills/generator.ts +519 -0
  208. package/src/cmd/ai/skills/index.ts +23 -0
  209. package/src/cmd/auth/signup.ts +1 -0
  210. package/src/cmd/build/ast.ts +161 -48
  211. package/src/cmd/build/entry-generator.ts +258 -187
  212. package/src/cmd/build/vite/agent-discovery.ts +151 -58
  213. package/src/cmd/build/vite/bun-dev-server.ts +57 -27
  214. package/src/cmd/build/vite/docs-generator.ts +87 -0
  215. package/src/cmd/build/vite/index.ts +9 -7
  216. package/src/cmd/build/vite/lifecycle-generator.ts +19 -5
  217. package/src/cmd/build/vite/metadata-generator.ts +251 -7
  218. package/src/cmd/build/vite/prompt-generator.ts +169 -0
  219. package/src/cmd/build/vite/registry-generator.ts +750 -108
  220. package/src/cmd/build/vite/route-discovery.ts +4 -0
  221. package/src/cmd/build/vite/server-bundler.ts +73 -23
  222. package/src/cmd/build/vite/vite-asset-server-config.ts +5 -0
  223. package/src/cmd/build/vite/vite-builder.ts +134 -100
  224. package/src/cmd/build/vite-bundler.ts +6 -6
  225. package/src/cmd/cloud/deploy.ts +114 -36
  226. package/src/cmd/cloud/keyvalue/create-namespace.ts +3 -1
  227. package/src/cmd/cloud/keyvalue/delete-namespace.ts +3 -1
  228. package/src/cmd/cloud/keyvalue/delete.ts +3 -1
  229. package/src/cmd/cloud/keyvalue/set.ts +4 -2
  230. package/src/cmd/cloud/stream/get.ts +2 -9
  231. package/src/cmd/cloud/vector/delete-namespace.ts +89 -0
  232. package/src/cmd/cloud/vector/index.ts +21 -4
  233. package/src/cmd/cloud/vector/list-namespaces.ts +46 -0
  234. package/src/cmd/cloud/vector/stats.ts +160 -0
  235. package/src/cmd/cloud/vector/upsert.ts +216 -0
  236. package/src/cmd/dev/file-watcher.ts +109 -34
  237. package/src/cmd/dev/index.ts +364 -60
  238. package/src/cmd/dev/skills.ts +82 -0
  239. package/src/cmd/dev/sync.ts +41 -6
  240. package/src/cmd/index.ts +1 -0
  241. package/src/cmd/project/create.ts +3 -0
  242. package/src/cmd/project/template-flow.ts +37 -5
  243. package/src/cmd/setup/index.ts +1 -0
  244. package/src/cmd/upgrade/index.ts +68 -4
  245. package/src/config.ts +9 -0
  246. package/src/domain.ts +273 -0
  247. package/src/index.ts +0 -5
  248. package/src/runtime-bootstrap.md +1 -1
  249. package/src/schema-generator.ts +23 -0
  250. package/src/steps.ts +16 -5
  251. package/src/tui/prompt.ts +11 -5
  252. package/src/tui.ts +21 -2
  253. package/src/types/md.d.ts +8 -0
  254. package/src/types.ts +12 -3
  255. package/dist/cmd/cloud/domain.d.ts +0 -17
  256. package/dist/cmd/cloud/domain.d.ts.map +0 -1
  257. package/dist/cmd/cloud/domain.js +0 -79
  258. package/dist/cmd/cloud/domain.js.map +0 -1
  259. package/dist/runtime-bootstrap.d.ts +0 -56
  260. package/dist/runtime-bootstrap.d.ts.map +0 -1
  261. package/dist/runtime-bootstrap.js +0 -95
  262. package/dist/runtime-bootstrap.js.map +0 -1
  263. package/src/cmd/cloud/domain.ts +0 -100
  264. package/src/runtime-bootstrap.ts +0 -131
@@ -25,6 +25,7 @@ interface AssetInfo {
25
25
  kind: string;
26
26
  contentType: string;
27
27
  size: number;
28
+ contentEncoding?: string;
28
29
  }
29
30
 
30
31
  function getContentType(filename: string): string {
@@ -65,6 +66,59 @@ function getContentType(filename: string): string {
65
66
  }
66
67
  }
67
68
 
69
+ /**
70
+ * Determine if an asset should be compressed with gzip.
71
+ * The result is included in asset metadata so the API can generate
72
+ * presigned URLs with matching Content-Encoding.
73
+ */
74
+ function shouldCompressAsset(asset: {
75
+ filename: string;
76
+ contentType: string;
77
+ kind: string;
78
+ }): boolean {
79
+ const ct = asset.contentType.toLowerCase();
80
+ const filename = asset.filename.toLowerCase();
81
+
82
+ if (ct.startsWith('image/') && ct !== 'image/svg+xml') {
83
+ return false;
84
+ }
85
+ if (ct.startsWith('video/') || ct.startsWith('audio/')) {
86
+ return false;
87
+ }
88
+ if (ct === 'font/woff' || ct === 'font/woff2') {
89
+ return false;
90
+ }
91
+ if (/\.(zip|gz|tgz|tar|bz2|br)$/.test(filename)) {
92
+ return false;
93
+ }
94
+
95
+ if (
96
+ ct.startsWith('text/') ||
97
+ ct === 'application/javascript' ||
98
+ ct === 'application/json' ||
99
+ ct === 'application/xml' ||
100
+ ct === 'application/xhtml+xml' ||
101
+ ct === 'image/svg+xml'
102
+ ) {
103
+ return true;
104
+ }
105
+
106
+ if (ct === 'font/ttf' || ct === 'application/vnd.ms-fontobject') {
107
+ return true;
108
+ }
109
+
110
+ if (
111
+ asset.kind === 'entry-point' ||
112
+ asset.kind === 'script' ||
113
+ asset.kind === 'stylesheet' ||
114
+ asset.kind === 'sourcemap'
115
+ ) {
116
+ return true;
117
+ }
118
+
119
+ return false;
120
+ }
121
+
68
122
  function getAssetKind(filename: string, isEntry: boolean = false): string {
69
123
  const ext = filename.split('.').pop()?.toLowerCase();
70
124
 
@@ -220,12 +274,18 @@ export async function generateMetadata(options: MetadataGeneratorOptions): Promi
220
274
  }
221
275
 
222
276
  seenAssets.add(assetPath);
223
- assets.push({
277
+ const kind = getAssetKind(relativePath, isEntry);
278
+ const contentType = getContentType(relativePath);
279
+ const assetInfo: AssetInfo = {
224
280
  filename: assetPath,
225
- kind: getAssetKind(relativePath, isEntry),
226
- contentType: getContentType(relativePath),
281
+ kind,
282
+ contentType,
227
283
  size: stats.size,
228
- });
284
+ };
285
+ if (shouldCompressAsset(assetInfo)) {
286
+ assetInfo.contentEncoding = 'gzip';
287
+ }
288
+ assets.push(assetInfo);
229
289
  }
230
290
  };
231
291
 
@@ -328,12 +388,17 @@ export async function generateMetadata(options: MetadataGeneratorOptions): Promi
328
388
  const assetPath = `public/${relativePath}`;
329
389
  if (!seenAssets.has(assetPath)) {
330
390
  seenAssets.add(assetPath);
331
- assets.push({
391
+ const contentType = getContentType(entry.name);
392
+ const assetInfo: AssetInfo = {
332
393
  filename: assetPath,
333
394
  kind: 'static',
334
- contentType: getContentType(entry.name),
395
+ contentType,
335
396
  size: stats.size,
336
- });
397
+ };
398
+ if (shouldCompressAsset(assetInfo)) {
399
+ assetInfo.contentEncoding = 'gzip';
400
+ }
401
+ assets.push(assetInfo);
337
402
  }
338
403
  }
339
404
  }
@@ -548,6 +613,176 @@ async function getGitInfo(
548
613
  }
549
614
  }
550
615
 
616
+ /**
617
+ * Generate AGENTS.md content for AI coding agents
618
+ */
619
+ function generateAgentsMd(metadata: BuildMetadata): string {
620
+ const lines: string[] = [];
621
+
622
+ lines.push('# Compiled Agentuity Application');
623
+ lines.push('');
624
+ lines.push(
625
+ 'This directory contains compiled and bundled source code from an Agentuity application.'
626
+ );
627
+ lines.push('');
628
+
629
+ // Add source repository info if available
630
+ if (metadata.deployment?.git?.repo) {
631
+ lines.push('## Source Repository');
632
+ lines.push('');
633
+ lines.push(`**Repository:** ${metadata.deployment.git.repo}`);
634
+
635
+ if (metadata.deployment.git.branch) {
636
+ lines.push(`**Branch:** ${metadata.deployment.git.branch}`);
637
+ }
638
+
639
+ if (metadata.deployment.git.commit) {
640
+ const shortCommit = metadata.deployment.git.commit.substring(0, 7);
641
+ const commitUrl = metadata.deployment.git.repo.endsWith('.git')
642
+ ? metadata.deployment.git.repo.slice(0, -4)
643
+ : metadata.deployment.git.repo;
644
+ lines.push(
645
+ `**Commit:** [\`${shortCommit}\`](${commitUrl}/commit/${metadata.deployment.git.commit})`
646
+ );
647
+ }
648
+
649
+ if (metadata.deployment.git.message) {
650
+ lines.push(`**Message:** ${metadata.deployment.git.message}`);
651
+ }
652
+
653
+ lines.push('');
654
+ }
655
+
656
+ // Add build info
657
+ lines.push('## Build Information');
658
+ lines.push('');
659
+ if (metadata.project?.name) {
660
+ lines.push(
661
+ `**Project:** ${metadata.project.name}${metadata.project.version ? ` v${metadata.project.version}` : ''}`
662
+ );
663
+ }
664
+ if (metadata.project?.id) {
665
+ lines.push(`**Project ID:** ${metadata.project.id}`);
666
+ }
667
+ if (metadata.project?.orgId) {
668
+ lines.push(`**Org ID:** ${metadata.project.orgId}`);
669
+ }
670
+ if (metadata.deployment.id) {
671
+ lines.push(`**Deployment ID:** ${metadata.deployment.id}`);
672
+ }
673
+ if (metadata.deployment?.build) {
674
+ lines.push(
675
+ `**Built with:** Agentuity CLI v${metadata.deployment.build.agentuity}, Bun v${metadata.deployment.build.bun}`
676
+ );
677
+ lines.push(
678
+ `**Platform:** ${metadata.deployment.build.platform}-${metadata.deployment.build.arch}`
679
+ );
680
+ }
681
+ if (metadata.deployment?.date) {
682
+ lines.push(`**Build date:** ${metadata.deployment.date}`);
683
+ }
684
+ lines.push('');
685
+
686
+ // Add structure overview
687
+ lines.push('## Structure');
688
+ lines.push('');
689
+ lines.push('```');
690
+ lines.push('.agentuity/');
691
+ lines.push('├── app.js # Bundled server application');
692
+ lines.push('├── agentuity.metadata.json # Build metadata and schemas');
693
+ if (metadata.assets?.some((a) => a.filename.startsWith('client/'))) {
694
+ lines.push('├── client/ # Frontend assets (fallback, CDN by default)');
695
+ }
696
+ if (metadata.assets?.some((a) => a.filename.startsWith('public/'))) {
697
+ lines.push('├── public/ # Static assets');
698
+ }
699
+ lines.push('└── AGENTS.md # This file');
700
+ lines.push('```');
701
+ lines.push('');
702
+
703
+ // Add agent/route details
704
+ if (metadata.agents && metadata.agents.length > 0) {
705
+ lines.push('## Agents');
706
+ lines.push('');
707
+ lines.push(`This application defines ${metadata.agents.length} agent(s):`);
708
+ lines.push('');
709
+ for (const agent of metadata.agents) {
710
+ lines.push(`- **${agent.name}** (ID: \`${agent.id}\`)`);
711
+ }
712
+ lines.push('');
713
+ }
714
+
715
+ if (metadata.routes && metadata.routes.length > 0) {
716
+ lines.push('## Routes');
717
+ lines.push('');
718
+ lines.push(`This application defines ${metadata.routes.length} route(s):`);
719
+ lines.push('');
720
+ for (const route of metadata.routes) {
721
+ lines.push(`- \`${route.method.toUpperCase()} ${route.path}\` (${route.type})`);
722
+ }
723
+ lines.push('');
724
+ }
725
+
726
+ // Add runtime environment info
727
+ lines.push('## Runtime Environment');
728
+ lines.push('');
729
+ lines.push('When deployed, this application runs in a managed runtime environment with:');
730
+ lines.push('');
731
+ lines.push('**User & Permissions:**');
732
+ lines.push('- User: `agentuity` (UID: 1022, GID: 1777)');
733
+ lines.push('- Home directory: `/home/agentuity`');
734
+ lines.push('- Working directory: `/home/agentuity/app` (application code deployed here)');
735
+ lines.push('- Logs directory: `/home/agentuity/logs`');
736
+ lines.push('- Temp directory: `/home/agentuity/tmp`');
737
+ lines.push('');
738
+ lines.push('**Pre-installed Tools:**');
739
+ lines.push('- **Runtimes:** Node.js 24, Bun 1.x');
740
+ lines.push('- **AI Tools:** Amp, Opencode AI, Claude Code');
741
+ lines.push('- **Version Control:** git, GitHub CLI (gh)');
742
+ lines.push('- **Browser Automation:** Chromium, ChromeDriver, Xvfb (headless display)');
743
+ lines.push('- **Media Processing:** ffmpeg');
744
+ lines.push('- **Network Tools:** curl, wget, netcat, dnsutils');
745
+ lines.push('- **Other:** openssh-client, openssh-sftp-server, strace, unzip, fuse');
746
+ lines.push('');
747
+ lines.push('**Environment Variables:**');
748
+ lines.push('- `AGENTUITY_DATA_DIR=/home/agentuity/data` - Persistent data storage');
749
+ lines.push('- `AGENTUITY_LOG_DIR=/home/agentuity/logs` - Application logs');
750
+ lines.push('- `CHROME_BIN=/usr/bin/chromium` - Chromium browser path');
751
+ lines.push('- `DISPLAY=:99` - X11 display for headless browser');
752
+ lines.push(
753
+ '- `PATH` includes `/home/agentuity/.local/bin` and `/home/agentuity/.agentuity/bin`'
754
+ );
755
+ lines.push('');
756
+ lines.push('**Ports:**');
757
+ lines.push(
758
+ '- `3000: This default port that the project is running. Use PORT environment if not available'
759
+ );
760
+ lines.push('');
761
+
762
+ // Add note about metadata
763
+ lines.push('## For AI Coding Agents');
764
+ lines.push('');
765
+ lines.push(
766
+ 'This is production-ready compiled code. For development and source code modifications:'
767
+ );
768
+ lines.push('');
769
+ if (metadata.deployment?.git?.repo) {
770
+ lines.push(`1. Clone the source repository: ${metadata.deployment.git.repo}`);
771
+ lines.push('2. Make changes to source files in `src/`');
772
+ lines.push('3. Run `agentuity build` to rebuild this bundle');
773
+ } else {
774
+ lines.push('1. Locate the original source repository');
775
+ lines.push('2. Make changes to source files in `src/`');
776
+ lines.push('3. Run `agentuity build` to rebuild this bundle');
777
+ }
778
+ lines.push('');
779
+ lines.push(
780
+ 'See `agentuity.metadata.json` for detailed information about agents, routes, and schemas.'
781
+ );
782
+
783
+ return lines.join('\n');
784
+ }
785
+
551
786
  /**
552
787
  * Write agentuity.metadata.json to .agentuity directory
553
788
  */
@@ -569,6 +804,15 @@ export function writeMetadataFile(
569
804
 
570
805
  writeFileSync(metadataPath, metadataContent, 'utf-8');
571
806
  logger.trace('Wrote agentuity.metadata.json');
807
+
808
+ // Write AGENTS.md for AI coding agents
809
+ if (!dev) {
810
+ const agentMdPath = join(agentuityDir, 'AGENTS.md');
811
+ const agentMdContent = generateAgentsMd(metadata);
812
+
813
+ writeFileSync(agentMdPath, agentMdContent, 'utf-8');
814
+ logger.trace('Wrote AGENTS.md');
815
+ }
572
816
  }
573
817
 
574
818
  /**
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Prompt Generator
3
+ *
4
+ * Generates AGENTS.md prompt files in .agents/agentuity/sdk/[type]/ directories.
5
+ * Also creates reference files in src/[type]/AGENTS.md (write-once, only if missing).
6
+ *
7
+ * Uses hash tracking to detect template changes in .agents/ folder.
8
+ * Reference files in src/ are never overwritten once created.
9
+ *
10
+ * Only runs in dev mode.
11
+ */
12
+
13
+ import { join, dirname } from 'node:path';
14
+ import { mkdir } from 'node:fs/promises';
15
+ import type { Logger } from '../../../types';
16
+ import { needsUpdate } from '../../ai/prompt/version';
17
+ import {
18
+ generateLLMPrompt as generateAgentPrompt,
19
+ getPromptContent as getAgentContent,
20
+ } from '../../ai/prompt/agent';
21
+ import {
22
+ generateLLMPrompt as generateApiPrompt,
23
+ getPromptContent as getApiContent,
24
+ } from '../../ai/prompt/api';
25
+ import {
26
+ generateLLMPrompt as generateWebPrompt,
27
+ getPromptContent as getWebContent,
28
+ } from '../../ai/prompt/web';
29
+
30
+ interface PromptConfig {
31
+ name: string;
32
+ srcFolder: string;
33
+ generate: () => string;
34
+ getContent: () => string;
35
+ }
36
+
37
+ const PROMPTS: PromptConfig[] = [
38
+ {
39
+ name: 'agent',
40
+ srcFolder: 'agent',
41
+ generate: generateAgentPrompt,
42
+ getContent: getAgentContent,
43
+ },
44
+ {
45
+ name: 'api',
46
+ srcFolder: 'api',
47
+ generate: generateApiPrompt,
48
+ getContent: getApiContent,
49
+ },
50
+ {
51
+ name: 'web',
52
+ srcFolder: 'web',
53
+ generate: generateWebPrompt,
54
+ getContent: getWebContent,
55
+ },
56
+ ];
57
+
58
+ /**
59
+ * Generate the reference file content that points to .agents/
60
+ */
61
+ function generateReferenceContent(name: string): string {
62
+ return `See [.agents/agentuity/sdk/${name}/AGENTS.md](../../.agents/agentuity/sdk/${name}/AGENTS.md) for Agentuity ${name} development guidelines.
63
+ `;
64
+ }
65
+
66
+ /**
67
+ * Generate or update prompt files.
68
+ *
69
+ * - .agents/agentuity/sdk/[type]/AGENTS.md: Full content, updated when hash differs
70
+ * - src/[type]/AGENTS.md: Reference file, only created if missing
71
+ *
72
+ * @param srcDir - The src/ directory path
73
+ * @param logger - Logger for output
74
+ */
75
+ export async function generatePromptFiles(srcDir: string, logger: Logger): Promise<void> {
76
+ const projectRoot = dirname(srcDir);
77
+
78
+ for (const prompt of PROMPTS) {
79
+ await generatePromptFile(projectRoot, srcDir, prompt, logger);
80
+ }
81
+ }
82
+
83
+ async function generatePromptFile(
84
+ projectRoot: string,
85
+ srcDir: string,
86
+ config: PromptConfig,
87
+ logger: Logger
88
+ ): Promise<void> {
89
+ const srcFolderPath = join(srcDir, config.srcFolder);
90
+
91
+ // Check if the src folder exists (e.g., src/agent/)
92
+ try {
93
+ const stat = await Bun.$`test -d ${srcFolderPath}`.nothrow();
94
+ if (stat.exitCode !== 0) {
95
+ logger.trace(`Skipping ${config.name} prompt - src/${config.srcFolder}/ does not exist`);
96
+ return;
97
+ }
98
+ } catch {
99
+ logger.trace(`Skipping ${config.name} prompt - src/${config.srcFolder}/ does not exist`);
100
+ return;
101
+ }
102
+
103
+ // Generate files
104
+ await generateAgentsFile(projectRoot, config, logger);
105
+ await generateReferenceFile(srcFolderPath, config, logger);
106
+ }
107
+
108
+ /**
109
+ * Generate/update the .agents/agentuity/sdk/[type]/AGENTS.md file.
110
+ * Overwrites if hash differs from source template.
111
+ */
112
+ async function generateAgentsFile(
113
+ projectRoot: string,
114
+ config: PromptConfig,
115
+ logger: Logger
116
+ ): Promise<void> {
117
+ const agentsDir = join(projectRoot, '.agents', 'agentuity', 'sdk', config.name);
118
+ const filePath = join(agentsDir, 'AGENTS.md');
119
+
120
+ const file = Bun.file(filePath);
121
+ const fileExists = await file.exists();
122
+
123
+ if (!fileExists) {
124
+ // File doesn't exist - create it
125
+ await mkdir(agentsDir, { recursive: true });
126
+ const content = config.generate();
127
+ await Bun.write(filePath, content);
128
+ logger.debug(`Generated .agents/agentuity/sdk/${config.name}/AGENTS.md`);
129
+ return;
130
+ }
131
+
132
+ // File exists - check if it needs to be updated
133
+ const existingContent = await file.text();
134
+ const sourceContent = config.getContent();
135
+
136
+ if (needsUpdate(existingContent, sourceContent)) {
137
+ const content = config.generate();
138
+ await Bun.write(filePath, content);
139
+ logger.debug(`Updated .agents/agentuity/sdk/${config.name}/AGENTS.md`);
140
+ return;
141
+ }
142
+
143
+ logger.trace(`Skipping ${config.name} prompt - already up to date`);
144
+ }
145
+
146
+ /**
147
+ * Generate the src/[type]/AGENTS.md reference file.
148
+ * Only creates if missing (write-once).
149
+ */
150
+ async function generateReferenceFile(
151
+ srcFolderPath: string,
152
+ config: PromptConfig,
153
+ logger: Logger
154
+ ): Promise<void> {
155
+ const filePath = join(srcFolderPath, 'AGENTS.md');
156
+
157
+ const file = Bun.file(filePath);
158
+ const fileExists = await file.exists();
159
+
160
+ if (fileExists) {
161
+ logger.trace(`Skipping src/${config.srcFolder}/AGENTS.md - already exists`);
162
+ return;
163
+ }
164
+
165
+ // Create the reference file
166
+ const content = generateReferenceContent(config.name);
167
+ await Bun.write(filePath, content);
168
+ logger.debug(`Generated src/${config.srcFolder}/AGENTS.md (reference)`);
169
+ }