create-egregore 0.20.2 → 0.21.0-runtime-mvp.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 (706) hide show
  1. package/assets/egregore-launcher.js +1013 -16
  2. package/bin/cli.js +11 -0
  3. package/lib/claude-runtime.js +192 -0
  4. package/lib/local.js +38 -31
  5. package/lib/pi-runtime.js +1 -0
  6. package/lib/prime-runtime.js +1 -0
  7. package/lib/runtime-identity.js +146 -0
  8. package/lib/setup.js +116 -17
  9. package/package.json +10 -6
  10. package/runtime/claude/.claude/context/commit-format.md +110 -0
  11. package/runtime/claude/.claude/context/git-language.md +46 -0
  12. package/runtime/claude/.claude/context/notification-consent.md +66 -0
  13. package/runtime/claude/.claude/context/pr-format.md +67 -0
  14. package/runtime/claude/.claude/context/telemetry.md +133 -0
  15. package/runtime/claude/.claude/hooks/boundary-check.sh +333 -0
  16. package/runtime/claude/.claude/hooks/branch-guard.sh +231 -0
  17. package/runtime/claude/.claude/hooks/card-context.sh +38 -0
  18. package/runtime/claude/.claude/hooks/emissary-detect.sh +53 -0
  19. package/runtime/claude/.claude/hooks/memory-refresh.sh +67 -0
  20. package/runtime/claude/.claude/hooks/onboarding-guard.sh +86 -0
  21. package/runtime/claude/.claude/hooks/retrieval-context.sh +43 -0
  22. package/runtime/claude/.claude/rules/voice-bedrock.md +73 -0
  23. package/runtime/claude/.claude/settings.json +131 -0
  24. package/runtime/claude/.claude/skills/activity/SKILL.md +68 -0
  25. package/runtime/claude/.claude/skills/announce/SKILL.md +54 -0
  26. package/runtime/claude/.claude/skills/archive/SKILL.md +71 -0
  27. package/runtime/claude/.claude/skills/branch/SKILL.md +147 -0
  28. package/runtime/claude/.claude/skills/checkup/SKILL.md +159 -0
  29. package/runtime/claude/.claude/skills/commit/SKILL.md +103 -0
  30. package/runtime/claude/.claude/skills/contribute/SKILL.md +343 -0
  31. package/runtime/claude/.claude/skills/create-skill/SKILL.md +135 -0
  32. package/runtime/claude/.claude/skills/dark-mode/SKILL.md +410 -0
  33. package/runtime/claude/.claude/skills/dashboard/SKILL.md +43 -0
  34. package/runtime/claude/.claude/skills/deep-reflect/REPORT.md +140 -0
  35. package/runtime/claude/.claude/skills/deep-reflect/RESEARCH.md +132 -0
  36. package/runtime/claude/.claude/skills/deep-reflect/ROLES.md +104 -0
  37. package/runtime/claude/.claude/skills/deep-reflect/SKILL.md +170 -0
  38. package/runtime/claude/.claude/skills/delete-user/SKILL.md +150 -0
  39. package/runtime/claude/.claude/skills/emissary/SKILL.md +220 -0
  40. package/runtime/claude/.claude/skills/handoff/SKILL.md +124 -0
  41. package/runtime/claude/.claude/skills/harvest/AUDIT.md +546 -0
  42. package/runtime/claude/.claude/skills/harvest/FORMAT.md +436 -0
  43. package/runtime/claude/.claude/skills/harvest/PROCESS.md +395 -0
  44. package/runtime/claude/.claude/skills/harvest/QUESTION_PALETTE.md +76 -0
  45. package/runtime/claude/.claude/skills/harvest/SKILL.md +100 -0
  46. package/runtime/claude/.claude/skills/ingest/SKILL.md +112 -0
  47. package/runtime/claude/.claude/skills/ingest-corpus/SKILL.md +187 -0
  48. package/runtime/claude/.claude/skills/ingest-notion/SKILL.md +214 -0
  49. package/runtime/claude/.claude/skills/ingest-user-interview/SKILL.md +65 -0
  50. package/runtime/claude/.claude/skills/ingest-user-interview/references/analysis-contract.md +125 -0
  51. package/runtime/claude/.claude/skills/invite/SKILL.md +111 -0
  52. package/runtime/claude/.claude/skills/issue/SKILL.md +104 -0
  53. package/runtime/claude/.claude/skills/me/SKILL.md +81 -0
  54. package/runtime/claude/.claude/skills/meeting/SKILL.md +76 -0
  55. package/runtime/claude/.claude/skills/meeting/references/analysis-contract.md +102 -0
  56. package/runtime/claude/.claude/skills/note/SKILL.md +71 -0
  57. package/runtime/claude/.claude/skills/notion-connect/SKILL.md +124 -0
  58. package/runtime/claude/.claude/skills/onboarding/SKILL.md +159 -0
  59. package/runtime/claude/.claude/skills/pr/SKILL.md +85 -0
  60. package/runtime/claude/.claude/skills/pull/SKILL.md +79 -0
  61. package/runtime/claude/.claude/skills/push/SKILL.md +47 -0
  62. package/runtime/claude/.claude/skills/quest/SKILL.md +121 -0
  63. package/runtime/claude/.claude/skills/reflect/SKILL.md +69 -0
  64. package/runtime/claude/.claude/skills/review-pr/SKILL.md +276 -0
  65. package/runtime/claude/.claude/skills/save/SKILL.md +92 -0
  66. package/runtime/claude/.claude/skills/slack-connect/SKILL.md +148 -0
  67. package/runtime/claude/.claude/skills/summon/SKILL.md +240 -0
  68. package/runtime/claude/.claude/skills/sync-repos/SKILL.md +82 -0
  69. package/runtime/claude/.claude/skills/teams-connect/SKILL.md +216 -0
  70. package/runtime/claude/.claude/skills/telegram-connect/SKILL.md +110 -0
  71. package/runtime/claude/.claude/skills/telemetry/SKILL.md +117 -0
  72. package/runtime/claude/.claude/skills/test/SKILL.md +87 -0
  73. package/runtime/claude/.claude/skills/the-spiral/SKILL.md +492 -0
  74. package/runtime/claude/.claude/skills/tui-design/SKILL.md +188 -0
  75. package/runtime/claude/.claude/skills/tutorial/SKILL.md +100 -0
  76. package/runtime/claude/.claude/skills/update/SKILL.md +265 -0
  77. package/runtime/claude/.claude/skills/view/SKILL.md +393 -0
  78. package/runtime/claude/.claude/skills/view/compose-scaffold.html +221 -0
  79. package/runtime/claude/.claude/skills/visual-explain/SKILL.md +132 -0
  80. package/runtime/claude/.claude/skills/wrap/SKILL.md +98 -0
  81. package/runtime/claude/CLAUDE.md +447 -0
  82. package/runtime/claude/bin/activity-action.sh +92 -0
  83. package/runtime/claude/bin/activity-data.sh +17 -0
  84. package/runtime/claude/bin/agent.sh +783 -0
  85. package/runtime/claude/bin/artifact-register.sh +164 -0
  86. package/runtime/claude/bin/artifact-writeback.sh +53 -0
  87. package/runtime/claude/bin/artifacts.sh +288 -0
  88. package/runtime/claude/bin/attendant.sh +707 -0
  89. package/runtime/claude/bin/autosave.sh +112 -0
  90. package/runtime/claude/bin/boundary.sh +253 -0
  91. package/runtime/claude/bin/build-sealed-dataroom.mjs +722 -0
  92. package/runtime/claude/bin/capture-reconcile.sh +69 -0
  93. package/runtime/claude/bin/capture-run.sh +357 -0
  94. package/runtime/claude/bin/codex-install-skills.sh +78 -0
  95. package/runtime/claude/bin/codex-render-spec.mjs +462 -0
  96. package/runtime/claude/bin/codex-session-start.sh +275 -0
  97. package/runtime/claude/bin/codex-skill-render.mjs +349 -0
  98. package/runtime/claude/bin/codex-sync-skills.sh +237 -0
  99. package/runtime/claude/bin/connect-refresh.sh +33 -0
  100. package/runtime/claude/bin/contribute-guard.sh +79 -0
  101. package/runtime/claude/bin/corpus_map.py +806 -0
  102. package/runtime/claude/bin/corpus_survey.py +304 -0
  103. package/runtime/claude/bin/dashboard-data.sh +18 -0
  104. package/runtime/claude/bin/github-auth.sh +121 -0
  105. package/runtime/claude/bin/graph-batch.sh +86 -0
  106. package/runtime/claude/bin/graph-op.sh +1106 -0
  107. package/runtime/claude/bin/graph-projection.sh +54 -0
  108. package/runtime/claude/bin/graph-wal.sh +242 -0
  109. package/runtime/claude/bin/graph.sh +267 -0
  110. package/runtime/claude/bin/handoff-lifecycle-job.sh +146 -0
  111. package/runtime/claude/bin/handoff-lifecycle.sh +280 -0
  112. package/runtime/claude/bin/handoff-pr-backfill.sh +86 -0
  113. package/runtime/claude/bin/handoff-preview.sh +169 -0
  114. package/runtime/claude/bin/handoff-run.sh +692 -0
  115. package/runtime/claude/bin/handoff-save-egregore.sh +224 -0
  116. package/runtime/claude/bin/index-handoff.sh +322 -0
  117. package/runtime/claude/bin/ingest-graph.sh +86 -0
  118. package/runtime/claude/bin/ingest-item.sh +10 -0
  119. package/runtime/claude/bin/ingest-surface.html +495 -0
  120. package/runtime/claude/bin/ingest.py +1011 -0
  121. package/runtime/claude/bin/ingest.sh +308 -0
  122. package/runtime/claude/bin/ingest_graph.py +856 -0
  123. package/runtime/claude/bin/ingest_surface.py +544 -0
  124. package/runtime/claude/bin/invite.sh +6 -0
  125. package/runtime/claude/bin/issue.sh +10 -0
  126. package/runtime/claude/bin/knowledge.sh +10 -0
  127. package/runtime/claude/bin/lib/artifact-id.sh +46 -0
  128. package/runtime/claude/bin/lib/config.sh +136 -0
  129. package/runtime/claude/bin/lib/context.sh +642 -0
  130. package/runtime/claude/bin/lib/dashboard-artifact.sh +242 -0
  131. package/runtime/claude/bin/lib/ensure-develop.sh +183 -0
  132. package/runtime/claude/bin/lib/git-message.sh +37 -0
  133. package/runtime/claude/bin/lib/git-sync.sh +494 -0
  134. package/runtime/claude/bin/lib/greeting.sh +548 -0
  135. package/runtime/claude/bin/lib/handoff-meta.sh +97 -0
  136. package/runtime/claude/bin/lib/hash.sh +13 -0
  137. package/runtime/claude/bin/lib/identity.sh +213 -0
  138. package/runtime/claude/bin/lib/metrics.sh +374 -0
  139. package/runtime/claude/bin/lib/noncode.sh +31 -0
  140. package/runtime/claude/bin/lib/permissions.sh +106 -0
  141. package/runtime/claude/bin/lib/time.sh +56 -0
  142. package/runtime/claude/bin/lib/worktree-links.sh +85 -0
  143. package/runtime/claude/bin/node-run.sh +42 -0
  144. package/runtime/claude/bin/notification.sh +6 -0
  145. package/runtime/claude/bin/notify.sh +636 -0
  146. package/runtime/claude/bin/observe-context.sh +14 -0
  147. package/runtime/claude/bin/onboarding.sh +6 -0
  148. package/runtime/claude/bin/person.py +634 -0
  149. package/runtime/claude/bin/person.sh +481 -0
  150. package/runtime/claude/bin/pi-render-spec.mjs +140 -0
  151. package/runtime/claude/bin/post-update.sh +37 -0
  152. package/runtime/claude/bin/prime-render-spec.mjs +147 -0
  153. package/runtime/claude/bin/publish-artifact.sh +324 -0
  154. package/runtime/claude/bin/publish-references.sh +144 -0
  155. package/runtime/claude/bin/quest.sh +9 -0
  156. package/runtime/claude/bin/question.sh +8 -0
  157. package/runtime/claude/bin/repo-state.sh +96 -0
  158. package/runtime/claude/bin/research-ingest.sh +7 -0
  159. package/runtime/claude/bin/restore-owned-skills.sh +67 -0
  160. package/runtime/claude/bin/retrieval_eval.py +385 -0
  161. package/runtime/claude/bin/runtime-identity.sh +70 -0
  162. package/runtime/claude/bin/runtime-upgrade.sh +43 -0
  163. package/runtime/claude/bin/scroll.sh +9 -0
  164. package/runtime/claude/bin/search.sh +318 -0
  165. package/runtime/claude/bin/session-autosave.sh +220 -0
  166. package/runtime/claude/bin/session-log.sh +199 -0
  167. package/runtime/claude/bin/session-start.sh +696 -0
  168. package/runtime/claude/bin/settings.sh +532 -0
  169. package/runtime/claude/bin/startup-check.sh +136 -0
  170. package/runtime/claude/bin/statusline.sh +41 -0
  171. package/runtime/claude/bin/telemetry.sh +666 -0
  172. package/runtime/claude/bin/test-changes.sh +344 -0
  173. package/runtime/claude/bin/thread.sh +9 -0
  174. package/runtime/claude/bin/todo.sh +9 -0
  175. package/runtime/claude/bin/view-render.sh +126 -0
  176. package/runtime/claude/bin/worktree-create.sh +145 -0
  177. package/runtime/claude/bin/worktree-remove.sh +50 -0
  178. package/runtime/claude/bin/worktree.sh +198 -0
  179. package/runtime/claude/egregore_runtime/__init__.py +228 -0
  180. package/runtime/claude/egregore_runtime/adapters/__init__.py +5 -0
  181. package/runtime/claude/egregore_runtime/adapters/invitation.py +237 -0
  182. package/runtime/claude/egregore_runtime/adapters/notification.py +59 -0
  183. package/runtime/claude/egregore_runtime/adapters/qmd.py +1701 -0
  184. package/runtime/claude/egregore_runtime/adapters/qmd_cli.py +210 -0
  185. package/runtime/claude/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
  186. package/runtime/claude/egregore_runtime/admin_gate.py +102 -0
  187. package/runtime/claude/egregore_runtime/artifacts.py +523 -0
  188. package/runtime/claude/egregore_runtime/contracts.py +499 -0
  189. package/runtime/claude/egregore_runtime/entitlements.py +85 -0
  190. package/runtime/claude/egregore_runtime/errors.py +10 -0
  191. package/runtime/claude/egregore_runtime/graph.py +356 -0
  192. package/runtime/claude/egregore_runtime/handoff_lookup.py +196 -0
  193. package/runtime/claude/egregore_runtime/harness_cli.py +1221 -0
  194. package/runtime/claude/egregore_runtime/identity.py +734 -0
  195. package/runtime/claude/egregore_runtime/identity_cli.py +91 -0
  196. package/runtime/claude/egregore_runtime/ingest.py +575 -0
  197. package/runtime/claude/egregore_runtime/ingest_cli.py +254 -0
  198. package/runtime/claude/egregore_runtime/ingest_index_cli.py +147 -0
  199. package/runtime/claude/egregore_runtime/invitation_cli.py +51 -0
  200. package/runtime/claude/egregore_runtime/invitations.py +116 -0
  201. package/runtime/claude/egregore_runtime/issue_cli.py +305 -0
  202. package/runtime/claude/egregore_runtime/issues.py +359 -0
  203. package/runtime/claude/egregore_runtime/knowledge.py +376 -0
  204. package/runtime/claude/egregore_runtime/knowledge_cli.py +173 -0
  205. package/runtime/claude/egregore_runtime/lifecycle.py +888 -0
  206. package/runtime/claude/egregore_runtime/lifecycle_cli.py +269 -0
  207. package/runtime/claude/egregore_runtime/notification_cli.py +125 -0
  208. package/runtime/claude/egregore_runtime/notifications.py +230 -0
  209. package/runtime/claude/egregore_runtime/observe.py +342 -0
  210. package/runtime/claude/egregore_runtime/onboarding.py +290 -0
  211. package/runtime/claude/egregore_runtime/onboarding_cli.py +110 -0
  212. package/runtime/claude/egregore_runtime/policy.py +144 -0
  213. package/runtime/claude/egregore_runtime/profile.py +193 -0
  214. package/runtime/claude/egregore_runtime/quest_cli.py +216 -0
  215. package/runtime/claude/egregore_runtime/question_cli.py +180 -0
  216. package/runtime/claude/egregore_runtime/questions.py +304 -0
  217. package/runtime/claude/egregore_runtime/quests.py +419 -0
  218. package/runtime/claude/egregore_runtime/readiness.py +379 -0
  219. package/runtime/claude/egregore_runtime/research_ingest.py +256 -0
  220. package/runtime/claude/egregore_runtime/research_ingest_cli.py +44 -0
  221. package/runtime/claude/egregore_runtime/runtime.py +464 -0
  222. package/runtime/claude/egregore_runtime/scroll_cli.py +185 -0
  223. package/runtime/claude/egregore_runtime/scrolls.py +726 -0
  224. package/runtime/claude/egregore_runtime/status.py +412 -0
  225. package/runtime/claude/egregore_runtime/status_cli.py +174 -0
  226. package/runtime/claude/egregore_runtime/sync.py +218 -0
  227. package/runtime/claude/egregore_runtime/teamsync.py +139 -0
  228. package/runtime/claude/egregore_runtime/telemetry.py +640 -0
  229. package/runtime/claude/egregore_runtime/thread_cli.py +173 -0
  230. package/runtime/claude/egregore_runtime/threads.py +517 -0
  231. package/runtime/claude/egregore_runtime/todo_cli.py +142 -0
  232. package/runtime/claude/egregore_runtime/todos.py +244 -0
  233. package/runtime/claude/egregore_runtime/upgrade.py +770 -0
  234. package/runtime/claude/egregore_runtime/upgrade_worker.py +53 -0
  235. package/runtime/claude/egregore_runtime/writeback.py +391 -0
  236. package/runtime/claude/egregore_runtime/writeback_cli.py +114 -0
  237. package/runtime/claude/manifest.json +284 -0
  238. package/runtime/codex/.codex/hooks/search-hint.js +21 -52
  239. package/runtime/codex/.codex/hooks.json +3 -3
  240. package/runtime/codex/.codex/skills/activity/SKILL.md +23 -66
  241. package/runtime/codex/.codex/skills/announce/SKILL.md +27 -50
  242. package/runtime/codex/.codex/skills/archive/SKILL.md +21 -36
  243. package/runtime/codex/.codex/skills/checkup/SKILL.md +77 -36
  244. package/runtime/codex/.codex/skills/dark-mode/SKILL.md +1 -1
  245. package/runtime/codex/.codex/skills/dashboard/SKILL.md +17 -47
  246. package/runtime/codex/.codex/skills/handoff/SKILL.md +84 -133
  247. package/runtime/codex/.codex/skills/harvest/SKILL.md +32 -117
  248. package/runtime/codex/.codex/skills/ingest/SKILL.md +47 -25
  249. package/runtime/codex/.codex/skills/ingest-user-interview/SKILL.md +18 -36
  250. package/runtime/codex/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
  251. package/runtime/codex/.codex/skills/invite/SKILL.md +21 -35
  252. package/runtime/codex/.codex/skills/issue/SKILL.md +60 -41
  253. package/runtime/codex/.codex/skills/me/SKILL.md +1 -1
  254. package/runtime/codex/.codex/skills/meeting/SKILL.md +16 -36
  255. package/runtime/codex/.codex/skills/meeting/references/analysis-contract.md +48 -0
  256. package/runtime/codex/.codex/skills/note/SKILL.md +30 -25
  257. package/runtime/codex/.codex/skills/onboarding/SKILL.md +36 -41
  258. package/runtime/codex/.codex/skills/pull/SKILL.md +1 -1
  259. package/runtime/codex/.codex/skills/quest/SKILL.md +27 -66
  260. package/runtime/codex/.codex/skills/reflect/SKILL.md +22 -36
  261. package/runtime/codex/.codex/skills/save/SKILL.md +2 -2
  262. package/runtime/codex/.codex/skills/telemetry/SKILL.md +1 -1
  263. package/runtime/codex/.codex/skills/test/SKILL.md +1 -1
  264. package/runtime/codex/.codex/skills/tutorial/SKILL.md +40 -41
  265. package/runtime/codex/.codex/skills/view/SKILL.md +115 -111
  266. package/runtime/codex/.codex/skills/wrap/SKILL.md +45 -41
  267. package/runtime/codex/.codex/spec-manifest.json +9 -9
  268. package/runtime/codex/AGENTS.md +62 -58
  269. package/runtime/codex/bin/activity-action.sh +92 -0
  270. package/runtime/codex/bin/activity-data.sh +12 -233
  271. package/runtime/codex/bin/agent.sh +84 -100
  272. package/runtime/codex/bin/artifact-register.sh +164 -0
  273. package/runtime/codex/bin/artifact-writeback.sh +53 -0
  274. package/runtime/codex/bin/artifacts.sh +288 -0
  275. package/runtime/codex/bin/build-sealed-dataroom.mjs +722 -0
  276. package/runtime/codex/bin/capture-run.sh +18 -2
  277. package/runtime/codex/bin/codex-render-spec.mjs +41 -16
  278. package/runtime/codex/bin/codex-session-start.sh +14 -4
  279. package/runtime/codex/bin/codex-skill-render.mjs +9 -7
  280. package/runtime/codex/bin/corpus_map.py +806 -0
  281. package/runtime/codex/bin/corpus_survey.py +304 -0
  282. package/runtime/codex/bin/dashboard-data.sh +11 -171
  283. package/runtime/codex/bin/github-auth.sh +121 -0
  284. package/runtime/codex/bin/graph-batch.sh +7 -0
  285. package/runtime/codex/bin/graph-op.sh +4 -0
  286. package/runtime/codex/bin/graph-projection.sh +54 -0
  287. package/runtime/codex/bin/graph-wal.sh +13 -0
  288. package/runtime/codex/bin/graph.sh +44 -0
  289. package/runtime/codex/bin/handoff-lifecycle-job.sh +146 -0
  290. package/runtime/codex/bin/handoff-lifecycle.sh +280 -0
  291. package/runtime/codex/bin/handoff-preview.sh +169 -0
  292. package/runtime/codex/bin/handoff-run.sh +42 -26
  293. package/runtime/codex/bin/ingest-graph.sh +6 -0
  294. package/runtime/codex/bin/ingest-item.sh +10 -0
  295. package/runtime/codex/bin/ingest.sh +59 -30
  296. package/runtime/codex/bin/invite.sh +6 -0
  297. package/runtime/codex/bin/issue.sh +10 -0
  298. package/runtime/codex/bin/knowledge.sh +10 -0
  299. package/runtime/codex/bin/lib/config.sh +20 -0
  300. package/runtime/codex/bin/lib/context.sh +46 -25
  301. package/runtime/codex/bin/lib/git-sync.sh +70 -6
  302. package/runtime/codex/bin/lib/greeting.sh +34 -5
  303. package/runtime/codex/bin/lib/handoff-meta.sh +97 -0
  304. package/runtime/codex/bin/lib/worktree-links.sh +6 -0
  305. package/runtime/codex/bin/node-run.sh +42 -0
  306. package/runtime/codex/bin/notification.sh +6 -0
  307. package/runtime/codex/bin/observe-context.sh +14 -0
  308. package/runtime/codex/bin/onboarding.sh +6 -0
  309. package/runtime/codex/bin/person.py +4 -0
  310. package/runtime/codex/bin/person.sh +43 -10
  311. package/runtime/codex/bin/pi-render-spec.mjs +140 -0
  312. package/runtime/codex/bin/post-update.sh +37 -0
  313. package/runtime/codex/bin/prime-render-spec.mjs +147 -0
  314. package/runtime/codex/bin/publish-artifact.sh +55 -2
  315. package/runtime/codex/bin/quest.sh +9 -0
  316. package/runtime/codex/bin/question.sh +8 -0
  317. package/runtime/codex/bin/research-ingest.sh +7 -0
  318. package/runtime/codex/bin/restore-owned-skills.sh +67 -0
  319. package/runtime/codex/bin/retrieval_eval.py +385 -0
  320. package/runtime/codex/bin/runtime-identity.sh +70 -0
  321. package/runtime/codex/bin/runtime-upgrade.sh +43 -0
  322. package/runtime/codex/bin/scroll.sh +9 -0
  323. package/runtime/codex/bin/search.sh +231 -195
  324. package/runtime/codex/bin/settings.sh +174 -5
  325. package/runtime/codex/bin/startup-check.sh +136 -0
  326. package/runtime/codex/bin/telemetry.sh +522 -247
  327. package/runtime/codex/bin/test-changes.sh +344 -0
  328. package/runtime/codex/bin/thread.sh +9 -0
  329. package/runtime/codex/bin/todo.sh +9 -0
  330. package/runtime/codex/bin/view-render.sh +126 -0
  331. package/runtime/codex/bin/worktree-create.sh +19 -5
  332. package/runtime/codex/egregore_runtime/__init__.py +228 -0
  333. package/runtime/codex/egregore_runtime/adapters/__init__.py +5 -0
  334. package/runtime/codex/egregore_runtime/adapters/invitation.py +237 -0
  335. package/runtime/codex/egregore_runtime/adapters/notification.py +59 -0
  336. package/runtime/codex/egregore_runtime/adapters/qmd.py +1701 -0
  337. package/runtime/codex/egregore_runtime/adapters/qmd_cli.py +210 -0
  338. package/runtime/codex/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
  339. package/runtime/codex/egregore_runtime/admin_gate.py +102 -0
  340. package/runtime/codex/egregore_runtime/artifacts.py +523 -0
  341. package/runtime/codex/egregore_runtime/contracts.py +499 -0
  342. package/runtime/codex/egregore_runtime/entitlements.py +85 -0
  343. package/runtime/codex/egregore_runtime/errors.py +10 -0
  344. package/runtime/codex/egregore_runtime/graph.py +356 -0
  345. package/runtime/codex/egregore_runtime/handoff_lookup.py +196 -0
  346. package/runtime/codex/egregore_runtime/harness_cli.py +1221 -0
  347. package/runtime/codex/egregore_runtime/identity.py +734 -0
  348. package/runtime/codex/egregore_runtime/identity_cli.py +91 -0
  349. package/runtime/codex/egregore_runtime/ingest.py +575 -0
  350. package/runtime/codex/egregore_runtime/ingest_cli.py +254 -0
  351. package/runtime/codex/egregore_runtime/ingest_index_cli.py +147 -0
  352. package/runtime/codex/egregore_runtime/invitation_cli.py +51 -0
  353. package/runtime/codex/egregore_runtime/invitations.py +116 -0
  354. package/runtime/codex/egregore_runtime/issue_cli.py +305 -0
  355. package/runtime/codex/egregore_runtime/issues.py +359 -0
  356. package/runtime/codex/egregore_runtime/knowledge.py +376 -0
  357. package/runtime/codex/egregore_runtime/knowledge_cli.py +173 -0
  358. package/runtime/codex/egregore_runtime/lifecycle.py +888 -0
  359. package/runtime/codex/egregore_runtime/lifecycle_cli.py +269 -0
  360. package/runtime/codex/egregore_runtime/notification_cli.py +125 -0
  361. package/runtime/codex/egregore_runtime/notifications.py +230 -0
  362. package/runtime/codex/egregore_runtime/observe.py +342 -0
  363. package/runtime/codex/egregore_runtime/onboarding.py +290 -0
  364. package/runtime/codex/egregore_runtime/onboarding_cli.py +110 -0
  365. package/runtime/codex/egregore_runtime/policy.py +144 -0
  366. package/runtime/codex/egregore_runtime/profile.py +193 -0
  367. package/runtime/codex/egregore_runtime/quest_cli.py +216 -0
  368. package/runtime/codex/egregore_runtime/question_cli.py +180 -0
  369. package/runtime/codex/egregore_runtime/questions.py +304 -0
  370. package/runtime/codex/egregore_runtime/quests.py +419 -0
  371. package/runtime/codex/egregore_runtime/readiness.py +379 -0
  372. package/runtime/codex/egregore_runtime/research_ingest.py +256 -0
  373. package/runtime/codex/egregore_runtime/research_ingest_cli.py +44 -0
  374. package/runtime/codex/egregore_runtime/runtime.py +464 -0
  375. package/runtime/codex/egregore_runtime/scroll_cli.py +185 -0
  376. package/runtime/codex/egregore_runtime/scrolls.py +726 -0
  377. package/runtime/codex/egregore_runtime/status.py +412 -0
  378. package/runtime/codex/egregore_runtime/status_cli.py +174 -0
  379. package/runtime/codex/egregore_runtime/sync.py +218 -0
  380. package/runtime/codex/egregore_runtime/teamsync.py +139 -0
  381. package/runtime/codex/egregore_runtime/telemetry.py +640 -0
  382. package/runtime/codex/egregore_runtime/thread_cli.py +173 -0
  383. package/runtime/codex/egregore_runtime/threads.py +517 -0
  384. package/runtime/codex/egregore_runtime/todo_cli.py +142 -0
  385. package/runtime/codex/egregore_runtime/todos.py +244 -0
  386. package/runtime/codex/egregore_runtime/upgrade.py +770 -0
  387. package/runtime/codex/egregore_runtime/upgrade_worker.py +53 -0
  388. package/runtime/codex/egregore_runtime/writeback.py +391 -0
  389. package/runtime/codex/egregore_runtime/writeback_cli.py +114 -0
  390. package/runtime/codex/manifest.json +98 -1
  391. package/runtime/pi/.codex/hooks/search-hint.js +21 -52
  392. package/runtime/pi/.codex/hooks.json +3 -3
  393. package/runtime/pi/.codex/skills/activity/SKILL.md +23 -66
  394. package/runtime/pi/.codex/skills/announce/SKILL.md +27 -50
  395. package/runtime/pi/.codex/skills/archive/SKILL.md +21 -36
  396. package/runtime/pi/.codex/skills/checkup/SKILL.md +77 -36
  397. package/runtime/pi/.codex/skills/dark-mode/SKILL.md +1 -1
  398. package/runtime/pi/.codex/skills/dashboard/SKILL.md +17 -47
  399. package/runtime/pi/.codex/skills/handoff/SKILL.md +84 -133
  400. package/runtime/pi/.codex/skills/harvest/SKILL.md +32 -117
  401. package/runtime/pi/.codex/skills/ingest/SKILL.md +47 -25
  402. package/runtime/pi/.codex/skills/ingest-user-interview/SKILL.md +18 -36
  403. package/runtime/pi/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
  404. package/runtime/pi/.codex/skills/invite/SKILL.md +21 -35
  405. package/runtime/pi/.codex/skills/issue/SKILL.md +60 -41
  406. package/runtime/pi/.codex/skills/me/SKILL.md +1 -1
  407. package/runtime/pi/.codex/skills/meeting/SKILL.md +16 -36
  408. package/runtime/pi/.codex/skills/meeting/references/analysis-contract.md +48 -0
  409. package/runtime/pi/.codex/skills/note/SKILL.md +30 -25
  410. package/runtime/pi/.codex/skills/onboarding/SKILL.md +36 -41
  411. package/runtime/pi/.codex/skills/pull/SKILL.md +1 -1
  412. package/runtime/pi/.codex/skills/quest/SKILL.md +27 -66
  413. package/runtime/pi/.codex/skills/reflect/SKILL.md +22 -36
  414. package/runtime/pi/.codex/skills/save/SKILL.md +2 -2
  415. package/runtime/pi/.codex/skills/telemetry/SKILL.md +1 -1
  416. package/runtime/pi/.codex/skills/test/SKILL.md +1 -1
  417. package/runtime/pi/.codex/skills/tutorial/SKILL.md +40 -41
  418. package/runtime/pi/.codex/skills/view/SKILL.md +115 -111
  419. package/runtime/pi/.codex/skills/wrap/SKILL.md +45 -41
  420. package/runtime/pi/.codex/spec-manifest.json +9 -9
  421. package/runtime/pi/.pi/APPEND_SYSTEM.md +57 -48
  422. package/runtime/pi/.pi/extensions/egregore.ts +7 -0
  423. package/runtime/pi/.pi/spec-manifest.json +2 -2
  424. package/runtime/pi/AGENTS.md +62 -58
  425. package/runtime/pi/bin/activity-action.sh +92 -0
  426. package/runtime/pi/bin/activity-data.sh +12 -233
  427. package/runtime/pi/bin/agent.sh +84 -100
  428. package/runtime/pi/bin/artifact-register.sh +164 -0
  429. package/runtime/pi/bin/artifact-writeback.sh +53 -0
  430. package/runtime/pi/bin/artifacts.sh +288 -0
  431. package/runtime/pi/bin/build-sealed-dataroom.mjs +722 -0
  432. package/runtime/pi/bin/capture-run.sh +18 -2
  433. package/runtime/pi/bin/codex-render-spec.mjs +41 -16
  434. package/runtime/pi/bin/codex-session-start.sh +14 -4
  435. package/runtime/pi/bin/codex-skill-render.mjs +9 -7
  436. package/runtime/pi/bin/corpus_map.py +806 -0
  437. package/runtime/pi/bin/corpus_survey.py +304 -0
  438. package/runtime/pi/bin/dashboard-data.sh +11 -171
  439. package/runtime/pi/bin/github-auth.sh +121 -0
  440. package/runtime/pi/bin/graph-batch.sh +7 -0
  441. package/runtime/pi/bin/graph-op.sh +4 -0
  442. package/runtime/pi/bin/graph-projection.sh +54 -0
  443. package/runtime/pi/bin/graph-wal.sh +13 -0
  444. package/runtime/pi/bin/graph.sh +44 -0
  445. package/runtime/pi/bin/handoff-lifecycle-job.sh +146 -0
  446. package/runtime/pi/bin/handoff-lifecycle.sh +280 -0
  447. package/runtime/pi/bin/handoff-preview.sh +169 -0
  448. package/runtime/pi/bin/handoff-run.sh +42 -26
  449. package/runtime/pi/bin/ingest-graph.sh +6 -0
  450. package/runtime/pi/bin/ingest-item.sh +10 -0
  451. package/runtime/pi/bin/ingest.sh +59 -30
  452. package/runtime/pi/bin/invite.sh +6 -0
  453. package/runtime/pi/bin/issue.sh +10 -0
  454. package/runtime/pi/bin/knowledge.sh +10 -0
  455. package/runtime/pi/bin/lib/config.sh +20 -0
  456. package/runtime/pi/bin/lib/context.sh +46 -25
  457. package/runtime/pi/bin/lib/git-sync.sh +70 -6
  458. package/runtime/pi/bin/lib/greeting.sh +34 -5
  459. package/runtime/pi/bin/lib/handoff-meta.sh +97 -0
  460. package/runtime/pi/bin/lib/worktree-links.sh +6 -0
  461. package/runtime/pi/bin/node-run.sh +42 -0
  462. package/runtime/pi/bin/notification.sh +6 -0
  463. package/runtime/pi/bin/observe-context.sh +14 -0
  464. package/runtime/pi/bin/onboarding.sh +6 -0
  465. package/runtime/pi/bin/person.py +4 -0
  466. package/runtime/pi/bin/person.sh +43 -10
  467. package/runtime/pi/bin/pi-observe-context.mjs +93 -0
  468. package/runtime/pi/bin/pi-product-workflows.mjs +1 -1
  469. package/runtime/pi/bin/pi-render-spec.mjs +1 -1
  470. package/runtime/pi/bin/post-update.sh +37 -0
  471. package/runtime/pi/bin/prime-render-spec.mjs +147 -0
  472. package/runtime/pi/bin/publish-artifact.sh +55 -2
  473. package/runtime/pi/bin/quest.sh +9 -0
  474. package/runtime/pi/bin/question.sh +8 -0
  475. package/runtime/pi/bin/research-ingest.sh +7 -0
  476. package/runtime/pi/bin/restore-owned-skills.sh +67 -0
  477. package/runtime/pi/bin/retrieval_eval.py +385 -0
  478. package/runtime/pi/bin/runtime-identity.sh +70 -0
  479. package/runtime/pi/bin/runtime-upgrade.sh +43 -0
  480. package/runtime/pi/bin/scroll.sh +9 -0
  481. package/runtime/pi/bin/search.sh +231 -195
  482. package/runtime/pi/bin/settings.sh +174 -5
  483. package/runtime/pi/bin/startup-check.sh +136 -0
  484. package/runtime/pi/bin/telemetry.sh +522 -247
  485. package/runtime/pi/bin/test-changes.sh +344 -0
  486. package/runtime/pi/bin/thread.sh +9 -0
  487. package/runtime/pi/bin/todo.sh +9 -0
  488. package/runtime/pi/bin/view-render.sh +126 -0
  489. package/runtime/pi/bin/worktree-create.sh +19 -5
  490. package/runtime/pi/egregore_runtime/__init__.py +228 -0
  491. package/runtime/pi/egregore_runtime/adapters/__init__.py +5 -0
  492. package/runtime/pi/egregore_runtime/adapters/invitation.py +237 -0
  493. package/runtime/pi/egregore_runtime/adapters/notification.py +59 -0
  494. package/runtime/pi/egregore_runtime/adapters/qmd.py +1701 -0
  495. package/runtime/pi/egregore_runtime/adapters/qmd_cli.py +210 -0
  496. package/runtime/pi/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
  497. package/runtime/pi/egregore_runtime/admin_gate.py +102 -0
  498. package/runtime/pi/egregore_runtime/artifacts.py +523 -0
  499. package/runtime/pi/egregore_runtime/contracts.py +499 -0
  500. package/runtime/pi/egregore_runtime/entitlements.py +85 -0
  501. package/runtime/pi/egregore_runtime/errors.py +10 -0
  502. package/runtime/pi/egregore_runtime/graph.py +356 -0
  503. package/runtime/pi/egregore_runtime/handoff_lookup.py +196 -0
  504. package/runtime/pi/egregore_runtime/harness_cli.py +1221 -0
  505. package/runtime/pi/egregore_runtime/identity.py +734 -0
  506. package/runtime/pi/egregore_runtime/identity_cli.py +91 -0
  507. package/runtime/pi/egregore_runtime/ingest.py +575 -0
  508. package/runtime/pi/egregore_runtime/ingest_cli.py +254 -0
  509. package/runtime/pi/egregore_runtime/ingest_index_cli.py +147 -0
  510. package/runtime/pi/egregore_runtime/invitation_cli.py +51 -0
  511. package/runtime/pi/egregore_runtime/invitations.py +116 -0
  512. package/runtime/pi/egregore_runtime/issue_cli.py +305 -0
  513. package/runtime/pi/egregore_runtime/issues.py +359 -0
  514. package/runtime/pi/egregore_runtime/knowledge.py +376 -0
  515. package/runtime/pi/egregore_runtime/knowledge_cli.py +173 -0
  516. package/runtime/pi/egregore_runtime/lifecycle.py +888 -0
  517. package/runtime/pi/egregore_runtime/lifecycle_cli.py +269 -0
  518. package/runtime/pi/egregore_runtime/notification_cli.py +125 -0
  519. package/runtime/pi/egregore_runtime/notifications.py +230 -0
  520. package/runtime/pi/egregore_runtime/observe.py +342 -0
  521. package/runtime/pi/egregore_runtime/onboarding.py +290 -0
  522. package/runtime/pi/egregore_runtime/onboarding_cli.py +110 -0
  523. package/runtime/pi/egregore_runtime/policy.py +144 -0
  524. package/runtime/pi/egregore_runtime/profile.py +193 -0
  525. package/runtime/pi/egregore_runtime/quest_cli.py +216 -0
  526. package/runtime/pi/egregore_runtime/question_cli.py +180 -0
  527. package/runtime/pi/egregore_runtime/questions.py +304 -0
  528. package/runtime/pi/egregore_runtime/quests.py +419 -0
  529. package/runtime/pi/egregore_runtime/readiness.py +379 -0
  530. package/runtime/pi/egregore_runtime/research_ingest.py +256 -0
  531. package/runtime/pi/egregore_runtime/research_ingest_cli.py +44 -0
  532. package/runtime/pi/egregore_runtime/runtime.py +464 -0
  533. package/runtime/pi/egregore_runtime/scroll_cli.py +185 -0
  534. package/runtime/pi/egregore_runtime/scrolls.py +726 -0
  535. package/runtime/pi/egregore_runtime/status.py +412 -0
  536. package/runtime/pi/egregore_runtime/status_cli.py +174 -0
  537. package/runtime/pi/egregore_runtime/sync.py +218 -0
  538. package/runtime/pi/egregore_runtime/teamsync.py +139 -0
  539. package/runtime/pi/egregore_runtime/telemetry.py +640 -0
  540. package/runtime/pi/egregore_runtime/thread_cli.py +173 -0
  541. package/runtime/pi/egregore_runtime/threads.py +517 -0
  542. package/runtime/pi/egregore_runtime/todo_cli.py +142 -0
  543. package/runtime/pi/egregore_runtime/todos.py +244 -0
  544. package/runtime/pi/egregore_runtime/upgrade.py +770 -0
  545. package/runtime/pi/egregore_runtime/upgrade_worker.py +53 -0
  546. package/runtime/pi/egregore_runtime/writeback.py +391 -0
  547. package/runtime/pi/egregore_runtime/writeback_cli.py +114 -0
  548. package/runtime/pi/manifest.json +98 -1
  549. package/runtime/prime/.codex/hooks/search-hint.js +21 -52
  550. package/runtime/prime/.codex/hooks.json +3 -3
  551. package/runtime/prime/.codex/skills/activity/SKILL.md +23 -66
  552. package/runtime/prime/.codex/skills/announce/SKILL.md +27 -50
  553. package/runtime/prime/.codex/skills/archive/SKILL.md +21 -36
  554. package/runtime/prime/.codex/skills/checkup/SKILL.md +77 -36
  555. package/runtime/prime/.codex/skills/dark-mode/SKILL.md +1 -1
  556. package/runtime/prime/.codex/skills/dashboard/SKILL.md +17 -47
  557. package/runtime/prime/.codex/skills/handoff/SKILL.md +84 -133
  558. package/runtime/prime/.codex/skills/harvest/SKILL.md +32 -117
  559. package/runtime/prime/.codex/skills/ingest/SKILL.md +47 -25
  560. package/runtime/prime/.codex/skills/ingest-user-interview/SKILL.md +18 -36
  561. package/runtime/prime/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
  562. package/runtime/prime/.codex/skills/invite/SKILL.md +21 -35
  563. package/runtime/prime/.codex/skills/issue/SKILL.md +60 -41
  564. package/runtime/prime/.codex/skills/me/SKILL.md +1 -1
  565. package/runtime/prime/.codex/skills/meeting/SKILL.md +16 -36
  566. package/runtime/prime/.codex/skills/meeting/references/analysis-contract.md +48 -0
  567. package/runtime/prime/.codex/skills/note/SKILL.md +30 -25
  568. package/runtime/prime/.codex/skills/onboarding/SKILL.md +36 -41
  569. package/runtime/prime/.codex/skills/pull/SKILL.md +1 -1
  570. package/runtime/prime/.codex/skills/quest/SKILL.md +27 -66
  571. package/runtime/prime/.codex/skills/reflect/SKILL.md +22 -36
  572. package/runtime/prime/.codex/skills/save/SKILL.md +2 -2
  573. package/runtime/prime/.codex/skills/telemetry/SKILL.md +1 -1
  574. package/runtime/prime/.codex/skills/test/SKILL.md +1 -1
  575. package/runtime/prime/.codex/skills/tutorial/SKILL.md +40 -41
  576. package/runtime/prime/.codex/skills/view/SKILL.md +115 -111
  577. package/runtime/prime/.codex/skills/wrap/SKILL.md +45 -41
  578. package/runtime/prime/.codex/spec-manifest.json +9 -9
  579. package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +57 -48
  580. package/runtime/prime/.prime/agent/extensions/egregore.ts +7 -0
  581. package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
  582. package/runtime/prime/AGENTS.md +62 -58
  583. package/runtime/prime/bin/activity-action.sh +92 -0
  584. package/runtime/prime/bin/activity-data.sh +12 -233
  585. package/runtime/prime/bin/agent.sh +84 -100
  586. package/runtime/prime/bin/artifact-register.sh +164 -0
  587. package/runtime/prime/bin/artifact-writeback.sh +53 -0
  588. package/runtime/prime/bin/artifacts.sh +288 -0
  589. package/runtime/prime/bin/build-sealed-dataroom.mjs +722 -0
  590. package/runtime/prime/bin/capture-run.sh +18 -2
  591. package/runtime/prime/bin/codex-render-spec.mjs +41 -16
  592. package/runtime/prime/bin/codex-session-start.sh +14 -4
  593. package/runtime/prime/bin/codex-skill-render.mjs +9 -7
  594. package/runtime/prime/bin/corpus_map.py +806 -0
  595. package/runtime/prime/bin/corpus_survey.py +304 -0
  596. package/runtime/prime/bin/dashboard-data.sh +11 -171
  597. package/runtime/prime/bin/github-auth.sh +121 -0
  598. package/runtime/prime/bin/graph-batch.sh +7 -0
  599. package/runtime/prime/bin/graph-op.sh +4 -0
  600. package/runtime/prime/bin/graph-projection.sh +54 -0
  601. package/runtime/prime/bin/graph-wal.sh +13 -0
  602. package/runtime/prime/bin/graph.sh +44 -0
  603. package/runtime/prime/bin/handoff-lifecycle-job.sh +146 -0
  604. package/runtime/prime/bin/handoff-lifecycle.sh +280 -0
  605. package/runtime/prime/bin/handoff-preview.sh +169 -0
  606. package/runtime/prime/bin/handoff-run.sh +42 -26
  607. package/runtime/prime/bin/ingest-graph.sh +6 -0
  608. package/runtime/prime/bin/ingest-item.sh +10 -0
  609. package/runtime/prime/bin/ingest.sh +59 -30
  610. package/runtime/prime/bin/invite.sh +6 -0
  611. package/runtime/prime/bin/issue.sh +10 -0
  612. package/runtime/prime/bin/knowledge.sh +10 -0
  613. package/runtime/prime/bin/lib/config.sh +20 -0
  614. package/runtime/prime/bin/lib/context.sh +46 -25
  615. package/runtime/prime/bin/lib/git-sync.sh +70 -6
  616. package/runtime/prime/bin/lib/greeting.sh +34 -5
  617. package/runtime/prime/bin/lib/handoff-meta.sh +97 -0
  618. package/runtime/prime/bin/lib/worktree-links.sh +6 -0
  619. package/runtime/prime/bin/node-run.sh +42 -0
  620. package/runtime/prime/bin/notification.sh +6 -0
  621. package/runtime/prime/bin/observe-context.sh +14 -0
  622. package/runtime/prime/bin/onboarding.sh +6 -0
  623. package/runtime/prime/bin/person.py +4 -0
  624. package/runtime/prime/bin/person.sh +43 -10
  625. package/runtime/prime/bin/pi-observe-context.mjs +93 -0
  626. package/runtime/prime/bin/pi-product-workflows.mjs +1 -1
  627. package/runtime/prime/bin/pi-render-spec.mjs +140 -0
  628. package/runtime/prime/bin/post-update.sh +37 -0
  629. package/runtime/prime/bin/prime-render-spec.mjs +1 -1
  630. package/runtime/prime/bin/publish-artifact.sh +55 -2
  631. package/runtime/prime/bin/quest.sh +9 -0
  632. package/runtime/prime/bin/question.sh +8 -0
  633. package/runtime/prime/bin/research-ingest.sh +7 -0
  634. package/runtime/prime/bin/restore-owned-skills.sh +67 -0
  635. package/runtime/prime/bin/retrieval_eval.py +385 -0
  636. package/runtime/prime/bin/runtime-identity.sh +70 -0
  637. package/runtime/prime/bin/runtime-upgrade.sh +43 -0
  638. package/runtime/prime/bin/scroll.sh +9 -0
  639. package/runtime/prime/bin/search.sh +231 -195
  640. package/runtime/prime/bin/settings.sh +174 -5
  641. package/runtime/prime/bin/startup-check.sh +136 -0
  642. package/runtime/prime/bin/telemetry.sh +522 -247
  643. package/runtime/prime/bin/test-changes.sh +344 -0
  644. package/runtime/prime/bin/thread.sh +9 -0
  645. package/runtime/prime/bin/todo.sh +9 -0
  646. package/runtime/prime/bin/view-render.sh +126 -0
  647. package/runtime/prime/bin/worktree-create.sh +19 -5
  648. package/runtime/prime/egregore_runtime/__init__.py +228 -0
  649. package/runtime/prime/egregore_runtime/adapters/__init__.py +5 -0
  650. package/runtime/prime/egregore_runtime/adapters/invitation.py +237 -0
  651. package/runtime/prime/egregore_runtime/adapters/notification.py +59 -0
  652. package/runtime/prime/egregore_runtime/adapters/qmd.py +1701 -0
  653. package/runtime/prime/egregore_runtime/adapters/qmd_cli.py +210 -0
  654. package/runtime/prime/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
  655. package/runtime/prime/egregore_runtime/admin_gate.py +102 -0
  656. package/runtime/prime/egregore_runtime/artifacts.py +523 -0
  657. package/runtime/prime/egregore_runtime/contracts.py +499 -0
  658. package/runtime/prime/egregore_runtime/entitlements.py +85 -0
  659. package/runtime/prime/egregore_runtime/errors.py +10 -0
  660. package/runtime/prime/egregore_runtime/graph.py +356 -0
  661. package/runtime/prime/egregore_runtime/handoff_lookup.py +196 -0
  662. package/runtime/prime/egregore_runtime/harness_cli.py +1221 -0
  663. package/runtime/prime/egregore_runtime/identity.py +734 -0
  664. package/runtime/prime/egregore_runtime/identity_cli.py +91 -0
  665. package/runtime/prime/egregore_runtime/ingest.py +575 -0
  666. package/runtime/prime/egregore_runtime/ingest_cli.py +254 -0
  667. package/runtime/prime/egregore_runtime/ingest_index_cli.py +147 -0
  668. package/runtime/prime/egregore_runtime/invitation_cli.py +51 -0
  669. package/runtime/prime/egregore_runtime/invitations.py +116 -0
  670. package/runtime/prime/egregore_runtime/issue_cli.py +305 -0
  671. package/runtime/prime/egregore_runtime/issues.py +359 -0
  672. package/runtime/prime/egregore_runtime/knowledge.py +376 -0
  673. package/runtime/prime/egregore_runtime/knowledge_cli.py +173 -0
  674. package/runtime/prime/egregore_runtime/lifecycle.py +888 -0
  675. package/runtime/prime/egregore_runtime/lifecycle_cli.py +269 -0
  676. package/runtime/prime/egregore_runtime/notification_cli.py +125 -0
  677. package/runtime/prime/egregore_runtime/notifications.py +230 -0
  678. package/runtime/prime/egregore_runtime/observe.py +342 -0
  679. package/runtime/prime/egregore_runtime/onboarding.py +290 -0
  680. package/runtime/prime/egregore_runtime/onboarding_cli.py +110 -0
  681. package/runtime/prime/egregore_runtime/policy.py +144 -0
  682. package/runtime/prime/egregore_runtime/profile.py +193 -0
  683. package/runtime/prime/egregore_runtime/quest_cli.py +216 -0
  684. package/runtime/prime/egregore_runtime/question_cli.py +180 -0
  685. package/runtime/prime/egregore_runtime/questions.py +304 -0
  686. package/runtime/prime/egregore_runtime/quests.py +419 -0
  687. package/runtime/prime/egregore_runtime/readiness.py +379 -0
  688. package/runtime/prime/egregore_runtime/research_ingest.py +256 -0
  689. package/runtime/prime/egregore_runtime/research_ingest_cli.py +44 -0
  690. package/runtime/prime/egregore_runtime/runtime.py +464 -0
  691. package/runtime/prime/egregore_runtime/scroll_cli.py +185 -0
  692. package/runtime/prime/egregore_runtime/scrolls.py +726 -0
  693. package/runtime/prime/egregore_runtime/status.py +412 -0
  694. package/runtime/prime/egregore_runtime/status_cli.py +174 -0
  695. package/runtime/prime/egregore_runtime/sync.py +218 -0
  696. package/runtime/prime/egregore_runtime/teamsync.py +139 -0
  697. package/runtime/prime/egregore_runtime/telemetry.py +640 -0
  698. package/runtime/prime/egregore_runtime/thread_cli.py +173 -0
  699. package/runtime/prime/egregore_runtime/threads.py +517 -0
  700. package/runtime/prime/egregore_runtime/todo_cli.py +142 -0
  701. package/runtime/prime/egregore_runtime/todos.py +244 -0
  702. package/runtime/prime/egregore_runtime/upgrade.py +770 -0
  703. package/runtime/prime/egregore_runtime/upgrade_worker.py +53 -0
  704. package/runtime/prime/egregore_runtime/writeback.py +391 -0
  705. package/runtime/prime/egregore_runtime/writeback_cli.py +114 -0
  706. package/runtime/prime/manifest.json +98 -1
@@ -0,0 +1,240 @@
1
+ ---
2
+ name: summon
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
+ ---
5
+
6
+ # /summon — Design and Launch a Persistent Agent Process
7
+
8
+ Summon a spirit — a persistent agent that runs on a schedule or watches for conditions. Unlike `/loop` (dumb scheduler), `/summon` designs the process through adaptive questioning, produces a reviewable spec, then launches it.
9
+
10
+ ## When to invoke
11
+
12
+ **Trigger phrases**: "summon", "create a loop", "set up a recurring", "watch for", "monitor", "keep an eye on", "babysit", "run something every", "I want an agent that"
13
+
14
+ **Not this command**:
15
+ - Quick one-shot schedule → `/loop` directly (user already knows what they want)
16
+ - One-time task → just do it, no spirit needed
17
+
18
+ ## Mode detection
19
+
20
+ ```bash
21
+ MODE=$(jq -r '.mode // "connected"' egregore.json 2>/dev/null)
22
+ ```
23
+
24
+ **Local mode** (`mode === "local"`): Skip ALL `bin/graph.sh`, `bin/graph-batch.sh`, and `bin/notify.sh` calls — do NOT run them. Do NOT show any graph-related messaging.
25
+
26
+ Local-mode adjustments:
27
+ - **Phase 1**: Skip the graph scan. Generate options from conversation context, `memory/quests/` files, and `.spirits/` directory instead of the graph.
28
+ - **Phase 5**: Skip Spirit node creation in Neo4j. Write the spec file to `.spirits/{name}.json` and create the CronCreate schedule — these work without the graph.
29
+ - **Phase 6**: Skip LoopReport creation in Neo4j. The TUI report still renders, but the graph artifact is not created.
30
+ - **Managing Spirits**: Read from `.spirits/` directory instead of querying the graph. Suspend/resume only uses CronDelete/CronCreate, not graph updates.
31
+
32
+ ## Instructions
33
+
34
+ ### Phase 1: Intent Discovery
35
+
36
+ Start with one open question via AskUserQuestion:
37
+
38
+ ```
39
+ What should this spirit do?
40
+ ```
41
+
42
+ **Connected mode:** Options should be derived from current graph context — not hardcoded. Before asking, run a lightweight graph scan to understand what's happening:
43
+
44
+ ```bash
45
+ # Get active quests, recent sessions, health signals
46
+ CONTEXT=$(bash bin/graph-batch.sh '[
47
+ {"statement": "MATCH (q:Quest) WHERE q.status IN [\"active\", \"in-progress\"] RETURN q.id, q.title LIMIT 10", "parameters": {}},
48
+ {"statement": "MATCH (s:Session)-[:BY]->(p:Person) RETURN s.topic, p.name, toString(s.date) AS date ORDER BY s.date DESC LIMIT 5", "parameters": {}},
49
+ {"statement": "MATCH (s:Spirit) RETURN s.name, s.type, s.status LIMIT 10", "parameters": {}}
50
+ ]')
51
+ ```
52
+
53
+ Use this context to generate options that are relevant — e.g. if there are dormant quests, offer "reconcile dormant work"; if there's a PR-heavy period, offer "watch PRs". Always include a free-text option.
54
+
55
+ **Local mode:** Skip the graph scan. Instead, derive options from:
56
+ - Active quests in `memory/quests/` (parse frontmatter for status)
57
+ - Recent handoffs in `memory/handoffs/index.md`
58
+ - Existing spirits in `.spirits/` directory
59
+ - Conversation context
60
+ Always include a free-text option.
61
+
62
+ The agent has full discretion to decide what context is relevant given the user's stated intent.
63
+
64
+ ### Phase 2: Adaptive Convergence
65
+
66
+ Ask questions iteratively. Each round is informed by previous answers AND graph context. The questioning is non-linear — the agent decides what to ask based on where the interesting tension is, not a fixed script.
67
+
68
+ **Dimensions to explore** (not necessarily in order — the agent picks what matters):
69
+
70
+ - **Scope**: What exactly does the spirit observe? What can it act on? What's off-limits?
71
+ - **Cadence**: How often? Time-driven (cron) or condition-driven (watchdog)? Or both?
72
+ - **Boundaries**: What should it never do? What requires human approval vs auto-action?
73
+ - **Reporting**: What does the user want to see? Metrics? Narrative? Diffs? Alerts only?
74
+ - **Failure modes**: What happens when the spirit finds something it can't handle?
75
+ - **Evolution**: Should the spirit's behavior change as it learns? How?
76
+
77
+ **Convergence signal**: When the user's answers start narrowing to specifics (concrete conditions, specific quests, named thresholds), propose the spec. Don't ask more than 6 rounds unless the user is actively expanding scope.
78
+
79
+ **For watchdog spirits** (event-driven):
80
+ - Define the condition to watch for (as a Cypher query or graph pattern)
81
+ - Define the action on trigger (notify, auto-fix, flag, escalate)
82
+ - Cadence is polling interval (cron-based for now, hookable later)
83
+
84
+ ### Phase 3: Spec Generation
85
+
86
+ Produce a spirit spec as JSON. Write to `.spirits/{name}.json`:
87
+
88
+ ```json
89
+ {
90
+ "name": "graph-gardener",
91
+ "type": "recurring",
92
+ "purpose": "Maintain knowledge graph health — fix structural issues, infer new relationships, report drift",
93
+ "cadence": "0 3 * * *",
94
+ "cadence_human": "Daily at 3:03 AM",
95
+ "scope": {
96
+ "reads": ["Quest", "Artifact", "Session", "Person"],
97
+ "writes": ["Artifact", "Quest"],
98
+ "relationships": ["PART_OF", "RELATES_TO", "BUILDS_ON"],
99
+ "off_limits": ["Person deletion", "Quest deletion"]
100
+ },
101
+ "actions": {
102
+ "auto": ["resolve stale handoffs", "migrate date types", "mark dormant quests", "link artifacts by topic"],
103
+ "suggest": ["merge duplicate persons", "link disconnected artifacts"],
104
+ "flag": ["ghost artifacts", "orphaned sessions"]
105
+ },
106
+ "reporting": {
107
+ "tui": true,
108
+ "graph_artifact": true,
109
+ "notify": false
110
+ },
111
+ "watchdog": null,
112
+ "created_by": "cem",
113
+ "created_at": "2026-03-09T10:00:00Z",
114
+ "version": 1
115
+ }
116
+ ```
117
+
118
+ For watchdog spirits, the `watchdog` field contains:
119
+
120
+ ```json
121
+ {
122
+ "condition": "MATCH (s:Session) WHERE s.date > date() - duration('P1D') AND s.handoffStatus = 'pending' RETURN count(s) > 3",
123
+ "action": "notify",
124
+ "message_template": "{{count}} handoffs piling up — someone should triage"
125
+ }
126
+ ```
127
+
128
+ ### Phase 4: Review
129
+
130
+ Present the spec as a TUI box:
131
+
132
+ ```
133
+ ┌ Spirit: graph-gardener ───────────────────────────┐
134
+ │ │
135
+ │ Purpose: Maintain knowledge graph health │
136
+ │ Type: Recurring │
137
+ │ Cadence: Daily at 3:03 AM │
138
+ │ │
139
+ │ Auto-fix: stale handoffs, date types, │
140
+ │ dormant quests, topic links │
141
+ │ Suggest: duplicate persons, disconnected arts │
142
+ │ Flag: ghosts, orphans │
143
+ │ │
144
+ │ Reporting: TUI + Graph artifact each cycle │
145
+ │ Boundaries: No person/quest deletion │
146
+ │ │
147
+ └────────────────────────────────────────────────────┘
148
+ ```
149
+
150
+ Ask: "Launch this spirit?" with options: Launch, Edit (back to questioning), Cancel.
151
+
152
+ ### Phase 5: Launch
153
+
154
+ 1. **Write spec file**: `.spirits/{name}.json`
155
+ 2. **Create Spirit node in graph** — **CONNECTED MODE ONLY**:
156
+ **Skip this step in local mode.** Do not run `bin/graph.sh`.
157
+ ```bash
158
+ bash bin/graph.sh query "
159
+ MERGE (sp:Spirit {name: \$name})
160
+ SET sp.type = \$type, sp.purpose = \$purpose, sp.cadence = \$cadence,
161
+ sp.status = 'active', sp.createdAt = datetime(), sp.createdBy = \$author,
162
+ sp.version = 1
163
+ RETURN sp.name
164
+ " '{"name":"...","type":"...","purpose":"...","cadence":"...","author":"..."}'
165
+ ```
166
+ 3. **Schedule via CronCreate**:
167
+ - Prompt is the spirit's execution prompt (constructed from spec)
168
+ - For recurring: standard cron
169
+ - For watchdog: polling cron + condition check prefix
170
+ 4. **Confirm**: Show job ID, how to cancel, 3-day auto-expiry note.
171
+
172
+ ### Phase 6: Cycle Reporting (attached to each execution)
173
+
174
+ When a spirit runs (via `/loop` invoking its prompt), each cycle MUST:
175
+
176
+ 1. **Run the work** defined in the spec
177
+ 2. **Produce TUI report**:
178
+ ```
179
+ ┌ graph-gardener · Cycle 4 · 2026-03-09 ─────────┐
180
+ │ │
181
+ │ ✦ Fixed: 3 stale handoffs resolved │
182
+ │ ✦ Fixed: 12 date types migrated │
183
+ │ ◇ Inferred: 8 new RELATES_TO edges │
184
+ │ ⚠ Flagged: 2 ghost artifacts │
185
+ │ │
186
+ │ Health: 412 nodes · 891 edges · 1.2% orphan │
187
+ │ Delta: +15 edges since last cycle │
188
+ │ Drift: dormant quest count stable (26) │
189
+ │ │
190
+ │ Insight: "3 artifacts about 'governance' appeared│
191
+ │ this week but aren't linked to any quest — │
192
+ │ emerging theme?" │
193
+ │ │
194
+ └───────────────────────────────────────────────────┘
195
+ ```
196
+
197
+ 3. **Write LoopReport to graph** — **CONNECTED MODE ONLY**:
198
+ **Skip this step in local mode.** Do not run `bin/graph.sh`. The TUI report still renders but is not persisted to the graph.
199
+ ```bash
200
+ bash bin/graph.sh query "
201
+ MATCH (sp:Spirit {name: \$name})
202
+ CREATE (lr:Artifact {
203
+ id: \$id, type: 'loop-report', title: \$title,
204
+ created: date(), origin: 'spirit',
205
+ metrics: \$metrics
206
+ })
207
+ CREATE (lr)-[:GENERATED_BY]->(sp)
208
+ RETURN lr.id
209
+ " '{"name":"...","id":"...","title":"...","metrics":"..."}'
210
+ ```
211
+
212
+ 4. **Insights**: The report should include one model-generated insight per cycle — a pattern, question, or observation that emerges from the data but wasn't explicitly programmed. This is the inferential layer growing.
213
+
214
+ ### Telemetry
215
+
216
+ ```bash
217
+ bash bin/telemetry.sh emit "command" '{"command":"summon"}' 2>/dev/null &
218
+ ```
219
+
220
+ ## Managing Spirits
221
+
222
+ **Connected mode:**
223
+ - **List active**: `bash bin/graph.sh query "MATCH (sp:Spirit {status: 'active'}) RETURN sp.name, sp.type, sp.cadence"`
224
+ - **Suspend**: Set `sp.status = 'suspended'` + CronDelete
225
+ - **Resume**: Set `sp.status = 'active'` + CronCreate
226
+ - **View history**: `MATCH (lr:Artifact {origin: 'spirit'})-[:GENERATED_BY]->(sp:Spirit {name: $name}) RETURN lr ORDER BY lr.created DESC`
227
+
228
+ **Local mode:**
229
+ - **List active**: Read `.spirits/*.json` files, filter by `"status": "active"`. Display name, type, cadence from each spec file.
230
+ - **Suspend**: Update spec file `"status": "suspended"` + CronDelete
231
+ - **Resume**: Update spec file `"status": "active"` + CronCreate
232
+ - **View history**: Not available in local mode (no graph artifact storage). Show: `Spirit history requires connected mode.`
233
+
234
+ ## Design Principles
235
+
236
+ 1. **Bitter lesson**: The agent decides what context is relevant, not a fixed query set. More compute, less hand-engineering.
237
+ 2. **Adaptive convergence**: Questions stop when the spec is clear, not after N rounds.
238
+ 3. **Specs are forkable**: `.spirits/` is git-tracked. Fork the egregore, inherit its spirits.
239
+ 4. **Spirits compound**: Each cycle's LoopReport feeds future cycles. The spirit gets smarter about what to surface.
240
+ 5. **Watchdogs are deferred hooks**: Poll-on-cron now, proper event-driven hooks when infrastructure exists.
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: sync-repos
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
+ ---
5
+
6
+ Smart sync of all Egregore repos. Fetches first, only pulls if behind.
7
+
8
+ ## When to invoke
9
+
10
+ User says: "/sync-repos", "sync all repos", "sync everything", "get every repo up to date"
11
+
12
+ ## Execution boundary
13
+
14
+ This is deterministic multi-repository sync. Run it inline with bounded
15
+ parallel fetches; do not spend a Loom/model-routing call or delegate it to
16
+ another agent.
17
+
18
+ ## Repos to sync
19
+
20
+ - `../$MEMORY_DIR` — shared knowledge (derived from `memory_repo` in `egregore.json`)
21
+ - Any repos listed in the `repos` array in `egregore.json` (as sibling directories `../{repo}`)
22
+ - Current repo (egregore-core)
23
+
24
+ **Read `egregore.json` first** to get the dynamic list:
25
+ ```bash
26
+ # Memory repo directory
27
+ MEMORY_DIR=$(basename "$(jq -r '.memory_repo' egregore.json)" .git)
28
+
29
+ # Managed repos
30
+ REPOS=$(jq -r '.repos[]? // empty' egregore.json)
31
+ ```
32
+
33
+ ## Execution
34
+
35
+ For each repo, run these commands:
36
+
37
+ ```bash
38
+ # 1. Fetch (always)
39
+ git -C /path/to/repo fetch origin --quiet
40
+
41
+ # 2. Compare local vs remote
42
+ LOCAL=$(git -C /path/to/repo rev-parse HEAD)
43
+ REMOTE=$(git -C /path/to/repo rev-parse origin/main)
44
+
45
+ # 3. Only pull if different
46
+ if [ "$LOCAL" != "$REMOTE" ]; then
47
+ git -C /path/to/repo pull origin main --quiet
48
+ # Count commits behind
49
+ BEHIND=$(git -C /path/to/repo rev-list HEAD..origin/main --count)
50
+ fi
51
+ ```
52
+
53
+ **For the current repo (egregore-core)**: sync the `develop` branch instead of main:
54
+ ```bash
55
+ # Update local develop ref without switching branches (safe for concurrent sessions)
56
+ git fetch origin develop:develop --quiet
57
+ # If on dev/* branch, rebase onto develop
58
+ BRANCH=$(git branch --show-current)
59
+ if [[ "$BRANCH" == dev/* ]]; then
60
+ git rebase develop --quiet || (git rebase --abort && git merge develop -m "Sync with develop")
61
+ fi
62
+ ```
63
+
64
+ Use absolute paths with `git -C` to avoid permission prompts.
65
+
66
+ ## Output format
67
+
68
+ ```
69
+ Syncing Egregore repos...
70
+
71
+ {memory-dir} ↓ 3 commits → pulled
72
+ {repo-1} ✓ up to date
73
+ {repo-2} ✓ up to date
74
+ egregore-core ↓ 1 commit → pulled
75
+ ```
76
+
77
+ ## Rules
78
+
79
+ - Use `git -C /absolute/path` — no `cd` commands
80
+ - Fetch ALL repos first (parallel if possible), then compare/pull
81
+ - Show commit count when pulling
82
+ - Skip repos that don't exist (no error)
@@ -0,0 +1,216 @@
1
+ ---
2
+ name: teams-connect
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
+ ---
5
+
6
+ Set up Microsoft Teams as a notification channel for your Egregore.
7
+
8
+ Arguments: $ARGUMENTS (none expected)
9
+
10
+ ## When to invoke
11
+
12
+ **Trigger phrases:**
13
+ - "set up teams", "connect teams", "teams-connect", "microsoft teams"
14
+ - "add teams notifications", "teams channel", "notify us on teams"
15
+
16
+ **Disambiguation:**
17
+ - "set up telegram" → `/telegram-connect`
18
+ - "send a message to teams" → NOT this — use the separate notification
19
+ consent protocol in `.claude/context/notification-consent.md`
20
+
21
+ ## What this does
22
+
23
+ Registers a bot in the org's own Microsoft tenant, installs it in their Teams,
24
+ and binds one channel to Egregore notifications. After this, everything that
25
+ plans a group notification may also resolve Teams as a receiving channel; all
26
+ resolved channels are shown before separate dispatch approval.
27
+
28
+ You (the agent) run all the Azure work via `az` after one browser login. The
29
+ human does exactly three things: one login, two portal clicks, one paste.
30
+
31
+ ## OSS tier — visible, gated, honest
32
+
33
+ This skill ships to every Egregore, but Teams notifications run on the
34
+ Connected tier. **Before anything else**, detect the tier:
35
+
36
+ ```bash
37
+ MODE=$(jq -r '.mode // empty' egregore.json 2>/dev/null)
38
+ API_URL=$(jq -r '.api_url // empty' egregore.json 2>/dev/null)
39
+ ```
40
+
41
+ The tier predicate is exactly the canonical `_detect_mode` truth table
42
+ (`bin/lib/config.sh`): the instance is on the **local (OSS) tier** when
43
+ `MODE` is `local` **or** `API_URL` is empty. (A hand-set `mode: "connected"`
44
+ without an `api_url` is still local — never treat it as an unlock.)
45
+
46
+ On the local tier, deliver exactly this message, then the question — do not
47
+ paraphrase the message:
48
+
49
+ > You can expand your knowledge base with connections to Notion, Google Drive, Docs, Sheets, and many more. Upgrade to Connected Tier to accelerate.
50
+
51
+ AskUserQuestion:
52
+ - **Upgrade to Connected Tier** — tell them the one sanctioned path: run
53
+ `egregore connect` in a terminal (the launcher walks the whole upgrade:
54
+ registers your org with the platform, provisions the key, replays your
55
+ graph). Teams notifications unlock once Connect is active.
56
+ - **Not now** — respect it and stop. Do not improvise config edits,
57
+ api_url values, or partial flows.
58
+
59
+ Only continue past this section on a connected instance.
60
+
61
+ ## Step 0: Prerequisites (check before touching anything)
62
+
63
+ Ask, or verify where possible. All three must be true:
64
+
65
+ 1. **A Microsoft 365 tenant with Teams** (work tenant, not personal Teams).
66
+ 2. **The person here is admin** of that tenant (Entra + Teams admin center).
67
+ 3. **An Azure subscription** in that tenant — the bot resource is free (F0) but must live in a subscription.
68
+
69
+ `az` CLI must be installed: `which az` — if missing, `brew install azure-cli`
70
+ (macOS) or point at https://aka.ms/azure-cli for their OS.
71
+
72
+ ## Step 1: Login (human, ~1 min)
73
+
74
+ Ask them to run in the prompt:
75
+ ```
76
+ ! az login
77
+ ```
78
+ Then verify tenant + user:
79
+ ```bash
80
+ az account show --query "{tenant:tenantId, user:user.name, state:state}" -o json
81
+ ```
82
+
83
+ **Verify Teams is actually licensed** (the #1 silent dead-end — an Azure-only
84
+ tenant has no Teams and the Teams admin center errors with a cryptic
85
+ "can't find the tenant region for …" / PLS message):
86
+ ```bash
87
+ az rest --method get --url "https://graph.microsoft.com/v1.0/subscribedSkus" \
88
+ --query "value[].skuPartNumber" -o json
89
+ ```
90
+ - `[]` or no Teams-bearing SKU → they need a license first. Guide: M365
91
+ admin center → Marketplace → **Microsoft 365 Business Basic (Trial)**.
92
+ **EEA trap:** every SKU marked "(no Teams)" literally excludes Teams
93
+ (EU unbundling) — pick the plain variant, or add "Microsoft Teams EEA"
94
+ separately. After purchase, assign the license (set `usageLocation` on the
95
+ user first — `assignLicense` fails without it, and racing the two calls
96
+ fails too: PATCH usageLocation, then assign in a separate call).
97
+ - Graph 403 `AADSTS530035` (security defaults) → `az logout && az login` fresh.
98
+
99
+ ## Step 2: Azure infrastructure (agent, ~2 min)
100
+
101
+ Run these; capture every id/secret as you go:
102
+
103
+ ```bash
104
+ # 1. App registration (single-tenant — deliberate; Microsoft is deprecating new multi-tenant bots)
105
+ az ad app create --display-name "Egregore Notifications" --sign-in-audience AzureADMyOrg \
106
+ --query "{appId:appId}" -o json
107
+
108
+ # 2. Client secret (2 years)
109
+ az ad app credential reset --id <APP_ID> --display-name "teams-notify" --years 2 -o json
110
+
111
+ # 3. Service principal — az ad app create does NOT make one; skipping this
112
+ # yields token 401 AADSTS7000229 later
113
+ az ad sp create --id <APP_ID>
114
+
115
+ # 4. Resource group + free Azure Bot + Teams channel
116
+ az group create -n egregore-bots -l <their-region, e.g. westeurope>
117
+ az bot create --resource-group egregore-bots --name egregore-notifications \
118
+ --app-type SingleTenant --appid <APP_ID> --tenant-id <TENANT_ID> --sku F0
119
+ az bot msteams create --name egregore-notifications --resource-group egregore-bots
120
+ ```
121
+
122
+ Save to the instance `.env` (gitignored — never commit):
123
+ ```
124
+ TEAMS_APP_ID=…
125
+ TEAMS_APP_SECRET=…
126
+ TEAMS_TENANT_ID=…
127
+ ```
128
+
129
+ Smoke the token before proceeding (catches AADSTS7000229 immediately):
130
+ ```bash
131
+ curl -sS -X POST "https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token" \
132
+ -d grant_type=client_credentials -d "client_id=<APP_ID>" \
133
+ -d "client_secret=<SECRET>" -d "scope=https://api.botframework.com/.default"
134
+ ```
135
+
136
+ ## Step 3: App package + catalog upload (human, 2 clicks)
137
+
138
+ Build and reveal the zip:
139
+ ```bash
140
+ bash teams-app/build-package.sh <APP_ID> && open teams-app/build/
141
+ ```
142
+ (If this instance doesn't carry `teams-app/`, fetch it from the framework repo.)
143
+
144
+ Guide them: **https://admin.teams.microsoft.com/policies/manage-apps** →
145
+ **Actions → Upload new app** → pick `egregore-teams-app.zip`.
146
+
147
+ Traps:
148
+ - Fresh tenants show "setting up your new app management experience… up to
149
+ 30 minutes" with the upload button greyed out. It's provisioning — wait, refresh.
150
+ - Re-uploading the same app id via "Upload new app" is rejected — updates go
151
+ through the app's **detail page → Upload file to update**.
152
+
153
+ ## Step 4: Add the bot to the team (human, 1 click)
154
+
155
+ In **Teams — the work account** (trap: the desktop app may silently be the
156
+ consumer client — "Build your community" UI, no org catalog; use
157
+ teams.microsoft.com if in doubt): **Apps → Built for your org → Egregore →
158
+ ▾ → Add to a team** → pick the channel → **Set up a bot**.
159
+
160
+ Without this, sends fail `403 BotNotInConversationRoster`.
161
+
162
+ ## Step 5: Channel binding (human pastes, agent decodes)
163
+
164
+ Ask for the channel link (channel → ⋯ → Get link to channel), then decode:
165
+ ```bash
166
+ python3 -c "import sys,urllib.parse,re; m=re.search(r'(19%3a[^/?]+|19:[^/?]+)', sys.argv[1]); print(urllib.parse.unquote(m.group(1)))" "<PASTED_LINK>"
167
+ ```
168
+ Result must look like `19:…@thread.tacv2`.
169
+
170
+ ## Step 6: Persist
171
+
172
+ ```bash
173
+ API_URL=$(jq -r '.api_url' egregore.json)
174
+ KEY=$(grep '^EGREGORE_API_KEY=' .env | cut -d= -f2-)
175
+ curl -sS -X POST "$API_URL/api/org/teams" \
176
+ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
177
+ -d '{"conversation_id":"<CONV_ID>","app_id":"<APP_ID>","app_secret":"<SECRET>","tenant_id":"<TENANT_ID>"}'
178
+ ```
179
+ Expect `{"status":"connected", …}`. The per-org creds matter: a single-tenant
180
+ bot only works in its home tenant, so each org brings its own registration.
181
+
182
+ Non-default region: their bot's service URL may differ from the EMEA default —
183
+ pass `"service_url"` too (Azure portal → the bot → Channels → Teams shows it).
184
+
185
+ ## Step 7: Verify with separate exact notification consent
186
+
187
+ Follow `.claude/context/notification-consent.md`. Connecting Teams is not
188
+ consent to send a test message. Prepare after configuration is final:
189
+ ```bash
190
+ PLAN_JSON=$(bash bin/notify.sh plan group "Teams channel connected — this message reached you through Egregore.")
191
+ ```
192
+
193
+ Show every resolved receiving channel—potentially both Telegram and Teams—and
194
+ the exact message in a dedicated Send / Edit / Cancel checkpoint. Only dispatch
195
+ after Send is selected for that preview. Card avatar may show a generic icon
196
+ for a few hours (Teams caches
197
+ app icons) — cosmetic, self-heals.
198
+
199
+ ## Troubleshooting quick table
200
+
201
+ | Symptom | Cause → fix |
202
+ |---|---|
203
+ | "can't find the tenant region" (PLS) in Teams admin center | No M365/Teams license on the tenant → Step 1 licensing |
204
+ | Token 401 `AADSTS7000229` | Missing service principal → `az ad sp create --id <APP_ID>` |
205
+ | Send 403 `BotNotInConversationRoster` | Bot not added to the team → Step 4 |
206
+ | Send 404 | Wrong conversation id or wrong `service_url` region |
207
+ | "already an app with the same app ID" on upload | Use the app detail page → Upload file to update |
208
+ | No Apps rail / no org catalog in Teams | Consumer Teams client → work account at teams.microsoft.com |
209
+ | Upload button greyed out | Tenant still provisioning app management (≤30 min) |
210
+
211
+ ## After
212
+
213
+ Emit telemetry (fire-and-forget):
214
+ ```bash
215
+ bash bin/telemetry.sh emit "teams-connect" '{"command":"teams-connect"}' 2>/dev/null &
216
+ ```
@@ -0,0 +1,110 @@
1
+ ---
2
+ name: telegram-connect
3
+ description: "Set up Telegram as a notification center for your Egregore — creates the group, links the bot, and stores the chat ID. Use for /telegram-connect, 'connect telegram', or 'set up telegram notifications'."
4
+ ---
5
+
6
+ Set up Telegram as a notification center for your Egregore.
7
+
8
+ Arguments: $ARGUMENTS (none expected)
9
+
10
+ ## When to invoke
11
+
12
+ **Trigger phrases:**
13
+ - "set up telegram", "connect telegram", "add notifications", "telegram-connect"
14
+ - "telegram group", "add telegram", "enable telegram", "link telegram"
15
+ - "notification setup", "set up notifications"
16
+
17
+ **Disambiguation:**
18
+ - "send a message on telegram" → NOT this — use the separate notification
19
+ consent protocol in `.claude/context/notification-consent.md`
20
+ - "announce something" → NOT this — use `/announce`
21
+
22
+ ## Step 1: Check current state
23
+
24
+ Check for existing `telegram_chat_id` — it lives in `.egregore-state.json` (preferred) or `egregore.json` (legacy):
25
+
26
+ ```bash
27
+ jq -r '.telegram_chat_id // empty' .egregore-state.json 2>/dev/null || jq -r '.telegram_chat_id // empty' egregore.json 2>/dev/null
28
+ ```
29
+
30
+ If already set, show:
31
+ ```
32
+ Telegram is already connected.
33
+
34
+ Chat ID: {chat_id}
35
+ Group link: {group_link}
36
+
37
+ To update it, remove `telegram_chat_id` from .egregore-state.json and run `/telegram-connect` again.
38
+ ```
39
+ And stop.
40
+
41
+ ## Step 2: Guide setup
42
+
43
+ Read the org slug from `egregore.json`:
44
+ ```bash
45
+ jq -r '.slug // empty' egregore.json 2>/dev/null
46
+ ```
47
+
48
+ If slug is set, generate the deep link with it: `https://t.me/Egregore_clbot?startgroup=org_{slug}`
49
+ If slug is empty, fall back to: `https://t.me/Egregore_clbot?startgroup=true`
50
+
51
+ Show:
52
+ ```
53
+ To set up Telegram notifications:
54
+
55
+ 1. Create a Telegram group for your team
56
+ 2. Add the bot: {deep_link}
57
+ 3. The bot will respond with your Chat ID — copy it
58
+ 4. Get the invite link: group name → Edit → Invite Links → Copy
59
+ 5. Paste both below
60
+ ```
61
+
62
+ Then use AskUserQuestion to ask for the chat ID:
63
+ ```
64
+ Chat ID (from the bot's message in your group):
65
+ ```
66
+
67
+ Validate: must be a negative number (e.g., `-1001234567890`) — reject anything else with "That doesn't look like a Telegram chat ID. It should be a negative number like -1001234567890."
68
+
69
+ Then use AskUserQuestion to ask for the group invite link:
70
+ ```
71
+ Group invite link:
72
+ ```
73
+
74
+ Validate: must start with `https://t.me/` — reject anything else with "That doesn't look like a Telegram invite link."
75
+
76
+ ## Step 3: Store and test
77
+
78
+ Read `.egregore-state.json`, add `telegram_chat_id` and `telegram_group_link` fields, write it back.
79
+
80
+ **Important:** Write to `.egregore-state.json`, NOT `egregore.json`. The state file is symlinked across worktrees so the config propagates everywhere. No branch, commit, or push is needed — it's an untracked local file.
81
+
82
+ Offer an optional test through the separate exact notification consent flow in
83
+ `.claude/context/notification-consent.md`. Saving the Telegram configuration is
84
+ not consent to send. Prepare without sending:
85
+ ```bash
86
+ PLAN_JSON=$(bash bin/notify.sh plan group "Telegram connected! 🎉")
87
+ ```
88
+
89
+ Show the organization, group/channel, and exact message in a dedicated Send /
90
+ Edit / Cancel checkpoint. If approved and dispatched, show:
91
+ ```
92
+ Telegram connected — test message sent to your group.
93
+ ```
94
+
95
+ If cancelled, show `Telegram connected — no test message sent.` If planning or
96
+ dispatch fails, show the error and suggest checking the chat ID.
97
+
98
+ ## Step 4: Telemetry
99
+
100
+ ```bash
101
+ bash bin/telemetry.sh emit "command" '{"command":"telegram-connect"}' 2>/dev/null &
102
+ ```
103
+
104
+ ## Rules
105
+
106
+ - Never expose credentials in tool output
107
+ - The bot username is `@Egregore_clbot` — NOT `@egregore_bot`
108
+ - Only store the group invite link and chat ID, not bot tokens (those live on the API server)
109
+ - Store in `.egregore-state.json` (symlinked, untracked) — NOT `egregore.json` (tracked, branch-specific)
110
+ - No commit/push needed — state file is local and shared via symlinks