@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.
- package/AGENTS.md +19 -188
- package/bin/cli.ts +13 -6
- package/dist/api.d.ts +1 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +1 -1
- package/dist/api.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +41 -12
- package/dist/cli.js.map +1 -1
- package/dist/cmd/ai/index.d.ts.map +1 -1
- package/dist/cmd/ai/index.js +6 -1
- package/dist/cmd/ai/index.js.map +1 -1
- package/dist/cmd/ai/prompt/agent.d.ts +7 -0
- package/dist/cmd/ai/prompt/agent.d.ts.map +1 -1
- package/dist/cmd/ai/prompt/agent.js +12 -323
- package/dist/cmd/ai/prompt/agent.js.map +1 -1
- package/dist/cmd/ai/prompt/api.d.ts +7 -0
- package/dist/cmd/ai/prompt/api.d.ts.map +1 -1
- package/dist/cmd/ai/prompt/api.js +12 -260
- package/dist/cmd/ai/prompt/api.js.map +1 -1
- package/dist/cmd/ai/prompt/version.d.ts +35 -0
- package/dist/cmd/ai/prompt/version.d.ts.map +1 -0
- package/dist/cmd/ai/prompt/version.js +55 -0
- package/dist/cmd/ai/prompt/version.js.map +1 -0
- package/dist/cmd/ai/prompt/web.d.ts +7 -0
- package/dist/cmd/ai/prompt/web.d.ts.map +1 -1
- package/dist/cmd/ai/prompt/web.js +12 -283
- package/dist/cmd/ai/prompt/web.js.map +1 -1
- package/dist/cmd/ai/skills/generate.d.ts +3 -0
- package/dist/cmd/ai/skills/generate.d.ts.map +1 -0
- package/dist/cmd/ai/skills/generate.js +65 -0
- package/dist/cmd/ai/skills/generate.js.map +1 -0
- package/dist/cmd/ai/skills/generator.d.ts +4 -0
- package/dist/cmd/ai/skills/generator.d.ts.map +1 -0
- package/dist/cmd/ai/skills/generator.js +402 -0
- package/dist/cmd/ai/skills/generator.js.map +1 -0
- package/dist/cmd/ai/skills/index.d.ts +4 -0
- package/dist/cmd/ai/skills/index.d.ts.map +1 -0
- package/dist/cmd/ai/skills/index.js +21 -0
- package/dist/cmd/ai/skills/index.js.map +1 -0
- package/dist/cmd/auth/signup.d.ts.map +1 -1
- package/dist/cmd/auth/signup.js +1 -0
- package/dist/cmd/auth/signup.js.map +1 -1
- package/dist/cmd/build/ast.d.ts +2 -1
- package/dist/cmd/build/ast.d.ts.map +1 -1
- package/dist/cmd/build/ast.js +135 -47
- package/dist/cmd/build/ast.js.map +1 -1
- package/dist/cmd/build/entry-generator.d.ts.map +1 -1
- package/dist/cmd/build/entry-generator.js +255 -188
- package/dist/cmd/build/entry-generator.js.map +1 -1
- package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -1
- package/dist/cmd/build/vite/agent-discovery.js +103 -45
- package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts +7 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.js +52 -26
- package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
- package/dist/cmd/build/vite/docs-generator.d.ts +13 -0
- package/dist/cmd/build/vite/docs-generator.d.ts.map +1 -0
- package/dist/cmd/build/vite/docs-generator.js +81 -0
- package/dist/cmd/build/vite/docs-generator.js.map +1 -0
- package/dist/cmd/build/vite/index.d.ts +3 -3
- package/dist/cmd/build/vite/index.d.ts.map +1 -1
- package/dist/cmd/build/vite/index.js +9 -7
- package/dist/cmd/build/vite/index.js.map +1 -1
- package/dist/cmd/build/vite/lifecycle-generator.d.ts +1 -1
- package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/lifecycle-generator.js +19 -5
- package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -1
- package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/metadata-generator.js +203 -7
- package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
- package/dist/cmd/build/vite/prompt-generator.d.ts +23 -0
- package/dist/cmd/build/vite/prompt-generator.d.ts.map +1 -0
- package/dist/cmd/build/vite/prompt-generator.js +123 -0
- package/dist/cmd/build/vite/prompt-generator.js.map +1 -0
- package/dist/cmd/build/vite/registry-generator.d.ts +3 -3
- package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/registry-generator.js +644 -103
- package/dist/cmd/build/vite/registry-generator.js.map +1 -1
- package/dist/cmd/build/vite/route-discovery.d.ts +4 -0
- package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
- package/dist/cmd/build/vite/route-discovery.js.map +1 -1
- package/dist/cmd/build/vite/server-bundler.d.ts +4 -0
- package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -1
- package/dist/cmd/build/vite/server-bundler.js +63 -17
- package/dist/cmd/build/vite/server-bundler.js.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.js +4 -0
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
- package/dist/cmd/build/vite/vite-builder.d.ts +1 -1
- package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-builder.js +118 -96
- package/dist/cmd/build/vite/vite-builder.js.map +1 -1
- package/dist/cmd/build/vite-bundler.js +6 -6
- package/dist/cmd/build/vite-bundler.js.map +1 -1
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +89 -32
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/create-namespace.js +3 -1
- package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete-namespace.js +3 -1
- package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete.js +3 -1
- package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/set.js +4 -2
- package/dist/cmd/cloud/keyvalue/set.js.map +1 -1
- package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
- package/dist/cmd/cloud/stream/get.js +2 -13
- package/dist/cmd/cloud/stream/get.js.map +1 -1
- package/dist/cmd/cloud/vector/delete-namespace.d.ts +3 -0
- package/dist/cmd/cloud/vector/delete-namespace.d.ts.map +1 -0
- package/dist/cmd/cloud/vector/delete-namespace.js +77 -0
- package/dist/cmd/cloud/vector/delete-namespace.js.map +1 -0
- package/dist/cmd/cloud/vector/index.d.ts.map +1 -1
- package/dist/cmd/cloud/vector/index.js +21 -4
- package/dist/cmd/cloud/vector/index.js.map +1 -1
- package/dist/cmd/cloud/vector/list-namespaces.d.ts +3 -0
- package/dist/cmd/cloud/vector/list-namespaces.d.ts.map +1 -0
- package/dist/cmd/cloud/vector/list-namespaces.js +42 -0
- package/dist/cmd/cloud/vector/list-namespaces.js.map +1 -0
- package/dist/cmd/cloud/vector/stats.d.ts +3 -0
- package/dist/cmd/cloud/vector/stats.d.ts.map +1 -0
- package/dist/cmd/cloud/vector/stats.js +142 -0
- package/dist/cmd/cloud/vector/stats.js.map +1 -0
- package/dist/cmd/cloud/vector/upsert.d.ts +3 -0
- package/dist/cmd/cloud/vector/upsert.d.ts.map +1 -0
- package/dist/cmd/cloud/vector/upsert.js +192 -0
- package/dist/cmd/cloud/vector/upsert.js.map +1 -0
- package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
- package/dist/cmd/dev/file-watcher.js +94 -33
- package/dist/cmd/dev/file-watcher.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +298 -61
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/dev/skills.d.ts +10 -0
- package/dist/cmd/dev/skills.d.ts.map +1 -0
- package/dist/cmd/dev/skills.js +57 -0
- package/dist/cmd/dev/skills.js.map +1 -0
- package/dist/cmd/dev/sync.d.ts.map +1 -1
- package/dist/cmd/dev/sync.js +19 -3
- package/dist/cmd/dev/sync.js.map +1 -1
- package/dist/cmd/index.d.ts.map +1 -1
- package/dist/cmd/index.js +1 -0
- package/dist/cmd/index.js.map +1 -1
- package/dist/cmd/project/create.d.ts.map +1 -1
- package/dist/cmd/project/create.js +3 -0
- package/dist/cmd/project/create.js.map +1 -1
- package/dist/cmd/project/template-flow.d.ts +1 -0
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js +30 -5
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/dist/cmd/setup/index.d.ts.map +1 -1
- package/dist/cmd/setup/index.js +1 -0
- package/dist/cmd/setup/index.js.map +1 -1
- package/dist/cmd/upgrade/index.d.ts +15 -0
- package/dist/cmd/upgrade/index.d.ts.map +1 -1
- package/dist/cmd/upgrade/index.js +59 -4
- package/dist/cmd/upgrade/index.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/domain.d.ts +45 -0
- package/dist/domain.d.ts.map +1 -0
- package/dist/domain.js +200 -0
- package/dist/domain.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/schema-generator.d.ts +2 -0
- package/dist/schema-generator.d.ts.map +1 -1
- package/dist/schema-generator.js +18 -0
- package/dist/schema-generator.js.map +1 -1
- package/dist/steps.d.ts +1 -1
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +16 -5
- package/dist/steps.js.map +1 -1
- package/dist/tui/prompt.d.ts +1 -2
- package/dist/tui/prompt.d.ts.map +1 -1
- package/dist/tui/prompt.js +8 -4
- package/dist/tui/prompt.js.map +1 -1
- package/dist/tui.d.ts +16 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +23 -2
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/package.json +5 -8
- package/src/api.ts +1 -1
- package/src/cli.ts +47 -12
- package/src/cmd/ai/index.ts +6 -1
- package/src/cmd/ai/prompt/agent.md +306 -0
- package/src/cmd/ai/prompt/agent.ts +12 -322
- package/src/cmd/ai/prompt/api.md +360 -0
- package/src/cmd/ai/prompt/api.ts +13 -260
- package/src/cmd/ai/prompt/version.ts +61 -0
- package/src/cmd/ai/prompt/web.md +509 -0
- package/src/cmd/ai/prompt/web.ts +12 -282
- package/src/cmd/ai/skills/generate.ts +75 -0
- package/src/cmd/ai/skills/generator.ts +519 -0
- package/src/cmd/ai/skills/index.ts +23 -0
- package/src/cmd/auth/signup.ts +1 -0
- package/src/cmd/build/ast.ts +161 -48
- package/src/cmd/build/entry-generator.ts +258 -187
- package/src/cmd/build/vite/agent-discovery.ts +151 -58
- package/src/cmd/build/vite/bun-dev-server.ts +57 -27
- package/src/cmd/build/vite/docs-generator.ts +87 -0
- package/src/cmd/build/vite/index.ts +9 -7
- package/src/cmd/build/vite/lifecycle-generator.ts +19 -5
- package/src/cmd/build/vite/metadata-generator.ts +251 -7
- package/src/cmd/build/vite/prompt-generator.ts +169 -0
- package/src/cmd/build/vite/registry-generator.ts +750 -108
- package/src/cmd/build/vite/route-discovery.ts +4 -0
- package/src/cmd/build/vite/server-bundler.ts +73 -23
- package/src/cmd/build/vite/vite-asset-server-config.ts +5 -0
- package/src/cmd/build/vite/vite-builder.ts +134 -100
- package/src/cmd/build/vite-bundler.ts +6 -6
- package/src/cmd/cloud/deploy.ts +114 -36
- package/src/cmd/cloud/keyvalue/create-namespace.ts +3 -1
- package/src/cmd/cloud/keyvalue/delete-namespace.ts +3 -1
- package/src/cmd/cloud/keyvalue/delete.ts +3 -1
- package/src/cmd/cloud/keyvalue/set.ts +4 -2
- package/src/cmd/cloud/stream/get.ts +2 -9
- package/src/cmd/cloud/vector/delete-namespace.ts +89 -0
- package/src/cmd/cloud/vector/index.ts +21 -4
- package/src/cmd/cloud/vector/list-namespaces.ts +46 -0
- package/src/cmd/cloud/vector/stats.ts +160 -0
- package/src/cmd/cloud/vector/upsert.ts +216 -0
- package/src/cmd/dev/file-watcher.ts +109 -34
- package/src/cmd/dev/index.ts +364 -60
- package/src/cmd/dev/skills.ts +82 -0
- package/src/cmd/dev/sync.ts +41 -6
- package/src/cmd/index.ts +1 -0
- package/src/cmd/project/create.ts +3 -0
- package/src/cmd/project/template-flow.ts +37 -5
- package/src/cmd/setup/index.ts +1 -0
- package/src/cmd/upgrade/index.ts +68 -4
- package/src/config.ts +9 -0
- package/src/domain.ts +273 -0
- package/src/index.ts +0 -5
- package/src/runtime-bootstrap.md +1 -1
- package/src/schema-generator.ts +23 -0
- package/src/steps.ts +16 -5
- package/src/tui/prompt.ts +11 -5
- package/src/tui.ts +21 -2
- package/src/types/md.d.ts +8 -0
- package/src/types.ts +12 -3
- package/dist/cmd/cloud/domain.d.ts +0 -17
- package/dist/cmd/cloud/domain.d.ts.map +0 -1
- package/dist/cmd/cloud/domain.js +0 -79
- package/dist/cmd/cloud/domain.js.map +0 -1
- package/dist/runtime-bootstrap.d.ts +0 -56
- package/dist/runtime-bootstrap.d.ts.map +0 -1
- package/dist/runtime-bootstrap.js +0 -95
- package/dist/runtime-bootstrap.js.map +0 -1
- package/src/cmd/cloud/domain.ts +0 -100
- 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
|
-
|
|
277
|
+
const kind = getAssetKind(relativePath, isEntry);
|
|
278
|
+
const contentType = getContentType(relativePath);
|
|
279
|
+
const assetInfo: AssetInfo = {
|
|
224
280
|
filename: assetPath,
|
|
225
|
-
kind
|
|
226
|
-
contentType
|
|
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
|
-
|
|
391
|
+
const contentType = getContentType(entry.name);
|
|
392
|
+
const assetInfo: AssetInfo = {
|
|
332
393
|
filename: assetPath,
|
|
333
394
|
kind: 'static',
|
|
334
|
-
contentType
|
|
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
|
+
}
|