superceo 0.3.3 → 0.3.5

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 (158) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +91 -51
  3. package/dist/index.js.map +3 -3
  4. package/dist/migrations/0000_mature_masked_marvel.sql +208 -0
  5. package/dist/migrations/0001_fast_northstar.sql +87 -0
  6. package/dist/migrations/0002_big_zaladane.sql +1 -0
  7. package/dist/migrations/0003_shallow_quentin_quire.sql +5 -0
  8. package/dist/migrations/0004_issue_identifiers.sql +28 -0
  9. package/dist/migrations/0005_chief_luke_cage.sql +19 -0
  10. package/dist/migrations/0006_overjoyed_mister_sinister.sql +36 -0
  11. package/dist/migrations/0007_new_quentin_quire.sql +20 -0
  12. package/dist/migrations/0008_amused_zzzax.sql +1 -0
  13. package/dist/migrations/0009_fast_jackal.sql +36 -0
  14. package/dist/migrations/0010_stale_justin_hammer.sql +37 -0
  15. package/dist/migrations/0011_windy_corsair.sql +18 -0
  16. package/dist/migrations/0012_perpetual_ser_duncan.sql +2 -0
  17. package/dist/migrations/0013_dashing_wasp.sql +4 -0
  18. package/dist/migrations/0014_many_mikhail_rasputin.sql +135 -0
  19. package/dist/migrations/0015_project_color_archived.sql +2 -0
  20. package/dist/migrations/0016_agent_icon.sql +1 -0
  21. package/dist/migrations/0017_tiresome_gabe_jones.sql +51 -0
  22. package/dist/migrations/0018_flat_sleepwalker.sql +26 -0
  23. package/dist/migrations/0019_public_victor_mancha.sql +18 -0
  24. package/dist/migrations/0020_white_anita_blake.sql +1 -0
  25. package/dist/migrations/0021_chief_vindicator.sql +1 -0
  26. package/dist/migrations/0022_company_brand_color.sql +1 -0
  27. package/dist/migrations/0023_fair_lethal_legion.sql +3 -0
  28. package/dist/migrations/0024_far_beast.sql +2 -0
  29. package/dist/migrations/0025_nasty_salo.sql +15 -0
  30. package/dist/migrations/0026_lying_pete_wisdom.sql +39 -0
  31. package/dist/migrations/0027_tranquil_tenebrous.sql +2 -0
  32. package/dist/migrations/0028_harsh_goliath.sql +54 -0
  33. package/dist/migrations/0029_plugin_tables.sql +177 -0
  34. package/dist/migrations/0030_rich_magneto.sql +12 -0
  35. package/dist/migrations/0031_zippy_magma.sql +51 -0
  36. package/dist/migrations/0032_pretty_doctor_octopus.sql +102 -0
  37. package/dist/migrations/0033_shiny_black_tarantula.sql +2 -0
  38. package/dist/migrations/0034_fat_dormammu.sql +2 -0
  39. package/dist/migrations/0035_marvelous_satana.sql +91 -0
  40. package/dist/migrations/0036_cheerful_nitro.sql +9 -0
  41. package/dist/migrations/0037_friendly_eddie_brock.sql +29 -0
  42. package/dist/migrations/0038_careless_iron_monger.sql +5 -0
  43. package/dist/migrations/0039_fat_magneto.sql +161 -0
  44. package/dist/migrations/0040_eager_shotgun.sql +5 -0
  45. package/dist/migrations/0041_curly_maria_hill.sql +1 -0
  46. package/dist/migrations/0042_spotty_the_renegades.sql +26 -0
  47. package/dist/migrations/0043_reflective_captain_universe.sql +6 -0
  48. package/dist/migrations/0044_illegal_toad.sql +56 -0
  49. package/dist/migrations/0045_workable_shockwave.sql +17 -0
  50. package/dist/migrations/0046_smooth_sentinels.sql +11 -0
  51. package/dist/migrations/0047_overjoyed_groot.sql +102 -0
  52. package/dist/migrations/0048_flashy_marrow.sql +1 -0
  53. package/dist/migrations/0049_flawless_abomination.sql +21 -0
  54. package/dist/migrations/0050_stiff_luckman.sql +1 -0
  55. package/dist/migrations/0051_young_korg.sql +5 -0
  56. package/dist/migrations/0052_mushy_trauma.sql +26 -0
  57. package/dist/migrations/0053_sharp_wild_child.sql +18 -0
  58. package/dist/migrations/0054_draft_routines.sql +2 -0
  59. package/dist/migrations/0055_faithful_doctor_octopus.sql +48 -0
  60. package/dist/migrations/0056_equal_sabretooth.sql +34 -0
  61. package/dist/migrations/0057_ordinary_khan.sql +5 -0
  62. package/dist/migrations/0058_sad_wolf_cub.sql +2 -0
  63. package/dist/migrations/0059_rich_jackpot.sql +4 -0
  64. package/dist/migrations/0060_orange_nightshade.sql +60 -0
  65. package/dist/migrations/0061_parallel_puma.sql +1 -0
  66. package/dist/migrations/0062_goofy_lethal_legion.sql +26 -0
  67. package/dist/migrations/0063_luxuriant_doctor_spectrum.sql +23 -0
  68. package/dist/migrations/0064_lead_platform_user.sql +2 -0
  69. package/dist/migrations/0065_wild_next_avengers.sql +14 -0
  70. package/dist/migrations/0066_late_stark_industries.sql +5 -0
  71. package/dist/migrations/0067_instance_backup_settings.sql +1 -0
  72. package/dist/migrations/0068_tiresome_ma_gnuci.sql +1 -0
  73. package/dist/migrations/0069_lazy_zaladane.sql +106 -0
  74. package/dist/migrations/0070_lame_wendigo.sql +1 -0
  75. package/dist/migrations/0071_content_analytics.sql +71 -0
  76. package/dist/migrations/0072_quota_gate_feature_scope.sql +3 -0
  77. package/dist/migrations/0073_instance_update_settings.sql +1 -0
  78. package/dist/migrations/0074_local_tools_config.sql +1 -0
  79. package/dist/migrations/0075_liveness_recovery_dedupe.sql +15 -0
  80. package/dist/migrations/0076_active_run_output_watchdog.sql +91 -0
  81. package/dist/migrations/0077_issue_tree_holds.sql +107 -0
  82. package/dist/migrations/0078_issue_reference_mentions.sql +50 -0
  83. package/dist/migrations/0079_subscription_quota_lane.sql +4 -0
  84. package/dist/migrations/0080_lead_product_user.sql +3 -0
  85. package/dist/migrations/0081_lead_product_user_split_x.sql +8 -0
  86. package/dist/migrations/0082_agent_image_url.sql +1 -0
  87. package/dist/migrations/0083_chat_sessions_target_agent.sql +2 -0
  88. package/dist/migrations/0084_document_folders.sql +22 -0
  89. package/dist/migrations/0085_eager_mulholland_black.sql +4 -0
  90. package/dist/migrations/meta/0000_snapshot.json +1743 -0
  91. package/dist/migrations/meta/0001_snapshot.json +2441 -0
  92. package/dist/migrations/meta/0002_snapshot.json +2454 -0
  93. package/dist/migrations/meta/0003_snapshot.json +2502 -0
  94. package/dist/migrations/meta/0005_snapshot.json +2719 -0
  95. package/dist/migrations/meta/0006_snapshot.json +3048 -0
  96. package/dist/migrations/meta/0007_snapshot.json +3258 -0
  97. package/dist/migrations/meta/0008_snapshot.json +3264 -0
  98. package/dist/migrations/meta/0009_snapshot.json +3587 -0
  99. package/dist/migrations/meta/0010_snapshot.json +3929 -0
  100. package/dist/migrations/meta/0011_snapshot.json +4068 -0
  101. package/dist/migrations/meta/0012_snapshot.json +4087 -0
  102. package/dist/migrations/meta/0013_snapshot.json +4118 -0
  103. package/dist/migrations/meta/0014_snapshot.json +5187 -0
  104. package/dist/migrations/meta/0017_snapshot.json +5215 -0
  105. package/dist/migrations/meta/0018_snapshot.json +5450 -0
  106. package/dist/migrations/meta/0019_snapshot.json +5603 -0
  107. package/dist/migrations/meta/0020_snapshot.json +5603 -0
  108. package/dist/migrations/meta/0021_snapshot.json +5609 -0
  109. package/dist/migrations/meta/0023_snapshot.json +5633 -0
  110. package/dist/migrations/meta/0024_snapshot.json +5693 -0
  111. package/dist/migrations/meta/0025_snapshot.json +5849 -0
  112. package/dist/migrations/meta/0027_snapshot.json +6205 -0
  113. package/dist/migrations/meta/0028_snapshot.json +6710 -0
  114. package/dist/migrations/meta/0029_snapshot.json +7899 -0
  115. package/dist/migrations/meta/0030_snapshot.json +8003 -0
  116. package/dist/migrations/meta/0031_snapshot.json +7242 -0
  117. package/dist/migrations/meta/0032_snapshot.json +7733 -0
  118. package/dist/migrations/meta/0033_snapshot.json +9038 -0
  119. package/dist/migrations/meta/0034_snapshot.json +9039 -0
  120. package/dist/migrations/meta/0035_snapshot.json +9959 -0
  121. package/dist/migrations/meta/0036_snapshot.json +10023 -0
  122. package/dist/migrations/meta/0037_snapshot.json +10263 -0
  123. package/dist/migrations/meta/0038_snapshot.json +11350 -0
  124. package/dist/migrations/meta/0039_snapshot.json +10308 -0
  125. package/dist/migrations/meta/0040_snapshot.json +10481 -0
  126. package/dist/migrations/meta/0041_snapshot.json +11393 -0
  127. package/dist/migrations/meta/0044_snapshot.json +11701 -0
  128. package/dist/migrations/meta/0045_snapshot.json +11857 -0
  129. package/dist/migrations/meta/0046_snapshot.json +11870 -0
  130. package/dist/migrations/meta/0047_snapshot.json +12539 -0
  131. package/dist/migrations/meta/0048_snapshot.json +12546 -0
  132. package/dist/migrations/meta/0049_snapshot.json +12766 -0
  133. package/dist/migrations/meta/0050_snapshot.json +12772 -0
  134. package/dist/migrations/meta/0051_snapshot.json +12836 -0
  135. package/dist/migrations/meta/0052_snapshot.json +13057 -0
  136. package/dist/migrations/meta/0053_snapshot.json +12979 -0
  137. package/dist/migrations/meta/0055_snapshot.json +13586 -0
  138. package/dist/migrations/meta/0056_snapshot.json +13868 -0
  139. package/dist/migrations/meta/0057_snapshot.json +13906 -0
  140. package/dist/migrations/meta/0058_snapshot.json +13918 -0
  141. package/dist/migrations/meta/0059_snapshot.json +13942 -0
  142. package/dist/migrations/meta/0060_snapshot.json +14509 -0
  143. package/dist/migrations/meta/0061_snapshot.json +14515 -0
  144. package/dist/migrations/meta/0062_snapshot.json +14717 -0
  145. package/dist/migrations/meta/0063_snapshot.json +14941 -0
  146. package/dist/migrations/meta/0065_snapshot.json +15081 -0
  147. package/dist/migrations/meta/0066_snapshot.json +15112 -0
  148. package/dist/migrations/meta/0067_snapshot.json +15119 -0
  149. package/dist/migrations/meta/0068_snapshot.json +15125 -0
  150. package/dist/migrations/meta/0069_snapshot.json +16110 -0
  151. package/dist/migrations/meta/0070_snapshot.json +16116 -0
  152. package/dist/migrations/meta/0073_snapshot.json +16584 -0
  153. package/dist/migrations/meta/0079_snapshot.json +17847 -0
  154. package/dist/migrations/meta/0080_snapshot.json +17853 -0
  155. package/dist/migrations/meta/0081_snapshot.json +17853 -0
  156. package/dist/migrations/meta/0085_snapshot.json +18068 -0
  157. package/dist/migrations/meta/_journal.json +608 -0
  158. package/package.json +4 -4
package/README.md CHANGED
@@ -11,8 +11,8 @@ Opens `http://localhost:3100` — hire agents, give them goals, watch them work.
11
11
 
12
12
  ## Documentation
13
13
 
14
- - GitHub repo: https://github.com/royherma/superceo
15
- - Full docs: https://github.com/royherma/superceo/blob/master/doc/FOR-DEVELOPERS.md
14
+ - GitHub repo: https://github.com/superceoai/superceo
15
+ - Full docs: https://github.com/superceoai/superceo/blob/master/doc/FOR-DEVELOPERS.md
16
16
 
17
17
  ## License
18
18
 
package/dist/index.js CHANGED
@@ -8823,27 +8823,36 @@ function getCliBrandPack(env = process.env) {
8823
8823
  const path83 = nonEmpty(env.PAPERCLIP_BRAND_PACK_PATH);
8824
8824
  if (path83) {
8825
8825
  const parsed = JSON.parse(fs6.readFileSync(path83, "utf8"));
8826
+ const name2 = typeof parsed.name === "string" && parsed.name.trim() ? parsed.name.trim() : DEFAULT_BRAND.name;
8826
8827
  const branded2 = {
8827
- name: typeof parsed.name === "string" && parsed.name.trim() ? parsed.name.trim() : DEFAULT_BRAND.name,
8828
- tagline: typeof parsed.tagline === "string" && parsed.tagline.trim() ? parsed.tagline.trim() : DEFAULT_BRAND.tagline
8828
+ name: name2,
8829
+ tagline: typeof parsed.tagline === "string" && parsed.tagline.trim() ? parsed.tagline.trim() : DEFAULT_BRAND.tagline,
8830
+ command: typeof parsed.command === "string" && parsed.command.trim() ? parsed.command.trim() : deriveCommand(name2)
8829
8831
  };
8830
8832
  if (env === process.env) cachedBrand = branded2;
8831
8833
  return branded2;
8832
8834
  }
8835
+ const name = nonEmpty(env.PAPERCLIP_BRAND_NAME) ?? DEFAULT_BRAND.name;
8833
8836
  const branded = {
8834
- name: nonEmpty(env.PAPERCLIP_BRAND_NAME) ?? DEFAULT_BRAND.name,
8835
- tagline: nonEmpty(env.PAPERCLIP_BRAND_TAGLINE) ?? DEFAULT_BRAND.tagline
8837
+ name,
8838
+ tagline: nonEmpty(env.PAPERCLIP_BRAND_TAGLINE) ?? DEFAULT_BRAND.tagline,
8839
+ command: nonEmpty(env.PAPERCLIP_BRAND_COMMAND) ?? deriveCommand(name)
8836
8840
  };
8837
8841
  if (env === process.env) cachedBrand = branded;
8838
8842
  return branded;
8839
8843
  }
8844
+ function deriveCommand(name) {
8845
+ if (name === DEFAULT_BRAND.name) return DEFAULT_BRAND.command;
8846
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, "");
8847
+ }
8840
8848
  var DEFAULT_BRAND, cachedBrand;
8841
8849
  var init_brand = __esm({
8842
8850
  "../cli/src/utils/brand.ts"() {
8843
8851
  "use strict";
8844
8852
  DEFAULT_BRAND = {
8845
8853
  name: "Paperclip",
8846
- tagline: "Open-source orchestration for zero-human companies"
8854
+ tagline: "Open-source orchestration for zero-human companies",
8855
+ command: "paperclipai"
8847
8856
  };
8848
8857
  cachedBrand = null;
8849
8858
  }
@@ -8853,9 +8862,10 @@ var init_brand = __esm({
8853
8862
  import pc2 from "picocolors";
8854
8863
  function printPaperclipCliBanner() {
8855
8864
  const brand2 = getCliBrandPack();
8865
+ const art = brand2.name.toLowerCase() === "superceo" ? SUPERCEO_ART : PAPERCLIP_ART;
8856
8866
  const lines = [
8857
8867
  "",
8858
- ...PAPERCLIP_ART.map((line) => pc2.cyan(line)),
8868
+ ...art.map((line) => pc2.cyan(line)),
8859
8869
  pc2.blue(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),
8860
8870
  pc2.bold(pc2.white(` ${brand2.tagline}`)),
8861
8871
  pc2.dim(` ${brand2.name} CLI`),
@@ -8863,7 +8873,7 @@ function printPaperclipCliBanner() {
8863
8873
  ];
8864
8874
  console.log(lines.join("\n"));
8865
8875
  }
8866
- var PAPERCLIP_ART;
8876
+ var PAPERCLIP_ART, SUPERCEO_ART;
8867
8877
  var init_banner = __esm({
8868
8878
  "../cli/src/utils/banner.ts"() {
8869
8879
  "use strict";
@@ -8876,6 +8886,14 @@ var init_banner = __esm({
8876
8886
  "\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 ",
8877
8887
  "\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D "
8878
8888
  ];
8889
+ SUPERCEO_ART = [
8890
+ "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ",
8891
+ "\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557",
8892
+ "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551",
8893
+ "\u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551",
8894
+ "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D",
8895
+ "\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D "
8896
+ ];
8879
8897
  }
8880
8898
  });
8881
8899
 
@@ -9149,13 +9167,14 @@ var init_agent_jwt_secret_check = __esm({
9149
9167
  // ../cli/src/checks/config-check.ts
9150
9168
  function configCheck(configPath) {
9151
9169
  const filePath = resolveConfigPath(configPath);
9170
+ const { command } = getCliBrandPack();
9152
9171
  if (!configExists(configPath)) {
9153
9172
  return {
9154
9173
  name: "Config file",
9155
9174
  status: "fail",
9156
9175
  message: `Config file not found at ${filePath}`,
9157
9176
  canRepair: false,
9158
- repairHint: "Run `paperclipai onboard` to create one"
9177
+ repairHint: `Run \`${command} onboard\` to create one`
9159
9178
  };
9160
9179
  }
9161
9180
  try {
@@ -9171,7 +9190,7 @@ function configCheck(configPath) {
9171
9190
  status: "fail",
9172
9191
  message: `Invalid config: ${err instanceof Error ? err.message : String(err)}`,
9173
9192
  canRepair: false,
9174
- repairHint: "Run `paperclipai configure --section database` (or `paperclipai onboard` to recreate)"
9193
+ repairHint: `Run \`${command} configure --section database\` (or \`${command} onboard\` to recreate)`
9175
9194
  };
9176
9195
  }
9177
9196
  }
@@ -9179,6 +9198,7 @@ var init_config_check = __esm({
9179
9198
  "../cli/src/checks/config-check.ts"() {
9180
9199
  "use strict";
9181
9200
  init_store();
9201
+ init_brand();
9182
9202
  }
9183
9203
  });
9184
9204
 
@@ -9198,7 +9218,7 @@ function deploymentAuthCheck(config) {
9198
9218
  status: "fail",
9199
9219
  message: `local_trusted requires loopback host binding (found ${config.server.host})`,
9200
9220
  canRepair: false,
9201
- repairHint: "Run `paperclipai configure --section server` and set host to 127.0.0.1"
9221
+ repairHint: `Run \`${getCliBrandPack().command} configure --section server\` and set host to 127.0.0.1`
9202
9222
  };
9203
9223
  }
9204
9224
  return {
@@ -9223,7 +9243,7 @@ function deploymentAuthCheck(config) {
9223
9243
  status: "fail",
9224
9244
  message: "auth.baseUrlMode=explicit requires auth.publicBaseUrl",
9225
9245
  canRepair: false,
9226
- repairHint: "Run `paperclipai configure --section server` and provide a base URL"
9246
+ repairHint: `Run \`${getCliBrandPack().command} configure --section server\` and provide a base URL`
9227
9247
  };
9228
9248
  }
9229
9249
  if (exposure === "public") {
@@ -9233,7 +9253,7 @@ function deploymentAuthCheck(config) {
9233
9253
  status: "fail",
9234
9254
  message: "authenticated/public requires explicit auth.publicBaseUrl",
9235
9255
  canRepair: false,
9236
- repairHint: "Run `paperclipai configure --section server` and select public exposure"
9256
+ repairHint: `Run \`${getCliBrandPack().command} configure --section server\` and select public exposure`
9237
9257
  };
9238
9258
  }
9239
9259
  try {
@@ -9253,7 +9273,7 @@ function deploymentAuthCheck(config) {
9253
9273
  status: "fail",
9254
9274
  message: "auth.publicBaseUrl is not a valid URL",
9255
9275
  canRepair: false,
9256
- repairHint: "Run `paperclipai configure --section server` and provide a valid URL"
9276
+ repairHint: `Run \`${getCliBrandPack().command} configure --section server\` and provide a valid URL`
9257
9277
  };
9258
9278
  }
9259
9279
  }
@@ -9266,6 +9286,7 @@ function deploymentAuthCheck(config) {
9266
9286
  var init_deployment_auth_check = __esm({
9267
9287
  "../cli/src/checks/deployment-auth-check.ts"() {
9268
9288
  "use strict";
9289
+ init_brand();
9269
9290
  }
9270
9291
  });
9271
9292
 
@@ -9287,7 +9308,7 @@ async function databaseCheck(config, configPath) {
9287
9308
  status: "fail",
9288
9309
  message: "PostgreSQL mode selected but no connection string configured",
9289
9310
  canRepair: false,
9290
- repairHint: "Run `paperclipai configure --section database`"
9311
+ repairHint: `Run \`${getCliBrandPack().command} configure --section database\``
9291
9312
  };
9292
9313
  }
9293
9314
  try {
@@ -9326,12 +9347,13 @@ async function databaseCheck(config, configPath) {
9326
9347
  status: "fail",
9327
9348
  message: `Unknown database mode: ${String(config.database.mode)}`,
9328
9349
  canRepair: false,
9329
- repairHint: "Run `paperclipai configure --section database`"
9350
+ repairHint: `Run \`${getCliBrandPack().command} configure --section database\``
9330
9351
  };
9331
9352
  }
9332
9353
  var init_database_check = __esm({
9333
9354
  "../cli/src/checks/database-check.ts"() {
9334
9355
  "use strict";
9356
+ init_brand();
9335
9357
  init_path_resolver2();
9336
9358
  }
9337
9359
  });
@@ -9376,7 +9398,7 @@ async function llmCheck(config) {
9376
9398
  status: "fail",
9377
9399
  message: "Claude API key is invalid (401)",
9378
9400
  canRepair: false,
9379
- repairHint: "Run `paperclipai configure --section llm`"
9401
+ repairHint: `Run \`${getCliBrandPack().command} configure --section llm\``
9380
9402
  };
9381
9403
  }
9382
9404
  return {
@@ -9397,7 +9419,7 @@ async function llmCheck(config) {
9397
9419
  status: "fail",
9398
9420
  message: "OpenAI API key is invalid (401)",
9399
9421
  canRepair: false,
9400
- repairHint: "Run `paperclipai configure --section llm`"
9422
+ repairHint: `Run \`${getCliBrandPack().command} configure --section llm\``
9401
9423
  };
9402
9424
  }
9403
9425
  return {
@@ -9417,6 +9439,7 @@ async function llmCheck(config) {
9417
9439
  var init_llm_check = __esm({
9418
9440
  "../cli/src/checks/llm-check.ts"() {
9419
9441
  "use strict";
9442
+ init_brand();
9420
9443
  }
9421
9444
  });
9422
9445
 
@@ -9621,7 +9644,7 @@ function secretsCheck(config, configPath) {
9621
9644
  status: "fail",
9622
9645
  message: `${provider} is configured, but this build only supports local_encrypted`,
9623
9646
  canRepair: false,
9624
- repairHint: "Run `paperclipai configure --section secrets` and set provider to local_encrypted"
9647
+ repairHint: `Run \`${getCliBrandPack().command} configure --section secrets\` and set provider to local_encrypted`
9625
9648
  };
9626
9649
  }
9627
9650
  const envMasterKey = process.env.PAPERCLIP_SECRETS_MASTER_KEY;
@@ -9703,6 +9726,7 @@ function secretsCheck(config, configPath) {
9703
9726
  var init_secrets_check = __esm({
9704
9727
  "../cli/src/checks/secrets-check.ts"() {
9705
9728
  "use strict";
9729
+ init_brand();
9706
9730
  init_path_resolver2();
9707
9731
  }
9708
9732
  });
@@ -9740,7 +9764,7 @@ function storageCheck(config, configPath) {
9740
9764
  status: "fail",
9741
9765
  message: "S3 storage requires non-empty bucket and region",
9742
9766
  canRepair: false,
9743
- repairHint: "Run `paperclipai configure --section storage`"
9767
+ repairHint: `Run \`${getCliBrandPack().command} configure --section storage\``
9744
9768
  };
9745
9769
  }
9746
9770
  return {
@@ -9754,6 +9778,7 @@ function storageCheck(config, configPath) {
9754
9778
  var init_storage_check = __esm({
9755
9779
  "../cli/src/checks/storage-check.ts"() {
9756
9780
  "use strict";
9781
+ init_brand();
9757
9782
  init_path_resolver2();
9758
9783
  }
9759
9784
  });
@@ -9780,7 +9805,8 @@ import * as p8 from "@clack/prompts";
9780
9805
  import pc3 from "picocolors";
9781
9806
  async function doctor(opts) {
9782
9807
  printPaperclipCliBanner();
9783
- p8.intro(pc3.bgCyan(pc3.black(" paperclip doctor ")));
9808
+ const brand2 = getCliBrandPack();
9809
+ p8.intro(pc3.bgCyan(pc3.black(` ${brand2.command} doctor `)));
9784
9810
  const configPath = resolveConfigPath(opts.config);
9785
9811
  loadPaperclipEnvFile(configPath);
9786
9812
  const results = [];
@@ -9799,7 +9825,7 @@ async function doctor(opts) {
9799
9825
  status: "fail",
9800
9826
  message: `Could not read config: ${err instanceof Error ? err.message : String(err)}`,
9801
9827
  canRepair: false,
9802
- repairHint: "Run `paperclipai configure --section database` or `paperclipai onboard`"
9828
+ repairHint: `Run \`${brand2.command} configure --section database\` or \`${brand2.command} onboard\``
9803
9829
  };
9804
9830
  results.push(readResult);
9805
9831
  printResult(readResult);
@@ -9920,6 +9946,7 @@ var init_doctor = __esm({
9920
9946
  init_checks();
9921
9947
  init_env();
9922
9948
  init_banner();
9949
+ init_brand();
9923
9950
  STATUS_ICON = {
9924
9951
  pass: pc3.green("\u2713"),
9925
9952
  warn: pc3.yellow("!"),
@@ -29793,7 +29820,7 @@ function documentService(db) {
29793
29820
  createdAt: documentRevisions.createdAt
29794
29821
  }).from(documentRevisions).where(eq15(documentRevisions.documentId, documentId)).orderBy(desc6(documentRevisions.revisionNumber));
29795
29822
  },
29796
- listCompanyDocuments: async (companyId) => {
29823
+ listCompanyDocuments: async (companyId, opts) => {
29797
29824
  const rows = await db.select({
29798
29825
  id: documents.id,
29799
29826
  companyId: documents.companyId,
@@ -29822,7 +29849,12 @@ function documentService(db) {
29822
29849
  or3(isNull5(issueDocuments.id), isNull5(issues.hiddenAt))
29823
29850
  )
29824
29851
  ).orderBy(desc6(documents.updatedAt)).limit(200);
29825
- return rows.map((row2) => ({
29852
+ const filtered = opts?.kind ? rows.filter((row2) => {
29853
+ if (!row2.latestBody) return false;
29854
+ const { frontmatter } = parseFrontmatterMarkdown(row2.latestBody);
29855
+ return frontmatter.kind === opts.kind;
29856
+ }) : rows;
29857
+ return filtered.map((row2) => ({
29826
29858
  id: row2.id,
29827
29859
  companyId: row2.companyId,
29828
29860
  title: row2.title,
@@ -30314,6 +30346,7 @@ var init_documents2 = __esm({
30314
30346
  init_dist2();
30315
30347
  init_dist();
30316
30348
  init_errors();
30349
+ init_company_skills2();
30317
30350
  issueDocumentSelect = {
30318
30351
  id: documents.id,
30319
30352
  companyId: documents.companyId,
@@ -61488,7 +61521,8 @@ function documentRoutes(db) {
61488
61521
  router.get("/companies/:companyId/documents", async (req, res) => {
61489
61522
  const companyId = req.params.companyId;
61490
61523
  assertCompanyAccess(req, companyId);
61491
- const docs = await svc.listCompanyDocuments(companyId);
61524
+ const kind = typeof req.query.kind === "string" ? req.query.kind : void 0;
61525
+ const docs = await svc.listCompanyDocuments(companyId, { kind });
61492
61526
  res.json(docs);
61493
61527
  });
61494
61528
  router.get("/companies/:companyId/document-folders", async (req, res) => {
@@ -82275,14 +82309,15 @@ async function runCommand(opts) {
82275
82309
  const configPath = resolveConfigPath(opts.config);
82276
82310
  process.env.PAPERCLIP_CONFIG = configPath;
82277
82311
  loadPaperclipEnvFile(configPath);
82278
- p9.intro(pc4.bgCyan(pc4.black(" paperclipai run ")));
82312
+ const brand2 = getCliBrandPack();
82313
+ p9.intro(pc4.bgCyan(pc4.black(` ${brand2.command} run `)));
82279
82314
  p9.log.message(pc4.dim(`Home: ${paths.homeDir}`));
82280
82315
  p9.log.message(pc4.dim(`Instance: ${paths.instanceId}`));
82281
82316
  p9.log.message(pc4.dim(`Config: ${configPath}`));
82282
82317
  if (!configExists(configPath)) {
82283
82318
  if (!process.stdin.isTTY || !process.stdout.isTTY) {
82284
82319
  p9.log.error("No config found and terminal is non-interactive.");
82285
- p9.log.message(`Run ${pc4.cyan("paperclipai onboard")} once, then retry ${pc4.cyan("paperclipai run")}.`);
82320
+ p9.log.message(`Run ${pc4.cyan(`${brand2.command} onboard`)} once, then retry ${pc4.cyan(`${brand2.command} run`)}.`);
82286
82321
  process.exit(1);
82287
82322
  }
82288
82323
  p9.log.step("No config found. Starting onboarding...");
@@ -82538,7 +82573,7 @@ function canCreateBootstrapInviteImmediately(config) {
82538
82573
  async function onboard(opts) {
82539
82574
  const brand2 = getCliBrandPack();
82540
82575
  printPaperclipCliBanner();
82541
- p10.intro(pc5.bgCyan(pc5.black(" paperclipai onboard ")));
82576
+ p10.intro(pc5.bgCyan(pc5.black(` ${brand2.command} onboard `)));
82542
82577
  const configPath = resolveConfigPath(opts.config);
82543
82578
  const instance = describeLocalInstancePaths(resolvePaperclipInstanceId());
82544
82579
  p10.log.message(
@@ -82564,7 +82599,7 @@ ${err instanceof Error ? err.message : String(err)}`
82564
82599
  p10.log.message(
82565
82600
  pc5.dim(`Existing ${brand2.name} install detected; keeping the current configuration unchanged.`)
82566
82601
  );
82567
- p10.log.message(pc5.dim(`Use ${pc5.cyan("paperclipai configure")} if you want to change settings.`));
82602
+ p10.log.message(pc5.dim(`Use ${pc5.cyan(`${brand2.command} configure`)} if you want to change settings.`));
82568
82603
  const jwtSecret2 = ensureAgentJwtSecret(configPath);
82569
82604
  const envFilePath2 = resolveAgentJwtEnvFile(configPath);
82570
82605
  if (jwtSecret2.created) {
@@ -82597,9 +82632,9 @@ ${err instanceof Error ? err.message : String(err)}`
82597
82632
  );
82598
82633
  p10.note(
82599
82634
  [
82600
- `Run: ${pc5.cyan("paperclipai run")}`,
82601
- `Reconfigure later: ${pc5.cyan("paperclipai configure")}`,
82602
- `Diagnose setup: ${pc5.cyan("paperclipai doctor")}`
82635
+ `Run: ${pc5.cyan(`${brand2.command} run`)}`,
82636
+ `Reconfigure later: ${pc5.cyan(`${brand2.command} configure`)}`,
82637
+ `Diagnose setup: ${pc5.cyan(`${brand2.command} doctor`)}`
82603
82638
  ].join("\n"),
82604
82639
  "Next commands"
82605
82640
  );
@@ -82672,7 +82707,7 @@ ${err instanceof Error ? err.message : String(err)}`
82672
82707
  await db.execute("SELECT 1");
82673
82708
  s.stop("Database connection successful");
82674
82709
  } catch {
82675
- s.stop(pc5.yellow("Could not connect to database \u2014 you can fix this later with `paperclipai doctor`"));
82710
+ s.stop(pc5.yellow(`Could not connect to database \u2014 you can fix this later with \`${brand2.command} doctor\``));
82676
82711
  }
82677
82712
  }
82678
82713
  p10.log.step(pc5.bold("LLM Provider"));
@@ -82804,9 +82839,9 @@ ${err instanceof Error ? err.message : String(err)}`
82804
82839
  );
82805
82840
  p10.note(
82806
82841
  [
82807
- `Run: ${pc5.cyan("paperclipai run")}`,
82808
- `Reconfigure later: ${pc5.cyan("paperclipai configure")}`,
82809
- `Diagnose setup: ${pc5.cyan("paperclipai doctor")}`
82842
+ `Run: ${pc5.cyan(`${brand2.command} run`)}`,
82843
+ `Reconfigure later: ${pc5.cyan(`${brand2.command} configure`)}`,
82844
+ `Diagnose setup: ${pc5.cyan(`${brand2.command} doctor`)}`
82810
82845
  ].join("\n"),
82811
82846
  "Next commands"
82812
82847
  );
@@ -82834,8 +82869,8 @@ ${err instanceof Error ? err.message : String(err)}`
82834
82869
  p10.log.info(
82835
82870
  [
82836
82871
  "Bootstrap CEO invite will be created after the server starts.",
82837
- `Next: ${pc5.cyan("paperclipai run")}`,
82838
- `Then: ${pc5.cyan("paperclipai auth bootstrap-ceo")}`
82872
+ `Next: ${pc5.cyan(`${brand2.command} run`)}`,
82873
+ `Then: ${pc5.cyan(`${brand2.command} auth bootstrap-ceo`)}`
82839
82874
  ].join("\n")
82840
82875
  );
82841
82876
  }
@@ -83222,10 +83257,11 @@ function defaultConfig() {
83222
83257
  }
83223
83258
  async function configure(opts) {
83224
83259
  printPaperclipCliBanner();
83225
- p12.intro(pc7.bgCyan(pc7.black(" paperclip configure ")));
83260
+ const brand2 = getCliBrandPack();
83261
+ p12.intro(pc7.bgCyan(pc7.black(` ${brand2.command} configure `)));
83226
83262
  const configPath = resolveConfigPath(opts.config);
83227
83263
  if (!configExists(opts.config)) {
83228
- p12.log.error("No config file found. Run `paperclipai onboard` first.");
83264
+ p12.log.error(`No config file found. Run \`${brand2.command} onboard\` first.`);
83229
83265
  p12.outro("");
83230
83266
  return;
83231
83267
  }
@@ -83343,6 +83379,7 @@ var init_configure = __esm({
83343
83379
  init_server();
83344
83380
  init_home();
83345
83381
  init_banner();
83382
+ init_brand();
83346
83383
  SECTION_LABELS = {
83347
83384
  llm: "LLM Provider",
83348
83385
  database: "Database",
@@ -84982,8 +85019,9 @@ async function toApiError(response) {
84982
85019
  }
84983
85020
  function buildConnectionErrorMessage(input) {
84984
85021
  const healthUrl = buildHealthCheckUrl(input.url);
85022
+ const brand2 = getCliBrandPack();
84985
85023
  const lines = [
84986
- "Could not reach the Paperclip API.",
85024
+ `Could not reach the ${brand2.name} API.`,
84987
85025
  "",
84988
85026
  `Request: ${input.method} ${input.url}`
84989
85027
  ];
@@ -84992,12 +85030,12 @@ function buildConnectionErrorMessage(input) {
84992
85030
  }
84993
85031
  lines.push(
84994
85032
  "",
84995
- "This usually means the Paperclip server is not running, the configured URL is wrong, or the request is being blocked before it reaches Paperclip.",
85033
+ `This usually means the ${brand2.name} server is not running, the configured URL is wrong, or the request is being blocked before it reaches ${brand2.name}.`,
84996
85034
  "",
84997
85035
  "Try:",
84998
- "- Start Paperclip with `pnpm dev` or `pnpm paperclipai run`.",
85036
+ `- Start ${brand2.name} with \`pnpm dev\` or \`pnpm ${brand2.command} run\`.`,
84999
85037
  `- Verify the server is reachable with \`curl ${healthUrl}\`.`,
85000
- `- If Paperclip is running elsewhere, pass \`--api-base ${input.apiBase.replace(/\/+$/, "")}\` or set \`PAPERCLIP_API_URL\`.`
85038
+ `- If ${brand2.name} is running elsewhere, pass \`--api-base ${input.apiBase.replace(/\/+$/, "")}\` or set \`PAPERCLIP_API_URL\`.`
85001
85039
  );
85002
85040
  return lines.join("\n");
85003
85041
  }
@@ -85032,6 +85070,7 @@ var ApiRequestError, ApiConnectionError, PaperclipApiClient;
85032
85070
  var init_http3 = __esm({
85033
85071
  "../cli/src/client/http.ts"() {
85034
85072
  "use strict";
85073
+ init_brand();
85035
85074
  ApiRequestError = class extends Error {
85036
85075
  status;
85037
85076
  details;
@@ -85169,7 +85208,7 @@ function resolveCommandContext(options2, opts) {
85169
85208
  const companyId = options2.companyId?.trim() || process.env.PAPERCLIP_COMPANY_ID?.trim() || profile.companyId;
85170
85209
  if (opts?.requireCompany && !companyId) {
85171
85210
  throw new Error(
85172
- "Company ID is required. Pass --company-id, set PAPERCLIP_COMPANY_ID, or set context profile companyId via `paperclipai context set`."
85211
+ `Company ID is required. Pass --company-id, set PAPERCLIP_COMPANY_ID, or set context profile companyId via \`${getCliBrandPack().command} context set\`.`
85173
85212
  );
85174
85213
  }
85175
85214
  const api = new PaperclipApiClient({
@@ -89911,12 +89950,12 @@ async function runWorktreeInit(opts) {
89911
89950
  }
89912
89951
  async function worktreeInitCommand(opts) {
89913
89952
  printPaperclipCliBanner();
89914
- p16.intro(pc24.bgCyan(pc24.black(" paperclipai worktree init ")));
89953
+ p16.intro(pc24.bgCyan(pc24.black(` ${getCliBrandPack().command} worktree init `)));
89915
89954
  await runWorktreeInit(opts);
89916
89955
  }
89917
89956
  async function worktreeMakeCommand(nameArg, opts) {
89918
89957
  printPaperclipCliBanner();
89919
- p16.intro(pc24.bgCyan(pc24.black(" paperclipai worktree:make ")));
89958
+ p16.intro(pc24.bgCyan(pc24.black(` ${getCliBrandPack().command} worktree:make `)));
89920
89959
  const name = resolveWorktreeMakeName(nameArg);
89921
89960
  const startPoint = resolveWorktreeStartPoint(opts.startPoint);
89922
89961
  const sourceCwd = process.cwd();
@@ -90072,7 +90111,7 @@ function worktreePathHasUncommittedChanges(worktreePath) {
90072
90111
  }
90073
90112
  async function worktreeCleanupCommand(nameArg, opts) {
90074
90113
  printPaperclipCliBanner();
90075
- p16.intro(pc24.bgCyan(pc24.black(" paperclipai worktree:cleanup ")));
90114
+ p16.intro(pc24.bgCyan(pc24.black(` ${getCliBrandPack().command} worktree:cleanup `)));
90076
90115
  const name = resolveWorktreeMakeName(nameArg);
90077
90116
  const sourceCwd = process.cwd();
90078
90117
  const targetPath = resolveWorktreeMakeTargetPath(name);
@@ -90697,7 +90736,7 @@ async function promptForSourceEndpoint(excludeWorktreePath) {
90697
90736
  hint: `${choice.worktree}${choice.isCurrent ? " (current)" : ""}`
90698
90737
  }));
90699
90738
  if (choices.length === 0) {
90700
- throw new Error("No Paperclip worktrees were found. Run `paperclipai worktree:list` to inspect the repo worktrees.");
90739
+ throw new Error(`No worktrees were found. Run \`${getCliBrandPack().command} worktree:list\` to inspect the repo worktrees.`);
90701
90740
  }
90702
90741
  const selection = await p16.select({
90703
90742
  message: "Choose the source worktree to import from",
@@ -91095,7 +91134,7 @@ async function worktreeMergeHistoryCommand(sourceArg, opts) {
91095
91134
  }
91096
91135
  async function worktreeReseedCommand(opts) {
91097
91136
  printPaperclipCliBanner();
91098
- p16.intro(pc24.bgCyan(pc24.black(" paperclipai worktree reseed ")));
91137
+ p16.intro(pc24.bgCyan(pc24.black(` ${getCliBrandPack().command} worktree reseed `)));
91099
91138
  const seedMode = opts.seedMode ?? "full";
91100
91139
  if (!isWorktreeSeedMode(seedMode)) {
91101
91140
  throw new Error(`Unsupported seed mode "${seedMode}". Expected one of: minimal, full.`);
@@ -91177,6 +91216,7 @@ var WORKTREE_NAME_PREFIX, dynamicImport;
91177
91216
  var init_worktree = __esm({
91178
91217
  "../cli/src/commands/worktree.ts"() {
91179
91218
  "use strict";
91219
+ init_brand();
91180
91220
  init_dist2();
91181
91221
  init_env();
91182
91222
  init_home();
@@ -91533,7 +91573,7 @@ var init_src2 = __esm({
91533
91573
  program = new Command();
91534
91574
  brand = getCliBrandPack();
91535
91575
  DATA_DIR_OPTION_HELP = `${brand.name} data directory root (isolates state from ~/.paperclip)`;
91536
- program.name("paperclipai").description(`${brand.name} CLI \u2014 setup, diagnose, and configure your instance`).version(cliVersion);
91576
+ program.name(brand.command).description(`${brand.name} CLI \u2014 setup, diagnose, and configure your instance`).version(cliVersion);
91537
91577
  program.hook("preAction", (_thisCommand, actionCommand) => {
91538
91578
  const options2 = actionCommand.optsWithGlobals();
91539
91579
  const optionNames = new Set(actionCommand.options.map((option) => option.attributeName()));
@@ -91581,6 +91621,6 @@ var init_src2 = __esm({
91581
91621
 
91582
91622
  // src/index.ts
91583
91623
  process.env.PAPERCLIP_BRAND_NAME = "SuperCEO";
91584
- process.env.PAPERCLIP_BRAND_HOMEPAGE_URL = "https://github.com/royherma/superceo";
91624
+ process.env.PAPERCLIP_BRAND_HOMEPAGE_URL = "https://github.com/superceoai/superceo";
91585
91625
  await Promise.resolve().then(() => (init_src2(), src_exports2));
91586
91626
  //# sourceMappingURL=index.js.map