@agentuity/cli 1.0.51 → 1.0.53

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.
@@ -0,0 +1,18 @@
1
+ import type { Logger } from '@agentuity/core';
2
+ export interface CIBuildOptions {
3
+ url: string;
4
+ directory?: string;
5
+ trigger?: string;
6
+ event?: string;
7
+ message?: string;
8
+ commit?: string;
9
+ commitUrl?: string;
10
+ branch?: string;
11
+ repo?: string;
12
+ provider?: string;
13
+ pullRequestNumber?: number;
14
+ pullRequestUrl?: string;
15
+ logsUrl?: string;
16
+ }
17
+ export declare function runCIBuild(opts: CIBuildOptions, _logger: Logger): Promise<void>;
18
+ //# sourceMappingURL=ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../../../src/cmd/build/ci.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAQ9C,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAmFD,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqHrF"}
@@ -0,0 +1,181 @@
1
+ import { spawn } from 'bun';
2
+ import { mkdir, mkdtemp, readdir, realpath, rm, stat } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { ErrorCode } from '../../errors';
6
+ import * as tui from '../../tui';
7
+ async function streamProcessOutput(proc) {
8
+ const forwardStream = async (stream, isStderr) => {
9
+ if (typeof stream === 'number')
10
+ return;
11
+ if (!stream)
12
+ return;
13
+ const reader = stream.getReader();
14
+ const target = isStderr ? process.stderr : process.stdout;
15
+ while (true) {
16
+ const { done, value } = await reader.read();
17
+ if (done)
18
+ break;
19
+ target.write(value);
20
+ }
21
+ };
22
+ await Promise.all([
23
+ forwardStream(proc.stdout, false),
24
+ forwardStream(proc.stderr, true),
25
+ proc.exited,
26
+ ]);
27
+ }
28
+ async function runCommand(cmd, cwd) {
29
+ const proc = spawn({
30
+ cmd,
31
+ cwd,
32
+ env: { ...process.env, CI: 'true' },
33
+ stdin: 'ignore',
34
+ stdout: 'pipe',
35
+ stderr: 'pipe',
36
+ });
37
+ await streamProcessOutput(proc);
38
+ return proc.exitCode ?? 1;
39
+ }
40
+ async function downloadSource(url, targetPath) {
41
+ let lastError;
42
+ for (let attempt = 1; attempt <= 3; attempt++) {
43
+ try {
44
+ const response = await fetch(url, { signal: AbortSignal.timeout(60_000) });
45
+ if (!response.ok) {
46
+ throw new Error(`Download failed with status ${response.status}`);
47
+ }
48
+ await Bun.write(targetPath, await response.arrayBuffer());
49
+ return;
50
+ }
51
+ catch (error) {
52
+ lastError = error;
53
+ if (attempt < 3) {
54
+ tui.info(`Download failed (attempt ${attempt}/3), retrying...`);
55
+ }
56
+ }
57
+ }
58
+ throw lastError instanceof Error ? lastError : new Error('Download failed');
59
+ }
60
+ function buildDeployArgs(opts) {
61
+ const args = [];
62
+ if (opts.trigger)
63
+ args.push('--trigger', opts.trigger);
64
+ if (opts.event)
65
+ args.push('--event', opts.event);
66
+ if (opts.message)
67
+ args.push('--message', opts.message);
68
+ if (opts.commit)
69
+ args.push('--commit', opts.commit);
70
+ if (opts.commitUrl)
71
+ args.push('--commit-url', opts.commitUrl);
72
+ if (opts.branch)
73
+ args.push('--branch', opts.branch);
74
+ if (opts.repo)
75
+ args.push('--repo', opts.repo);
76
+ if (opts.provider)
77
+ args.push('--provider', opts.provider);
78
+ if (opts.pullRequestNumber !== undefined) {
79
+ args.push('--pull-request-number', String(opts.pullRequestNumber));
80
+ }
81
+ if (opts.pullRequestUrl)
82
+ args.push('--pull-request-url', opts.pullRequestUrl);
83
+ if (opts.logsUrl)
84
+ args.push('--logs-url', opts.logsUrl);
85
+ return args;
86
+ }
87
+ export async function runCIBuild(opts, _logger) {
88
+ let tempDir = '';
89
+ try {
90
+ tempDir = await mkdtemp(join(tmpdir(), 'agentuity-ci-build-'));
91
+ const sourceZipPath = join(tempDir, 'source.zip');
92
+ const extractPath = join(tempDir, 'build');
93
+ tui.info('1️⃣ Downloading source code from GitHub...');
94
+ await downloadSource(opts.url, sourceZipPath);
95
+ tui.info('2️⃣ Unzipping source code from GitHub...');
96
+ await mkdir(extractPath, { recursive: true });
97
+ const unzipExit = await runCommand(['unzip', '-q', sourceZipPath, '-d', extractPath], tempDir);
98
+ if (unzipExit !== 0 && unzipExit !== 1) {
99
+ tui.fatal(`Failed to unzip source archive (exit ${unzipExit})`, ErrorCode.BUILD_FAILED);
100
+ }
101
+ const extractedEntries = await readdir(extractPath, { withFileTypes: true });
102
+ const extractedDirs = extractedEntries.filter((entry) => entry.isDirectory());
103
+ if (extractedDirs.length !== 1) {
104
+ tui.fatal(`Expected one root directory after unzip, found ${extractedDirs.length}`, ErrorCode.BUILD_FAILED);
105
+ }
106
+ const sourceRoot = extractedDirs.at(0);
107
+ if (!sourceRoot) {
108
+ tui.fatal('Could not determine extracted source directory', ErrorCode.BUILD_FAILED);
109
+ }
110
+ const sourceRootDir = join(extractPath, sourceRoot.name);
111
+ let projectDir = sourceRootDir;
112
+ if (opts.directory) {
113
+ projectDir = join(sourceRootDir, opts.directory);
114
+ }
115
+ const projectStats = await stat(projectDir).catch(() => null);
116
+ if (!projectStats?.isDirectory()) {
117
+ tui.fatal(`Build directory not found: ${projectDir}`, ErrorCode.CONFIG_INVALID);
118
+ }
119
+ // Resolve symlinks and verify the project dir is within the source root
120
+ const realProjectDir = await realpath(projectDir).catch(() => null);
121
+ const realSourceRoot = await realpath(sourceRootDir).catch(() => null);
122
+ if (!realProjectDir || !realSourceRoot || !realProjectDir.startsWith(realSourceRoot)) {
123
+ tui.fatal('Directory path escapes the source root (path traversal denied)', ErrorCode.CONFIG_INVALID);
124
+ }
125
+ projectDir = realProjectDir;
126
+ const sdkKey = process.env.AGENTUITY_SDK_KEY;
127
+ if (sdkKey) {
128
+ await Bun.write(join(projectDir, '.env'), `AGENTUITY_SDK_KEY=${sdkKey}\n`);
129
+ }
130
+ tui.info('3️⃣ Installing your project dependencies...');
131
+ const installExit = await runCommand(['bun', 'install'], projectDir);
132
+ if (installExit !== 0) {
133
+ tui.fatal(`Dependency installation failed (exit ${installExit})`, ErrorCode.BUILD_FAILED);
134
+ }
135
+ const packageJsonPath = join(projectDir, 'package.json');
136
+ const packageJsonFile = Bun.file(packageJsonPath);
137
+ let scripts;
138
+ if (await packageJsonFile.exists()) {
139
+ const packageJson = (await packageJsonFile.json());
140
+ scripts = packageJson.scripts;
141
+ }
142
+ if (scripts?.predeploy) {
143
+ tui.info('🔧 Running predeploy script...');
144
+ const predeployExit = await runCommand(['bun', 'run', '--bun', 'predeploy'], projectDir);
145
+ if (predeployExit !== 0) {
146
+ tui.fatal(`Predeploy failed (exit ${predeployExit})`, ErrorCode.BUILD_FAILED);
147
+ }
148
+ }
149
+ tui.info('4️⃣ Deploying your project...');
150
+ // Use the locally installed CLI binary instead of bunx to avoid
151
+ // bunx resolution crashes on certain Bun versions (e.g. arm64 segfaults)
152
+ const localCliBin = join(projectDir, 'node_modules', '.bin', 'agentuity');
153
+ const cliExists = await stat(localCliBin).catch(() => null);
154
+ const deployCmd = cliExists
155
+ ? ['bun', localCliBin, 'deploy', ...buildDeployArgs(opts)]
156
+ : ['bunx', '--bun', 'agentuity', 'deploy', ...buildDeployArgs(opts)];
157
+ tui.info(`Using CLI: ${cliExists ? localCliBin : 'bunx --bun agentuity'}`);
158
+ const deployExit = await runCommand(deployCmd, projectDir);
159
+ if (deployExit !== 0) {
160
+ tui.fatal(`Deploy failed (exit ${deployExit})`, ErrorCode.BUILD_FAILED);
161
+ }
162
+ if (scripts?.postdeploy) {
163
+ tui.info('🔧 Running postdeploy script...');
164
+ const postdeployExit = await runCommand(['bun', 'run', '--bun', 'postdeploy'], projectDir);
165
+ if (postdeployExit !== 0) {
166
+ tui.fatal(`Postdeploy failed (exit ${postdeployExit})`, ErrorCode.BUILD_FAILED);
167
+ }
168
+ }
169
+ tui.success('✅ Your project has been built...');
170
+ }
171
+ catch (error) {
172
+ const message = error instanceof Error ? error.message : String(error);
173
+ tui.fatal(`CI build failed: ${message}`, ErrorCode.BUILD_FAILED);
174
+ }
175
+ finally {
176
+ if (tempDir) {
177
+ await rm(tempDir, { recursive: true, force: true });
178
+ }
179
+ }
180
+ }
181
+ //# sourceMappingURL=ci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../../src/cmd/build/ci.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmd/build/index.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,OAAO,mCA0JlB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmd/build/index.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,OAAO,mCAmLlB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { resolve, join, relative } from 'node:path';
3
- import { createCommand } from '../../types';
3
+ import { createCommand, DeployOptionsSchema } from '../../types';
4
4
  import { viteBundle } from './vite-bundler';
5
5
  import * as tui from '../../tui';
6
6
  import { getCommand } from '../../command-prefix';
@@ -14,6 +14,18 @@ const BuildResponseSchema = z.object({
14
14
  dev: z.boolean().describe('Whether dev mode was enabled'),
15
15
  size: z.number().optional().describe('Build size in bytes'),
16
16
  });
17
+ const BuildOptionsSchema = z.intersection(DeployOptionsSchema, z.object({
18
+ dev: z.boolean().optional().describe('Enable development mode'),
19
+ outdir: z.string().optional().describe('Output directory for build artifacts'),
20
+ skipTypeCheck: z.boolean().default(false).optional().describe('Skip typecheck after build'),
21
+ reportFile: z
22
+ .string()
23
+ .optional()
24
+ .describe('file path to save build report JSON with errors, warnings, and diagnostics'),
25
+ ci: z.boolean().optional().describe('Enable CI build mode'),
26
+ url: z.string().optional().describe('Source code download URL (required with --ci)'),
27
+ directory: z.string().optional().describe('Subdirectory within extracted source'),
28
+ }));
17
29
  export const command = createCommand({
18
30
  name: 'build',
19
31
  description: 'Build Agentuity application for deployment',
@@ -24,26 +36,45 @@ export const command = createCommand({
24
36
  examples: [
25
37
  { command: getCommand('build'), description: 'Build the project' },
26
38
  { command: getCommand('build --dev'), description: 'Run in development mode' },
39
+ {
40
+ command: getCommand('build --ci --url https://example.com/source.zip'),
41
+ description: 'Run CI build from source URL',
42
+ },
27
43
  { command: getCommand('bundle'), description: 'Bundle the project' },
28
44
  ],
29
45
  schema: {
30
- options: z.object({
31
- dev: z.boolean().optional().describe('Enable development mode'),
32
- outdir: z.string().optional().describe('Output directory for build artifacts'),
33
- skipTypeCheck: z
34
- .boolean()
35
- .default(false)
36
- .optional()
37
- .describe('Skip typecheck after build'),
38
- reportFile: z
39
- .string()
40
- .optional()
41
- .describe('file path to save build report JSON with errors, warnings, and diagnostics'),
42
- }),
46
+ options: BuildOptionsSchema,
43
47
  response: BuildResponseSchema,
44
48
  },
45
49
  async handler(ctx) {
46
50
  const { opts, projectDir, project } = ctx;
51
+ if (opts.ci) {
52
+ if (!opts.url) {
53
+ tui.fatal('--url is required when using --ci mode', ErrorCode.CONFIG_INVALID);
54
+ }
55
+ const { runCIBuild } = await import('./ci');
56
+ await runCIBuild({
57
+ url: opts.url,
58
+ directory: opts.directory,
59
+ trigger: opts.trigger,
60
+ event: opts.event,
61
+ message: opts.message,
62
+ commit: opts.commit,
63
+ commitUrl: opts.commitUrl,
64
+ branch: opts.branch,
65
+ repo: opts.repo,
66
+ provider: opts.provider,
67
+ pullRequestNumber: opts.pullRequestNumber,
68
+ pullRequestUrl: opts.pullRequestUrl,
69
+ logsUrl: opts.logsUrl,
70
+ }, ctx.logger);
71
+ return {
72
+ success: true,
73
+ bundlePath: projectDir,
74
+ projectName: project?.projectId || 'unknown',
75
+ dev: false,
76
+ };
77
+ }
47
78
  // Initialize build report collector if reportFile is specified
48
79
  const collector = new BuildReportCollector();
49
80
  if (opts.reportFile) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmd/build/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmd/build/index.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,12 @@
3
3
  *
4
4
  * The Tailwind v4 oxide scanner (native Rust binary) can hang or fail when
5
5
  * scanning the filesystem in containerized environments. Adding source(none)
6
- * to @import "tailwindcss" disables the oxide filesystem scanner while still
7
- * allowing @tailwindcss/vite to detect class usage through Vite's module graph.
6
+ * to @import "tailwindcss" disables the oxide filesystem scanner, and an
7
+ * explicit @source directive pointing at the project's src/ directory tells
8
+ * Tailwind exactly where to find utility classes.
8
9
  *
9
10
  * @see https://github.com/tailwindlabs/tailwindcss/discussions/19661
11
+ * @see https://tailwindcss.com/docs/detecting-classes-in-source-files
10
12
  */
11
13
  import type { Plugin } from 'vite';
12
14
  export declare function tailwindSourcePlugin(): Plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-source-plugin.d.ts","sourceRoot":"","sources":["../../../../src/cmd/build/vite/tailwind-source-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,wBAAgB,oBAAoB,IAAI,MAAM,CAwC7C"}
1
+ {"version":3,"file":"tailwind-source-plugin.d.ts","sourceRoot":"","sources":["../../../../src/cmd/build/vite/tailwind-source-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,wBAAgB,oBAAoB,IAAI,MAAM,CAwD7C"}
@@ -3,15 +3,22 @@
3
3
  *
4
4
  * The Tailwind v4 oxide scanner (native Rust binary) can hang or fail when
5
5
  * scanning the filesystem in containerized environments. Adding source(none)
6
- * to @import "tailwindcss" disables the oxide filesystem scanner while still
7
- * allowing @tailwindcss/vite to detect class usage through Vite's module graph.
6
+ * to @import "tailwindcss" disables the oxide filesystem scanner, and an
7
+ * explicit @source directive pointing at the project's src/ directory tells
8
+ * Tailwind exactly where to find utility classes.
8
9
  *
9
10
  * @see https://github.com/tailwindlabs/tailwindcss/discussions/19661
11
+ * @see https://tailwindcss.com/docs/detecting-classes-in-source-files
10
12
  */
13
+ import { dirname, join, relative, sep } from 'node:path';
11
14
  export function tailwindSourcePlugin() {
15
+ let root;
12
16
  return {
13
17
  name: 'agentuity:tailwind-source',
14
18
  enforce: 'pre',
19
+ configResolved(config) {
20
+ root = config.root;
21
+ },
15
22
  transform(code, id) {
16
23
  // Only transform CSS files
17
24
  if (!id.endsWith('.css')) {
@@ -21,15 +28,25 @@ export function tailwindSourcePlugin() {
21
28
  if (!/@import\s+["']tailwindcss["']/.test(code)) {
22
29
  return null;
23
30
  }
31
+ // Compute relative path from CSS file to project's src/ directory
32
+ const cssDir = dirname(id);
33
+ const srcDir = join(root, 'src');
34
+ let relPath = relative(cssDir, srcDir).split(sep).join('/');
35
+ if (relPath === '') {
36
+ relPath = '.';
37
+ }
38
+ else if (!relPath.startsWith('.')) {
39
+ relPath = './' + relPath;
40
+ }
24
41
  // Transform @import "tailwindcss" → @import "tailwindcss" source(none)
25
- // Handles both quote styles and preserves any other directives on the same statement
26
- // Does NOT transform if source() is already specified
42
+ // and add explicit @source so Tailwind knows where to scan for classes.
43
+ // Does NOT transform if source() is already specified.
27
44
  const transformed = code.replace(/@import\s+(["'])tailwindcss\1([^;]*);/g, (match, quote, rest) => {
28
45
  // If source() is already present, don't modify
29
46
  if (/source\s*\(/.test(rest)) {
30
47
  return match;
31
48
  }
32
- return `@import ${quote}tailwindcss${quote}${rest} source(none);`;
49
+ return `@import ${quote}tailwindcss${quote}${rest} source(none);\n@source "${relPath}";`;
33
50
  });
34
51
  if (transformed !== code) {
35
52
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-source-plugin.js","sourceRoot":"","sources":["../../../../src/cmd/build/vite/tailwind-source-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,UAAU,oBAAoB;IACnC,OAAO;QACN,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,KAAK;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YACjB,2BAA2B;YAC3B,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACb,CAAC;YAED,4EAA4E;YAC5E,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,OAAO,IAAI,CAAC;YACb,CAAC;YAED,uEAAuE;YACvE,qFAAqF;YACrF,sDAAsD;YACtD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAC/B,wCAAwC,EACxC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,+CAA+C;gBAC/C,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9B,OAAO,KAAK,CAAC;gBACd,CAAC;gBACD,OAAO,WAAW,KAAK,cAAc,KAAK,GAAG,IAAI,gBAAgB,CAAC;YACnE,CAAC,CACD,CAAC;YAEF,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC1B,OAAO;oBACN,IAAI,EAAE,WAAW;oBACjB,GAAG,EAAE,IAAI;iBACT,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC;KACD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tailwind-source-plugin.js","sourceRoot":"","sources":["../../../../src/cmd/build/vite/tailwind-source-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGzD,MAAM,UAAU,oBAAoB;IACnC,IAAI,IAAY,CAAC;IAEjB,OAAO;QACN,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,KAAK;QAEd,cAAc,CAAC,MAAM;YACpB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;QAED,SAAS,CAAC,IAAI,EAAE,EAAE;YACjB,2BAA2B;YAC3B,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACb,CAAC;YAED,4EAA4E;YAC5E,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,OAAO,IAAI,CAAC;YACb,CAAC;YAED,kEAAkE;YAClE,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjC,IAAI,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;gBACpB,OAAO,GAAG,GAAG,CAAC;YACf,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC;YAC1B,CAAC;YAED,uEAAuE;YACvE,wEAAwE;YACxE,uDAAuD;YACvD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAC/B,wCAAwC,EACxC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,+CAA+C;gBAC/C,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9B,OAAO,KAAK,CAAC;gBACd,CAAC;gBACD,OAAO,WAAW,KAAK,cAAc,KAAK,GAAG,IAAI,4BAA4B,OAAO,IAAI,CAAC;YAC1F,CAAC,CACD,CAAC;YAEF,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC1B,OAAO;oBACN,IAAI,EAAE,WAAW;oBACjB,GAAG,EAAE,IAAI;iBACT,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC;KACD,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/cli",
3
- "version": "1.0.51",
3
+ "version": "1.0.53",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -41,9 +41,9 @@
41
41
  "prepublishOnly": "bun run clean && bun run build"
42
42
  },
43
43
  "dependencies": {
44
- "@agentuity/auth": "1.0.51",
45
- "@agentuity/core": "1.0.51",
46
- "@agentuity/server": "1.0.51",
44
+ "@agentuity/auth": "1.0.53",
45
+ "@agentuity/core": "1.0.53",
46
+ "@agentuity/server": "1.0.53",
47
47
  "@datasert/cronjs-parser": "^1.4.0",
48
48
  "@vitejs/plugin-react": "^5.1.2",
49
49
  "acorn-loose": "^8.5.2",
@@ -59,10 +59,10 @@
59
59
  "typescript": "^5.9.0",
60
60
  "vite": "^7.2.7",
61
61
  "zod": "^4.3.5",
62
- "@agentuity/frontend": "1.0.51"
62
+ "@agentuity/frontend": "1.0.53"
63
63
  },
64
64
  "devDependencies": {
65
- "@agentuity/test-utils": "1.0.51",
65
+ "@agentuity/test-utils": "1.0.53",
66
66
  "@types/adm-zip": "^0.5.7",
67
67
  "@types/bun": "latest",
68
68
  "@types/tar-fs": "^2.0.4",
@@ -0,0 +1,223 @@
1
+ import type { Logger } from '@agentuity/core';
2
+ import { spawn } from 'bun';
3
+ import { mkdir, mkdtemp, readdir, realpath, rm, stat } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { ErrorCode } from '../../errors';
7
+ import * as tui from '../../tui';
8
+
9
+ export interface CIBuildOptions {
10
+ url: string;
11
+ directory?: string;
12
+ trigger?: string;
13
+ event?: string;
14
+ message?: string;
15
+ commit?: string;
16
+ commitUrl?: string;
17
+ branch?: string;
18
+ repo?: string;
19
+ provider?: string;
20
+ pullRequestNumber?: number;
21
+ pullRequestUrl?: string;
22
+ logsUrl?: string;
23
+ }
24
+
25
+ async function streamProcessOutput(proc: ReturnType<typeof spawn>): Promise<void> {
26
+ const forwardStream = async (
27
+ stream: ReadableStream<Uint8Array> | number | undefined,
28
+ isStderr: boolean
29
+ ) => {
30
+ if (typeof stream === 'number') return;
31
+ if (!stream) return;
32
+ const reader = stream.getReader();
33
+ const target = isStderr ? process.stderr : process.stdout;
34
+
35
+ while (true) {
36
+ const { done, value } = await reader.read();
37
+ if (done) break;
38
+ target.write(value);
39
+ }
40
+ };
41
+
42
+ await Promise.all([
43
+ forwardStream(proc.stdout, false),
44
+ forwardStream(proc.stderr, true),
45
+ proc.exited,
46
+ ]);
47
+ }
48
+
49
+ async function runCommand(cmd: string[], cwd: string): Promise<number> {
50
+ const proc = spawn({
51
+ cmd,
52
+ cwd,
53
+ env: { ...process.env, CI: 'true' },
54
+ stdin: 'ignore',
55
+ stdout: 'pipe',
56
+ stderr: 'pipe',
57
+ });
58
+
59
+ await streamProcessOutput(proc);
60
+ return proc.exitCode ?? 1;
61
+ }
62
+
63
+ async function downloadSource(url: string, targetPath: string): Promise<void> {
64
+ let lastError: unknown;
65
+
66
+ for (let attempt = 1; attempt <= 3; attempt++) {
67
+ try {
68
+ const response = await fetch(url, { signal: AbortSignal.timeout(60_000) });
69
+ if (!response.ok) {
70
+ throw new Error(`Download failed with status ${response.status}`);
71
+ }
72
+
73
+ await Bun.write(targetPath, await response.arrayBuffer());
74
+ return;
75
+ } catch (error) {
76
+ lastError = error;
77
+ if (attempt < 3) {
78
+ tui.info(`Download failed (attempt ${attempt}/3), retrying...`);
79
+ }
80
+ }
81
+ }
82
+
83
+ throw lastError instanceof Error ? lastError : new Error('Download failed');
84
+ }
85
+
86
+ function buildDeployArgs(opts: CIBuildOptions): string[] {
87
+ const args: string[] = [];
88
+
89
+ if (opts.trigger) args.push('--trigger', opts.trigger);
90
+ if (opts.event) args.push('--event', opts.event);
91
+ if (opts.message) args.push('--message', opts.message);
92
+ if (opts.commit) args.push('--commit', opts.commit);
93
+ if (opts.commitUrl) args.push('--commit-url', opts.commitUrl);
94
+ if (opts.branch) args.push('--branch', opts.branch);
95
+ if (opts.repo) args.push('--repo', opts.repo);
96
+ if (opts.provider) args.push('--provider', opts.provider);
97
+ if (opts.pullRequestNumber !== undefined) {
98
+ args.push('--pull-request-number', String(opts.pullRequestNumber));
99
+ }
100
+ if (opts.pullRequestUrl) args.push('--pull-request-url', opts.pullRequestUrl);
101
+ if (opts.logsUrl) args.push('--logs-url', opts.logsUrl);
102
+
103
+ return args;
104
+ }
105
+
106
+ export async function runCIBuild(opts: CIBuildOptions, _logger: Logger): Promise<void> {
107
+ let tempDir = '';
108
+
109
+ try {
110
+ tempDir = await mkdtemp(join(tmpdir(), 'agentuity-ci-build-'));
111
+ const sourceZipPath = join(tempDir, 'source.zip');
112
+ const extractPath = join(tempDir, 'build');
113
+
114
+ tui.info('1️⃣ Downloading source code from GitHub...');
115
+ await downloadSource(opts.url, sourceZipPath);
116
+
117
+ tui.info('2️⃣ Unzipping source code from GitHub...');
118
+ await mkdir(extractPath, { recursive: true });
119
+ const unzipExit = await runCommand(
120
+ ['unzip', '-q', sourceZipPath, '-d', extractPath],
121
+ tempDir
122
+ );
123
+ if (unzipExit !== 0 && unzipExit !== 1) {
124
+ tui.fatal(`Failed to unzip source archive (exit ${unzipExit})`, ErrorCode.BUILD_FAILED);
125
+ }
126
+
127
+ const extractedEntries = await readdir(extractPath, { withFileTypes: true });
128
+ const extractedDirs = extractedEntries.filter((entry) => entry.isDirectory());
129
+ if (extractedDirs.length !== 1) {
130
+ tui.fatal(
131
+ `Expected one root directory after unzip, found ${extractedDirs.length}`,
132
+ ErrorCode.BUILD_FAILED
133
+ );
134
+ }
135
+
136
+ const sourceRoot = extractedDirs.at(0);
137
+ if (!sourceRoot) {
138
+ tui.fatal('Could not determine extracted source directory', ErrorCode.BUILD_FAILED);
139
+ }
140
+
141
+ const sourceRootDir = join(extractPath, sourceRoot.name);
142
+ let projectDir = sourceRootDir;
143
+ if (opts.directory) {
144
+ projectDir = join(sourceRootDir, opts.directory);
145
+ }
146
+
147
+ const projectStats = await stat(projectDir).catch(() => null);
148
+ if (!projectStats?.isDirectory()) {
149
+ tui.fatal(`Build directory not found: ${projectDir}`, ErrorCode.CONFIG_INVALID);
150
+ }
151
+
152
+ // Resolve symlinks and verify the project dir is within the source root
153
+ const realProjectDir = await realpath(projectDir).catch(() => null);
154
+ const realSourceRoot = await realpath(sourceRootDir).catch(() => null);
155
+ if (!realProjectDir || !realSourceRoot || !realProjectDir.startsWith(realSourceRoot)) {
156
+ tui.fatal(
157
+ 'Directory path escapes the source root (path traversal denied)',
158
+ ErrorCode.CONFIG_INVALID
159
+ );
160
+ }
161
+ projectDir = realProjectDir;
162
+
163
+ const sdkKey = process.env.AGENTUITY_SDK_KEY;
164
+ if (sdkKey) {
165
+ await Bun.write(join(projectDir, '.env'), `AGENTUITY_SDK_KEY=${sdkKey}\n`);
166
+ }
167
+
168
+ tui.info('3️⃣ Installing your project dependencies...');
169
+ const installExit = await runCommand(['bun', 'install'], projectDir);
170
+ if (installExit !== 0) {
171
+ tui.fatal(`Dependency installation failed (exit ${installExit})`, ErrorCode.BUILD_FAILED);
172
+ }
173
+
174
+ const packageJsonPath = join(projectDir, 'package.json');
175
+ const packageJsonFile = Bun.file(packageJsonPath);
176
+ let scripts: Record<string, string> | undefined;
177
+ if (await packageJsonFile.exists()) {
178
+ const packageJson = (await packageJsonFile.json()) as {
179
+ scripts?: Record<string, string>;
180
+ };
181
+ scripts = packageJson.scripts;
182
+ }
183
+
184
+ if (scripts?.predeploy) {
185
+ tui.info('🔧 Running predeploy script...');
186
+ const predeployExit = await runCommand(['bun', 'run', '--bun', 'predeploy'], projectDir);
187
+ if (predeployExit !== 0) {
188
+ tui.fatal(`Predeploy failed (exit ${predeployExit})`, ErrorCode.BUILD_FAILED);
189
+ }
190
+ }
191
+
192
+ tui.info('4️⃣ Deploying your project...');
193
+ // Use the locally installed CLI binary instead of bunx to avoid
194
+ // bunx resolution crashes on certain Bun versions (e.g. arm64 segfaults)
195
+ const localCliBin = join(projectDir, 'node_modules', '.bin', 'agentuity');
196
+ const cliExists = await stat(localCliBin).catch(() => null);
197
+ const deployCmd = cliExists
198
+ ? ['bun', localCliBin, 'deploy', ...buildDeployArgs(opts)]
199
+ : ['bunx', '--bun', 'agentuity', 'deploy', ...buildDeployArgs(opts)];
200
+ tui.info(`Using CLI: ${cliExists ? localCliBin : 'bunx --bun agentuity'}`);
201
+ const deployExit = await runCommand(deployCmd, projectDir);
202
+ if (deployExit !== 0) {
203
+ tui.fatal(`Deploy failed (exit ${deployExit})`, ErrorCode.BUILD_FAILED);
204
+ }
205
+
206
+ if (scripts?.postdeploy) {
207
+ tui.info('🔧 Running postdeploy script...');
208
+ const postdeployExit = await runCommand(['bun', 'run', '--bun', 'postdeploy'], projectDir);
209
+ if (postdeployExit !== 0) {
210
+ tui.fatal(`Postdeploy failed (exit ${postdeployExit})`, ErrorCode.BUILD_FAILED);
211
+ }
212
+ }
213
+
214
+ tui.success('✅ Your project has been built...');
215
+ } catch (error) {
216
+ const message = error instanceof Error ? error.message : String(error);
217
+ tui.fatal(`CI build failed: ${message}`, ErrorCode.BUILD_FAILED);
218
+ } finally {
219
+ if (tempDir) {
220
+ await rm(tempDir, { recursive: true, force: true });
221
+ }
222
+ }
223
+ }
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { resolve, join, relative } from 'node:path';
3
- import { createCommand } from '../../types';
3
+ import { createCommand, DeployOptionsSchema } from '../../types';
4
4
  import { viteBundle } from './vite-bundler';
5
5
  import * as tui from '../../tui';
6
6
  import { getCommand } from '../../command-prefix';
@@ -16,6 +16,22 @@ const BuildResponseSchema = z.object({
16
16
  size: z.number().optional().describe('Build size in bytes'),
17
17
  });
18
18
 
19
+ const BuildOptionsSchema = z.intersection(
20
+ DeployOptionsSchema,
21
+ z.object({
22
+ dev: z.boolean().optional().describe('Enable development mode'),
23
+ outdir: z.string().optional().describe('Output directory for build artifacts'),
24
+ skipTypeCheck: z.boolean().default(false).optional().describe('Skip typecheck after build'),
25
+ reportFile: z
26
+ .string()
27
+ .optional()
28
+ .describe('file path to save build report JSON with errors, warnings, and diagnostics'),
29
+ ci: z.boolean().optional().describe('Enable CI build mode'),
30
+ url: z.string().optional().describe('Source code download URL (required with --ci)'),
31
+ directory: z.string().optional().describe('Subdirectory within extracted source'),
32
+ })
33
+ );
34
+
19
35
  export const command = createCommand({
20
36
  name: 'build',
21
37
  description: 'Build Agentuity application for deployment',
@@ -26,28 +42,53 @@ export const command = createCommand({
26
42
  examples: [
27
43
  { command: getCommand('build'), description: 'Build the project' },
28
44
  { command: getCommand('build --dev'), description: 'Run in development mode' },
45
+ {
46
+ command: getCommand('build --ci --url https://example.com/source.zip'),
47
+ description: 'Run CI build from source URL',
48
+ },
29
49
  { command: getCommand('bundle'), description: 'Bundle the project' },
30
50
  ],
31
51
  schema: {
32
- options: z.object({
33
- dev: z.boolean().optional().describe('Enable development mode'),
34
- outdir: z.string().optional().describe('Output directory for build artifacts'),
35
- skipTypeCheck: z
36
- .boolean()
37
- .default(false)
38
- .optional()
39
- .describe('Skip typecheck after build'),
40
- reportFile: z
41
- .string()
42
- .optional()
43
- .describe('file path to save build report JSON with errors, warnings, and diagnostics'),
44
- }),
52
+ options: BuildOptionsSchema,
45
53
  response: BuildResponseSchema,
46
54
  },
47
55
 
48
56
  async handler(ctx) {
49
57
  const { opts, projectDir, project } = ctx;
50
58
 
59
+ if (opts.ci) {
60
+ if (!opts.url) {
61
+ tui.fatal('--url is required when using --ci mode', ErrorCode.CONFIG_INVALID);
62
+ }
63
+
64
+ const { runCIBuild } = await import('./ci');
65
+ await runCIBuild(
66
+ {
67
+ url: opts.url,
68
+ directory: opts.directory,
69
+ trigger: opts.trigger,
70
+ event: opts.event,
71
+ message: opts.message,
72
+ commit: opts.commit,
73
+ commitUrl: opts.commitUrl,
74
+ branch: opts.branch,
75
+ repo: opts.repo,
76
+ provider: opts.provider,
77
+ pullRequestNumber: opts.pullRequestNumber,
78
+ pullRequestUrl: opts.pullRequestUrl,
79
+ logsUrl: opts.logsUrl,
80
+ },
81
+ ctx.logger
82
+ );
83
+
84
+ return {
85
+ success: true,
86
+ bundlePath: projectDir,
87
+ projectName: project?.projectId || 'unknown',
88
+ dev: false,
89
+ };
90
+ }
91
+
51
92
  // Initialize build report collector if reportFile is specified
52
93
  const collector = new BuildReportCollector();
53
94
  if (opts.reportFile) {
@@ -3,19 +3,28 @@
3
3
  *
4
4
  * The Tailwind v4 oxide scanner (native Rust binary) can hang or fail when
5
5
  * scanning the filesystem in containerized environments. Adding source(none)
6
- * to @import "tailwindcss" disables the oxide filesystem scanner while still
7
- * allowing @tailwindcss/vite to detect class usage through Vite's module graph.
6
+ * to @import "tailwindcss" disables the oxide filesystem scanner, and an
7
+ * explicit @source directive pointing at the project's src/ directory tells
8
+ * Tailwind exactly where to find utility classes.
8
9
  *
9
10
  * @see https://github.com/tailwindlabs/tailwindcss/discussions/19661
11
+ * @see https://tailwindcss.com/docs/detecting-classes-in-source-files
10
12
  */
11
13
 
14
+ import { dirname, join, relative, sep } from 'node:path';
12
15
  import type { Plugin } from 'vite';
13
16
 
14
17
  export function tailwindSourcePlugin(): Plugin {
18
+ let root: string;
19
+
15
20
  return {
16
21
  name: 'agentuity:tailwind-source',
17
22
  enforce: 'pre',
18
23
 
24
+ configResolved(config) {
25
+ root = config.root;
26
+ },
27
+
19
28
  transform(code, id) {
20
29
  // Only transform CSS files
21
30
  if (!id.endsWith('.css')) {
@@ -27,9 +36,19 @@ export function tailwindSourcePlugin(): Plugin {
27
36
  return null;
28
37
  }
29
38
 
39
+ // Compute relative path from CSS file to project's src/ directory
40
+ const cssDir = dirname(id);
41
+ const srcDir = join(root, 'src');
42
+ let relPath = relative(cssDir, srcDir).split(sep).join('/');
43
+ if (relPath === '') {
44
+ relPath = '.';
45
+ } else if (!relPath.startsWith('.')) {
46
+ relPath = './' + relPath;
47
+ }
48
+
30
49
  // Transform @import "tailwindcss" → @import "tailwindcss" source(none)
31
- // Handles both quote styles and preserves any other directives on the same statement
32
- // Does NOT transform if source() is already specified
50
+ // and add explicit @source so Tailwind knows where to scan for classes.
51
+ // Does NOT transform if source() is already specified.
33
52
  const transformed = code.replace(
34
53
  /@import\s+(["'])tailwindcss\1([^;]*);/g,
35
54
  (match, quote, rest) => {
@@ -37,7 +56,7 @@ export function tailwindSourcePlugin(): Plugin {
37
56
  if (/source\s*\(/.test(rest)) {
38
57
  return match;
39
58
  }
40
- return `@import ${quote}tailwindcss${quote}${rest} source(none);`;
59
+ return `@import ${quote}tailwindcss${quote}${rest} source(none);\n@source "${relPath}";`;
41
60
  }
42
61
  );
43
62