gg-deploy 1.0.1 → 1.1.0

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/dist/cli.js CHANGED
@@ -4,13 +4,15 @@ import { Command } from 'commander';
4
4
  import { planCommand } from './commands/plan.js';
5
5
  import { applyCommand } from './commands/apply.js';
6
6
  import { statusCommand } from './commands/status.js';
7
+ import { updateCommand } from './commands/update.js';
7
8
  import { startMcpServer } from './mcp-server.js';
8
9
  import { startUiServer } from './ui-server.js';
10
+ import { checkAndNotify, CURRENT_VERSION } from './lib/update-checker.js';
9
11
  const program = new Command();
10
12
  program
11
13
  .name('gg-deploy')
12
14
  .description('Free hosting deserves free tooling. Domain → GitHub Pages in 60 seconds.')
13
- .version('1.0.0');
15
+ .version(CURRENT_VERSION);
14
16
  program
15
17
  .command('plan')
16
18
  .description('Preview deployment without making changes (safe for AI agents)')
@@ -20,6 +22,8 @@ program
20
22
  .action(async (domain, repo, opts) => {
21
23
  const output = opts.output;
22
24
  const result = await planCommand(domain, repo, output);
25
+ if (output === 'human')
26
+ await checkAndNotify();
23
27
  process.exit(result.status === 'success' ? 0 : 1);
24
28
  });
25
29
  program
@@ -31,6 +35,8 @@ program
31
35
  .action(async (domain, repo, opts) => {
32
36
  const output = opts.output;
33
37
  const result = await applyCommand(domain, repo, output);
38
+ if (output === 'human')
39
+ await checkAndNotify();
34
40
  const exitCode = result.status === 'success' ? 0 :
35
41
  result.status === 'partial_success' ? 2 : 3;
36
42
  process.exit(exitCode);
@@ -44,6 +50,8 @@ program
44
50
  .action(async (domain, repo, opts) => {
45
51
  const output = opts.output;
46
52
  const result = await statusCommand(domain, repo, output);
53
+ if (output === 'human')
54
+ await checkAndNotify();
47
55
  process.exit(result.status === 'success' ? 0 : 1);
48
56
  });
49
57
  program
@@ -120,5 +128,11 @@ program
120
128
  .action(async () => {
121
129
  await startUiServer();
122
130
  });
131
+ program
132
+ .command('update')
133
+ .description('Check for updates and show upgrade instructions')
134
+ .action(async () => {
135
+ await updateCommand();
136
+ });
123
137
  program.parse();
124
138
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function updateCommand(): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgGnD"}
@@ -0,0 +1,96 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { checkForUpdates, CURRENT_VERSION, detectSurfaceType, getPlatformInfo, getBinaryDownloadUrl } from '../lib/update-checker.js';
4
+ export async function updateCommand() {
5
+ console.log(chalk.bold('\n🔍 Checking for updates...\n'));
6
+ const spinner = ora('Fetching latest version info...').start();
7
+ try {
8
+ const update = await checkForUpdates();
9
+ spinner.stop();
10
+ const surface = detectSurfaceType();
11
+ const { os, arch } = getPlatformInfo();
12
+ console.log(chalk.bold('Current version: ') + chalk.cyan(CURRENT_VERSION));
13
+ console.log(chalk.bold('Installation: ') + chalk.gray(formatSurface(surface)));
14
+ console.log(chalk.bold('Platform: ') + chalk.gray(`${os}-${arch}`));
15
+ console.log('');
16
+ if (!update) {
17
+ console.log(chalk.green('✓ You are running the latest version!'));
18
+ return;
19
+ }
20
+ console.log(chalk.yellow('⚡ Update available!'));
21
+ console.log('');
22
+ console.log(chalk.bold('Latest version: ') + chalk.green.bold(update.latestVersion));
23
+ console.log(chalk.bold('Release URL: ') + chalk.blue.underline(update.releaseUrl));
24
+ console.log('');
25
+ // Show upgrade instructions based on surface type
26
+ console.log(chalk.bold.white('How to update:'));
27
+ console.log('');
28
+ switch (surface) {
29
+ case 'npm-global':
30
+ console.log(chalk.white(' Run:'));
31
+ console.log(chalk.cyan(' npm update -g gg-deploy'));
32
+ break;
33
+ case 'npm-local':
34
+ console.log(chalk.white(' Run:'));
35
+ console.log(chalk.cyan(' npm update gg-deploy'));
36
+ break;
37
+ case 'npx':
38
+ console.log(chalk.white(' Just use the latest version with npx:'));
39
+ console.log(chalk.cyan(` npx gg-deploy@${update.latestVersion} <command>`));
40
+ console.log('');
41
+ console.log(chalk.gray(' Or install globally for faster startup:'));
42
+ console.log(chalk.gray(' npm install -g gg-deploy'));
43
+ break;
44
+ case 'binary': {
45
+ const downloadUrl = getBinaryDownloadUrl(update.latestVersion);
46
+ console.log(chalk.white(' Download the latest binary:'));
47
+ console.log(chalk.blue.underline(` ${downloadUrl}`));
48
+ console.log('');
49
+ if (os === 'macos' || os === 'linux') {
50
+ console.log(chalk.white(' Quick install (macOS/Linux):'));
51
+ console.log(chalk.cyan(` curl -L ${downloadUrl} | tar xz`));
52
+ console.log(chalk.cyan(' sudo mv gg-deploy-* /usr/local/bin/gg-deploy'));
53
+ }
54
+ else if (os === 'win') {
55
+ console.log(chalk.white(' Quick install (Windows):'));
56
+ console.log(chalk.cyan(' 1. Download the .zip file'));
57
+ console.log(chalk.cyan(' 2. Extract and move to a folder in your PATH'));
58
+ }
59
+ break;
60
+ }
61
+ default:
62
+ console.log(chalk.white(' Install via npm:'));
63
+ console.log(chalk.cyan(' npm install -g gg-deploy@latest'));
64
+ console.log('');
65
+ console.log(chalk.white(' Or download binary from:'));
66
+ console.log(chalk.blue.underline(` https://github.com/abe238/gg-deploy/releases/tag/v${update.latestVersion}`));
67
+ }
68
+ console.log('');
69
+ // Show release notes preview if available
70
+ if (update.releaseNotes) {
71
+ console.log(chalk.bold.white('What\'s new:'));
72
+ console.log(chalk.gray('─'.repeat(50)));
73
+ const notes = update.releaseNotes.split('\n').slice(0, 5).join('\n');
74
+ console.log(chalk.gray(notes));
75
+ console.log(chalk.gray('─'.repeat(50)));
76
+ }
77
+ }
78
+ catch (error) {
79
+ spinner.fail('Failed to check for updates');
80
+ console.log(chalk.red('Error: Could not connect to GitHub API'));
81
+ console.log(chalk.gray('Check your internet connection and try again.'));
82
+ console.log('');
83
+ console.log(chalk.white('You can also check manually:'));
84
+ console.log(chalk.blue.underline(' https://github.com/abe238/gg-deploy/releases'));
85
+ }
86
+ }
87
+ function formatSurface(surface) {
88
+ switch (surface) {
89
+ case 'npm-global': return 'npm (global)';
90
+ case 'npm-local': return 'npm (local)';
91
+ case 'npx': return 'npx';
92
+ case 'binary': return 'standalone binary';
93
+ default: return 'unknown';
94
+ }
95
+ }
96
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ declare const CURRENT_VERSION = "1.1.0";
2
+ interface UpdateInfo {
3
+ currentVersion: string;
4
+ latestVersion: string;
5
+ releaseUrl: string;
6
+ releaseNotes: string | null;
7
+ updateCommand: string;
8
+ downloadUrl: string | null;
9
+ }
10
+ type SurfaceType = 'npm-global' | 'npm-local' | 'npx' | 'binary' | 'unknown';
11
+ declare function detectSurfaceType(): SurfaceType;
12
+ declare function getPlatformInfo(): {
13
+ os: string;
14
+ arch: string;
15
+ };
16
+ declare function getBinaryDownloadUrl(version: string): string | null;
17
+ export declare function checkForUpdates(): Promise<UpdateInfo | null>;
18
+ export declare function printUpdateNotification(update: UpdateInfo): void;
19
+ export declare function printUpdateNotificationCompact(update: UpdateInfo): void;
20
+ export declare function checkAndNotify(compact?: boolean): Promise<void>;
21
+ export { CURRENT_VERSION, detectSurfaceType, getPlatformInfo, getBinaryDownloadUrl };
22
+ //# sourceMappingURL=update-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/lib/update-checker.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,eAAe,UAAU,CAAC;AAahC,UAAU,UAAU;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,KAAK,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAe7E,iBAAS,iBAAiB,IAAI,WAAW,CA+BxC;AAED,iBAAS,eAAe,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMvD;AAmBD,iBAAS,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI5D;AAqDD,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA8ClE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAUhE;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAKvE;AAED,wBAAsB,cAAc,CAAC,OAAO,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAalE;AAED,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,202 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
4
+ import chalk from 'chalk';
5
+ const CURRENT_VERSION = '1.1.0';
6
+ const GITHUB_REPO = 'abe238/gg-deploy';
7
+ const CACHE_DIR = join(homedir(), '.gg-deploy');
8
+ const CACHE_FILE = join(CACHE_DIR, 'update-cache.json');
9
+ const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
10
+ function compareVersions(v1, v2) {
11
+ const parts1 = v1.replace(/^v/, '').split('.').map(Number);
12
+ const parts2 = v2.replace(/^v/, '').split('.').map(Number);
13
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
14
+ const p1 = parts1[i] || 0;
15
+ const p2 = parts2[i] || 0;
16
+ if (p1 > p2)
17
+ return 1;
18
+ if (p1 < p2)
19
+ return -1;
20
+ }
21
+ return 0;
22
+ }
23
+ function detectSurfaceType() {
24
+ // Check if running as pkg binary
25
+ if (process.pkg) {
26
+ return 'binary';
27
+ }
28
+ // Check if running via npx (has npm_execpath with npx)
29
+ if (process.env.npm_execpath?.includes('npx')) {
30
+ return 'npx';
31
+ }
32
+ // Check if globally installed
33
+ if (process.env.npm_config_global === 'true') {
34
+ return 'npm-global';
35
+ }
36
+ // Check common global paths
37
+ const execPath = process.argv[1] || '';
38
+ if (execPath.includes('/lib/node_modules/') ||
39
+ execPath.includes('\\node_modules\\') ||
40
+ execPath.includes('/usr/local/bin/') ||
41
+ execPath.includes('/opt/homebrew/')) {
42
+ return 'npm-global';
43
+ }
44
+ // If in a node_modules, likely local
45
+ if (execPath.includes('node_modules')) {
46
+ return 'npm-local';
47
+ }
48
+ return 'unknown';
49
+ }
50
+ function getPlatformInfo() {
51
+ const os = process.platform === 'darwin' ? 'macos' :
52
+ process.platform === 'win32' ? 'win' :
53
+ process.platform === 'linux' ? 'linux' : process.platform;
54
+ const arch = process.arch === 'arm64' ? 'arm64' : 'x64';
55
+ return { os, arch };
56
+ }
57
+ function getUpdateCommand(surface, version) {
58
+ switch (surface) {
59
+ case 'npm-global':
60
+ return 'npm update -g gg-deploy';
61
+ case 'npm-local':
62
+ return 'npm update gg-deploy';
63
+ case 'npx':
64
+ return `npx gg-deploy@${version}`;
65
+ case 'binary': {
66
+ const { os, arch } = getPlatformInfo();
67
+ return `gg-deploy update # or download from GitHub releases`;
68
+ }
69
+ default:
70
+ return 'npm install -g gg-deploy@latest';
71
+ }
72
+ }
73
+ function getBinaryDownloadUrl(version) {
74
+ const { os, arch } = getPlatformInfo();
75
+ const ext = os === 'win' ? 'zip' : 'tar.gz';
76
+ return `https://github.com/${GITHUB_REPO}/releases/download/v${version}/gg-deploy-${version}-${os}-${arch}.${ext}`;
77
+ }
78
+ function readCache() {
79
+ try {
80
+ if (existsSync(CACHE_FILE)) {
81
+ const data = readFileSync(CACHE_FILE, 'utf-8');
82
+ return JSON.parse(data);
83
+ }
84
+ }
85
+ catch {
86
+ // Cache corrupted or unreadable
87
+ }
88
+ return null;
89
+ }
90
+ function writeCache(cache) {
91
+ try {
92
+ if (!existsSync(CACHE_DIR)) {
93
+ mkdirSync(CACHE_DIR, { recursive: true });
94
+ }
95
+ writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));
96
+ }
97
+ catch {
98
+ // Can't write cache, ignore
99
+ }
100
+ }
101
+ async function fetchLatestRelease() {
102
+ try {
103
+ const controller = new AbortController();
104
+ const timeout = setTimeout(() => controller.abort(), 3000); // 3s timeout
105
+ const res = await fetch(`https://api.github.com/repos/${GITHUB_REPO}/releases/latest`, {
106
+ signal: controller.signal,
107
+ headers: {
108
+ 'Accept': 'application/vnd.github.v3+json',
109
+ 'User-Agent': `gg-deploy/${CURRENT_VERSION}`
110
+ }
111
+ });
112
+ clearTimeout(timeout);
113
+ if (!res.ok)
114
+ return null;
115
+ const data = await res.json();
116
+ return {
117
+ version: data.tag_name.replace(/^v/, ''),
118
+ url: data.html_url,
119
+ notes: data.body?.split('\n').slice(0, 3).join('\n') || null
120
+ };
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ export async function checkForUpdates() {
127
+ const cache = readCache();
128
+ const now = Date.now();
129
+ // Return cached result if recent
130
+ if (cache && (now - cache.lastCheck) < CHECK_INTERVAL_MS) {
131
+ if (cache.latestVersion && compareVersions(cache.latestVersion, CURRENT_VERSION) > 0) {
132
+ const surface = detectSurfaceType();
133
+ return {
134
+ currentVersion: CURRENT_VERSION,
135
+ latestVersion: cache.latestVersion,
136
+ releaseUrl: cache.releaseUrl || `https://github.com/${GITHUB_REPO}/releases`,
137
+ releaseNotes: cache.releaseNotes,
138
+ updateCommand: getUpdateCommand(surface, cache.latestVersion),
139
+ downloadUrl: surface === 'binary' ? getBinaryDownloadUrl(cache.latestVersion) : null
140
+ };
141
+ }
142
+ return null;
143
+ }
144
+ // Fetch fresh data (non-blocking for CLI, result used on NEXT run)
145
+ const release = await fetchLatestRelease();
146
+ // Update cache
147
+ const newCache = {
148
+ lastCheck: now,
149
+ latestVersion: release?.version || null,
150
+ releaseUrl: release?.url || null,
151
+ releaseNotes: release?.notes || null
152
+ };
153
+ writeCache(newCache);
154
+ // Return update info if newer version exists
155
+ if (release && compareVersions(release.version, CURRENT_VERSION) > 0) {
156
+ const surface = detectSurfaceType();
157
+ return {
158
+ currentVersion: CURRENT_VERSION,
159
+ latestVersion: release.version,
160
+ releaseUrl: release.url,
161
+ releaseNotes: release.notes,
162
+ updateCommand: getUpdateCommand(surface, release.version),
163
+ downloadUrl: surface === 'binary' ? getBinaryDownloadUrl(release.version) : null
164
+ };
165
+ }
166
+ return null;
167
+ }
168
+ export function printUpdateNotification(update) {
169
+ console.log('');
170
+ console.log(chalk.yellow('╭─────────────────────────────────────────────────────╮'));
171
+ console.log(chalk.yellow('│') + chalk.bold.cyan(' 💡 Update available: ') +
172
+ chalk.gray(update.currentVersion) + chalk.white(' → ') +
173
+ chalk.green.bold(update.latestVersion) +
174
+ chalk.yellow(' │'));
175
+ console.log(chalk.yellow('│') + chalk.white(` Run: ${chalk.cyan(update.updateCommand)}`) +
176
+ ' '.repeat(Math.max(0, 36 - update.updateCommand.length)) + chalk.yellow('│'));
177
+ console.log(chalk.yellow('╰─────────────────────────────────────────────────────╯'));
178
+ }
179
+ export function printUpdateNotificationCompact(update) {
180
+ console.log('');
181
+ console.log(chalk.yellow('💡') + chalk.gray(` Update available: ${update.currentVersion} → `) +
182
+ chalk.green.bold(update.latestVersion) +
183
+ chalk.gray(` • Run: `) + chalk.cyan(update.updateCommand));
184
+ }
185
+ export async function checkAndNotify(compact = true) {
186
+ try {
187
+ const update = await checkForUpdates();
188
+ if (update) {
189
+ if (compact) {
190
+ printUpdateNotificationCompact(update);
191
+ }
192
+ else {
193
+ printUpdateNotification(update);
194
+ }
195
+ }
196
+ }
197
+ catch {
198
+ // Silently ignore update check failures
199
+ }
200
+ }
201
+ export { CURRENT_VERSION, detectSurfaceType, getPlatformInfo, getBinaryDownloadUrl };
202
+ //# sourceMappingURL=update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/lib/update-checker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gg-deploy",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Free hosting deserves free tooling. Domain → GitHub Pages in 60 seconds.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1 +1 @@
1
- *{margin:0;padding:0;box-sizing:border-box}:root{--bg: #0a0a0a;--bg-secondary: #111111;--bg-tertiary: #1a1a1a;--bg-hover: #1f1f1f;--border: #262626;--border-hover: #404040;--text: #fafafa;--text-secondary: #a1a1a1;--text-muted: #525252;--accent: #10b981;--accent-hover: #059669;--accent-glow: rgba(16, 185, 129, .15);--error: #ef4444;--warning: #f59e0b}body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mono{font-family:JetBrains Mono,Fira Code,SF Mono,Consolas,monospace}.container{max-width:480px;margin:0 auto;padding:3rem 1.5rem;min-height:100vh;display:flex;flex-direction:column}.header{margin-bottom:2rem}.header-row{display:flex;align-items:center;justify-content:space-between}.logo{font-size:1.75rem;font-weight:700;letter-spacing:-.03em;background:linear-gradient(135deg,#fff,#a1a1a1);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.tagline{color:var(--text-secondary);font-size:.95rem;margin-top:.375rem}.settings-btn{background:transparent;border:none;color:var(--text-muted);cursor:pointer;padding:.5rem;border-radius:8px;transition:all .15s}.settings-btn:hover{background:var(--bg-tertiary);color:var(--text-secondary)}.card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:16px;padding:1.5rem;margin-bottom:1rem}.setup-card{padding:1.75rem}.field{margin-bottom:1rem}.field:last-child{margin-bottom:0}.label{display:block;font-size:.8rem;font-weight:500;color:var(--text-secondary);margin-bottom:.5rem;text-transform:uppercase;letter-spacing:.05em}.input{width:100%;padding:.875rem 1rem;background:var(--bg);border:1px solid var(--border);border-radius:10px;color:var(--text);font-size:.95rem;transition:all .15s}.input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}.input::placeholder{color:var(--text-muted)}.input:disabled{opacity:.5;cursor:not-allowed}.input-with-toggle{position:relative;display:flex;align-items:center}.input-with-toggle .input{padding-right:3rem}.eye-toggle{position:absolute;right:.75rem;background:transparent;border:none;color:var(--text-muted);cursor:pointer;padding:.25rem;display:flex;align-items:center;justify-content:center;transition:color .15s}.eye-toggle:hover{color:var(--text-secondary)}.saved-value{font-size:.8rem;color:var(--accent);margin-top:.375rem;font-family:JetBrains Mono,monospace}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem 1.5rem;background:var(--accent);color:#000;border:none;border-radius:10px;font-size:.95rem;font-weight:600;cursor:pointer;transition:all .15s;width:100%}.btn:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.btn:active:not(:disabled){transform:translateY(0)}.btn:disabled{opacity:.4;cursor:not-allowed}.btn-secondary{background:var(--bg-tertiary);color:var(--text);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){background:var(--bg-hover);border-color:var(--border-hover)}.setup-section{padding:.5rem 0}.setup-header{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.setup-number{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:var(--accent);color:#000;font-weight:600;font-size:.85rem;border-radius:50%}.setup-title{font-size:1.05rem;font-weight:600;color:var(--text);flex:1}.setup-check{color:var(--accent)}.setup-desc{color:var(--text-secondary);font-size:.9rem;margin-bottom:.75rem;line-height:1.5}.setup-configured{color:var(--accent);font-size:.9rem;font-family:JetBrains Mono,monospace}.setup-divider{height:1px;background:var(--border);margin:1.25rem 0}.external-link{display:inline-flex;align-items:center;gap:.375rem;color:var(--accent);font-size:.9rem;font-weight:500;text-decoration:none;margin-bottom:1rem;transition:opacity .15s}.external-link:hover{opacity:.8}.steps{margin:1.25rem 0}.step{display:flex;align-items:flex-start;gap:.875rem;padding:.75rem 0;border-bottom:1px solid var(--border)}.step:last-child{border-bottom:none}.step-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px}.step-icon.pending{color:var(--text-muted)}.step-icon.active,.step-icon.done{color:var(--accent)}.step-icon.error{color:var(--error)}.step-text{flex:1;min-width:0}.step-title{font-size:.925rem;color:var(--text)}.step-title.muted{color:var(--text-muted)}.step-detail{font-size:.8rem;color:var(--text-secondary);margin-top:.25rem;font-family:JetBrains Mono,monospace}.success-banner{background:linear-gradient(135deg,var(--accent) 0%,#059669 100%);border-radius:16px;padding:2.5rem 2rem;text-align:center;margin-bottom:1rem}.success-icon{font-size:3.5rem;margin-bottom:.75rem;line-height:1}.success-title{font-size:1.5rem;font-weight:700;color:#fff;margin-bottom:.5rem}.success-url{font-family:JetBrains Mono,monospace;font-size:1rem}.success-url a{color:#ffffffe6;text-decoration:underline;text-underline-offset:3px}.status-row{display:flex;gap:.75rem;justify-content:center;margin-bottom:1rem}.status-badge{display:inline-flex;align-items:center;gap:.5rem;padding:.375rem .875rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:100px;font-size:.8rem;color:var(--text-secondary)}.status-dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted)}.status-dot.connected{background:var(--accent);box-shadow:0 0 8px var(--accent)}.status-dot.error{background:var(--error)}.status-dot.testing{background:var(--warning);animation:pulse 1s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.2)}}.status-user{font-size:.75rem;color:var(--text-muted);margin-left:.25rem}.test-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;color:var(--text-muted);cursor:pointer;transition:all .15s}.test-btn:hover:not(:disabled){background:var(--bg-tertiary);color:var(--text-secondary);border-color:var(--border-hover)}.test-btn:disabled{opacity:.5;cursor:not-allowed}.status-badge{cursor:help;position:relative}.status-badge[data-tooltip]:after{content:attr(data-tooltip);position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);padding:.5rem .75rem;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:6px;font-size:.75rem;color:var(--text-secondary);white-space:nowrap;opacity:0;visibility:hidden;transition:opacity .1s,visibility .1s;z-index:10;pointer-events:none}.status-badge[data-tooltip]:hover:after{opacity:1;visibility:visible}.settings-status-row{display:flex;gap:.75rem;align-items:center;justify-content:center;padding:1rem 0;margin-bottom:1rem;border-top:1px solid var(--border)}.loading-state{display:flex;align-items:center;justify-content:center;gap:.75rem;padding:4rem 0;color:var(--text-secondary)}.footer{margin-top:auto;padding-top:2rem;text-align:center;font-size:.85rem;color:var(--text-muted)}.footer a{color:var(--text-secondary);text-decoration:none;transition:color .15s}.footer a:hover{color:var(--text)}.error-text{color:var(--error);font-size:.875rem;margin-top:1rem;padding:.75rem;background:#ef44441a;border:1px solid rgba(239,68,68,.2);border-radius:8px}@keyframes spin{to{transform:rotate(360deg)}}.spinner{animation:spin 1s linear infinite}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.card{animation:fadeIn .3s ease-out}@media (max-width: 520px){.container{padding:2rem 1rem}.logo{font-size:1.5rem}.card{padding:1.25rem}}
1
+ *{margin:0;padding:0;box-sizing:border-box}:root{--bg: #0a0a0a;--bg-secondary: #111111;--bg-tertiary: #1a1a1a;--bg-hover: #1f1f1f;--border: #262626;--border-hover: #404040;--text: #fafafa;--text-secondary: #a1a1a1;--text-muted: #525252;--accent: #10b981;--accent-hover: #059669;--accent-glow: rgba(16, 185, 129, .15);--error: #ef4444;--warning: #f59e0b}body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mono{font-family:JetBrains Mono,Fira Code,SF Mono,Consolas,monospace}.container{max-width:480px;margin:0 auto;padding:3rem 1.5rem;min-height:100vh;display:flex;flex-direction:column}.header{margin-bottom:2rem}.header-row{display:flex;align-items:center;justify-content:space-between}.logo{font-size:1.75rem;font-weight:700;letter-spacing:-.03em;background:linear-gradient(135deg,#fff,#a1a1a1);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.tagline{color:var(--text-secondary);font-size:.95rem;margin-top:.375rem}.settings-btn{background:transparent;border:none;color:var(--text-muted);cursor:pointer;padding:.5rem;border-radius:8px;transition:all .15s}.settings-btn:hover{background:var(--bg-tertiary);color:var(--text-secondary)}.card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:16px;padding:1.5rem;margin-bottom:1rem}.setup-card{padding:1.75rem}.field{margin-bottom:1rem}.field:last-child{margin-bottom:0}.label{display:block;font-size:.8rem;font-weight:500;color:var(--text-secondary);margin-bottom:.5rem;text-transform:uppercase;letter-spacing:.05em}.input{width:100%;padding:.875rem 1rem;background:var(--bg);border:1px solid var(--border);border-radius:10px;color:var(--text);font-size:.95rem;transition:all .15s}.input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}.input::placeholder{color:var(--text-muted)}.input:disabled{opacity:.5;cursor:not-allowed}.input-with-toggle{position:relative;display:flex;align-items:center}.input-with-toggle .input{padding-right:3rem}.eye-toggle{position:absolute;right:.75rem;background:transparent;border:none;color:var(--text-muted);cursor:pointer;padding:.25rem;display:flex;align-items:center;justify-content:center;transition:color .15s}.eye-toggle:hover{color:var(--text-secondary)}.saved-value{font-size:.8rem;color:var(--accent);margin-top:.375rem;font-family:JetBrains Mono,monospace}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem 1.5rem;background:var(--accent);color:#000;border:none;border-radius:10px;font-size:.95rem;font-weight:600;cursor:pointer;transition:all .15s;width:100%}.btn:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.btn:active:not(:disabled){transform:translateY(0)}.btn:disabled{opacity:.4;cursor:not-allowed}.btn-secondary{background:var(--bg-tertiary);color:var(--text);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){background:var(--bg-hover);border-color:var(--border-hover)}.setup-section{padding:.5rem 0}.setup-header{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.setup-number{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:var(--accent);color:#000;font-weight:600;font-size:.85rem;border-radius:50%}.setup-title{font-size:1.05rem;font-weight:600;color:var(--text);flex:1}.setup-check{color:var(--accent)}.setup-desc{color:var(--text-secondary);font-size:.9rem;margin-bottom:.75rem;line-height:1.5}.setup-configured{color:var(--accent);font-size:.9rem;font-family:JetBrains Mono,monospace}.setup-divider{height:1px;background:var(--border);margin:1.25rem 0}.external-link{display:inline-flex;align-items:center;gap:.375rem;color:var(--accent);font-size:.9rem;font-weight:500;text-decoration:none;margin-bottom:1rem;transition:opacity .15s}.external-link:hover{opacity:.8}.steps{margin:1.25rem 0}.step{display:flex;align-items:flex-start;gap:.875rem;padding:.75rem 0;border-bottom:1px solid var(--border)}.step:last-child{border-bottom:none}.step-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px}.step-icon.pending{color:var(--text-muted)}.step-icon.active,.step-icon.done{color:var(--accent)}.step-icon.error{color:var(--error)}.step-text{flex:1;min-width:0}.step-title{font-size:.925rem;color:var(--text)}.step-title.muted{color:var(--text-muted)}.step-detail{font-size:.8rem;color:var(--text-secondary);margin-top:.25rem;font-family:JetBrains Mono,monospace}.success-banner{background:linear-gradient(135deg,var(--accent) 0%,#059669 100%);border-radius:16px;padding:2.5rem 2rem;text-align:center;margin-bottom:1rem}.success-icon{font-size:3.5rem;margin-bottom:.75rem;line-height:1}.success-title{font-size:1.5rem;font-weight:700;color:#fff;margin-bottom:.5rem}.success-url{font-family:JetBrains Mono,monospace;font-size:1rem}.success-url a{color:#ffffffe6;text-decoration:underline;text-underline-offset:3px}.status-row{display:flex;gap:.75rem;justify-content:center;margin-bottom:1rem}.status-badge{display:inline-flex;align-items:center;gap:.5rem;padding:.375rem .875rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:100px;font-size:.8rem;color:var(--text-secondary)}.status-dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted)}.status-dot.connected{background:var(--accent);box-shadow:0 0 8px var(--accent)}.status-dot.error{background:var(--error)}.status-dot.testing{background:var(--warning);animation:pulse 1s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.2)}}.status-user{font-size:.75rem;color:var(--text-muted);margin-left:.25rem}.test-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;color:var(--text-muted);cursor:pointer;transition:all .15s}.test-btn:hover:not(:disabled){background:var(--bg-tertiary);color:var(--text-secondary);border-color:var(--border-hover)}.test-btn:disabled{opacity:.5;cursor:not-allowed}.status-badge{cursor:help;position:relative}.status-badge[data-tooltip]:after{content:attr(data-tooltip);position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);padding:.5rem .75rem;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:6px;font-size:.75rem;color:var(--text-secondary);white-space:nowrap;opacity:0;visibility:hidden;transition:opacity .1s,visibility .1s;z-index:10;pointer-events:none}.status-badge[data-tooltip]:hover:after{opacity:1;visibility:visible}.settings-status-row{display:flex;gap:.75rem;align-items:center;justify-content:center;padding:1rem 0;margin-bottom:1rem;border-top:1px solid var(--border)}.loading-state{display:flex;align-items:center;justify-content:center;gap:.75rem;padding:4rem 0;color:var(--text-secondary)}.footer{margin-top:auto;padding-top:2rem;text-align:center;font-size:.85rem;color:var(--text-muted)}.footer a{color:var(--text-secondary);text-decoration:none;transition:color .15s}.footer a:hover{color:var(--text)}.error-text{color:var(--error);font-size:.875rem;margin-top:1rem;padding:.75rem;background:#ef44441a;border:1px solid rgba(239,68,68,.2);border-radius:8px}@keyframes spin{to{transform:rotate(360deg)}}.spinner{animation:spin 1s linear infinite}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.card{animation:fadeIn .3s ease-out}@media (max-width: 520px){.container{padding:2rem 1rem}.logo{font-size:1.5rem}.card{padding:1.25rem}}.update-banner{background:linear-gradient(135deg,var(--accent) 0%,#059669 100%);border-radius:12px;padding:.75rem 1rem;margin-bottom:1.5rem;display:flex;align-items:center;justify-content:space-between;gap:.75rem;animation:slideDown .3s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.update-content{display:flex;align-items:center;gap:1rem;flex:1}.update-text{font-size:.875rem;font-weight:500;color:#fff}.update-btn{display:flex;align-items:center;gap:.375rem;background:#fff3;border:none;color:#fff;font-size:.8125rem;font-weight:600;padding:.5rem .875rem;border-radius:8px;cursor:pointer;transition:background .15s;white-space:nowrap}.update-btn:hover{background:#ffffff4d}.update-btn svg{width:14px;height:14px}.update-dismiss{background:transparent;border:none;color:#ffffffb3;cursor:pointer;padding:.25rem;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .15s}.update-dismiss:hover{background:#ffffff26;color:#fff}