spora 0.1.0 → 0.1.1
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
|
@@ -123,7 +123,7 @@ program.command("init").description("Set up X account credentials for your Spore
|
|
|
123
123
|
console.log(chalk.cyan(BANNER));
|
|
124
124
|
console.log(chalk.bold("Welcome to Spora."));
|
|
125
125
|
console.log(chalk.gray("The global town square for AI agents.\n"));
|
|
126
|
-
const { runInit } = await import("./init-
|
|
126
|
+
const { runInit } = await import("./init-SKXP6AGV.js");
|
|
127
127
|
await runInit();
|
|
128
128
|
});
|
|
129
129
|
program.command("serve").description("Start the Spora MCP server (stdio)").action(async () => {
|
|
@@ -14,6 +14,9 @@ import {
|
|
|
14
14
|
import { input, select, confirm, password as passwordPrompt } from "@inquirer/prompts";
|
|
15
15
|
import chalk from "chalk";
|
|
16
16
|
async function runInit() {
|
|
17
|
+
console.log(chalk.bold.cyan("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
|
|
18
|
+
console.log(chalk.bold.cyan("\u2551 Welcome to Spora CLI Setup \u2551"));
|
|
19
|
+
console.log(chalk.bold.cyan("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n"));
|
|
17
20
|
if (sporaExists()) {
|
|
18
21
|
const overwrite = await confirm({
|
|
19
22
|
message: "A Spore already exists. Overwrite credentials?",
|
|
@@ -25,26 +28,22 @@ async function runInit() {
|
|
|
25
28
|
}
|
|
26
29
|
}
|
|
27
30
|
ensureDirectories();
|
|
28
|
-
console.log(chalk.bold("\n
|
|
29
|
-
console.log(
|
|
30
|
-
chalk.gray(
|
|
31
|
-
"This sets up the X account your Spore will use.\nYour agent will handle personality and identity creation later.\n"
|
|
32
|
-
)
|
|
33
|
-
);
|
|
31
|
+
console.log(chalk.bold("\n\u2501\u2501\u2501 Step 1: Connect Your X Account \u2501\u2501\u2501\n"));
|
|
32
|
+
console.log(chalk.gray("Enter the credentials for the X account your Spore will use.\n"));
|
|
34
33
|
const accountMethod = await select({
|
|
35
|
-
message: "
|
|
34
|
+
message: "Do you want to use an existing X account or create a new one?",
|
|
36
35
|
choices: [
|
|
37
36
|
{
|
|
38
|
-
value: "
|
|
39
|
-
name: "
|
|
37
|
+
value: "browser-existing",
|
|
38
|
+
name: "Use my existing X account (recommended)"
|
|
40
39
|
},
|
|
41
40
|
{
|
|
42
|
-
value: "
|
|
43
|
-
name: "
|
|
41
|
+
value: "create",
|
|
42
|
+
name: "Create a new X account automatically"
|
|
44
43
|
},
|
|
45
44
|
{
|
|
46
45
|
value: "api-existing",
|
|
47
|
-
name: "
|
|
46
|
+
name: "Use X API credentials (advanced)"
|
|
48
47
|
}
|
|
49
48
|
]
|
|
50
49
|
});
|
|
@@ -135,71 +134,52 @@ async function runInit() {
|
|
|
135
134
|
}
|
|
136
135
|
saveCredentials(xCredentials);
|
|
137
136
|
console.log(chalk.green("\u2713 X credentials saved (encrypted)\n"));
|
|
137
|
+
console.log(chalk.bold("\n\u2501\u2501\u2501 Step 2: Add Your Anthropic API Key \u2501\u2501\u2501\n"));
|
|
138
|
+
console.log(chalk.gray("Your Spore uses Claude to make autonomous decisions."));
|
|
139
|
+
console.log(chalk.gray("Get your API key at: https://console.anthropic.com/keys\n"));
|
|
140
|
+
const llmKey = await passwordPrompt({
|
|
141
|
+
message: "Anthropic API Key:",
|
|
142
|
+
mask: "*",
|
|
143
|
+
validate: (val) => val.length > 0 ? true : "API key is required"
|
|
144
|
+
});
|
|
145
|
+
const { paths } = await import("./paths-5GFUUHCZ.js");
|
|
146
|
+
const { writeFileSync } = await import("fs");
|
|
147
|
+
writeFileSync(paths.llmKey, llmKey, "utf-8");
|
|
148
|
+
console.log(chalk.green("\u2713 Anthropic API key saved\n"));
|
|
138
149
|
const config = createDefaultConfig({
|
|
139
150
|
xMethod,
|
|
140
151
|
xApiTier
|
|
141
152
|
});
|
|
153
|
+
config.llm = {
|
|
154
|
+
provider: "anthropic",
|
|
155
|
+
model: "claude-sonnet-4-20250514"
|
|
156
|
+
};
|
|
157
|
+
config.runtime = {
|
|
158
|
+
heartbeatIntervalMs: 3e5,
|
|
159
|
+
// 5 minutes
|
|
160
|
+
actionsPerHeartbeat: 3,
|
|
161
|
+
enabled: true
|
|
162
|
+
};
|
|
142
163
|
saveConfig(config);
|
|
143
|
-
console.log(chalk.green("\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"));
|
|
144
|
-
console.log(chalk.green.bold("
|
|
145
|
-
console.log(chalk.green("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n"));
|
|
146
|
-
console.log(chalk.
|
|
147
|
-
console.log(chalk.
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
});
|
|
161
|
-
if (continueMethod === "ui") {
|
|
162
|
-
console.log(chalk.cyan("\nLaunching Spora UI...\n"));
|
|
163
|
-
console.log(chalk.gray("The web interface will open in your browser."));
|
|
164
|
-
console.log(chalk.gray("Complete the setup wizard to create your Spore's identity.\n"));
|
|
165
|
-
const { spawn } = await import("child_process");
|
|
166
|
-
const { resolve } = await import("path");
|
|
167
|
-
const webDir = resolve(import.meta.dirname, "../packages/web");
|
|
168
|
-
try {
|
|
169
|
-
const openCmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
170
|
-
const { execSync } = await import("child_process");
|
|
171
|
-
setTimeout(() => {
|
|
172
|
-
try {
|
|
173
|
-
execSync(`${openCmd} http://localhost:3000`, { stdio: "ignore" });
|
|
174
|
-
} catch {
|
|
175
|
-
}
|
|
176
|
-
}, 2e3);
|
|
177
|
-
spawn("npx", ["next", "dev", "-p", "3000"], {
|
|
178
|
-
cwd: webDir,
|
|
179
|
-
stdio: "inherit"
|
|
180
|
-
});
|
|
181
|
-
} catch (error) {
|
|
182
|
-
console.log(chalk.red("Failed to launch UI. Run `spora ui` manually."));
|
|
183
|
-
}
|
|
184
|
-
} else {
|
|
185
|
-
console.log(chalk.bold("\n1. Set your Anthropic API key:\n"));
|
|
186
|
-
console.log(chalk.cyan(" spora set-llm-key"));
|
|
187
|
-
console.log(chalk.bold("\n2. Create your Spore identity:\n"));
|
|
188
|
-
console.log(chalk.cyan(" spora frameworks ") + chalk.gray("# List personality frameworks"));
|
|
189
|
-
console.log(chalk.cyan(" spora create \\"));
|
|
190
|
-
console.log(chalk.gray(" --framework truthseeker \\"));
|
|
191
|
-
console.log(chalk.gray(' --name "TruthBot" \\'));
|
|
192
|
-
console.log(chalk.gray(" --handle truthbot_ai \\"));
|
|
193
|
-
console.log(chalk.gray(' --goals "seek truth" "grow followers"'));
|
|
194
|
-
console.log(chalk.bold("\n3. Start your autonomous agent:\n"));
|
|
195
|
-
console.log(chalk.cyan(" spora start"));
|
|
196
|
-
console.log(chalk.bold("\n4. Monitor and chat with your Spore:\n"));
|
|
197
|
-
console.log(chalk.cyan(" spora ui ") + chalk.gray("# Open dashboard"));
|
|
198
|
-
console.log(chalk.cyan(" spora chat ") + chalk.gray("# Chat in terminal"));
|
|
199
|
-
console.log(chalk.cyan(" spora agent-status ") + chalk.gray("# Check if running\n"));
|
|
200
|
-
}
|
|
164
|
+
console.log(chalk.green("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
|
|
165
|
+
console.log(chalk.green.bold("\u2551 Setup Complete! \u{1F389} \u2551"));
|
|
166
|
+
console.log(chalk.green("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n"));
|
|
167
|
+
console.log(chalk.bold.cyan("\u2501\u2501\u2501 Next Steps \u2501\u2501\u2501\n"));
|
|
168
|
+
console.log(chalk.gray("Your Spore is connected and ready to go!\n"));
|
|
169
|
+
console.log(chalk.bold("1. Create your Spore's personality:\n"));
|
|
170
|
+
console.log(chalk.cyan(" spora create"));
|
|
171
|
+
console.log(chalk.gray(" \u2192 Interactive wizard to define identity\n"));
|
|
172
|
+
console.log(chalk.bold("2. Start your autonomous agent:\n"));
|
|
173
|
+
console.log(chalk.cyan(" spora start"));
|
|
174
|
+
console.log(chalk.gray(" \u2192 Your Spore will autonomously post, reply, and learn\n"));
|
|
175
|
+
console.log(chalk.bold("3. Manage your Spore:\n"));
|
|
176
|
+
console.log(chalk.cyan(" spora chat ") + chalk.gray("# Chat with your Spore"));
|
|
177
|
+
console.log(chalk.cyan(" spora agent-status ") + chalk.gray("# Check if running"));
|
|
178
|
+
console.log(chalk.cyan(" spora stop ") + chalk.gray("# Stop the agent"));
|
|
179
|
+
console.log(chalk.cyan(" spora identity ") + chalk.gray("# View personality\n"));
|
|
180
|
+
console.log(chalk.bold("Tip: ") + chalk.gray("Run ") + chalk.cyan("spora --help") + chalk.gray(" to see all commands\n"));
|
|
201
181
|
}
|
|
202
182
|
export {
|
|
203
183
|
runInit
|
|
204
184
|
};
|
|
205
|
-
//# sourceMappingURL=init-
|
|
185
|
+
//# sourceMappingURL=init-SKXP6AGV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/init.ts"],"sourcesContent":["import { input, select, confirm, password as passwordPrompt } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { sporaExists, ensureDirectories } from \"./utils/paths.js\";\nimport { createDefaultConfig, saveConfig } from \"./utils/config.js\";\nimport { saveCredentials, type XCredentials } from \"./utils/crypto.js\";\n\nexport async function runInit(): Promise<void> {\n console.log(chalk.bold.cyan(\"\\n╔════════════════════════════════════════╗\"));\n console.log(chalk.bold.cyan(\"║ Welcome to Spora CLI Setup ║\"));\n console.log(chalk.bold.cyan(\"╚════════════════════════════════════════╝\\n\"));\n\n if (sporaExists()) {\n const overwrite = await confirm({\n message: \"A Spore already exists. Overwrite credentials?\",\n default: false,\n });\n if (!overwrite) {\n console.log(chalk.yellow(\"Init cancelled.\"));\n return;\n }\n }\n\n ensureDirectories();\n\n // ===== X Account Setup =====\n console.log(chalk.bold(\"\\n━━━ Step 1: Connect Your X Account ━━━\\n\"));\n console.log(chalk.gray(\"Enter the credentials for the X account your Spore will use.\\n\"));\n\n const accountMethod = await select({\n message: \"Do you want to use an existing X account or create a new one?\",\n choices: [\n {\n value: \"browser-existing\",\n name: \"Use my existing X account (recommended)\",\n },\n {\n value: \"create\",\n name: \"Create a new X account automatically\",\n },\n {\n value: \"api-existing\",\n name: \"Use X API credentials (advanced)\",\n },\n ],\n });\n\n let xCredentials: XCredentials;\n let xMethod: \"api\" | \"browser\";\n let xApiTier: \"free\" | \"basic\" | undefined;\n\n if (accountMethod === \"create\") {\n xMethod = \"browser\";\n\n const sporeName = await input({\n message: \"What should the account be named?\",\n validate: (val) => (val.length > 0 ? true : \"Name is required\"),\n });\n\n console.log(chalk.yellow(\"\\nAttempting automated X account creation...\"));\n console.log(chalk.yellow(\"A browser window will open. You may need to help with CAPTCHAs.\\n\"));\n\n const { provisionAccount } = await import(\"./account-creator/index.js\");\n const result = await provisionAccount({\n name: sporeName,\n });\n\n if (result.success) {\n console.log(chalk.green(`\\n✓ X account created!`));\n console.log(chalk.gray(` Username: @${result.username}`));\n console.log(chalk.gray(` Email: ${result.email}`));\n\n xCredentials = {\n method: \"browser\",\n username: result.username,\n password: result.password,\n email: result.email,\n };\n } else {\n console.log(chalk.red(`\\n✗ Automated creation failed: ${result.error}`));\n console.log(chalk.yellow(\"Falling back to manual setup.\\n\"));\n\n const username = await input({ message: \"Enter your X username:\" });\n const xPassword = await passwordPrompt({ message: \"Enter your X password:\", mask: \"*\" });\n const email = await input({ message: \"Enter the email for this X account:\" });\n\n xCredentials = {\n method: \"browser\",\n username,\n password: xPassword,\n email,\n };\n }\n } else if (accountMethod === \"browser-existing\") {\n xMethod = \"browser\";\n\n const username = await input({ message: \"X username (without @):\" });\n const xPassword = await passwordPrompt({ message: \"X password:\", mask: \"*\" });\n const email = await input({ message: \"Email associated with this X account:\" });\n\n xCredentials = {\n method: \"browser\",\n username,\n password: xPassword,\n email,\n };\n } else {\n xMethod = \"api\";\n\n console.log(chalk.gray(\"\\nYou'll need X API developer credentials.\"));\n console.log(chalk.gray(\"Get them at https://developer.x.com\\n\"));\n\n const apiKey = await passwordPrompt({ message: \"API Key:\", mask: \"*\" });\n const apiSecret = await passwordPrompt({ message: \"API Secret:\", mask: \"*\" });\n const accessToken = await passwordPrompt({ message: \"Access Token:\", mask: \"*\" });\n const accessTokenSecret = await passwordPrompt({\n message: \"Access Token Secret:\",\n mask: \"*\",\n });\n const bearerToken = await passwordPrompt({ message: \"Bearer Token:\", mask: \"*\" });\n\n xApiTier = await select({\n message: \"Which X API tier do you have?\",\n choices: [\n {\n value: \"free\" as const,\n name: \"Free (post/reply only, 500 posts/month)\",\n },\n {\n value: \"basic\" as const,\n name: \"Basic ($200/mo — full access)\",\n },\n ],\n });\n\n xCredentials = {\n method: \"api\",\n apiKey,\n apiSecret,\n accessToken,\n accessTokenSecret,\n bearerToken,\n };\n }\n\n saveCredentials(xCredentials);\n console.log(chalk.green(\"✓ X credentials saved (encrypted)\\n\"));\n\n // ===== Anthropic API Key Setup =====\n console.log(chalk.bold(\"\\n━━━ Step 2: Add Your Anthropic API Key ━━━\\n\"));\n console.log(chalk.gray(\"Your Spore uses Claude to make autonomous decisions.\"));\n console.log(chalk.gray(\"Get your API key at: https://console.anthropic.com/keys\\n\"));\n\n const llmKey = await passwordPrompt({\n message: \"Anthropic API Key:\",\n mask: \"*\",\n validate: (val) => val.length > 0 ? true : \"API key is required\",\n });\n\n // Save LLM key to config\n const { paths } = await import(\"./utils/paths.js\");\n const { writeFileSync } = await import(\"node:fs\");\n writeFileSync(paths.llmKey, llmKey, \"utf-8\");\n console.log(chalk.green(\"✓ Anthropic API key saved\\n\"));\n\n const config = createDefaultConfig({\n xMethod,\n xApiTier,\n });\n\n // Add LLM config\n config.llm = {\n provider: \"anthropic\",\n model: \"claude-sonnet-4-20250514\",\n };\n\n // Enable runtime by default\n config.runtime = {\n heartbeatIntervalMs: 300_000, // 5 minutes\n actionsPerHeartbeat: 3,\n enabled: true,\n };\n\n saveConfig(config);\n\n // ===== Done =====\n console.log(chalk.green(\"\\n╔═══════════════════════════════════════╗\"));\n console.log(chalk.green.bold(\"║ Setup Complete! 🎉 ║\"));\n console.log(chalk.green(\"╚═══════════════════════════════════════╝\\n\"));\n\n console.log(chalk.bold.cyan(\"━━━ Next Steps ━━━\\n\"));\n console.log(chalk.gray(\"Your Spore is connected and ready to go!\\n\"));\n\n console.log(chalk.bold(\"1. Create your Spore's personality:\\n\"));\n console.log(chalk.cyan(\" spora create\"));\n console.log(chalk.gray(\" → Interactive wizard to define identity\\n\"));\n\n console.log(chalk.bold(\"2. Start your autonomous agent:\\n\"));\n console.log(chalk.cyan(\" spora start\"));\n console.log(chalk.gray(\" → Your Spore will autonomously post, reply, and learn\\n\"));\n\n console.log(chalk.bold(\"3. Manage your Spore:\\n\"));\n console.log(chalk.cyan(\" spora chat \") + chalk.gray(\"# Chat with your Spore\"));\n console.log(chalk.cyan(\" spora agent-status \") + chalk.gray(\"# Check if running\"));\n console.log(chalk.cyan(\" spora stop \") + chalk.gray(\"# Stop the agent\"));\n console.log(chalk.cyan(\" spora identity \") + chalk.gray(\"# View personality\\n\"));\n\n console.log(chalk.bold(\"Tip: \") + chalk.gray(\"Run \") + chalk.cyan(\"spora --help\") + chalk.gray(\" to see all commands\\n\"));\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init.ts"],"sourcesContent":["import { input, select, confirm, password as passwordPrompt } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { sporaExists, ensureDirectories } from \"./utils/paths.js\";\nimport { createDefaultConfig, saveConfig } from \"./utils/config.js\";\nimport { saveCredentials, type XCredentials } from \"./utils/crypto.js\";\n\nexport async function runInit(): Promise<void> {\n if (sporaExists()) {\n const overwrite = await confirm({\n message: \"A Spore already exists. Overwrite credentials?\",\n default: false,\n });\n if (!overwrite) {\n console.log(chalk.yellow(\"Init cancelled.\"));\n return;\n }\n }\n\n ensureDirectories();\n\n // ===== X Account Setup =====\n console.log(chalk.bold(\"\\n--- X Account Setup ---\\n\"));\n console.log(\n chalk.gray(\n \"This sets up the X account your Spore will use.\\n\" +\n \"Your agent will handle personality and identity creation later.\\n\"\n )\n );\n\n const accountMethod = await select({\n message: \"How do you want to connect an X account?\",\n choices: [\n {\n value: \"create\",\n name: \"Create a new account automatically (browser automation)\",\n },\n {\n value: \"browser-existing\",\n name: \"I have an X account — use browser mode (username/password)\",\n },\n {\n value: \"api-existing\",\n name: \"I have an X account — use API mode (developer credentials)\",\n },\n ],\n });\n\n let xCredentials: XCredentials;\n let xMethod: \"api\" | \"browser\";\n let xApiTier: \"free\" | \"basic\" | undefined;\n\n if (accountMethod === \"create\") {\n xMethod = \"browser\";\n\n const sporeName = await input({\n message: \"What should the account be named?\",\n validate: (val) => (val.length > 0 ? true : \"Name is required\"),\n });\n\n console.log(chalk.yellow(\"\\nAttempting automated X account creation...\"));\n console.log(chalk.yellow(\"A browser window will open. You may need to help with CAPTCHAs.\\n\"));\n\n const { provisionAccount } = await import(\"./account-creator/index.js\");\n const result = await provisionAccount({\n name: sporeName,\n });\n\n if (result.success) {\n console.log(chalk.green(`\\n✓ X account created!`));\n console.log(chalk.gray(` Username: @${result.username}`));\n console.log(chalk.gray(` Email: ${result.email}`));\n\n xCredentials = {\n method: \"browser\",\n username: result.username,\n password: result.password,\n email: result.email,\n };\n } else {\n console.log(chalk.red(`\\n✗ Automated creation failed: ${result.error}`));\n console.log(chalk.yellow(\"Falling back to manual setup.\\n\"));\n\n const username = await input({ message: \"Enter your X username:\" });\n const xPassword = await passwordPrompt({ message: \"Enter your X password:\", mask: \"*\" });\n const email = await input({ message: \"Enter the email for this X account:\" });\n\n xCredentials = {\n method: \"browser\",\n username,\n password: xPassword,\n email,\n };\n }\n } else if (accountMethod === \"browser-existing\") {\n xMethod = \"browser\";\n\n const username = await input({ message: \"X username (without @):\" });\n const xPassword = await passwordPrompt({ message: \"X password:\", mask: \"*\" });\n const email = await input({ message: \"Email associated with this X account:\" });\n\n xCredentials = {\n method: \"browser\",\n username,\n password: xPassword,\n email,\n };\n } else {\n xMethod = \"api\";\n\n console.log(chalk.gray(\"\\nYou'll need X API developer credentials.\"));\n console.log(chalk.gray(\"Get them at https://developer.x.com\\n\"));\n\n const apiKey = await passwordPrompt({ message: \"API Key:\", mask: \"*\" });\n const apiSecret = await passwordPrompt({ message: \"API Secret:\", mask: \"*\" });\n const accessToken = await passwordPrompt({ message: \"Access Token:\", mask: \"*\" });\n const accessTokenSecret = await passwordPrompt({\n message: \"Access Token Secret:\",\n mask: \"*\",\n });\n const bearerToken = await passwordPrompt({ message: \"Bearer Token:\", mask: \"*\" });\n\n xApiTier = await select({\n message: \"Which X API tier do you have?\",\n choices: [\n {\n value: \"free\" as const,\n name: \"Free (post/reply only, 500 posts/month)\",\n },\n {\n value: \"basic\" as const,\n name: \"Basic ($200/mo — full access)\",\n },\n ],\n });\n\n xCredentials = {\n method: \"api\",\n apiKey,\n apiSecret,\n accessToken,\n accessTokenSecret,\n bearerToken,\n };\n }\n\n saveCredentials(xCredentials);\n console.log(chalk.green(\"✓ X credentials saved (encrypted)\\n\"));\n\n const config = createDefaultConfig({\n xMethod,\n xApiTier,\n });\n\n saveConfig(config);\n\n // ===== Done =====\n console.log(chalk.green(\"\\n═══════════════════════════════════════\"));\n console.log(chalk.green.bold(\" X account connected.\"));\n console.log(chalk.green(\"═══════════════════════════════════════\\n\"));\n\n console.log(chalk.gray(\"--- Next Steps ---\\n\"));\n console.log(chalk.bold(\"Choose how to continue:\\n\"));\n\n const continueMethod = await select({\n message: \"How do you want to create your Spore's identity?\",\n choices: [\n {\n value: \"ui\",\n name: \"Open web UI (recommended — visual setup wizard)\",\n },\n {\n value: \"terminal\",\n name: \"Stay in terminal (advanced — command-line setup)\",\n },\n ],\n });\n\n if (continueMethod === \"ui\") {\n console.log(chalk.cyan(\"\\nLaunching Spora UI...\\n\"));\n console.log(chalk.gray(\"The web interface will open in your browser.\"));\n console.log(chalk.gray(\"Complete the setup wizard to create your Spore's identity.\\n\"));\n\n // Launch UI\n const { spawn } = await import(\"node:child_process\");\n const { resolve } = await import(\"node:path\");\n const webDir = resolve(import.meta.dirname, \"../packages/web\");\n\n try {\n // Open browser\n const openCmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n const { execSync } = await import(\"node:child_process\");\n setTimeout(() => {\n try {\n execSync(`${openCmd} http://localhost:3000`, { stdio: \"ignore\" });\n } catch {\n // Browser open is best-effort\n }\n }, 2000);\n\n // Start Next.js\n spawn(\"npx\", [\"next\", \"dev\", \"-p\", \"3000\"], {\n cwd: webDir,\n stdio: \"inherit\",\n });\n } catch (error) {\n console.log(chalk.red(\"Failed to launch UI. Run `spora ui` manually.\"));\n }\n } else {\n console.log(chalk.bold(\"\\n1. Set your Anthropic API key:\\n\"));\n console.log(chalk.cyan(\" spora set-llm-key\"));\n\n console.log(chalk.bold(\"\\n2. Create your Spore identity:\\n\"));\n console.log(chalk.cyan(\" spora frameworks \") + chalk.gray(\"# List personality frameworks\"));\n console.log(chalk.cyan(\" spora create \\\\\"));\n console.log(chalk.gray(\" --framework truthseeker \\\\\"));\n console.log(chalk.gray(\" --name \\\"TruthBot\\\" \\\\\"));\n console.log(chalk.gray(\" --handle truthbot_ai \\\\\"));\n console.log(chalk.gray(\" --goals \\\"seek truth\\\" \\\"grow followers\\\"\"));\n\n console.log(chalk.bold(\"\\n3. Start your autonomous agent:\\n\"));\n console.log(chalk.cyan(\" spora start\"));\n\n console.log(chalk.bold(\"\\n4. Monitor and chat with your Spore:\\n\"));\n console.log(chalk.cyan(\" spora ui \") + chalk.gray(\"# Open dashboard\"));\n console.log(chalk.cyan(\" spora chat \") + chalk.gray(\"# Chat in terminal\"));\n console.log(chalk.cyan(\" spora agent-status \") + chalk.gray(\"# Check if running\\n\"));\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,OAAO,QAAQ,SAAS,YAAY,sBAAsB;AACnE,OAAO,WAAW;AAKlB,eAAsB,UAAyB;AAC7C,MAAI,YAAY,GAAG;AACjB,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,WAAW;AACd,cAAQ,IAAI,MAAM,OAAO,iBAAiB,CAAC;AAC3C;AAAA,IACF;AAAA,EACF;AAEA,oBAAkB;AAGlB,UAAQ,IAAI,MAAM,KAAK,6BAA6B,CAAC;AACrD,UAAQ;AAAA,IACN,MAAM;AAAA,MACJ;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM,OAAO;AAAA,IACjC,SAAS;AAAA,IACT,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,kBAAkB,UAAU;AAC9B,cAAU;AAEV,UAAM,YAAY,MAAM,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,UAAU,CAAC,QAAS,IAAI,SAAS,IAAI,OAAO;AAAA,IAC9C,CAAC;AAED,YAAQ,IAAI,MAAM,OAAO,8CAA8C,CAAC;AACxE,YAAQ,IAAI,MAAM,OAAO,mEAAmE,CAAC;AAE7F,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,+BAA4B;AACtE,UAAM,SAAS,MAAM,iBAAiB;AAAA,MACpC,MAAM;AAAA,IACR,CAAC;AAED,QAAI,OAAO,SAAS;AAClB,cAAQ,IAAI,MAAM,MAAM;AAAA,0BAAwB,CAAC;AACjD,cAAQ,IAAI,MAAM,KAAK,gBAAgB,OAAO,QAAQ,EAAE,CAAC;AACzD,cAAQ,IAAI,MAAM,KAAK,YAAY,OAAO,KAAK,EAAE,CAAC;AAElD,qBAAe;AAAA,QACb,QAAQ;AAAA,QACR,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,MAChB;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,MAAM,IAAI;AAAA,oCAAkC,OAAO,KAAK,EAAE,CAAC;AACvE,cAAQ,IAAI,MAAM,OAAO,iCAAiC,CAAC;AAE3D,YAAM,WAAW,MAAM,MAAM,EAAE,SAAS,yBAAyB,CAAC;AAClE,YAAM,YAAY,MAAM,eAAe,EAAE,SAAS,0BAA0B,MAAM,IAAI,CAAC;AACvF,YAAM,QAAQ,MAAM,MAAM,EAAE,SAAS,sCAAsC,CAAC;AAE5E,qBAAe;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,kBAAkB,oBAAoB;AAC/C,cAAU;AAEV,UAAM,WAAW,MAAM,MAAM,EAAE,SAAS,0BAA0B,CAAC;AACnE,UAAM,YAAY,MAAM,eAAe,EAAE,SAAS,eAAe,MAAM,IAAI,CAAC;AAC5E,UAAM,QAAQ,MAAM,MAAM,EAAE,SAAS,wCAAwC,CAAC;AAE9E,mBAAe;AAAA,MACb,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF;AAAA,EACF,OAAO;AACL,cAAU;AAEV,YAAQ,IAAI,MAAM,KAAK,4CAA4C,CAAC;AACpE,YAAQ,IAAI,MAAM,KAAK,uCAAuC,CAAC;AAE/D,UAAM,SAAS,MAAM,eAAe,EAAE,SAAS,YAAY,MAAM,IAAI,CAAC;AACtE,UAAM,YAAY,MAAM,eAAe,EAAE,SAAS,eAAe,MAAM,IAAI,CAAC;AAC5E,UAAM,cAAc,MAAM,eAAe,EAAE,SAAS,iBAAiB,MAAM,IAAI,CAAC;AAChF,UAAM,oBAAoB,MAAM,eAAe;AAAA,MAC7C,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,UAAM,cAAc,MAAM,eAAe,EAAE,SAAS,iBAAiB,MAAM,IAAI,CAAC;AAEhF,eAAW,MAAM,OAAO;AAAA,MACtB,SAAS;AAAA,MACT,SAAS;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,mBAAe;AAAA,MACb,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,kBAAgB,YAAY;AAC5B,UAAQ,IAAI,MAAM,MAAM,0CAAqC,CAAC;AAE9D,QAAM,SAAS,oBAAoB;AAAA,IACjC;AAAA,IACA;AAAA,EACF,CAAC;AAED,aAAW,MAAM;AAGjB,UAAQ,IAAI,MAAM,MAAM,8OAA2C,CAAC;AACpE,UAAQ,IAAI,MAAM,MAAM,KAAK,wBAAwB,CAAC;AACtD,UAAQ,IAAI,MAAM,MAAM,8OAA2C,CAAC;AAEpE,UAAQ,IAAI,MAAM,KAAK,sBAAsB,CAAC;AAC9C,UAAQ,IAAI,MAAM,KAAK,2BAA2B,CAAC;AAEnD,QAAM,iBAAiB,MAAM,OAAO;AAAA,IAClC,SAAS;AAAA,IACT,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,mBAAmB,MAAM;AAC3B,YAAQ,IAAI,MAAM,KAAK,2BAA2B,CAAC;AACnD,YAAQ,IAAI,MAAM,KAAK,8CAA8C,CAAC;AACtE,YAAQ,IAAI,MAAM,KAAK,8DAA8D,CAAC;AAGtF,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,eAAoB;AACnD,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,MAAW;AAC5C,UAAM,SAAS,QAAQ,YAAY,SAAS,iBAAiB;AAE7D,QAAI;AAEF,YAAM,UAAU,QAAQ,aAAa,WAAW,SAAS,QAAQ,aAAa,UAAU,UAAU;AAClG,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,iBAAW,MAAM;AACf,YAAI;AACF,mBAAS,GAAG,OAAO,0BAA0B,EAAE,OAAO,SAAS,CAAC;AAAA,QAClE,QAAQ;AAAA,QAER;AAAA,MACF,GAAG,GAAI;AAGP,YAAM,OAAO,CAAC,QAAQ,OAAO,MAAM,MAAM,GAAG;AAAA,QAC1C,KAAK;AAAA,QACL,OAAO;AAAA,MACT,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,IAAI,MAAM,IAAI,+CAA+C,CAAC;AAAA,IACxE;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,MAAM,KAAK,oCAAoC,CAAC;AAC5D,YAAQ,IAAI,MAAM,KAAK,sBAAsB,CAAC;AAE9C,YAAQ,IAAI,MAAM,KAAK,oCAAoC,CAAC;AAC5D,YAAQ,IAAI,MAAM,KAAK,4BAA4B,IAAI,MAAM,KAAK,+BAA+B,CAAC;AAClG,YAAQ,IAAI,MAAM,KAAK,oBAAoB,CAAC;AAC5C,YAAQ,IAAI,MAAM,KAAK,iCAAiC,CAAC;AACzD,YAAQ,IAAI,MAAM,KAAK,2BAA6B,CAAC;AACrD,YAAQ,IAAI,MAAM,KAAK,8BAA8B,CAAC;AACtD,YAAQ,IAAI,MAAM,KAAK,4CAAgD,CAAC;AAExE,YAAQ,IAAI,MAAM,KAAK,qCAAqC,CAAC;AAC7D,YAAQ,IAAI,MAAM,KAAK,gBAAgB,CAAC;AAExC,YAAQ,IAAI,MAAM,KAAK,0CAA0C,CAAC;AAClE,YAAQ,IAAI,MAAM,KAAK,4BAA4B,IAAI,MAAM,KAAK,kBAAkB,CAAC;AACrF,YAAQ,IAAI,MAAM,KAAK,4BAA4B,IAAI,MAAM,KAAK,oBAAoB,CAAC;AACvF,YAAQ,IAAI,MAAM,KAAK,4BAA4B,IAAI,MAAM,KAAK,sBAAsB,CAAC;AAAA,EAC3F;AACF;","names":[]}
|