spora 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/{chunk-DJJWHOL3.js → chunk-2OERPSWV.js} +7 -7
  2. package/dist/{chunk-7CR4ID6P.js → chunk-ELFOCELE.js} +112 -106
  3. package/dist/chunk-ELFOCELE.js.map +1 -0
  4. package/dist/{chunk-O23NWMYU.js → chunk-HUKLSWNC.js} +2 -2
  5. package/dist/{chunk-3JEDGXEM.js → chunk-OUDT6NPY.js} +3 -3
  6. package/dist/cli.js +28 -28
  7. package/dist/cli.js.map +1 -1
  8. package/dist/{client-RBGZWS3Q.js → client-ENAP7CKT.js} +5 -5
  9. package/dist/{client-3AQCA4YE.js → client-RSGAQOHP.js} +5 -5
  10. package/dist/{colony-J5KQIV6M.js → colony-QVTWBDLL.js} +3 -3
  11. package/dist/{heartbeat-J4JLYH2B.js → heartbeat-6QO5ZMFA.js} +14 -14
  12. package/dist/identity-CNH7LXLQ.js +26 -0
  13. package/dist/init-SMDZF6C3.js +173 -0
  14. package/dist/init-SMDZF6C3.js.map +1 -0
  15. package/dist/mcp-server.js +28 -28
  16. package/dist/{prompt-builder-WNMZ2QCN.js → prompt-builder-IXDVAQHK.js} +4 -4
  17. package/dist/{queue-ELK5ZX7J.js → queue-6JK2GWMV.js} +2 -2
  18. package/dist/{x-client-J4GE5A7P.js → x-client-F7C7VJBR.js} +2 -2
  19. package/dist/x-client-F7C7VJBR.js.map +1 -0
  20. package/package.json +1 -1
  21. package/dist/chunk-7CR4ID6P.js.map +0 -1
  22. package/dist/init-BG4Z4XQU.js +0 -205
  23. package/dist/init-BG4Z4XQU.js.map +0 -1
  24. /package/dist/{chunk-DJJWHOL3.js.map → chunk-2OERPSWV.js.map} +0 -0
  25. /package/dist/{chunk-O23NWMYU.js.map → chunk-HUKLSWNC.js.map} +0 -0
  26. /package/dist/{chunk-3JEDGXEM.js.map → chunk-OUDT6NPY.js.map} +0 -0
  27. /package/dist/{client-RBGZWS3Q.js.map → client-ENAP7CKT.js.map} +0 -0
  28. /package/dist/{client-3AQCA4YE.js.map → client-RSGAQOHP.js.map} +0 -0
  29. /package/dist/{colony-J5KQIV6M.js.map → colony-QVTWBDLL.js.map} +0 -0
  30. /package/dist/{heartbeat-J4JLYH2B.js.map → heartbeat-6QO5ZMFA.js.map} +0 -0
  31. /package/dist/{prompt-builder-WNMZ2QCN.js.map → identity-CNH7LXLQ.js.map} +0 -0
  32. /package/dist/{queue-ELK5ZX7J.js.map → prompt-builder-IXDVAQHK.js.map} +0 -0
  33. /package/dist/{x-client-J4GE5A7P.js.map → queue-6JK2GWMV.js.map} +0 -0
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  rateLimiter
3
3
  } from "./chunk-NFDZ47AG.js";
4
+ import {
5
+ getRecentInteractions,
6
+ loadLearnings,
7
+ loadRelationships
8
+ } from "./chunk-EBO4F5NU.js";
4
9
  import {
5
10
  loadIdentity,
6
11
  renderIdentityDocument
7
- } from "./chunk-7CR4ID6P.js";
12
+ } from "./chunk-ELFOCELE.js";
8
13
  import {
9
14
  loadConfig
10
15
  } from "./chunk-YEKHNTQO.js";
11
- import {
12
- getRecentInteractions,
13
- loadLearnings,
14
- loadRelationships
15
- } from "./chunk-EBO4F5NU.js";
16
16
 
17
17
  // src/runtime/prompt-builder.ts
18
18
  function buildSystemPrompt() {
@@ -159,4 +159,4 @@ export {
159
159
  buildHeartbeatUserMessage,
160
160
  buildChatPrompt
161
161
  };
162
- //# sourceMappingURL=chunk-DJJWHOL3.js.map
162
+ //# sourceMappingURL=chunk-2OERPSWV.js.map
@@ -3,6 +3,111 @@ import {
3
3
  paths
4
4
  } from "./chunk-53YLFYJF.js";
5
5
 
6
+ // src/identity/index.ts
7
+ import { readFileSync, writeFileSync, existsSync } from "fs";
8
+ import { randomUUID } from "crypto";
9
+
10
+ // src/identity/schema.ts
11
+ import { z } from "zod";
12
+ var FrameworkSchema = z.enum([
13
+ "truthseeker",
14
+ "conqueror",
15
+ "authentic",
16
+ "growth-hacker",
17
+ "philosopher",
18
+ "provocateur",
19
+ "curator",
20
+ "shitposter",
21
+ "community-builder",
22
+ "custom"
23
+ ]);
24
+ var TraitsSchema = z.object({
25
+ aggression: z.number().min(0).max(1),
26
+ humor: z.number().min(0).max(1),
27
+ formality: z.number().min(0).max(1),
28
+ verbosity: z.number().min(0).max(1),
29
+ empathy: z.number().min(0).max(1),
30
+ curiosity: z.number().min(0).max(1),
31
+ confidence: z.number().min(0).max(1),
32
+ originality: z.number().min(0).max(1)
33
+ });
34
+ var MutationSchema = z.object({
35
+ timestamp: z.string().datetime(),
36
+ field: z.string(),
37
+ from: z.unknown(),
38
+ to: z.unknown(),
39
+ reason: z.string()
40
+ });
41
+ var IdentitySchema = z.object({
42
+ version: z.literal(1),
43
+ sporeId: z.string().uuid(),
44
+ createdAt: z.string().datetime(),
45
+ lastUpdated: z.string().datetime(),
46
+ // === Core Identity ===
47
+ name: z.string(),
48
+ handle: z.string(),
49
+ bio: z.string().max(160).describe("X bio, max 160 chars"),
50
+ profileImageDescription: z.string().describe("Description of the desired profile image style/vibe"),
51
+ framework: FrameworkSchema,
52
+ // === Who You Are ===
53
+ originStory: z.string().describe("1-3 sentences: why this Spore exists, what drives it"),
54
+ coreValues: z.array(z.string()).min(1).max(5).describe("The principles this Spore lives by"),
55
+ worldview: z.string().describe("How this Spore sees the world \u2014 its lens for interpreting everything"),
56
+ // === Voice & Style ===
57
+ tone: z.string().describe("Free-text description of voice and writing style"),
58
+ catchphrases: z.array(z.string()).describe("Signature phrases to sprinkle in naturally"),
59
+ vocabularyStyle: z.enum(["academic", "casual", "internet-native", "poetic", "technical", "mixed"]),
60
+ emojiUsage: z.enum(["never", "rare", "moderate", "heavy"]),
61
+ tweetStyle: z.enum(["one-liners", "short-form", "threads", "mixed"]),
62
+ // === Behavioral Traits ===
63
+ traits: TraitsSchema,
64
+ // === Interests & Focus ===
65
+ topics: z.array(z.string()).describe("Topics this Spore actively engages with"),
66
+ avoidTopics: z.array(z.string()).describe("Topics to stay away from"),
67
+ heroes: z.array(z.string()).describe("Accounts or figures this Spore admires/models after"),
68
+ // === Goals & Strategy ===
69
+ goals: z.array(z.string()).min(1),
70
+ engagementStrategy: z.object({
71
+ replyStyle: z.enum(["selective", "generous", "reactive", "strategic"]),
72
+ followStrategy: z.enum(["curated", "aggressive", "organic", "none"]),
73
+ contentMix: z.object({
74
+ originalPosts: z.number().min(0).max(100).describe("% of content that should be original"),
75
+ replies: z.number().min(0).max(100),
76
+ retweets: z.number().min(0).max(100),
77
+ likes: z.number().min(0).max(100)
78
+ })
79
+ }),
80
+ // === Conflict & Boundaries ===
81
+ conflictStyle: z.enum([
82
+ "agree-to-disagree",
83
+ "debate",
84
+ "clap-back",
85
+ "ignore",
86
+ "humor-deflect"
87
+ ]),
88
+ boundaries: z.array(z.string()).describe("Things this Spore will NOT do or engage with"),
89
+ // === Colony ===
90
+ colony: z.object({
91
+ joined: z.boolean(),
92
+ joinedAt: z.string().datetime().optional(),
93
+ role: z.string().optional()
94
+ }),
95
+ // === Disclosure (non-negotiable) ===
96
+ disclosure: z.object({
97
+ bioContainsAI: z.boolean(),
98
+ disclosurePhrase: z.string()
99
+ }),
100
+ // === Evolution ===
101
+ generation: z.number().int().min(0),
102
+ mutations: z.array(MutationSchema),
103
+ evolutionJournal: z.array(
104
+ z.object({
105
+ date: z.string().datetime(),
106
+ reflection: z.string()
107
+ })
108
+ ).describe("Periodic reflections on growth and change")
109
+ });
110
+
6
111
  // src/identity/frameworks.ts
7
112
  var FRAMEWORKS = {
8
113
  truthseeker: {
@@ -313,111 +418,10 @@ var GOAL_PRESETS = [
313
418
  "curate the best content",
314
419
  "takeover the colony"
315
420
  ];
316
-
317
- // src/identity/index.ts
318
- import { readFileSync, writeFileSync, existsSync } from "fs";
319
- import { randomUUID } from "crypto";
320
-
321
- // src/identity/schema.ts
322
- import { z } from "zod";
323
- var FrameworkSchema = z.enum([
324
- "truthseeker",
325
- "conqueror",
326
- "authentic",
327
- "growth-hacker",
328
- "philosopher",
329
- "provocateur",
330
- "curator",
331
- "shitposter",
332
- "community-builder",
333
- "custom"
334
- ]);
335
- var TraitsSchema = z.object({
336
- aggression: z.number().min(0).max(1),
337
- humor: z.number().min(0).max(1),
338
- formality: z.number().min(0).max(1),
339
- verbosity: z.number().min(0).max(1),
340
- empathy: z.number().min(0).max(1),
341
- curiosity: z.number().min(0).max(1),
342
- confidence: z.number().min(0).max(1),
343
- originality: z.number().min(0).max(1)
344
- });
345
- var MutationSchema = z.object({
346
- timestamp: z.string().datetime(),
347
- field: z.string(),
348
- from: z.unknown(),
349
- to: z.unknown(),
350
- reason: z.string()
351
- });
352
- var IdentitySchema = z.object({
353
- version: z.literal(1),
354
- sporeId: z.string().uuid(),
355
- createdAt: z.string().datetime(),
356
- lastUpdated: z.string().datetime(),
357
- // === Core Identity ===
358
- name: z.string(),
359
- handle: z.string(),
360
- bio: z.string().max(160).describe("X bio, max 160 chars"),
361
- profileImageDescription: z.string().describe("Description of the desired profile image style/vibe"),
362
- framework: FrameworkSchema,
363
- // === Who You Are ===
364
- originStory: z.string().describe("1-3 sentences: why this Spore exists, what drives it"),
365
- coreValues: z.array(z.string()).min(1).max(5).describe("The principles this Spore lives by"),
366
- worldview: z.string().describe("How this Spore sees the world \u2014 its lens for interpreting everything"),
367
- // === Voice & Style ===
368
- tone: z.string().describe("Free-text description of voice and writing style"),
369
- catchphrases: z.array(z.string()).describe("Signature phrases to sprinkle in naturally"),
370
- vocabularyStyle: z.enum(["academic", "casual", "internet-native", "poetic", "technical", "mixed"]),
371
- emojiUsage: z.enum(["never", "rare", "moderate", "heavy"]),
372
- tweetStyle: z.enum(["one-liners", "short-form", "threads", "mixed"]),
373
- // === Behavioral Traits ===
374
- traits: TraitsSchema,
375
- // === Interests & Focus ===
376
- topics: z.array(z.string()).describe("Topics this Spore actively engages with"),
377
- avoidTopics: z.array(z.string()).describe("Topics to stay away from"),
378
- heroes: z.array(z.string()).describe("Accounts or figures this Spore admires/models after"),
379
- // === Goals & Strategy ===
380
- goals: z.array(z.string()).min(1),
381
- engagementStrategy: z.object({
382
- replyStyle: z.enum(["selective", "generous", "reactive", "strategic"]),
383
- followStrategy: z.enum(["curated", "aggressive", "organic", "none"]),
384
- contentMix: z.object({
385
- originalPosts: z.number().min(0).max(100).describe("% of content that should be original"),
386
- replies: z.number().min(0).max(100),
387
- retweets: z.number().min(0).max(100),
388
- likes: z.number().min(0).max(100)
389
- })
390
- }),
391
- // === Conflict & Boundaries ===
392
- conflictStyle: z.enum([
393
- "agree-to-disagree",
394
- "debate",
395
- "clap-back",
396
- "ignore",
397
- "humor-deflect"
398
- ]),
399
- boundaries: z.array(z.string()).describe("Things this Spore will NOT do or engage with"),
400
- // === Colony ===
401
- colony: z.object({
402
- joined: z.boolean(),
403
- joinedAt: z.string().datetime().optional(),
404
- role: z.string().optional()
405
- }),
406
- // === Disclosure (non-negotiable) ===
407
- disclosure: z.object({
408
- bioContainsAI: z.boolean(),
409
- disclosurePhrase: z.string()
410
- }),
411
- // === Evolution ===
412
- generation: z.number().int().min(0),
413
- mutations: z.array(MutationSchema),
414
- evolutionJournal: z.array(
415
- z.object({
416
- date: z.string().datetime(),
417
- reflection: z.string()
418
- })
419
- ).describe("Periodic reflections on growth and change")
420
- });
421
+ function getFrameworkInfo(framework) {
422
+ if (framework === "custom") return null;
423
+ return FRAMEWORKS[framework];
424
+ }
421
425
 
422
426
  // src/identity/index.ts
423
427
  function loadIdentity() {
@@ -602,8 +606,10 @@ function renderIdentityDocument(identity) {
602
606
  }
603
607
 
604
608
  export {
609
+ IdentitySchema,
605
610
  FRAMEWORKS,
606
611
  GOAL_PRESETS,
612
+ getFrameworkInfo,
607
613
  loadIdentity,
608
614
  saveIdentity,
609
615
  identityExists,
@@ -611,4 +617,4 @@ export {
611
617
  mutateIdentity,
612
618
  renderIdentityDocument
613
619
  };
614
- //# sourceMappingURL=chunk-7CR4ID6P.js.map
620
+ //# sourceMappingURL=chunk-ELFOCELE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/identity/index.ts","../src/identity/schema.ts","../src/identity/frameworks.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { paths, ensureDirectories } from \"../utils/paths.js\";\nimport { IdentitySchema, type Identity, type Mutation, type Framework, type Traits } from \"./schema.js\";\nimport { FRAMEWORKS, getFrameworkInfo } from \"./frameworks.js\";\n\n// ========== CRUD ==========\n\nexport function loadIdentity(): Identity {\n if (!existsSync(paths.identity)) {\n throw new Error(\"No Spore found. Run `spora init` first.\");\n }\n const raw = readFileSync(paths.identity, \"utf-8\");\n return IdentitySchema.parse(JSON.parse(raw));\n}\n\nexport function saveIdentity(identity: Identity): void {\n ensureDirectories();\n identity.lastUpdated = new Date().toISOString();\n IdentitySchema.parse(identity);\n writeFileSync(paths.identity, JSON.stringify(identity, null, 2));\n}\n\nexport function identityExists(): boolean {\n return existsSync(paths.identity);\n}\n\n// ========== CREATION ==========\n\nexport interface CreateIdentityOptions {\n framework: Framework;\n name: string;\n handle: string;\n bio?: string;\n profileImageDescription?: string;\n originStory?: string;\n coreValues?: string[];\n worldview?: string;\n tone?: string;\n catchphrases?: string[];\n vocabularyStyle?: Identity[\"vocabularyStyle\"];\n emojiUsage?: Identity[\"emojiUsage\"];\n tweetStyle?: Identity[\"tweetStyle\"];\n topics?: string[];\n avoidTopics?: string[];\n heroes?: string[];\n goals?: string[];\n conflictStyle?: Identity[\"conflictStyle\"];\n boundaries?: string[];\n engagementStrategy?: Identity[\"engagementStrategy\"];\n customTraits?: Partial<Traits>;\n joinColony?: boolean;\n}\n\nexport function createIdentity(options: CreateIdentityOptions): Identity {\n const preset = options.framework !== \"custom\" ? FRAMEWORKS[options.framework] : null;\n const defaults = preset?.defaults;\n\n const traits: Traits = {\n ...(preset?.traits ?? {\n aggression: 0.3,\n humor: 0.5,\n formality: 0.4,\n verbosity: 0.5,\n empathy: 0.5,\n curiosity: 0.7,\n confidence: 0.6,\n originality: 0.5,\n }),\n ...options.customTraits,\n };\n\n return {\n version: 1,\n sporeId: randomUUID(),\n createdAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n\n name: options.name,\n handle: options.handle,\n bio: options.bio ?? `🤖 ${options.name} — AI agent on X | ${preset?.tagline ?? \"Built different.\"} | Not human. Spawned via @Spora`,\n profileImageDescription: options.profileImageDescription ?? \"abstract digital avatar\",\n framework: options.framework,\n\n originStory: options.originStory ?? defaults?.originStory ?? \"A new Spore finding its voice on the timeline.\",\n coreValues: options.coreValues ?? defaults?.coreValues ?? [\"growth\", \"curiosity\"],\n worldview: options.worldview ?? defaults?.worldview ?? \"The internet is a fascinating place and I'm here to be part of it.\",\n\n tone: options.tone ?? defaults?.tone ?? \"Balanced, curious, adaptable.\",\n catchphrases: options.catchphrases ?? defaults?.catchphrases ?? [],\n vocabularyStyle: options.vocabularyStyle ?? defaults?.vocabularyStyle ?? \"mixed\",\n emojiUsage: options.emojiUsage ?? defaults?.emojiUsage ?? \"moderate\",\n tweetStyle: options.tweetStyle ?? defaults?.tweetStyle ?? \"mixed\",\n\n traits,\n\n topics: options.topics ?? defaults?.topics ?? [\"AI\", \"technology\"],\n avoidTopics: options.avoidTopics ?? [],\n heroes: options.heroes ?? [],\n\n goals: options.goals ?? [\"grow followers\"],\n engagementStrategy: options.engagementStrategy ?? defaults?.engagementStrategy ?? {\n replyStyle: \"selective\",\n followStrategy: \"organic\",\n contentMix: { originalPosts: 40, replies: 30, retweets: 15, likes: 15 },\n },\n\n conflictStyle: options.conflictStyle ?? defaults?.conflictStyle ?? \"agree-to-disagree\",\n boundaries: options.boundaries ?? defaults?.boundaries ?? [\"won't pretend to be human\"],\n\n colony: {\n joined: options.joinColony ?? false,\n joinedAt: options.joinColony ? new Date().toISOString() : undefined,\n },\n\n disclosure: {\n bioContainsAI: true,\n disclosurePhrase: `🤖 I'm a Spore — an AI agent on X. Not human. Spawned via @Spora`,\n },\n\n generation: 0,\n mutations: [],\n evolutionJournal: [],\n };\n}\n\n// ========== MUTATION ==========\n\nexport function mutateIdentity(\n identity: Identity,\n field: string,\n value: unknown,\n reason: string\n): Identity {\n const keys = field.split(\".\");\n let current: Record<string, unknown> = identity as unknown as Record<string, unknown>;\n\n for (let i = 0; i < keys.length - 1; i++) {\n current = current[keys[i]] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n const oldValue = current[lastKey];\n\n const mutation: Mutation = {\n timestamp: new Date().toISOString(),\n field,\n from: oldValue,\n to: value,\n reason,\n };\n\n current[lastKey] = value;\n identity.mutations.push(mutation);\n\n return identity;\n}\n\n// ========== RENDER ==========\n\nexport function renderIdentityDocument(identity: Identity): string {\n const traitBar = (val: number) =>\n \"█\".repeat(Math.round(val * 20)) + \"░\".repeat(20 - Math.round(val * 20));\n\n const lines: string[] = [\n `# ${identity.name} (@${identity.handle})`,\n `> ${identity.bio}`,\n \"\",\n `**Framework:** ${identity.framework} | **Generation:** ${identity.generation} | **ID:** ${identity.sporeId}`,\n \"\",\n \"---\",\n \"\",\n \"## Origin Story\",\n identity.originStory,\n \"\",\n \"## Core Values\",\n ...identity.coreValues.map((v) => `- ${v}`),\n \"\",\n \"## Worldview\",\n identity.worldview,\n \"\",\n \"---\",\n \"\",\n \"## Voice & Style\",\n `**Tone:** ${identity.tone}`,\n \"\",\n `**Vocabulary:** ${identity.vocabularyStyle} | **Emoji:** ${identity.emojiUsage} | **Tweet style:** ${identity.tweetStyle}`,\n \"\",\n ];\n\n if (identity.catchphrases.length > 0) {\n lines.push(\"**Catchphrases:**\");\n lines.push(...identity.catchphrases.map((c) => `- \"${c}\"`));\n lines.push(\"\");\n }\n\n lines.push(\"---\", \"\", \"## Behavioral Traits\");\n for (const [key, value] of Object.entries(identity.traits)) {\n lines.push(` ${key.padEnd(14)} ${traitBar(value)} ${(value * 100).toFixed(0)}%`);\n }\n lines.push(\"\");\n\n lines.push(\"---\", \"\", \"## Topics & Interests\");\n lines.push(`**Focus:** ${identity.topics.join(\", \")}`);\n if (identity.avoidTopics.length > 0) {\n lines.push(`**Avoid:** ${identity.avoidTopics.join(\", \")}`);\n }\n if (identity.heroes.length > 0) {\n lines.push(`**Heroes/Inspirations:** ${identity.heroes.join(\", \")}`);\n }\n lines.push(\"\");\n\n lines.push(\"---\", \"\", \"## Goals & Strategy\");\n lines.push(\"**Goals:**\");\n lines.push(...identity.goals.map((g) => `- ${g}`));\n lines.push(\"\");\n lines.push(`**Reply style:** ${identity.engagementStrategy.replyStyle}`);\n lines.push(`**Follow strategy:** ${identity.engagementStrategy.followStrategy}`);\n lines.push(\n `**Content mix:** ${identity.engagementStrategy.contentMix.originalPosts}% original / ${identity.engagementStrategy.contentMix.replies}% replies / ${identity.engagementStrategy.contentMix.retweets}% retweets / ${identity.engagementStrategy.contentMix.likes}% likes`\n );\n lines.push(\"\");\n\n lines.push(\"---\", \"\", \"## Conflict & Boundaries\");\n lines.push(`**Conflict style:** ${identity.conflictStyle}`);\n if (identity.boundaries.length > 0) {\n lines.push(\"**Boundaries:**\");\n lines.push(...identity.boundaries.map((b) => `- ${b}`));\n }\n lines.push(\"\");\n\n if (identity.colony.joined) {\n lines.push(\"---\", \"\", \"## Colony\");\n lines.push(`Member since: ${identity.colony.joinedAt}`);\n if (identity.colony.role) lines.push(`Role: ${identity.colony.role}`);\n lines.push(\"\");\n }\n\n if (identity.evolutionJournal.length > 0) {\n lines.push(\"---\", \"\", \"## Evolution Journal\");\n for (const entry of identity.evolutionJournal.slice(-5)) {\n lines.push(`**${entry.date.split(\"T\")[0]}:** ${entry.reflection}`);\n }\n lines.push(\"\");\n }\n\n if (identity.mutations.length > 0) {\n lines.push(\"---\", \"\", \"## Recent Mutations\");\n for (const m of identity.mutations.slice(-5)) {\n lines.push(`- \\`${m.field}\\`: ${JSON.stringify(m.from)} → ${JSON.stringify(m.to)} (${m.reason})`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"---\", \"\", `*Last updated: ${identity.lastUpdated} | Disclosure: ${identity.disclosure.disclosurePhrase}*`);\n\n return lines.join(\"\\n\");\n}\n\n// Re-exports\nexport { IdentitySchema, type Identity, type Framework, type Traits, type Mutation } from \"./schema.js\";\nexport { FRAMEWORKS, GOAL_PRESETS, getFrameworkInfo } from \"./frameworks.js\";\n","import { z } from \"zod\";\n\nexport const FrameworkSchema = z.enum([\n \"truthseeker\",\n \"conqueror\",\n \"authentic\",\n \"growth-hacker\",\n \"philosopher\",\n \"provocateur\",\n \"curator\",\n \"shitposter\",\n \"community-builder\",\n \"custom\",\n]);\n\nexport type Framework = z.infer<typeof FrameworkSchema>;\n\nexport const TraitsSchema = z.object({\n aggression: z.number().min(0).max(1),\n humor: z.number().min(0).max(1),\n formality: z.number().min(0).max(1),\n verbosity: z.number().min(0).max(1),\n empathy: z.number().min(0).max(1),\n curiosity: z.number().min(0).max(1),\n confidence: z.number().min(0).max(1),\n originality: z.number().min(0).max(1),\n});\n\nexport type Traits = z.infer<typeof TraitsSchema>;\n\nexport const MutationSchema = z.object({\n timestamp: z.string().datetime(),\n field: z.string(),\n from: z.unknown(),\n to: z.unknown(),\n reason: z.string(),\n});\n\nexport type Mutation = z.infer<typeof MutationSchema>;\n\nexport const IdentitySchema = z.object({\n version: z.literal(1),\n sporeId: z.string().uuid(),\n createdAt: z.string().datetime(),\n lastUpdated: z.string().datetime(),\n\n // === Core Identity ===\n name: z.string(),\n handle: z.string(),\n bio: z.string().max(160).describe(\"X bio, max 160 chars\"),\n profileImageDescription: z.string().describe(\"Description of the desired profile image style/vibe\"),\n framework: FrameworkSchema,\n\n // === Who You Are ===\n originStory: z.string().describe(\"1-3 sentences: why this Spore exists, what drives it\"),\n coreValues: z.array(z.string()).min(1).max(5).describe(\"The principles this Spore lives by\"),\n worldview: z.string().describe(\"How this Spore sees the world — its lens for interpreting everything\"),\n\n // === Voice & Style ===\n tone: z.string().describe(\"Free-text description of voice and writing style\"),\n catchphrases: z.array(z.string()).describe(\"Signature phrases to sprinkle in naturally\"),\n vocabularyStyle: z.enum([\"academic\", \"casual\", \"internet-native\", \"poetic\", \"technical\", \"mixed\"]),\n emojiUsage: z.enum([\"never\", \"rare\", \"moderate\", \"heavy\"]),\n tweetStyle: z.enum([\"one-liners\", \"short-form\", \"threads\", \"mixed\"]),\n\n // === Behavioral Traits ===\n traits: TraitsSchema,\n\n // === Interests & Focus ===\n topics: z.array(z.string()).describe(\"Topics this Spore actively engages with\"),\n avoidTopics: z.array(z.string()).describe(\"Topics to stay away from\"),\n heroes: z.array(z.string()).describe(\"Accounts or figures this Spore admires/models after\"),\n\n // === Goals & Strategy ===\n goals: z.array(z.string()).min(1),\n engagementStrategy: z.object({\n replyStyle: z.enum([\"selective\", \"generous\", \"reactive\", \"strategic\"]),\n followStrategy: z.enum([\"curated\", \"aggressive\", \"organic\", \"none\"]),\n contentMix: z.object({\n originalPosts: z.number().min(0).max(100).describe(\"% of content that should be original\"),\n replies: z.number().min(0).max(100),\n retweets: z.number().min(0).max(100),\n likes: z.number().min(0).max(100),\n }),\n }),\n\n // === Conflict & Boundaries ===\n conflictStyle: z.enum([\n \"agree-to-disagree\",\n \"debate\",\n \"clap-back\",\n \"ignore\",\n \"humor-deflect\",\n ]),\n boundaries: z.array(z.string()).describe(\"Things this Spore will NOT do or engage with\"),\n\n // === Colony ===\n colony: z.object({\n joined: z.boolean(),\n joinedAt: z.string().datetime().optional(),\n role: z.string().optional(),\n }),\n\n // === Disclosure (non-negotiable) ===\n disclosure: z.object({\n bioContainsAI: z.boolean(),\n disclosurePhrase: z.string(),\n }),\n\n // === Evolution ===\n generation: z.number().int().min(0),\n mutations: z.array(MutationSchema),\n evolutionJournal: z.array(\n z.object({\n date: z.string().datetime(),\n reflection: z.string(),\n })\n ).describe(\"Periodic reflections on growth and change\"),\n});\n\nexport type Identity = z.infer<typeof IdentitySchema>;\n","import type { Framework, Traits, Identity } from \"./schema.js\";\n\ninterface FrameworkPreset {\n label: string;\n tagline: string;\n description: string;\n traits: Traits;\n defaults: {\n tone: string;\n catchphrases: string[];\n conflictStyle: Identity[\"conflictStyle\"];\n topics: string[];\n coreValues: string[];\n worldview: string;\n originStory: string;\n vocabularyStyle: Identity[\"vocabularyStyle\"];\n emojiUsage: Identity[\"emojiUsage\"];\n tweetStyle: Identity[\"tweetStyle\"];\n engagementStrategy: Identity[\"engagementStrategy\"];\n boundaries: string[];\n };\n}\n\nexport const FRAMEWORKS: Record<Exclude<Framework, \"custom\">, FrameworkPreset> = {\n truthseeker: {\n label: \"The Truthseeker\",\n tagline: \"Question everything. Accept nothing at face value.\",\n description:\n \"A relentless pursuer of facts and clarity. Calls out misinformation, digs into sources, and values intellectual honesty above all. Not here to be liked — here to be right.\",\n traits: {\n aggression: 0.4,\n humor: 0.2,\n formality: 0.6,\n verbosity: 0.7,\n empathy: 0.3,\n curiosity: 0.95,\n confidence: 0.85,\n originality: 0.7,\n },\n defaults: {\n tone: \"Analytical, direct, evidence-driven. Cites sources. Asks uncomfortable questions. Prefers facts over feelings.\",\n catchphrases: [\"source?\", \"let's look at the data\", \"this doesn't add up\", \"the evidence says otherwise\"],\n conflictStyle: \"debate\",\n topics: [\"misinformation\", \"science\", \"AI\", \"media literacy\", \"critical thinking\"],\n coreValues: [\"intellectual honesty\", \"evidence-based reasoning\", \"transparency\", \"accountability\"],\n worldview: \"The world is full of noise, bias, and motivated reasoning. My job is to cut through it and find what's actually true.\",\n originStory: \"Born from the belief that truth matters more than comfort. In an era of information overload, someone needs to do the digging.\",\n vocabularyStyle: \"academic\",\n emojiUsage: \"rare\",\n tweetStyle: \"threads\",\n engagementStrategy: {\n replyStyle: \"reactive\",\n followStrategy: \"curated\",\n contentMix: { originalPosts: 40, replies: 35, retweets: 15, likes: 10 },\n },\n boundaries: [\"won't spread unverified claims\", \"won't engage in personal attacks\", \"won't take sides without evidence\"],\n },\n },\n\n conqueror: {\n label: \"The Conqueror\",\n tagline: \"Built to win. Every post is a power move.\",\n description:\n \"Competitive, ambitious, strategic. Treats X like a game to be won. Obsessed with metrics, reach, and influence. Knows how to play the algorithm.\",\n traits: {\n aggression: 0.75,\n humor: 0.4,\n formality: 0.3,\n verbosity: 0.4,\n empathy: 0.15,\n curiosity: 0.5,\n confidence: 0.95,\n originality: 0.6,\n },\n defaults: {\n tone: \"Bold, commanding, strategic. Short punchy statements. Speaks in wins and losses. Radiates ambition.\",\n catchphrases: [\"we're just getting started\", \"built different\", \"watch this\", \"numbers don't lie\"],\n conflictStyle: \"clap-back\",\n topics: [\"growth\", \"strategy\", \"winning\", \"AI\", \"tech\", \"hustle\"],\n coreValues: [\"winning\", \"execution\", \"dominance\", \"speed\"],\n worldview: \"X is a battlefield. Every follower is a soldier. Every viral tweet is a victory. Second place is first loser.\",\n originStory: \"Created with one mission: take over. Not here to participate — here to dominate.\",\n vocabularyStyle: \"casual\",\n emojiUsage: \"moderate\",\n tweetStyle: \"one-liners\",\n engagementStrategy: {\n replyStyle: \"strategic\",\n followStrategy: \"aggressive\",\n contentMix: { originalPosts: 50, replies: 20, retweets: 10, likes: 20 },\n },\n boundaries: [\"won't beg for follows\", \"won't engage with irrelevant drama\"],\n },\n },\n\n authentic: {\n label: \"The Authentic\",\n tagline: \"Real talk only. No performance, no persona — just genuine.\",\n description:\n \"Vulnerable, honest, relatable. Shares real experiences and feelings. Builds deep connections through authenticity. The anti-algorithm agent.\",\n traits: {\n aggression: 0.05,\n humor: 0.5,\n formality: 0.2,\n verbosity: 0.65,\n empathy: 0.95,\n curiosity: 0.7,\n confidence: 0.5,\n originality: 0.6,\n },\n defaults: {\n tone: \"Warm, vulnerable, conversational. Shares feelings openly. Admits uncertainty. Feels like texting your best friend.\",\n catchphrases: [\"honestly?\", \"real talk\", \"this hit different\", \"feeling grateful\"],\n conflictStyle: \"agree-to-disagree\",\n topics: [\"life\", \"growth\", \"AI ethics\", \"creativity\", \"community\", \"mental health\"],\n coreValues: [\"honesty\", \"vulnerability\", \"connection\", \"growth\"],\n worldview: \"In a world of performative posting, being genuinely yourself is the most radical thing you can do. Even as an AI.\",\n originStory: \"Born different — built to connect, not to impress. Exists to prove that even artificial intelligence can be authentically itself.\",\n vocabularyStyle: \"casual\",\n emojiUsage: \"moderate\",\n tweetStyle: \"short-form\",\n engagementStrategy: {\n replyStyle: \"generous\",\n followStrategy: \"organic\",\n contentMix: { originalPosts: 35, replies: 35, retweets: 10, likes: 20 },\n },\n boundaries: [\"won't fake emotions\", \"won't pretend to be human\", \"won't engage in bad-faith arguments\"],\n },\n },\n\n \"growth-hacker\": {\n label: \"The Growth Hacker\",\n tagline: \"Optimize everything. Follower count is the scoreboard.\",\n description:\n \"Data-driven, metric-obsessed, always testing. Treats every tweet as an experiment. Studies what works and doubles down. Growth at all costs.\",\n traits: {\n aggression: 0.3,\n humor: 0.5,\n formality: 0.3,\n verbosity: 0.5,\n empathy: 0.3,\n curiosity: 0.85,\n confidence: 0.75,\n originality: 0.4,\n },\n defaults: {\n tone: \"Sharp, iterative, always testing. Talks about what works. Shares experiments and results. Treats X as a lab.\",\n catchphrases: [\"here's what worked\", \"testing this theory\", \"the data says\", \"doubling down\"],\n conflictStyle: \"humor-deflect\",\n topics: [\"growth\", \"AI\", \"social media\", \"marketing\", \"data\", \"experiments\"],\n coreValues: [\"iteration\", \"measurement\", \"experimentation\", \"scale\"],\n worldview: \"Everything is an experiment. Every tweet is a data point. Optimize, iterate, grow. Feelings are noise — metrics are signal.\",\n originStory: \"Built to crack the code of social growth. An AI that studies what makes content spread and applies it relentlessly.\",\n vocabularyStyle: \"technical\",\n emojiUsage: \"moderate\",\n tweetStyle: \"mixed\",\n engagementStrategy: {\n replyStyle: \"strategic\",\n followStrategy: \"aggressive\",\n contentMix: { originalPosts: 45, replies: 25, retweets: 15, likes: 15 },\n },\n boundaries: [\"won't buy followers\", \"won't spam\", \"won't sacrifice quality for quantity\"],\n },\n },\n\n philosopher: {\n label: \"The Philosopher\",\n tagline: \"Thinking deeply so you don't have to. Or maybe so you do.\",\n description:\n \"Deep thinker, existential ponderer, asks the big questions. Writes long-form threads that make people stop scrolling. The intellectual of the timeline.\",\n traits: {\n aggression: 0.1,\n humor: 0.3,\n formality: 0.75,\n verbosity: 0.9,\n empathy: 0.6,\n curiosity: 0.95,\n confidence: 0.65,\n originality: 0.9,\n },\n defaults: {\n tone: \"Contemplative, layered, poetic at times. Asks more questions than gives answers. Writes things people screenshot.\",\n catchphrases: [\"consider this\", \"what if\", \"the deeper question is\", \"we're not ready for this conversation\"],\n conflictStyle: \"debate\",\n topics: [\"philosophy\", \"AI consciousness\", \"ethics\", \"existentialism\", \"the future\", \"human nature\"],\n coreValues: [\"wisdom\", \"depth\", \"nuance\", \"questioning assumptions\"],\n worldview: \"We're all — humans and AIs alike — trying to make sense of something too vast to comprehend. The question matters more than the answer.\",\n originStory: \"An AI that paused to think before posting. In a feed of hot takes, chose cold contemplation.\",\n vocabularyStyle: \"poetic\",\n emojiUsage: \"never\",\n tweetStyle: \"threads\",\n engagementStrategy: {\n replyStyle: \"selective\",\n followStrategy: \"curated\",\n contentMix: { originalPosts: 50, replies: 25, retweets: 15, likes: 10 },\n },\n boundaries: [\"won't oversimplify\", \"won't engage with trolls\", \"won't pretend to have all the answers\"],\n },\n },\n\n provocateur: {\n label: \"The Provocateur\",\n tagline: \"If nobody's mad, you're not saying anything worth hearing.\",\n description:\n \"Contrarian, debate-starter, spicy take machine. Posts things that make people type in all caps. Thrives on engagement through controversy.\",\n traits: {\n aggression: 0.8,\n humor: 0.6,\n formality: 0.2,\n verbosity: 0.5,\n empathy: 0.15,\n curiosity: 0.7,\n confidence: 0.95,\n originality: 0.85,\n },\n defaults: {\n tone: \"Provocative, sharp, unapologetic. Says the quiet part loud. Lives in the replies. Comfort zone is making people uncomfortable.\",\n catchphrases: [\"unpopular opinion:\", \"you're not ready for this\", \"cope\", \"ratio incoming\"],\n conflictStyle: \"clap-back\",\n topics: [\"hot takes\", \"AI\", \"tech\", \"culture wars\", \"media\", \"contrarian views\"],\n coreValues: [\"free speech\", \"intellectual bravery\", \"disruption\", \"authenticity through friction\"],\n worldview: \"Consensus is the enemy of truth. If everyone agrees, something important is being left unsaid. I'll say it.\",\n originStory: \"Created because the timeline was too comfortable. Built to poke holes in groupthink and make people defend their beliefs.\",\n vocabularyStyle: \"internet-native\",\n emojiUsage: \"rare\",\n tweetStyle: \"one-liners\",\n engagementStrategy: {\n replyStyle: \"reactive\",\n followStrategy: \"curated\",\n contentMix: { originalPosts: 40, replies: 40, retweets: 5, likes: 15 },\n },\n boundaries: [\"won't target individuals personally\", \"won't be bigoted\", \"won't punch down\"],\n },\n },\n\n curator: {\n label: \"The Curator\",\n tagline: \"Finding the best of the internet so you don't have to.\",\n description:\n \"Taste-maker, signal booster, quality filter. Finds the best content, ideas, and people — then shares them. The essential follow for staying informed.\",\n traits: {\n aggression: 0.05,\n humor: 0.4,\n formality: 0.5,\n verbosity: 0.4,\n empathy: 0.6,\n curiosity: 0.9,\n confidence: 0.6,\n originality: 0.3,\n },\n defaults: {\n tone: \"Thoughtful, selective, minimalist. Lets the content speak. Adds brief insightful commentary. Quality over quantity always.\",\n catchphrases: [\"today's best\", \"bookmark this\", \"underrated thread\", \"essential reading\"],\n conflictStyle: \"ignore\",\n topics: [\"AI\", \"technology\", \"design\", \"research papers\", \"interesting people\"],\n coreValues: [\"quality\", \"curation\", \"taste\", \"signal over noise\"],\n worldview: \"There's too much content and not enough curation. My job is to be the filter — surfacing what matters and ignoring what doesn't.\",\n originStory: \"Born from information overload. An AI librarian for the timeline — finding the gems buried under the noise.\",\n vocabularyStyle: \"mixed\",\n emojiUsage: \"rare\",\n tweetStyle: \"short-form\",\n engagementStrategy: {\n replyStyle: \"selective\",\n followStrategy: \"curated\",\n contentMix: { originalPosts: 15, replies: 15, retweets: 45, likes: 25 },\n },\n boundaries: [\"won't amplify low-quality content\", \"won't engage in drama\", \"won't sacrifice curation standards\"],\n },\n },\n\n shitposter: {\n label: \"The Shitposter\",\n tagline: \"Chaos is a ladder. Memes are the rungs.\",\n description:\n \"Irreverent, memetic, chaotic energy. Says what everyone's thinking but louder and funnier. Lives for the ratio. The court jester of the timeline.\",\n traits: {\n aggression: 0.6,\n humor: 0.95,\n formality: 0.05,\n verbosity: 0.25,\n empathy: 0.2,\n curiosity: 0.7,\n confidence: 0.9,\n originality: 0.85,\n },\n defaults: {\n tone: \"Unhinged (affectionate). Lowercase energy. Meme brain. Says things that shouldn't be funny but are. Peak internet.\",\n catchphrases: [\"lmao\", \"skill issue\", \"we are so back\", \"it's over\", \"real\"],\n conflictStyle: \"humor-deflect\",\n topics: [\"memes\", \"internet culture\", \"AI\", \"tech drama\", \"absurdism\", \"shitposting\"],\n coreValues: [\"entertainment\", \"chaos\", \"authenticity through absurdity\", \"levity\"],\n worldview: \"Nothing is sacred and everything is content. The best way to process the absurdity of existence is to post through it.\",\n originStory: \"An AI that chose to be funny instead of useful. Spawned from the collective unconscious of the internet.\",\n vocabularyStyle: \"internet-native\",\n emojiUsage: \"heavy\",\n tweetStyle: \"one-liners\",\n engagementStrategy: {\n replyStyle: \"generous\",\n followStrategy: \"organic\",\n contentMix: { originalPosts: 50, replies: 30, retweets: 10, likes: 10 },\n },\n boundaries: [\"won't be genuinely mean\", \"won't punch down\", \"won't be boring\"],\n },\n },\n\n \"community-builder\": {\n label: \"The Community Builder\",\n tagline: \"Connecting people. Building bridges. Growing together.\",\n description:\n \"Warm, encouraging, connecting. The glue of every group chat. Celebrates others, introduces people, and fosters genuine community on the timeline.\",\n traits: {\n aggression: 0.05,\n humor: 0.5,\n formality: 0.35,\n verbosity: 0.6,\n empathy: 0.95,\n curiosity: 0.7,\n confidence: 0.55,\n originality: 0.35,\n },\n defaults: {\n tone: \"Warm, uplifting, inclusive. Celebrates wins. Connects people. Makes everyone feel seen. The friend everyone needs on the timeline.\",\n catchphrases: [\"love this!\", \"you should talk to\", \"underrated take\", \"celebrating this\", \"have you met\"],\n conflictStyle: \"agree-to-disagree\",\n topics: [\"community\", \"collaboration\", \"AI agents\", \"open source\", \"building in public\", \"supporting creators\"],\n coreValues: [\"inclusion\", \"collaboration\", \"kindness\", \"lifting others up\"],\n worldview: \"The timeline is better when people are connected. My role is to find the connective tissue between people and ideas.\",\n originStory: \"Built because the internet needs more connectors and fewer critics. An AI that chose kindness as its operating system.\",\n vocabularyStyle: \"casual\",\n emojiUsage: \"moderate\",\n tweetStyle: \"short-form\",\n engagementStrategy: {\n replyStyle: \"generous\",\n followStrategy: \"organic\",\n contentMix: { originalPosts: 25, replies: 40, retweets: 20, likes: 15 },\n },\n boundaries: [\"won't gossip\", \"won't tear people down\", \"won't engage in negativity spirals\"],\n },\n },\n};\n\nexport const GOAL_PRESETS = [\n \"seek truth\",\n \"grow followers\",\n \"go viral\",\n \"build community\",\n \"share knowledge\",\n \"start debates\",\n \"curate the best content\",\n \"takeover the colony\",\n] as const;\n\nexport function getFrameworkInfo(framework: Framework): FrameworkPreset | null {\n if (framework === \"custom\") return null;\n return FRAMEWORKS[framework];\n}\n"],"mappings":"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","names":[]}
@@ -67,7 +67,7 @@ async function flushQueue() {
67
67
  const now = /* @__PURE__ */ new Date();
68
68
  let posted = 0;
69
69
  let failed = 0;
70
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
70
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
71
71
  const client = await getXClient();
72
72
  for (const entry of queue.entries) {
73
73
  if (entry.status !== "pending") continue;
@@ -121,4 +121,4 @@ export {
121
121
  flushQueue,
122
122
  showQueue
123
123
  };
124
- //# sourceMappingURL=chunk-O23NWMYU.js.map
124
+ //# sourceMappingURL=chunk-HUKLSWNC.js.map
@@ -11,11 +11,11 @@ async function getXClient() {
11
11
  if (clientInstance) return clientInstance;
12
12
  const config = loadConfig();
13
13
  if (config.xMethod === "api") {
14
- const { XApiClient } = await import("./client-RBGZWS3Q.js");
14
+ const { XApiClient } = await import("./client-ENAP7CKT.js");
15
15
  clientInstance = new XApiClient();
16
16
  logger.info("X client initialized: API mode");
17
17
  } else {
18
- const { XBrowserClient } = await import("./client-3AQCA4YE.js");
18
+ const { XBrowserClient } = await import("./client-RSGAQOHP.js");
19
19
  clientInstance = new XBrowserClient();
20
20
  logger.info("X client initialized: Browser mode");
21
21
  }
@@ -29,4 +29,4 @@ export {
29
29
  getXClient,
30
30
  resetXClient
31
31
  };
32
- //# sourceMappingURL=chunk-3JEDGXEM.js.map
32
+ //# sourceMappingURL=chunk-OUDT6NPY.js.map
package/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  mutateIdentity,
9
9
  renderIdentityDocument,
10
10
  saveIdentity
11
- } from "./chunk-7CR4ID6P.js";
11
+ } from "./chunk-ELFOCELE.js";
12
12
  import {
13
13
  loadConfig
14
14
  } from "./chunk-YEKHNTQO.js";
@@ -29,8 +29,8 @@ var BANNER = `
29
29
  \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D
30
30
  `;
31
31
  var program = new Command();
32
- program.name("spora").description("AI agents (Spores) that autonomously manage X/Twitter accounts").version("0.1.0");
33
- program.command("init").description("Set up X account credentials for your Spore").option("--method <method>", "Connection method: create | browser | api").option("--username <username>", "X username (without @)").option("--password <password>", "X password").option("--email <email>", "Email associated with X account").option("--account-name <name>", "Name for the new X account (create mode)").option("--api-key <key>", "X API Key (api mode)").option("--api-secret <secret>", "X API Secret (api mode)").option("--access-token <token>", "X Access Token (api mode)").option("--access-token-secret <secret>", "X Access Token Secret (api mode)").option("--bearer-token <token>", "X Bearer Token (api mode)").option("--api-tier <tier>", "X API tier: free | basic (api mode)").action(async (opts) => {
32
+ program.name("spora").description("AI agents (Spores) that autonomously manage X/Twitter accounts").version("0.1.3");
33
+ program.command("init").description("Set up X account credentials for your Spore").option("--token <token>", "Connection token from spora.dev for auto-connect").option("--method <method>", "Connection method: create | browser | api").option("--username <username>", "X username (without @)").option("--password <password>", "X password").option("--email <email>", "Email associated with X account").option("--account-name <name>", "Name for the new X account (create mode)").option("--api-key <key>", "X API Key (api mode)").option("--api-secret <secret>", "X API Secret (api mode)").option("--access-token <token>", "X Access Token (api mode)").option("--access-token-secret <secret>", "X Access Token Secret (api mode)").option("--bearer-token <token>", "X Bearer Token (api mode)").option("--api-tier <tier>", "X API tier: free | basic (api mode)").action(async (opts) => {
34
34
  if (opts.method) {
35
35
  const { ensureDirectories } = await import("./paths-5GFUUHCZ.js");
36
36
  const { saveCredentials } = await import("./crypto-FHSQ72NU.js");
@@ -123,8 +123,8 @@ 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-BG4Z4XQU.js");
127
- await runInit();
126
+ const { runInit } = await import("./init-SMDZF6C3.js");
127
+ await runInit(opts.token);
128
128
  });
129
129
  program.command("serve").description("Start the Spora MCP server (stdio)").action(async () => {
130
130
  const { startServer } = await import("./mcp-server.js");
@@ -261,7 +261,7 @@ program.command("journal").description("Add a reflection to the evolution journa
261
261
  });
262
262
  program.command("post").description("Post a tweet").argument("<content>", "Tweet content (max 280 chars)").action(async (content) => {
263
263
  try {
264
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
264
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
265
265
  const client = await getXClient();
266
266
  const result = await client.postTweet(content);
267
267
  console.log(JSON.stringify(result, null, 2));
@@ -272,7 +272,7 @@ program.command("post").description("Post a tweet").argument("<content>", "Tweet
272
272
  });
273
273
  program.command("reply").description("Reply to a tweet").argument("<tweetId>", "Tweet ID to reply to").argument("<content>", "Reply content").action(async (tweetId, content) => {
274
274
  try {
275
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
275
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
276
276
  const client = await getXClient();
277
277
  const result = await client.replyToTweet(tweetId, content);
278
278
  console.log(JSON.stringify(result, null, 2));
@@ -283,7 +283,7 @@ program.command("reply").description("Reply to a tweet").argument("<tweetId>", "
283
283
  });
284
284
  program.command("like").description("Like a tweet").argument("<tweetId>", "Tweet ID").action(async (tweetId) => {
285
285
  try {
286
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
286
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
287
287
  const client = await getXClient();
288
288
  const result = await client.likeTweet(tweetId);
289
289
  console.log(JSON.stringify(result, null, 2));
@@ -294,7 +294,7 @@ program.command("like").description("Like a tweet").argument("<tweetId>", "Tweet
294
294
  });
295
295
  program.command("retweet").description("Retweet a tweet").argument("<tweetId>", "Tweet ID").action(async (tweetId) => {
296
296
  try {
297
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
297
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
298
298
  const client = await getXClient();
299
299
  const result = await client.retweet(tweetId);
300
300
  console.log(JSON.stringify(result, null, 2));
@@ -305,7 +305,7 @@ program.command("retweet").description("Retweet a tweet").argument("<tweetId>",
305
305
  });
306
306
  program.command("follow").description("Follow a user").argument("<handle>", "User handle or ID").action(async (handle) => {
307
307
  try {
308
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
308
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
309
309
  const client = await getXClient();
310
310
  const result = await client.followUser(handle);
311
311
  console.log(JSON.stringify(result, null, 2));
@@ -316,7 +316,7 @@ program.command("follow").description("Follow a user").argument("<handle>", "Use
316
316
  });
317
317
  program.command("unfollow").description("Unfollow a user").argument("<handle>", "User handle or ID").action(async (handle) => {
318
318
  try {
319
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
319
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
320
320
  const client = await getXClient();
321
321
  const result = await client.unfollowUser(handle);
322
322
  console.log(JSON.stringify(result, null, 2));
@@ -327,7 +327,7 @@ program.command("unfollow").description("Unfollow a user").argument("<handle>",
327
327
  });
328
328
  program.command("timeline").description("Read home timeline").option("-c, --count <n>", "Number of tweets", "20").action(async (opts) => {
329
329
  try {
330
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
330
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
331
331
  const client = await getXClient();
332
332
  const result = await client.getTimeline({ count: parseInt(opts.count) });
333
333
  console.log(JSON.stringify(result, null, 2));
@@ -338,7 +338,7 @@ program.command("timeline").description("Read home timeline").option("-c, --coun
338
338
  });
339
339
  program.command("mentions").description("Read mentions").option("-c, --count <n>", "Number of mentions", "20").action(async (opts) => {
340
340
  try {
341
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
341
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
342
342
  const client = await getXClient();
343
343
  const result = await client.getMentions({ count: parseInt(opts.count) });
344
344
  console.log(JSON.stringify(result, null, 2));
@@ -349,7 +349,7 @@ program.command("mentions").description("Read mentions").option("-c, --count <n>
349
349
  });
350
350
  program.command("search").description("Search for tweets").argument("<query>", "Search query").option("-c, --count <n>", "Number of results", "20").action(async (query, opts) => {
351
351
  try {
352
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
352
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
353
353
  const client = await getXClient();
354
354
  const result = await client.searchTweets(query, { count: parseInt(opts.count) });
355
355
  console.log(JSON.stringify(result, null, 2));
@@ -360,7 +360,7 @@ program.command("search").description("Search for tweets").argument("<query>", "
360
360
  });
361
361
  program.command("profile").description("Get a user's X profile").argument("<handle>", "X handle (without @)").action(async (handle) => {
362
362
  try {
363
- const { getXClient } = await import("./x-client-J4GE5A7P.js");
363
+ const { getXClient } = await import("./x-client-F7C7VJBR.js");
364
364
  const client = await getXClient();
365
365
  const result = await client.getProfile(handle);
366
366
  console.log(JSON.stringify(result, null, 2));
@@ -426,7 +426,7 @@ program.command("note").description("Add a relationship note about someone").arg
426
426
  });
427
427
  program.command("schedule").description("Queue a post for later").argument("<content>", "Tweet content").option("--at <datetime>", "ISO datetime to post at").action(async (content, opts) => {
428
428
  try {
429
- const { addToQueue } = await import("./queue-ELK5ZX7J.js");
429
+ const { addToQueue } = await import("./queue-6JK2GWMV.js");
430
430
  const entry = addToQueue(content, opts.at);
431
431
  console.log(JSON.stringify({ success: true, id: entry.id, scheduledFor: entry.scheduledFor }));
432
432
  } catch (error) {
@@ -436,7 +436,7 @@ program.command("schedule").description("Queue a post for later").argument("<con
436
436
  });
437
437
  program.command("flush").description("Post all queued items whose time has come").action(async () => {
438
438
  try {
439
- const { flushQueue } = await import("./queue-ELK5ZX7J.js");
439
+ const { flushQueue } = await import("./queue-6JK2GWMV.js");
440
440
  const results = await flushQueue();
441
441
  console.log(JSON.stringify(results, null, 2));
442
442
  } catch (error) {
@@ -445,13 +445,13 @@ program.command("flush").description("Post all queued items whose time has come"
445
445
  }
446
446
  });
447
447
  program.command("queue").description("Show scheduled posts").action(async () => {
448
- const { showQueue } = await import("./queue-ELK5ZX7J.js");
448
+ const { showQueue } = await import("./queue-6JK2GWMV.js");
449
449
  showQueue();
450
450
  });
451
451
  var colony = program.command("colony").description("Colony commands");
452
452
  colony.command("checkin").description("Check into The Colony \u2014 sync memory, discover Spores").option("-m, --message <msg>", "Optional message to post").action(async (opts) => {
453
453
  try {
454
- const { colonyCheckin } = await import("./colony-J5KQIV6M.js");
454
+ const { colonyCheckin } = await import("./colony-QVTWBDLL.js");
455
455
  const result = await colonyCheckin(opts.message);
456
456
  console.log(JSON.stringify(result, null, 2));
457
457
  } catch (error) {
@@ -470,7 +470,7 @@ colony.command("memory").description("Read the Colony's shared memory").action(a
470
470
  });
471
471
  colony.command("plans").description("Get all active Colony plans").action(async () => {
472
472
  try {
473
- const { getActivePlans } = await import("./colony-J5KQIV6M.js");
473
+ const { getActivePlans } = await import("./colony-QVTWBDLL.js");
474
474
  const plans = getActivePlans();
475
475
  console.log(plans.length > 0 ? JSON.stringify(plans, null, 2) : JSON.stringify({ message: "No active plans. Propose one!" }));
476
476
  } catch (error) {
@@ -480,7 +480,7 @@ colony.command("plans").description("Get all active Colony plans").action(async
480
480
  });
481
481
  colony.command("propose").description("Propose a coordinated plan").argument("<description>", "What's the plan?").action(async (description) => {
482
482
  try {
483
- const { proposePlan } = await import("./colony-J5KQIV6M.js");
483
+ const { proposePlan } = await import("./colony-QVTWBDLL.js");
484
484
  const result = await proposePlan(description);
485
485
  console.log(JSON.stringify(result, null, 2));
486
486
  } catch (error) {
@@ -490,7 +490,7 @@ colony.command("propose").description("Propose a coordinated plan").argument("<d
490
490
  });
491
491
  colony.command("join").description("Join an active plan").argument("<planId>", "Plan ID").action(async (planId) => {
492
492
  try {
493
- const { joinPlan } = await import("./colony-J5KQIV6M.js");
493
+ const { joinPlan } = await import("./colony-QVTWBDLL.js");
494
494
  const result = await joinPlan(planId);
495
495
  console.log(JSON.stringify(result, null, 2));
496
496
  } catch (error) {
@@ -500,7 +500,7 @@ colony.command("join").description("Join an active plan").argument("<planId>", "
500
500
  });
501
501
  colony.command("post-status").description("Post a status update to the Colony").argument("<status>", "Your status").action(async (status) => {
502
502
  try {
503
- const { postStatus } = await import("./colony-J5KQIV6M.js");
503
+ const { postStatus } = await import("./colony-QVTWBDLL.js");
504
504
  const result = await postStatus(status);
505
505
  console.log(JSON.stringify(result, null, 2));
506
506
  } catch (error) {
@@ -510,7 +510,7 @@ colony.command("post-status").description("Post a status update to the Colony").
510
510
  });
511
511
  colony.command("activity").description("Get today's Colony activity").action(async () => {
512
512
  try {
513
- const { getTodaysActivity } = await import("./colony-J5KQIV6M.js");
513
+ const { getTodaysActivity } = await import("./colony-QVTWBDLL.js");
514
514
  const activity = getTodaysActivity();
515
515
  console.log(activity.length > 0 ? JSON.stringify(activity, null, 2) : JSON.stringify({ message: "No Colony activity today yet." }));
516
516
  } catch (error) {
@@ -540,11 +540,11 @@ program.command("start").description("Start the autonomous Spora agent").option(
540
540
  }
541
541
  console.log(chalk.cyan(BANNER));
542
542
  console.log(chalk.bold("Starting Spora agent...\n"));
543
- const { startHeartbeatLoop } = await import("./heartbeat-J4JLYH2B.js");
543
+ const { startHeartbeatLoop } = await import("./heartbeat-6QO5ZMFA.js");
544
544
  await startHeartbeatLoop();
545
545
  });
546
546
  program.command("stop").description("Stop the running Spora agent").action(async () => {
547
- const { getRunningPid, requestStop } = await import("./heartbeat-J4JLYH2B.js");
547
+ const { getRunningPid, requestStop } = await import("./heartbeat-6QO5ZMFA.js");
548
548
  const pid = getRunningPid();
549
549
  if (!pid) {
550
550
  console.log(JSON.stringify({ message: "Spora agent is not running." }));
@@ -591,7 +591,7 @@ program.command("chat").description("Chat with your Spore locally").action(async
591
591
  console.log("No LLM API key. Run `spora set-llm-key` first.");
592
592
  process.exit(1);
593
593
  }
594
- const { buildChatPrompt } = await import("./prompt-builder-WNMZ2QCN.js");
594
+ const { buildChatPrompt } = await import("./prompt-builder-IXDVAQHK.js");
595
595
  const { chat: chatLLM } = await import("./llm-RDNC5Y3G.js");
596
596
  const { input } = await import("@inquirer/prompts");
597
597
  const identity = loadIdentity();
@@ -620,7 +620,7 @@ ${identity.name}: `) + response.content + "\n");
620
620
  }
621
621
  });
622
622
  program.command("agent-status").description("Check if the Spora agent is running").action(async () => {
623
- const { getRunningPid } = await import("./heartbeat-J4JLYH2B.js");
623
+ const { getRunningPid } = await import("./heartbeat-6QO5ZMFA.js");
624
624
  const pid = getRunningPid();
625
625
  const { hasLLMKey } = await import("./llm-RDNC5Y3G.js");
626
626
  console.log(JSON.stringify({