create-egregore 0.20.0 → 0.20.2

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 (160) hide show
  1. package/assets/egregore-launcher.js +80 -15
  2. package/lib/local.js +4 -20
  3. package/lib/setup.js +21 -4
  4. package/package.json +2 -2
  5. package/runtime/codex/.codex/config.toml +3 -0
  6. package/runtime/codex/.codex/skills/archive/SKILL.md +1 -1
  7. package/runtime/codex/.codex/skills/branch/SKILL.md +1 -1
  8. package/runtime/codex/.codex/skills/checkup/SKILL.md +1 -1
  9. package/runtime/codex/.codex/skills/commit/SKILL.md +1 -1
  10. package/runtime/codex/.codex/skills/contribute/SKILL.md +1 -1
  11. package/runtime/codex/.codex/skills/delete-user/SKILL.md +1 -1
  12. package/runtime/codex/.codex/skills/ingest/SKILL.md +1 -1
  13. package/runtime/codex/.codex/skills/ingest-corpus/SKILL.md +29 -0
  14. package/runtime/codex/.codex/skills/ingest-notion/SKILL.md +1 -1
  15. package/runtime/codex/.codex/skills/ingest-user-interview/SKILL.md +1 -1
  16. package/runtime/codex/.codex/skills/issue/SKILL.md +1 -1
  17. package/runtime/codex/.codex/skills/me/SKILL.md +1 -1
  18. package/runtime/codex/.codex/skills/meeting/SKILL.md +1 -1
  19. package/runtime/codex/.codex/skills/note/SKILL.md +1 -1
  20. package/runtime/codex/.codex/skills/notion-connect/SKILL.md +1 -1
  21. package/runtime/codex/.codex/skills/onboarding/SKILL.md +1 -1
  22. package/runtime/codex/.codex/skills/pr/SKILL.md +1 -1
  23. package/runtime/codex/.codex/skills/pull/SKILL.md +1 -1
  24. package/runtime/codex/.codex/skills/push/SKILL.md +1 -1
  25. package/runtime/codex/.codex/skills/reflect/SKILL.md +1 -1
  26. package/runtime/codex/.codex/skills/review-pr/SKILL.md +1 -1
  27. package/runtime/codex/.codex/skills/save/SKILL.md +3 -1
  28. package/runtime/codex/.codex/skills/slack-connect/SKILL.md +1 -1
  29. package/runtime/codex/.codex/skills/summon/SKILL.md +1 -1
  30. package/runtime/codex/.codex/skills/sync-repos/SKILL.md +1 -1
  31. package/runtime/codex/.codex/skills/teams-connect/SKILL.md +1 -1
  32. package/runtime/codex/.codex/skills/telegram-connect/SKILL.md +1 -1
  33. package/runtime/codex/.codex/skills/telemetry/SKILL.md +1 -1
  34. package/runtime/codex/.codex/skills/test/SKILL.md +1 -1
  35. package/runtime/codex/.codex/skills/tutorial/SKILL.md +1 -1
  36. package/runtime/codex/.codex/skills/update/SKILL.md +1 -1
  37. package/runtime/codex/.codex/spec-manifest.json +4 -4
  38. package/runtime/codex/AGENTS.md +52 -39
  39. package/runtime/codex/bin/agent.sh +32 -8
  40. package/runtime/codex/bin/codex-render-spec.mjs +31 -34
  41. package/runtime/codex/bin/codex-sync-skills.sh +6 -1
  42. package/runtime/codex/bin/contribute-guard.sh +79 -0
  43. package/runtime/codex/bin/handoff-pr-backfill.sh +1 -1
  44. package/runtime/codex/bin/handoff-run.sh +8 -3
  45. package/runtime/codex/bin/handoff-save-egregore.sh +20 -8
  46. package/runtime/codex/bin/ingest.py +260 -5
  47. package/runtime/codex/bin/lib/git-message.sh +37 -0
  48. package/runtime/codex/bin/lib/git-sync.sh +26 -2
  49. package/runtime/codex/bin/lib/greeting.sh +2 -2
  50. package/runtime/codex/bin/search.sh +46 -4
  51. package/runtime/codex/bin/session-autosave.sh +13 -2
  52. package/runtime/codex/bin/settings.sh +63 -4
  53. package/runtime/codex/bin/worktree-create.sh +4 -1
  54. package/runtime/codex/manifest.json +5 -1
  55. package/runtime/pi/.codex/config.toml +3 -0
  56. package/runtime/pi/.codex/skills/archive/SKILL.md +1 -1
  57. package/runtime/pi/.codex/skills/branch/SKILL.md +1 -1
  58. package/runtime/pi/.codex/skills/checkup/SKILL.md +1 -1
  59. package/runtime/pi/.codex/skills/commit/SKILL.md +1 -1
  60. package/runtime/pi/.codex/skills/contribute/SKILL.md +1 -1
  61. package/runtime/pi/.codex/skills/delete-user/SKILL.md +1 -1
  62. package/runtime/pi/.codex/skills/ingest/SKILL.md +1 -1
  63. package/runtime/pi/.codex/skills/ingest-corpus/SKILL.md +29 -0
  64. package/runtime/pi/.codex/skills/ingest-notion/SKILL.md +1 -1
  65. package/runtime/pi/.codex/skills/ingest-user-interview/SKILL.md +1 -1
  66. package/runtime/pi/.codex/skills/issue/SKILL.md +1 -1
  67. package/runtime/pi/.codex/skills/me/SKILL.md +1 -1
  68. package/runtime/pi/.codex/skills/meeting/SKILL.md +1 -1
  69. package/runtime/pi/.codex/skills/note/SKILL.md +1 -1
  70. package/runtime/pi/.codex/skills/notion-connect/SKILL.md +1 -1
  71. package/runtime/pi/.codex/skills/onboarding/SKILL.md +1 -1
  72. package/runtime/pi/.codex/skills/pr/SKILL.md +1 -1
  73. package/runtime/pi/.codex/skills/pull/SKILL.md +1 -1
  74. package/runtime/pi/.codex/skills/push/SKILL.md +1 -1
  75. package/runtime/pi/.codex/skills/reflect/SKILL.md +1 -1
  76. package/runtime/pi/.codex/skills/review-pr/SKILL.md +1 -1
  77. package/runtime/pi/.codex/skills/save/SKILL.md +3 -1
  78. package/runtime/pi/.codex/skills/slack-connect/SKILL.md +1 -1
  79. package/runtime/pi/.codex/skills/summon/SKILL.md +1 -1
  80. package/runtime/pi/.codex/skills/sync-repos/SKILL.md +1 -1
  81. package/runtime/pi/.codex/skills/teams-connect/SKILL.md +1 -1
  82. package/runtime/pi/.codex/skills/telegram-connect/SKILL.md +1 -1
  83. package/runtime/pi/.codex/skills/telemetry/SKILL.md +1 -1
  84. package/runtime/pi/.codex/skills/test/SKILL.md +1 -1
  85. package/runtime/pi/.codex/skills/tutorial/SKILL.md +1 -1
  86. package/runtime/pi/.codex/skills/update/SKILL.md +1 -1
  87. package/runtime/pi/.codex/spec-manifest.json +4 -4
  88. package/runtime/pi/.pi/APPEND_SYSTEM.md +76 -39
  89. package/runtime/pi/.pi/spec-manifest.json +2 -2
  90. package/runtime/pi/AGENTS.md +52 -39
  91. package/runtime/pi/bin/agent.sh +32 -8
  92. package/runtime/pi/bin/codex-render-spec.mjs +31 -34
  93. package/runtime/pi/bin/codex-sync-skills.sh +6 -1
  94. package/runtime/pi/bin/contribute-guard.sh +79 -0
  95. package/runtime/pi/bin/handoff-pr-backfill.sh +1 -1
  96. package/runtime/pi/bin/handoff-run.sh +8 -3
  97. package/runtime/pi/bin/handoff-save-egregore.sh +20 -8
  98. package/runtime/pi/bin/ingest.py +260 -5
  99. package/runtime/pi/bin/lib/git-message.sh +37 -0
  100. package/runtime/pi/bin/lib/git-sync.sh +26 -2
  101. package/runtime/pi/bin/lib/greeting.sh +2 -2
  102. package/runtime/pi/bin/pi-render-spec.mjs +52 -26
  103. package/runtime/pi/bin/search.sh +46 -4
  104. package/runtime/pi/bin/session-autosave.sh +13 -2
  105. package/runtime/pi/bin/settings.sh +63 -4
  106. package/runtime/pi/bin/worktree-create.sh +4 -1
  107. package/runtime/pi/manifest.json +5 -1
  108. package/runtime/prime/.codex/config.toml +3 -0
  109. package/runtime/prime/.codex/skills/archive/SKILL.md +1 -1
  110. package/runtime/prime/.codex/skills/branch/SKILL.md +1 -1
  111. package/runtime/prime/.codex/skills/checkup/SKILL.md +1 -1
  112. package/runtime/prime/.codex/skills/commit/SKILL.md +1 -1
  113. package/runtime/prime/.codex/skills/contribute/SKILL.md +1 -1
  114. package/runtime/prime/.codex/skills/delete-user/SKILL.md +1 -1
  115. package/runtime/prime/.codex/skills/ingest/SKILL.md +1 -1
  116. package/runtime/prime/.codex/skills/ingest-corpus/SKILL.md +29 -0
  117. package/runtime/prime/.codex/skills/ingest-notion/SKILL.md +1 -1
  118. package/runtime/prime/.codex/skills/ingest-user-interview/SKILL.md +1 -1
  119. package/runtime/prime/.codex/skills/issue/SKILL.md +1 -1
  120. package/runtime/prime/.codex/skills/me/SKILL.md +1 -1
  121. package/runtime/prime/.codex/skills/meeting/SKILL.md +1 -1
  122. package/runtime/prime/.codex/skills/note/SKILL.md +1 -1
  123. package/runtime/prime/.codex/skills/notion-connect/SKILL.md +1 -1
  124. package/runtime/prime/.codex/skills/onboarding/SKILL.md +1 -1
  125. package/runtime/prime/.codex/skills/pr/SKILL.md +1 -1
  126. package/runtime/prime/.codex/skills/pull/SKILL.md +1 -1
  127. package/runtime/prime/.codex/skills/push/SKILL.md +1 -1
  128. package/runtime/prime/.codex/skills/reflect/SKILL.md +1 -1
  129. package/runtime/prime/.codex/skills/review-pr/SKILL.md +1 -1
  130. package/runtime/prime/.codex/skills/save/SKILL.md +3 -1
  131. package/runtime/prime/.codex/skills/slack-connect/SKILL.md +1 -1
  132. package/runtime/prime/.codex/skills/summon/SKILL.md +1 -1
  133. package/runtime/prime/.codex/skills/sync-repos/SKILL.md +1 -1
  134. package/runtime/prime/.codex/skills/teams-connect/SKILL.md +1 -1
  135. package/runtime/prime/.codex/skills/telegram-connect/SKILL.md +1 -1
  136. package/runtime/prime/.codex/skills/telemetry/SKILL.md +1 -1
  137. package/runtime/prime/.codex/skills/test/SKILL.md +1 -1
  138. package/runtime/prime/.codex/skills/tutorial/SKILL.md +1 -1
  139. package/runtime/prime/.codex/skills/update/SKILL.md +1 -1
  140. package/runtime/prime/.codex/spec-manifest.json +4 -4
  141. package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +77 -40
  142. package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
  143. package/runtime/prime/AGENTS.md +52 -39
  144. package/runtime/prime/bin/agent.sh +32 -8
  145. package/runtime/prime/bin/codex-render-spec.mjs +31 -34
  146. package/runtime/prime/bin/codex-sync-skills.sh +6 -1
  147. package/runtime/prime/bin/contribute-guard.sh +79 -0
  148. package/runtime/prime/bin/handoff-pr-backfill.sh +1 -1
  149. package/runtime/prime/bin/handoff-run.sh +8 -3
  150. package/runtime/prime/bin/handoff-save-egregore.sh +20 -8
  151. package/runtime/prime/bin/ingest.py +260 -5
  152. package/runtime/prime/bin/lib/git-message.sh +37 -0
  153. package/runtime/prime/bin/lib/git-sync.sh +26 -2
  154. package/runtime/prime/bin/lib/greeting.sh +2 -2
  155. package/runtime/prime/bin/prime-render-spec.mjs +52 -28
  156. package/runtime/prime/bin/search.sh +46 -4
  157. package/runtime/prime/bin/session-autosave.sh +13 -2
  158. package/runtime/prime/bin/settings.sh +63 -4
  159. package/runtime/prime/bin/worktree-create.sh +4 -1
  160. package/runtime/prime/manifest.json +5 -1
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // egregore-launcher-version: 0.20.0
2
+ // egregore-launcher-version: 0.20.2
3
3
  //
4
4
  // egregore — launch and browse Egregore instances from your terminal.
5
5
  // Installed by create-egregore. Reads ~/.egregore/instances.json.
@@ -33,7 +33,7 @@ const crypto = require("node:crypto");
33
33
  const { spawnSync, spawn } = require("node:child_process");
34
34
  const readline = require("node:readline");
35
35
 
36
- const VERSION = "0.20.0";
36
+ const VERSION = "0.20.2";
37
37
  const REGISTRY = path.join(os.homedir(), ".egregore", "instances.json");
38
38
  const DEFAULT_FILE = path.join(os.homedir(), ".egregore", "default");
39
39
  const UPDATE_CACHE_FILE = path.join(os.homedir(), ".egregore", "update-check.json");
@@ -702,7 +702,9 @@ function codexSupportMessage(egregoreDir) {
702
702
  " .codex/hooks.json",
703
703
  " .codex/hooks/",
704
704
  "",
705
- "Run npx -y create-egregore@latest to install the packaged Codex runtime, then rerun egregore.",
705
+ "Automatic repair did not complete. Retry with:",
706
+ " npx -y create-egregore@latest --refresh-launcher",
707
+ "Then rerun egregore.",
706
708
  "Egregore workflows appear as slash commands. In Codex, invoke them with the matching $skill token or ask in natural language.",
707
709
  ].join("\n");
708
710
  }
@@ -756,6 +758,27 @@ function primeSupportMessage(egregoreDir) {
756
758
  ].join("\n");
757
759
  }
758
760
 
761
+ function repairPortableRuntime(egregoreDir, runtime) {
762
+ const label = runtimeLabel(runtime);
763
+ process.stdout.write(`\n ${CYAN}↻${RESET} ${BOLD}Repairing ${label} support${RESET}${DIM} — updating this checkout${RESET}\n`);
764
+ const result = spawnSync(
765
+ "npx",
766
+ ["-y", `${PUBLIC_NPX_PACKAGE}@latest`, "--refresh-launcher"],
767
+ {
768
+ cwd: egregoreDir,
769
+ stdio: "inherit",
770
+ env: { ...process.env, EGREGORE_RUNTIME_REPAIR: runtime },
771
+ timeout: 3 * 60 * 1000,
772
+ },
773
+ );
774
+ if (result.error || result.status !== 0) {
775
+ process.stderr.write(` ${YELLOW}!${RESET} Automatic ${label} repair failed; the checkout was left in place.\n`);
776
+ return false;
777
+ }
778
+ process.stdout.write(` ${GREEN}✓${RESET} ${label} support repaired\n\n`);
779
+ return true;
780
+ }
781
+
759
782
  // Minimal y/N line prompt for pre-launch decisions (the TUI select machinery
760
783
  // is torn down by the time launch() runs).
761
784
  function confirmLine(question) {
@@ -886,7 +909,9 @@ async function launch(inst, runtimeOverride) {
886
909
  }
887
910
  if (runtime === "codex") {
888
911
  if (!hasCodexCoreSupport(inst.path)) {
889
- die(codexSupportMessage(inst.path));
912
+ if (!repairPortableRuntime(inst.path, runtime) || !hasCodexCoreSupport(inst.path)) {
913
+ die(codexSupportMessage(inst.path));
914
+ }
890
915
  }
891
916
  const skillsInstalled = installCodexSkills(inst.path);
892
917
  const cardRendered = await renderCodexStartupCard(inst.path);
@@ -894,7 +919,10 @@ async function launch(inst, runtimeOverride) {
894
919
  die(codexSupportMessage(inst.path));
895
920
  }
896
921
  } else if (runtime === "pi") {
897
- if (!hasPiCoreSupport(inst.path)) die(piSupportMessage(inst.path));
922
+ if (!hasPiCoreSupport(inst.path) &&
923
+ (!repairPortableRuntime(inst.path, runtime) || !hasPiCoreSupport(inst.path))) {
924
+ die(piSupportMessage(inst.path));
925
+ }
898
926
  }
899
927
  let launchArgs = null;
900
928
  if (runtime === "prime") {
@@ -903,7 +931,10 @@ async function launch(inst, runtimeOverride) {
903
931
  // check + the trust-flag probe, which shells out to the binary), then a
904
932
  // single handoff line explains the remaining in-harness startup.
905
933
  const stopLoader = startSpinner("Starting Prime Agent");
906
- const coreOk = hasPrimeCoreSupport(inst.path);
934
+ let coreOk = hasPrimeCoreSupport(inst.path);
935
+ if (!coreOk && repairPortableRuntime(inst.path, runtime)) {
936
+ coreOk = hasPrimeCoreSupport(inst.path);
937
+ }
907
938
  launchArgs = coreOk ? runtimeLaunchArgs(runtime, inst.path) : null;
908
939
  stopLoader();
909
940
  if (!coreOk) die(primeSupportMessage(inst.path));
@@ -1532,9 +1563,31 @@ async function cmdConnect(args) {
1532
1563
  }
1533
1564
  const activation = state.connected_activation || {};
1534
1565
  if (cfg.mode === "connected" && activation.status === "connected") {
1566
+ if (activation.intent_id) {
1567
+ const repaired = await connectedApiRequest(
1568
+ githubToken,
1569
+ "POST",
1570
+ `/api/billing/connect/${encodeURIComponent(activation.intent_id)}/claim`,
1571
+ {},
1572
+ );
1573
+ if (repaired.status !== 200 || repaired.data?.status !== "connected") {
1574
+ die(
1575
+ `Connected is active, but its shared configuration could not be published: ${connectError(repaired, `HTTP ${repaired.status}`)}`,
1576
+ );
1577
+ }
1578
+ writeJsonFileAtomic(path.join(inst.path, "egregore.json"), {
1579
+ ...cfg,
1580
+ mode: "connected",
1581
+ api_url: repaired.data.api_url,
1582
+ });
1583
+ if (repaired.data.api_key) {
1584
+ writeEnvValueAtomic(path.join(inst.path, ".env"), "EGREGORE_API_KEY", repaired.data.api_key);
1585
+ }
1586
+ }
1535
1587
  normalizeClaudeDenyRules(inst.path);
1536
1588
  ensureClaudeModeStatusLine(inst.path);
1537
- console.log(`\n ${GREEN}✓${RESET} ${BOLD}${inst.slug}${RESET} is already connected.\n`);
1589
+ const detail = activation.intent_id ? "shared configuration published" : "already connected";
1590
+ console.log(`\n ${GREEN}✓${RESET} ${BOLD}${inst.slug}${RESET} is connected · ${detail}.\n`);
1538
1591
  return;
1539
1592
  }
1540
1593
 
@@ -2080,7 +2133,7 @@ function runSettings(inst, args) {
2080
2133
  return { status: 127, stdout: "", stderr: "bin/settings.sh not found — update this egregore (run /pull) to get settings.\n", missing: true };
2081
2134
  }
2082
2135
  try {
2083
- return spawnSync("bash", [script, ...args], { cwd: inst.path, stdio: "pipe", encoding: "utf-8", timeout: 15000 });
2136
+ return spawnSync("bash", [script, ...args], { cwd: inst.path, stdio: "pipe", encoding: "utf-8", timeout: 45000 });
2084
2137
  } catch (err) {
2085
2138
  return { status: 1, stdout: "", stderr: String(err) };
2086
2139
  }
@@ -2095,13 +2148,13 @@ function settingsDump(inst) {
2095
2148
  async function cmdSettings(args) {
2096
2149
  const registry = readRegistry();
2097
2150
  if (registry.length === 0) die("no egregores installed yet.\n run: npx -y create-egregore@latest");
2098
- const DOMAINS = new Set(["hosting", "repo", "admin", "people", "dump"]);
2151
+ const DOMAINS = new Set(["hosting", "workflow", "repo", "admin", "people", "dump"]);
2099
2152
  let rest = args.slice();
2100
2153
  let slug = "";
2101
2154
  if (rest.length && !DOMAINS.has(rest[0])) { slug = rest[0]; rest = rest.slice(1); }
2102
2155
  const inst = resolveInviteInstance(registry, slug);
2103
2156
  if (!inst) {
2104
- die(`multiple egregores installed; choose one:\n egregore settings <slug> [hosting|repo|admin]\n run: egregore ls`);
2157
+ die(`multiple egregores installed; choose one:\n egregore settings <slug> [hosting|workflow|repo|admin|people]\n run: egregore ls`);
2105
2158
  }
2106
2159
  // Interactive editing lives in the launcher (press `s`). With no verb, print
2107
2160
  // the snapshot; otherwise forward straight to the deterministic verb.
@@ -2399,6 +2452,14 @@ function renderSettingsPanel({ inst, data, cursor, view, domain, items, listCurs
2399
2452
  } else {
2400
2453
  const rows = [
2401
2454
  { name: "Hosted Artifacts", value: (d.hosting !== false) ? `${GREEN}ON${RESET}` : `${YELLOW}OFF${RESET}` },
2455
+ {
2456
+ name: "Git workflow",
2457
+ value: d.workflow === "simple"
2458
+ ? `${DIM}PRs → main${RESET}`
2459
+ : d.workflow === "staged"
2460
+ ? `${DIM}PRs → develop → main${RESET}`
2461
+ : `${DIM}PRs → ${d.base_branch || "custom"}${RESET}`,
2462
+ },
2402
2463
  { name: "Managed repos", value: `${DIM}${(d.repos || []).length}${RESET}` },
2403
2464
  { name: "Admins", value: `${DIM}${(d.admins || []).length}${RESET}` },
2404
2465
  { name: "People", value: `${DIM}${(d.people || []).length}${RESET}` },
@@ -2411,7 +2472,7 @@ function renderSettingsPanel({ inst, data, cursor, view, domain, items, listCurs
2411
2472
  });
2412
2473
  lines.push(emptyBoxLine(innerWidth, margin));
2413
2474
  if (notice) lines.push(boxLine(notice, innerWidth, margin));
2414
- lines.push(boxLine(`${DIM}↑↓ nav · ${RESET}${BOLD}enter${RESET}${DIM} ${cursor === 0 ? "toggle" : "open"} · ← back · q quit${RESET}`, innerWidth, margin));
2475
+ lines.push(boxLine(`${DIM}↑↓ nav · ${RESET}${BOLD}enter${RESET}${DIM} ${cursor < 2 ? "toggle" : "open"} · ← back · q quit${RESET}`, innerWidth, margin));
2415
2476
  }
2416
2477
 
2417
2478
  lines.push(emptyBoxLine(innerWidth, margin));
@@ -2869,15 +2930,19 @@ async function browser(args = {}) {
2869
2930
 
2870
2931
  // menu view
2871
2932
  if (key.name === "escape" || key.name === "left") { S.settingsInst = null; S.settingsNotice = ""; render(); return; }
2872
- if (key.name === "up" || key.name === "k") { S.settingsCursor = (S.settingsCursor - 1 + 4) % 4; render(); return; }
2873
- if (key.name === "down" || key.name === "j") { S.settingsCursor = (S.settingsCursor + 1) % 4; render(); return; }
2933
+ if (key.name === "up" || key.name === "k") { S.settingsCursor = (S.settingsCursor - 1 + 5) % 5; render(); return; }
2934
+ if (key.name === "down" || key.name === "j") { S.settingsCursor = (S.settingsCursor + 1) % 5; render(); return; }
2874
2935
  if (key.name === "return" || chunk === " ") {
2875
2936
  if (S.settingsCursor === 0) {
2876
2937
  const on = (S.settingsData && S.settingsData.hosting) !== false;
2877
2938
  settingsRunVerb(["hosting", on ? "off" : "on"]);
2878
2939
  render();
2940
+ } else if (S.settingsCursor === 1) {
2941
+ const simple = (S.settingsData && S.settingsData.workflow) === "simple";
2942
+ settingsRunVerb(["workflow", simple ? "staged" : "simple"]);
2943
+ render();
2879
2944
  } else {
2880
- const domain = S.settingsCursor === 1 ? "repo" : S.settingsCursor === 2 ? "admin" : "people";
2945
+ const domain = S.settingsCursor === 2 ? "repo" : S.settingsCursor === 3 ? "admin" : "people";
2881
2946
  S.settingsView = "list"; S.settingsDomain = domain;
2882
2947
  S.settingsItems = settingsItemsFor(S.settingsData, domain);
2883
2948
  S.settingsListCursor = 0; S.settingsMode = "browse"; S.settingsNotice = "";
@@ -3133,7 +3198,7 @@ async function browser(args = {}) {
3133
3198
  return;
3134
3199
  }
3135
3200
  state.settingsInst = pick;
3136
- state.settingsData = settingsDump(pick) || { hosting: true, repos: [], admins: [], people: [] };
3201
+ state.settingsData = settingsDump(pick) || { hosting: true, workflow: "staged", base_branch: "develop", repos: [], admins: [], people: [] };
3137
3202
  state.settingsCursor = 0;
3138
3203
  state.settingsView = "menu";
3139
3204
  state.settingsNotice = "";
package/lib/local.js CHANGED
@@ -31,7 +31,6 @@ const {
31
31
  configureGitCredentials,
32
32
  gitCloneEnv,
33
33
  initMemoryDirs,
34
- ensureDevelop,
35
34
  ensurePersonOnboardingWitness,
36
35
  ensureInstallerMemberRole,
37
36
  run,
@@ -1031,7 +1030,6 @@ async function localFounderFlow(ui, ctx = {}) {
1031
1030
 
1032
1031
  const githubOrg = st.githubOrg;
1033
1032
  const isOrg = st.isOrg;
1034
- const isNewProject = st.isNewProject;
1035
1033
  const orgName = st.orgName;
1036
1034
  const description = st.description;
1037
1035
  let newProjectRepo = st.newProjectRepo;
@@ -1156,13 +1154,14 @@ async function localFounderFlow(ui, ctx = {}) {
1156
1154
  const s3 = ui.spinner(`Creating ${newProjectRepo}...`);
1157
1155
  const projExists = await repoExists(githubToken, githubOrg, newProjectRepo);
1158
1156
  if (projExists) {
1159
- selectedRepos.push({ name: newProjectRepo });
1157
+ const branchInfo = await detectRepoBranches(githubToken, githubOrg, newProjectRepo).catch(() => null);
1158
+ selectedRepos.push({ name: newProjectRepo, base_branch: branchInfo?.defaultBranch || "main" });
1160
1159
  s3.stop(`${newProjectRepo} already exists — added to managed repos`);
1161
1160
  } else {
1162
1161
  try {
1163
1162
  await createRepo(githubToken, githubOrg, newProjectRepo, isOrg, description || "");
1164
1163
  if (await waitForRepo(githubToken, githubOrg, newProjectRepo)) {
1165
- selectedRepos.push({ name: newProjectRepo });
1164
+ selectedRepos.push({ name: newProjectRepo, base_branch: "main" });
1166
1165
  s3.stop(`Created ${newProjectRepo}`);
1167
1166
  } else {
1168
1167
  s3.fail(`${newProjectRepo} creation timed out`);
@@ -1181,6 +1180,7 @@ async function localFounderFlow(ui, ctx = {}) {
1181
1180
  memory_repo: `https://github.com/${githubOrg}/${memoryRepoName}.git`,
1182
1181
  slug: slug,
1183
1182
  repo_name: repoName,
1183
+ base_branch: "main",
1184
1184
  repos: selectedRepos,
1185
1185
  upstream_url: "https://github.com/egregore-labs/egregore.git",
1186
1186
  report_url: "https://xgksfrirtdumacvmfkzj.supabase.co",
@@ -1241,18 +1241,6 @@ async function localFounderFlow(ui, ctx = {}) {
1241
1241
  ui.step(1, totalSteps, "Cloning egregore...");
1242
1242
  cloneRepo(forkUrl, egregoreDir, githubToken, ui, "egregore");
1243
1243
  setGitIdentity(egregoreDir, user);
1244
- ensureDevelop(egregoreDir);
1245
- // ensureDevelop only creates develop on the REMOTE (git branch, no checkout),
1246
- // so the clone is still on main. The egregore operates on develop, so switch
1247
- // to it now — otherwise local overlays (the codex runtime) get committed to
1248
- // main and are orphaned when session-start later checks out develop.
1249
- try {
1250
- execFileSync("git", ["-C", egregoreDir, "checkout", "develop"], { stdio: "pipe" });
1251
- } catch {
1252
- try {
1253
- execFileSync("git", ["-C", egregoreDir, "checkout", "-b", "develop", "origin/develop"], { stdio: "pipe" });
1254
- } catch {}
1255
- }
1256
1244
 
1257
1245
  ui.step(2, totalSteps, "Cloning shared memory...");
1258
1246
  cloneRepo(memoryUrl, memoryDir, githubToken, ui, "memory");
@@ -1356,10 +1344,6 @@ async function localFounderFlow(ui, ctx = {}) {
1356
1344
  const repoUrl = `https://github.com/${githubOrg}/${mrName}.git`;
1357
1345
  cloneRepo(repoUrl, repoDir, githubToken, ui, mrName);
1358
1346
  setGitIdentity(repoDir, user);
1359
- // New repos get develop branch (our workflow). Existing repos keep their default.
1360
- if (isNewProject) {
1361
- ensureDevelop(repoDir);
1362
- }
1363
1347
  } catch {
1364
1348
  ui.warn(`Could not clone ${mrName} — you may not have access.`);
1365
1349
  }
package/lib/setup.js CHANGED
@@ -435,7 +435,6 @@ async function install(data, ui, targetDir, opts = {}) {
435
435
  }
436
436
  }
437
437
  try { run("git config credential.helper store", { cwd: egregoreDir }); } catch {}
438
- ensureDevelop(egregoreDir);
439
438
  ui.success("Cloned egregore");
440
439
 
441
440
  // Set repo-local git identity from GitHub user (not machine-global config)
@@ -587,7 +586,6 @@ async function install(data, ui, targetDir, opts = {}) {
587
586
  }
588
587
  }
589
588
  try { run("git config credential.helper store", { cwd: repoDir }); } catch {}
590
- ensureDevelop(repoDir);
591
589
  clonedRepos.push(repoName);
592
590
  ui.success(`Cloned ${repoName}`);
593
591
  } catch {
@@ -695,8 +693,9 @@ function ensureConnectedConfig(repoDir, data, ui) {
695
693
  }
696
694
 
697
695
  const required = ["org_name", "github_org", "memory_repo", "api_url", "slug"];
698
- const missing = required.filter((key) => !config[key]);
699
- if (missing.length) {
696
+ let missing = required.filter((key) => !config[key]);
697
+ const missingIdentity = missing.filter((key) => key !== "api_url");
698
+ if (missingIdentity.length) {
700
699
  throw new Error(
701
700
  `Connected setup is incomplete: egregore.json is missing ${missing.join(", ")}. Retry setup from egregore.xyz/setup.`
702
701
  );
@@ -712,8 +711,26 @@ function ensureConnectedConfig(repoDir, data, ui) {
712
711
  );
713
712
  }
714
713
 
714
+ let changed = false;
715
+ const tokenApiUrl = data.api_url ? String(data.api_url).replace(/\/$/, "") : "";
716
+ if (tokenApiUrl && config.api_url !== tokenApiUrl) {
717
+ config.api_url = tokenApiUrl;
718
+ changed = true;
719
+ if (ui && typeof ui.warn === "function") {
720
+ ui.warn("Reconciled Connected configuration from the authenticated setup token");
721
+ }
722
+ }
723
+ missing = required.filter((key) => !config[key]);
724
+ if (missing.length) {
725
+ throw new Error(
726
+ `Connected setup is incomplete: egregore.json is missing ${missing.join(", ")}. Retry setup from egregore.xyz/setup.`
727
+ );
728
+ }
715
729
  if (config.mode !== "connected") {
716
730
  config.mode = "connected";
731
+ changed = true;
732
+ }
733
+ if (changed) {
717
734
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
718
735
  }
719
736
  return config;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-egregore",
3
- "version": "0.20.0",
3
+ "version": "0.20.2",
4
4
  "description": "Set up Egregore for your team in one command \u2014 installs the egregore launcher and your choice of Claude Code, Codex, or Pi.",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -13,7 +13,7 @@
13
13
  "build:runtime": "node ../../bin/capability-distribution.mjs generate-skill-view --root ../.. && node scripts/build-runtime-bundle.mjs && node scripts/build-pi-runtime-bundle.mjs && node scripts/build-prime-runtime-bundle.mjs && node ../../api/scripts/build-connect-runtime-pack.mjs",
14
14
  "build:pi-runtime": "node scripts/build-pi-runtime-bundle.mjs",
15
15
  "build:prime-runtime": "node scripts/build-prime-runtime-bundle.mjs",
16
- "test": "node ../../bin/capability-distribution.mjs validate --root ../.. && node scripts/build-runtime-bundle.mjs --check && node scripts/build-pi-runtime-bundle.mjs --check && node scripts/build-prime-runtime-bundle.mjs --check && node ../../bin/prime-render-spec.mjs --check && node ../../bin/pi-render-spec.mjs --check && node ../../api/scripts/build-connect-runtime-pack.mjs --check && node --test test/capability-distribution.test.js test/connect-runtime.test.js test/context.test.js test/path-lookup.test.js test/nixos-portability.test.js test/parse-join-target.test.js test/skip-repos.test.js test/install-origin-guard.test.js test/onboarding-shortcircuit.test.js test/welcome-screen.test.js test/runtime-selection.test.js test/command-generation.test.js test/auth-gh.test.js test/gauntlet-fixes.test.js test/codex-runtime.test.js test/pi-runtime.test.js test/prime-runtime.test.js test/prime-branch-policy.test.js test/prime-bridge-skill.test.js test/prime-session-smoke.test.js test/pi-product-workflows.test.js test/installer-runtime-source.test.js test/scroll-repro.test.js test/launcher-refocus-redraw.test.js test/multiselect-remote-search.test.js test/back-navigation.test.js test/manifest-form.test.js test/launcher-delete.test.js test/launcher-connect.test.js test/installer-connect-choice.test.js test/launcher-connected-status.test.js test/launcher-permissions.test.js test/launcher-update.test.js test/connected-config.test.js",
16
+ "test": "node ../../bin/capability-distribution.mjs validate --root ../.. && node scripts/build-runtime-bundle.mjs --check && node scripts/build-pi-runtime-bundle.mjs --check && node scripts/build-prime-runtime-bundle.mjs --check && node ../../bin/prime-render-spec.mjs --check && node ../../bin/pi-render-spec.mjs --check && node ../../api/scripts/build-connect-runtime-pack.mjs --check && node --test test/capability-distribution.test.js test/connect-runtime.test.js test/context.test.js test/path-lookup.test.js test/nixos-portability.test.js test/parse-join-target.test.js test/skip-repos.test.js test/install-origin-guard.test.js test/onboarding-shortcircuit.test.js test/welcome-screen.test.js test/runtime-selection.test.js test/command-generation.test.js test/auth-gh.test.js test/gauntlet-fixes.test.js test/codex-runtime.test.js test/pi-runtime.test.js test/prime-runtime.test.js test/prime-branch-policy.test.js test/prime-bridge-skill.test.js test/prime-session-smoke.test.js test/pi-product-workflows.test.js test/installer-runtime-source.test.js test/scroll-repro.test.js test/launcher-refocus-redraw.test.js test/multiselect-remote-search.test.js test/back-navigation.test.js test/manifest-form.test.js test/launcher-delete.test.js test/launcher-connect.test.js test/installer-connect-choice.test.js test/launcher-connected-status.test.js test/launcher-permissions.test.js test/launcher-update.test.js test/connected-config.test.js test/workflow-settings.test.js",
17
17
  "test:e2e": "node --test test/e2e-local.test.js",
18
18
  "test:all": "node scripts/build-runtime-bundle.mjs --check && node scripts/build-pi-runtime-bundle.mjs --check && node --test test/"
19
19
  },
@@ -1,6 +1,9 @@
1
1
  [features]
2
2
  hooks = true
3
3
 
4
+ [mcp_servers.notion]
5
+ url = "https://mcp.notion.com/mcp"
6
+
4
7
  [tui]
5
8
  # Codex currently accepts built-in footer item IDs only. Egregore's dynamic
6
9
  # ◆ CONNECTED / ◇ LOCAL identity is rendered by bin/codex-session-start.sh.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: archive
3
- description: 'Fallback Codex adapter for the Egregore archive workflow.'
3
+ description: 'Capture an effective prompting technique or steering pattern as reusable knowledge. Use for /archive, or when a prompt worked especially well and is worth reusing — not insight about the work itself (/reflect).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: branch
3
- description: 'Fallback Codex adapter for the Egregore branch workflow.'
3
+ description: 'Create a working branch from what you are about to work on. Use for /branch, or any request to start a new branch before making changes.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: checkup
3
- description: 'Fallback Codex adapter for the Egregore checkup workflow.'
3
+ description: 'Run diagnostics on your Egregore environment and render a health report, auto-fixing what it can. Use for /checkup, a health check, or when something is broken and the root cause is unclear.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: commit
3
- description: 'Fallback Codex adapter for the Egregore commit workflow.'
3
+ description: 'Stage changes and create a commit with a properly formatted message. Use for /commit, or saving work locally — not sharing it (/push) or opening a pull request (/pr).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: contribute
3
- description: 'Fallback Codex adapter for the Egregore contribute workflow.'
3
+ description: 'Contribute an improvement back to the upstream Egregore framework as a cross-fork pull request. Use for /contribute, or submitting a framework fix upstream — not saving org work (/save) or filing a bug (/issue).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: delete-user
3
- description: 'Fallback Codex adapter for the Egregore delete-user workflow.'
3
+ description: 'Remove a member from this Egregore, revoking access across GitHub, Supabase, and Neo4j. Use for /delete-user, removing or kicking someone — not inviting (/invite) or viewing members (/dashboard).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ingest
3
- description: 'Fallback Codex adapter for the Egregore ingest workflow.'
3
+ description: 'Unified ingestion entry point — brings files, meetings, Google Workspace, Notion, or bulk corpora into intake, then promotes useful material into curated memory. Say ''ingest'', ''bring this into Egregore''.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: ingest-corpus
3
+ description: 'Turn a large folder of documents into a Connect-only knowledge base that answers questions with sources. Say ''build a knowledge base''. Not a few files (/ingest) or a meeting/Notion/Google source.'
4
+ ---
5
+
6
+ <!-- generated-by: bin/codex-sync-skills.sh -->
7
+
8
+ # Egregore ingest-corpus Adapter
9
+
10
+ This is fallback coverage for a long-tail Egregore workflow that has not been
11
+ ported to a hand-written Codex-native skill yet.
12
+
13
+ Use the project shell and filesystem directly. Do not invoke Claude Code
14
+ commands. Translate interactive choices to structured Codex question tooling
15
+ when it is available; otherwise render compact numbered choices with an
16
+ `Other:` option and wait for the user.
17
+
18
+ 1. Read `.claude/skills/ingest-corpus/SKILL.md` for the workflow details.
19
+ 2. Run the referenced `bin/` scripts directly from Codex.
20
+ 3. Treat graph and publish steps as best-effort unless that workflow explicitly
21
+ says they are required.
22
+ 4. For every external notification, follow
23
+ `.claude/context/notification-consent.md`: plan without sending, then show
24
+ a separate exact Send / Edit / Cancel checkpoint. Never infer notification
25
+ consent from the workflow request or a batch approval.
26
+ 5. Keep local-mode behavior filesystem-first and avoid graph or notification
27
+ calls when `egregore.json` declares `"mode": "local"`.
28
+ 6. Never call the deprecated `egregore-handoff` CLI for Egregore project
29
+ handoffs.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ingest-notion
3
- description: 'Fallback Codex adapter for the Egregore ingest-notion workflow.'
3
+ description: 'Bring selected Notion pages into shared Egregore memory via Notion''s official MCP. Routed from /ingest when the source is Notion — say ''/ingest notion''. Selected pages only, not a full-workspace sync.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ingest-user-interview
3
- description: 'Fallback Codex adapter for the Egregore ingest-user-interview workflow.'
3
+ description: 'Analyze user interview transcripts (Granola, pasted text, or a file) through a 3-analyst-agent plus Opus-synthesis pipeline. Say ''process the interview'', ''onboarding interview'', ''research call''.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: issue
3
- description: 'Fallback Codex adapter for the Egregore issue workflow.'
3
+ description: 'Report an issue — captures context and routes it to the right place. Say ''this is broken'', ''bug in'', ''file an issue'', ''report a problem''. Not a personal task (/todo) or team exploration (/quest).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: me
3
- description: 'Fallback Codex adapter for the Egregore me workflow.'
3
+ description: 'View or change your member identity — display name, email — shared across Claude Code, Codex, and Pi. Say ''who am I'', ''call me <name>'', ''change my name to X'', or run ''/me''.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: meeting
3
- description: 'Fallback Codex adapter for the Egregore meeting workflow.'
3
+ description: 'Use for /meeting, /meeting sync, /meeting backfill, or a search term — adaptively analyzes a Granola meeting into decisions, findings, actions, and continuity in shared memory.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: note
3
- description: 'Fallback Codex adapter for the Egregore note workflow.'
3
+ description: 'Use when the user says ''jot this down'', ''note to self'', ''just thinking out loud'', or ''park this thought'' — saves a private personal note, never shared or pushed until explicitly promoted.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: notion-connect
3
- description: 'Fallback Codex adapter for the Egregore notion-connect workflow.'
3
+ description: 'Use for ''connect notion'', ''notion status'', or ''disconnect notion'' — connects the current agent runtime directly to Notion''s official hosted MCP for search and fetch, or checks/revokes that connection.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: onboarding
3
- description: 'Fallback Codex adapter for the Egregore onboarding workflow.'
3
+ description: 'Use for /onboarding, or when a new member''s onboarding is not yet complete — runs the deterministic VERIFY, ORIENT, INVITE, FIRST_HANDOFF welcome flow.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pr
3
- description: 'Fallback Codex adapter for the Egregore pr workflow.'
3
+ description: 'Use for /pr, or ''create a PR'' / ''open a pull request'' — creates a pull request for the current branch against the repo''s base branch with a formatted title and body. Not for reviewing an existing PR (review-pr).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pull
3
- description: 'Fallback Codex adapter for the Egregore pull workflow.'
3
+ description: 'Use for /pull when you need to sync the current branch and shared memory without also viewing activity (/activity auto-syncs already).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: push
3
- description: 'Fallback Codex adapter for the Egregore push workflow.'
3
+ description: 'Use for /push, or ''push my branch'' — pushes the current branch to origin, setting upstream on first push, before opening a PR with /pr.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: reflect
3
- description: 'Fallback Codex adapter for the Egregore reflect workflow.'
3
+ description: 'Use when the user says ''we decided'', ''I realized'', or ''that''s a pattern'' — captures decisions, findings, or patterns in shared memory. Not a private half-baked thought (/note) or cross-referencing (/deep-reflect).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: review-pr
3
- description: 'Fallback Codex adapter for the Egregore review-pr workflow.'
3
+ description: 'Use when the user says ''review PR'', ''is this PR safe to merge'', or ''audit PR'' — runs a CTO-level 10-point review checklist on one or more pull requests. Not creating a PR (/pr) or validating local changes (/test).'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -81,7 +81,9 @@ Where should {name} live?
81
81
  twice.
82
82
  5. Synthesize:
83
83
  - a short topic from the work,
84
- - a clear commit message,
84
+ - a commit message per `.claude/context/commit-format.md` — subject
85
+ `type(scope): imperative summary`, type/scope derived from the work
86
+ itself (never `chore(save):` for real work),
85
87
  - a one-line user-facing scope summary,
86
88
  - a PR description following `.claude/context/pr-format.md`:
87
89
  `## What` (1–4 bullets), `## Why` (1–3 sentences), and
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: slack-connect
3
- description: 'Fallback Codex adapter for the Egregore slack-connect workflow.'
3
+ description: 'Set up Slack as a notification channel for your Egregore — creates the workspace app, invites the bot, and binds a channel. Use for /slack-connect, ''connect slack'', or ''set up slack notifications''.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: summon
3
- description: 'Fallback Codex adapter for the Egregore summon workflow.'
3
+ description: 'Design and launch a persistent agent (a spirit) that runs on a schedule or watches for conditions, via adaptive questioning that produces a reviewable spec before launch.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sync-repos
3
- description: 'Fallback Codex adapter for the Egregore sync-repos workflow.'
3
+ description: 'Smart sync of all Egregore repos (memory + managed repos + current repo) — fetches first, only pulls if behind. Use for /sync-repos or ''sync all repos''.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: teams-connect
3
- description: 'Fallback Codex adapter for the Egregore teams-connect workflow.'
3
+ description: 'Set up Microsoft Teams as a notification channel for your Egregore — registers an Azure bot, uploads the app, and binds a channel. Use for /teams-connect, ''connect teams'', or ''set up teams notifications''.'
4
4
  ---
5
5
 
6
6
  <!-- generated-by: bin/codex-sync-skills.sh -->