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,636 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Human-consented notification transport.
5
+ #
6
+ # No command in this file can plan and dispatch in one step:
7
+ # 1. plan — resolve exact destinations and persist immutable content
8
+ # 2. approve — record one explicit human approval for that exact digest
9
+ # 3. dispatch — consume the one-use approval and send the stored payload
10
+ #
11
+ # Legacy `send` / `group` commands only create a plan and exit 4. They never
12
+ # dispatch. This makes the invariant fail closed for stale skills and jobs.
13
+
14
+ SCRIPT_DIR="${EGREGORE_NOTIFY_PROJECT_DIR:-$(cd "$(dirname "$0")/.." && pwd)}"
15
+ CONFIG="$SCRIPT_DIR/egregore.json"
16
+
17
+ [ -f "$CONFIG" ] || {
18
+ echo "Error: egregore.json not found." >&2
19
+ exit 1
20
+ }
21
+
22
+ umask 077
23
+
24
+ MODE="$(jq -r '.mode // "connected"' "$CONFIG" 2>/dev/null || echo connected)"
25
+ ORG_SLUG="$(jq -r '.slug // empty' "$CONFIG" 2>/dev/null || true)"
26
+ ORG_NAME="$(jq -r '.org_name // .slug // empty' "$CONFIG" 2>/dev/null || true)"
27
+ SESSION_ID="$(sed -n '1p' "$SCRIPT_DIR/.egregore-session-id" 2>/dev/null || true)"
28
+ SESSION_ID="${SESSION_ID:-no-session}"
29
+ PROJECT_HASH="$(printf '%s' "$SCRIPT_DIR" | cksum | awk '{print $1}')"
30
+ STATE_DIR="${EGREGORE_NOTIFY_STATE_DIR:-$HOME/.egregore/notifications/$PROJECT_HASH}"
31
+ RELAY_URL="${EGREGORE_NOTIFY_RELAY_URL:-https://egregore-production-55f2.up.railway.app}"
32
+ mkdir -p "$STATE_DIR"
33
+ chmod 700 "$STATE_DIR" 2>/dev/null || true
34
+
35
+ if [ -f "$SCRIPT_DIR/.env" ]; then
36
+ EGREGORE_API_URL="${EGREGORE_API_URL:-$(grep '^EGREGORE_API_URL=' "$SCRIPT_DIR/.env" 2>/dev/null | cut -d'=' -f2- || true)}"
37
+ EGREGORE_API_KEY="${EGREGORE_API_KEY:-$(grep '^EGREGORE_API_KEY=' "$SCRIPT_DIR/.env" 2>/dev/null | cut -d'=' -f2- || true)}"
38
+ SLACK_BOT_TOKEN="${SLACK_BOT_TOKEN:-$(grep '^SLACK_BOT_TOKEN=' "$SCRIPT_DIR/.env" 2>/dev/null | cut -d'=' -f2- || true)}"
39
+ fi
40
+ API_URL="${EGREGORE_API_URL:-$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)}"
41
+ API_KEY="${EGREGORE_API_KEY:-}"
42
+
43
+ die() {
44
+ echo "Error: $*" >&2
45
+ exit 1
46
+ }
47
+
48
+ hash_text() {
49
+ if command -v shasum >/dev/null 2>&1; then
50
+ shasum -a 256 | awk '{print $1}'
51
+ else
52
+ sha256sum | awk '{print $1}'
53
+ fi
54
+ }
55
+
56
+ random_token() {
57
+ openssl rand -hex 16
58
+ }
59
+
60
+ plan_path() {
61
+ local id="$1"
62
+ case "$id" in
63
+ ""|*[!a-f0-9]*) die "invalid notification plan id" ;;
64
+ esac
65
+ printf '%s/%s.json\n' "$STATE_DIR" "$id"
66
+ }
67
+
68
+ read_plan() {
69
+ local id="$1"
70
+ local path
71
+ path="$(plan_path "$id")"
72
+ [ -f "$path" ] || die "notification plan not found: $id"
73
+ jq -e . "$path" >/dev/null 2>&1 || die "notification plan is unreadable: $id"
74
+ printf '%s\n' "$path"
75
+ }
76
+
77
+ canonical_plan() {
78
+ jq -cS '{
79
+ version,
80
+ id,
81
+ session_id,
82
+ mode,
83
+ org_slug,
84
+ org_name,
85
+ kind,
86
+ recipient,
87
+ message,
88
+ channels,
89
+ deliveries,
90
+ no_fallback,
91
+ expires_at,
92
+ server_plan_token
93
+ }' "$1"
94
+ }
95
+
96
+ verify_digest() {
97
+ local path="$1"
98
+ local stored actual
99
+ stored="$(jq -r '.digest' "$path")"
100
+ actual="$(canonical_plan "$path" | hash_text)"
101
+ [ "$stored" = "$actual" ] || die "notification plan changed after preview"
102
+ }
103
+
104
+ verify_live_plan() {
105
+ local path="$1"
106
+ local plan_session plan_mode expires now
107
+ plan_session="$(jq -r '.session_id' "$path")"
108
+ [ "$plan_session" = "$SESSION_ID" ] ||
109
+ die "notification approval belongs to another session"
110
+ plan_mode="$(jq -r '.mode' "$path")"
111
+ [ "$plan_mode" = "$MODE" ] ||
112
+ die "notification configuration changed; prepare it again"
113
+ expires="$(jq -r '.expires_at' "$path")"
114
+ now="$(date +%s)"
115
+ [ "$expires" -ge "$now" ] || die "notification plan expired; prepare it again"
116
+ verify_digest "$path"
117
+ }
118
+
119
+ write_plan() {
120
+ local plan_response="$1"
121
+ local kind="$2"
122
+ local recipient="$3"
123
+ local message="$4"
124
+ local id created expires path tmp
125
+ id="$(random_token | cut -c1-24)"
126
+ created="$(date +%s)"
127
+ expires="$(printf '%s' "$plan_response" | jq -r '.expires_at // empty')"
128
+ expires="${expires:-$((created + 600))}"
129
+ path="$(plan_path "$id")"
130
+ tmp="$path.tmp"
131
+
132
+ printf '%s' "$plan_response" | jq \
133
+ --arg id "$id" \
134
+ --arg session "$SESSION_ID" \
135
+ --arg mode "$MODE" \
136
+ --arg slug "$ORG_SLUG" \
137
+ --arg orgName "$ORG_NAME" \
138
+ --arg kind "$kind" \
139
+ --arg recipient "$recipient" \
140
+ --arg message "$message" \
141
+ --argjson created "$created" \
142
+ --argjson expires "$expires" \
143
+ '{
144
+ version: 1,
145
+ id: $id,
146
+ status: "proposed",
147
+ session_id: $session,
148
+ mode: $mode,
149
+ org_slug: (.org_slug // $slug),
150
+ org_name: (.org_name // $orgName),
151
+ kind: $kind,
152
+ recipient: (if $recipient == "" then null else $recipient end),
153
+ message: $message,
154
+ channels: (.channels // []),
155
+ deliveries: (.deliveries // []),
156
+ no_fallback: true,
157
+ created_at: $created,
158
+ expires_at: $expires,
159
+ server_plan_token: (.plan_token // ""),
160
+ digest: ""
161
+ }' > "$tmp"
162
+
163
+ local digest
164
+ digest="$(canonical_plan "$tmp" | hash_text)"
165
+ jq --arg digest "$digest" '.digest = $digest' "$tmp" > "$path"
166
+ rm -f "$tmp"
167
+ chmod 600 "$path" 2>/dev/null || true
168
+ jq '{
169
+ status: "approval_required",
170
+ plan_id: .id,
171
+ digest,
172
+ org: .org_name,
173
+ recipient,
174
+ channels,
175
+ deliveries,
176
+ no_fallback,
177
+ message,
178
+ expires_at
179
+ }' "$path"
180
+ }
181
+
182
+ # Channel-generic despite the name: reads any field from .egregore-state.json
183
+ # with egregore.json as the legacy fallback (telegram_*, slack_*, …).
184
+ read_local_telegram_config() {
185
+ local field="$1"
186
+ local state_file="$SCRIPT_DIR/.egregore-state.json"
187
+ local value
188
+ value="$(jq -r ".$field // empty" "$state_file" 2>/dev/null || true)"
189
+ [ -n "$value" ] ||
190
+ value="$(jq -r ".$field // empty" "$CONFIG" 2>/dev/null || true)"
191
+ printf '%s\n' "$value"
192
+ }
193
+
194
+ plan_connected() {
195
+ local kind="$1"
196
+ local recipient="$2"
197
+ local message="$3"
198
+ [ -n "$API_URL" ] && [ -n "$API_KEY" ] ||
199
+ die "notification service is not connected"
200
+
201
+ local response
202
+ response="$(curl -sS -X POST "${API_URL}/api/notify/plan" \
203
+ -H "Authorization: Bearer $API_KEY" \
204
+ -H "Content-Type: application/json" \
205
+ -d "$(jq -nc \
206
+ --arg kind "$kind" \
207
+ --arg to "$recipient" \
208
+ --arg message "$message" \
209
+ '{kind:$kind, message:$message}
210
+ + (if $to == "" then {} else {to:$to} end)')" \
211
+ --max-time 10)" || die "notification planning failed"
212
+
213
+ printf '%s' "$response" | jq -e '.status == "planned"' >/dev/null 2>&1 ||
214
+ die "$(printf '%s' "$response" | jq -r '.detail // "notification planning failed"' 2>/dev/null)"
215
+ write_plan "$response" "$kind" "$recipient" "$message"
216
+ }
217
+
218
+ plan_local() {
219
+ local kind="$1"
220
+ local recipient="$2"
221
+ local message="$3"
222
+ if [ "$kind" = "send" ]; then
223
+ die "direct messages are unavailable in local mode; no group fallback was sent"
224
+ fi
225
+
226
+ local chat_id group_link slack_channel deliveries
227
+ chat_id="$(read_local_telegram_config telegram_chat_id)"
228
+ group_link="$(read_local_telegram_config telegram_group_link)"
229
+ slack_channel="$(read_local_telegram_config slack_channel_id)"
230
+
231
+ deliveries="[]"
232
+ if [ -n "$chat_id" ] || [ -n "$group_link" ]; then
233
+ deliveries="$(printf '%s' "$deliveries" | jq -c \
234
+ --arg destination "${group_link:-$chat_id}" \
235
+ '. + [{channel:"telegram", destination:$destination, kind:"group"}]')"
236
+ fi
237
+ # Slack is local-direct (the org owns the app and token): plan it only when
238
+ # both halves of the config exist, so a half-configured Slack fails soft.
239
+ if [ -n "$slack_channel" ] && [ -n "${SLACK_BOT_TOKEN:-}" ]; then
240
+ deliveries="$(printf '%s' "$deliveries" | jq -c \
241
+ --arg destination "$slack_channel" \
242
+ '. + [{channel:"slack", destination:$destination, kind:"group"}]')"
243
+ fi
244
+ [ "$deliveries" != "[]" ] ||
245
+ die "no group notification channel is configured"
246
+
247
+ local response
248
+ response="$(jq -nc \
249
+ --arg slug "$ORG_SLUG" \
250
+ --arg org "$ORG_NAME" \
251
+ --argjson deliveries "$deliveries" \
252
+ '{
253
+ status:"planned",
254
+ org_slug:$slug,
255
+ org_name:$org,
256
+ channels:($deliveries | map(.channel)),
257
+ deliveries:$deliveries,
258
+ no_fallback:true
259
+ }')"
260
+ write_plan "$response" "$kind" "$recipient" "$message"
261
+ }
262
+
263
+ plan_notification() {
264
+ local kind="$1"
265
+ local recipient="$2"
266
+ local message="$3"
267
+ [ -n "$message" ] || die "notification message is empty"
268
+ case "$MODE" in
269
+ connected) plan_connected "$kind" "$recipient" "$message" ;;
270
+ local) plan_local "$kind" "$recipient" "$message" ;;
271
+ *) die "notifications are unavailable in this configuration" ;;
272
+ esac
273
+ }
274
+
275
+ approve_plan() {
276
+ local id="$1"
277
+ local supplied_digest="$2"
278
+ local confirmation="$3"
279
+ [ "$confirmation" = "APPROVE_EXACT_NOTIFICATION" ] ||
280
+ die "explicit notification confirmation is required"
281
+
282
+ local path status digest token token_hash tmp
283
+ path="$(read_plan "$id")"
284
+ verify_live_plan "$path"
285
+ status="$(jq -r '.status' "$path")"
286
+ [ "$status" = "proposed" ] || die "notification plan is not awaiting approval"
287
+ digest="$(jq -r '.digest' "$path")"
288
+ [ "$supplied_digest" = "$digest" ] ||
289
+ die "approval does not match the previewed notification"
290
+
291
+ token="$(random_token)"
292
+ token_hash="$(printf '%s' "$token" | hash_text)"
293
+ tmp="$path.tmp"
294
+ jq \
295
+ --arg tokenHash "$token_hash" \
296
+ --argjson approvedAt "$(date +%s)" \
297
+ '.status = "approved"
298
+ | .approval_token_hash = $tokenHash
299
+ | .approved_at = $approvedAt' "$path" > "$tmp"
300
+ mv "$tmp" "$path"
301
+ jq -nc --arg id "$id" --arg token "$token" \
302
+ '{status:"approved", plan_id:$id, approval_token:$token}'
303
+ }
304
+
305
+ mark_plan() {
306
+ local path="$1"
307
+ local status="$2"
308
+ local detail="${3:-}"
309
+ local tmp="$path.tmp"
310
+ jq \
311
+ --arg status "$status" \
312
+ --arg detail "$detail" \
313
+ --argjson changedAt "$(date +%s)" \
314
+ '.status = $status
315
+ | .status_detail = (if $detail == "" then null else $detail end)
316
+ | .status_changed_at = $changedAt' "$path" > "$tmp"
317
+ mv "$tmp" "$path"
318
+ }
319
+
320
+ dispatch_connected() {
321
+ local path="$1"
322
+ local kind message plan_token response
323
+ kind="$(jq -r '.kind' "$path")"
324
+ message="$(jq -r '.message' "$path")"
325
+ plan_token="$(jq -r '.server_plan_token' "$path")"
326
+
327
+ if [ "$kind" = "send" ]; then
328
+ local recipient channel
329
+ recipient="$(jq -r '.recipient' "$path")"
330
+ channel="$(jq -r '.channels[0]' "$path")"
331
+ response="$(curl -sS -X POST "${API_URL}/api/notify/send" \
332
+ -H "Authorization: Bearer $API_KEY" \
333
+ -H "Content-Type: application/json" \
334
+ -d "$(jq -nc \
335
+ --arg to "$recipient" \
336
+ --arg message "$message" \
337
+ --arg channel "$channel" \
338
+ --arg planToken "$plan_token" \
339
+ '{to:$to,message:$message,channel:$channel,plan_token:$planToken}')" \
340
+ --max-time 10)" || return 1
341
+ else
342
+ local channels
343
+ channels="$(jq -c '.channels' "$path")"
344
+ response="$(curl -sS -X POST "${API_URL}/api/notify/group" \
345
+ -H "Authorization: Bearer $API_KEY" \
346
+ -H "Content-Type: application/json" \
347
+ -d "$(jq -nc \
348
+ --arg message "$message" \
349
+ --arg planToken "$plan_token" \
350
+ --argjson channels "$channels" \
351
+ '{message:$message,channels:$channels,plan_token:$planToken}')" \
352
+ --max-time 10)" || return 1
353
+ fi
354
+
355
+ printf '%s' "$response" | jq -e '.status == "sent"' >/dev/null 2>&1 || {
356
+ printf '%s\n' "$response"
357
+ return 1
358
+ }
359
+ printf '%s\n' "$response"
360
+ }
361
+
362
+ dispatch_local_telegram() {
363
+ local destination="$1"
364
+ local message="$2"
365
+ local plan_slug="$3"
366
+ local plan_org="$4"
367
+ local chat_id group_link
368
+ case "$destination" in
369
+ https://t.me/*)
370
+ chat_id=""
371
+ group_link="$destination"
372
+ ;;
373
+ *)
374
+ chat_id="$destination"
375
+ group_link=""
376
+ ;;
377
+ esac
378
+ curl -sS -X POST "${RELAY_URL}/api/notify/relay" \
379
+ -H "Content-Type: application/json" \
380
+ -d "$(jq -nc \
381
+ --arg chat_id "$chat_id" \
382
+ --arg group_link "$group_link" \
383
+ --arg message "$message" \
384
+ --arg slug "$plan_slug" \
385
+ --arg org_name "$plan_org" \
386
+ '{chat_id:$chat_id,group_link:$group_link,message:$message,slug:$slug,org_name:$org_name}')" \
387
+ --max-time 10
388
+ }
389
+
390
+ # Local-direct: the org owns the Slack app and token, so the message goes
391
+ # straight from this machine to Slack — never through the Egregore relay.
392
+ dispatch_local_slack() {
393
+ local destination="$1"
394
+ local message="$2"
395
+ if [ -z "${SLACK_BOT_TOKEN:-}" ]; then
396
+ jq -nc '{status:"error",detail:"SLACK_BOT_TOKEN is missing from .env"}'
397
+ return 0
398
+ fi
399
+ local response
400
+ response="$(curl -sS -X POST "https://slack.com/api/chat.postMessage" \
401
+ -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
402
+ -H "Content-Type: application/json; charset=utf-8" \
403
+ -d "$(jq -nc \
404
+ --arg channel "$destination" \
405
+ --arg text "$message" \
406
+ '{channel:$channel,text:$text,unfurl_links:false}')" \
407
+ --max-time 10)" || {
408
+ jq -nc '{status:"error",detail:"Slack request failed"}'
409
+ return 0
410
+ }
411
+ if printf '%s' "$response" | jq -e '.ok == true' >/dev/null 2>&1; then
412
+ jq -nc '{status:"sent"}'
413
+ else
414
+ jq -nc \
415
+ --arg detail "$(printf '%s' "$response" | jq -r '.error // "unknown"' 2>/dev/null || echo unknown)" \
416
+ '{status:"error",detail:$detail}'
417
+ fi
418
+ }
419
+
420
+ dispatch_local() {
421
+ local path="$1"
422
+ local message plan_slug plan_org count i channel destination result
423
+ message="$(jq -r '.message' "$path")"
424
+ plan_slug="$(jq -r '.org_slug' "$path")"
425
+ plan_org="$(jq -r '.org_name' "$path")"
426
+ count="$(jq -r '.deliveries | length' "$path")"
427
+
428
+ # One platform failing must not mask another succeeding (mirror of the
429
+ # server-side send_group semantics).
430
+ local results="{}"
431
+ i=0
432
+ while [ "$i" -lt "$count" ]; do
433
+ channel="$(jq -r ".deliveries[$i].channel" "$path")"
434
+ destination="$(jq -r ".deliveries[$i].destination" "$path")"
435
+ case "$channel" in
436
+ telegram)
437
+ result="$(dispatch_local_telegram "$destination" "$message" "$plan_slug" "$plan_org")" ||
438
+ result='{"status":"error","detail":"relay request failed"}'
439
+ printf '%s' "$result" | jq -e . >/dev/null 2>&1 ||
440
+ result='{"status":"error","detail":"relay returned an unreadable response"}'
441
+ ;;
442
+ slack)
443
+ result="$(dispatch_local_slack "$destination" "$message")"
444
+ ;;
445
+ *)
446
+ result='{"status":"error","detail":"Unsupported channel"}'
447
+ ;;
448
+ esac
449
+ results="$(printf '%s' "$results" | jq -c --arg ch "$channel" --argjson r "$result" '. + {($ch): $r}')"
450
+ i=$((i + 1))
451
+ done
452
+
453
+ local sent
454
+ sent="$(printf '%s' "$results" | jq -c '[to_entries[] | select(.value.status == "sent") | .key]')"
455
+ if [ "$sent" = "[]" ]; then
456
+ printf '%s\n' "$results"
457
+ return 1
458
+ fi
459
+ printf '%s' "$results" | jq -c --argjson sent "$sent" \
460
+ '{status:"sent", platforms:$sent}
461
+ + ([to_entries[] | select(.value.status != "sent")] as $f
462
+ | if ($f | length) > 0
463
+ then {failed: ($f | map({(.key): (.value.detail // "unknown")}) | add)}
464
+ else {} end)'
465
+ }
466
+
467
+ dispatch_plan() {
468
+ local id="$1"
469
+ local approval_token="$2"
470
+ local path status expected_hash actual_hash lock response
471
+ path="$(read_plan "$id")"
472
+ verify_live_plan "$path"
473
+ status="$(jq -r '.status' "$path")"
474
+ [ "$status" = "approved" ] || die "notification plan has not been explicitly approved"
475
+ expected_hash="$(jq -r '.approval_token_hash' "$path")"
476
+ actual_hash="$(printf '%s' "$approval_token" | hash_text)"
477
+ [ "$expected_hash" = "$actual_hash" ] || die "notification approval token is invalid"
478
+
479
+ lock="$path.lock"
480
+ mkdir "$lock" 2>/dev/null || die "notification dispatch is already in progress"
481
+ NOTIFY_LOCK="$lock"
482
+ trap '[ -z "${NOTIFY_LOCK:-}" ] || rmdir "$NOTIFY_LOCK" 2>/dev/null || true' EXIT
483
+
484
+ # Consume approval before the network call. An uncertain failure requires a
485
+ # new plan rather than risking a duplicate external message.
486
+ mark_plan "$path" "dispatching"
487
+ if [ "$MODE" = "connected" ]; then
488
+ if ! response="$(dispatch_connected "$path")"; then
489
+ mark_plan "$path" "failed" "dispatch failed; prepare and approve a new plan"
490
+ die "notification dispatch failed; no fallback was attempted"
491
+ fi
492
+ else
493
+ if ! response="$(dispatch_local "$path")"; then
494
+ mark_plan "$path" "failed" "dispatch failed; prepare and approve a new plan"
495
+ die "notification dispatch failed; no fallback was attempted"
496
+ fi
497
+ fi
498
+
499
+ mark_plan "$path" "sent"
500
+ rmdir "$lock" 2>/dev/null || true
501
+ NOTIFY_LOCK=""
502
+ trap - EXIT
503
+ bash "$SCRIPT_DIR/bin/telemetry.sh" emit "notification" \
504
+ "$(jq -nc --arg kind "$(jq -r '.kind' "$path")" \
505
+ '{type:$kind,status:"sent",consent:"explicit"}')" 2>/dev/null &
506
+ jq -nc \
507
+ --arg id "$id" \
508
+ --argjson result "$response" \
509
+ '{status:"sent",plan_id:$id,result:$result}'
510
+ }
511
+
512
+ show_plan() {
513
+ local path
514
+ path="$(read_plan "$1")"
515
+ jq '{
516
+ status,
517
+ plan_id:.id,
518
+ digest,
519
+ org:.org_name,
520
+ recipient,
521
+ channels,
522
+ deliveries,
523
+ no_fallback,
524
+ message,
525
+ expires_at
526
+ }' "$path"
527
+ }
528
+
529
+ cancel_plan() {
530
+ local path status
531
+ path="$(read_plan "$1")"
532
+ status="$(jq -r '.status' "$path")"
533
+ case "$status" in
534
+ proposed|approved|failed) mark_plan "$path" "cancelled" ;;
535
+ *) die "notification plan cannot be cancelled from status: $status" ;;
536
+ esac
537
+ jq -nc --arg id "$1" '{status:"cancelled",plan_id:$id}'
538
+ }
539
+
540
+ list_pending() {
541
+ local found="false"
542
+ for path in "$STATE_DIR"/*.json; do
543
+ [ -f "$path" ] || continue
544
+ if jq -e '.status == "proposed" or .status == "approved"' "$path" >/dev/null 2>&1; then
545
+ jq -c '{plan_id:.id,status,org:.org_name,recipient,channels,message,expires_at}' "$path"
546
+ found="true"
547
+ fi
548
+ done
549
+ [ "$found" = "true" ] || echo '{"status":"empty"}'
550
+ }
551
+
552
+ test_connection() {
553
+ if [ "$MODE" = "connected" ]; then
554
+ [ -n "$API_URL" ] && [ -n "$API_KEY" ] ||
555
+ die "notification service is not connected"
556
+ curl -sS -X GET "${API_URL}/api/notify/test" \
557
+ -H "Authorization: Bearer $API_KEY" \
558
+ --max-time 10
559
+ elif [ "$MODE" = "local" ]; then
560
+ local group_link slack_channel
561
+ group_link="$(read_local_telegram_config telegram_group_link)"
562
+ slack_channel="$(read_local_telegram_config slack_channel_id)"
563
+ if [ -n "$group_link" ] ||
564
+ { [ -n "$slack_channel" ] && [ -n "${SLACK_BOT_TOKEN:-}" ]; }; then
565
+ echo '{"status":"configured","mode":"local"}'
566
+ else
567
+ echo '{"status":"offline","reason":"no_notification_channel"}'
568
+ fi
569
+ else
570
+ echo '{"status":"offline","reason":"no_api_key"}'
571
+ fi
572
+ }
573
+
574
+ case "${1:-help}" in
575
+ plan)
576
+ case "${2:-}" in
577
+ send)
578
+ [ "$#" -eq 4 ] || die "Usage: notify.sh plan send <recipient> <message>"
579
+ plan_notification "send" "$3" "$4"
580
+ ;;
581
+ group)
582
+ [ "$#" -eq 3 ] || die "Usage: notify.sh plan group <message>"
583
+ plan_notification "group" "" "$3"
584
+ ;;
585
+ *) die "Usage: notify.sh plan send|group ..." ;;
586
+ esac
587
+ ;;
588
+ approve)
589
+ [ "$#" -eq 4 ] || die "Usage: notify.sh approve <plan-id> <digest> APPROVE_EXACT_NOTIFICATION"
590
+ approve_plan "$2" "$3" "$4"
591
+ ;;
592
+ dispatch)
593
+ [ "$#" -eq 3 ] || die "Usage: notify.sh dispatch <plan-id> <approval-token>"
594
+ dispatch_plan "$2" "$3"
595
+ ;;
596
+ show)
597
+ [ "$#" -eq 2 ] || die "Usage: notify.sh show <plan-id>"
598
+ show_plan "$2"
599
+ ;;
600
+ cancel)
601
+ [ "$#" -eq 2 ] || die "Usage: notify.sh cancel <plan-id>"
602
+ cancel_plan "$2"
603
+ ;;
604
+ pending)
605
+ list_pending
606
+ ;;
607
+ send)
608
+ [ "$#" -eq 3 ] || die "Usage: notify.sh send <recipient> <message>"
609
+ plan_notification "send" "$2" "$3"
610
+ echo "Approval required — no notification was sent." >&2
611
+ exit 4
612
+ ;;
613
+ group)
614
+ [ "$#" -eq 2 ] || die "Usage: notify.sh group <message>"
615
+ plan_notification "group" "" "$2"
616
+ echo "Approval required — no notification was sent." >&2
617
+ exit 4
618
+ ;;
619
+ test)
620
+ test_connection
621
+ ;;
622
+ help|*)
623
+ echo "Usage: notify.sh <command>"
624
+ echo ""
625
+ echo "Commands:"
626
+ echo " plan send <name> <message> Resolve a DM without sending"
627
+ echo " plan group <message> Resolve group channels without sending"
628
+ echo " approve <id> <digest> APPROVE_EXACT_NOTIFICATION"
629
+ echo " Record one exact human approval"
630
+ echo " dispatch <id> <token> Consume approval and send stored content"
631
+ echo " show <id> Show exact pending content"
632
+ echo " cancel <id> Cancel a pending plan"
633
+ echo " pending List pending plans"
634
+ echo " test Test configuration without sending"
635
+ ;;
636
+ esac
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # Compile authorized organizational context for harness UserPromptSubmit hooks.
3
+ # Input: the harness hook JSON on stdin. Output: a hook additionalContext JSON
4
+ # envelope, or nothing when the prompt is not organizational recall.
5
+
6
+ set -u
7
+
8
+ ROOT="${EGREGORE_ROOT:-${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "$0")/.." && pwd)}}"
9
+ HARNESS="${1:-shell}"
10
+
11
+ EGREGORE_ROOT="$ROOT" \
12
+ EGREGORE_RUNTIME="$HARNESS" \
13
+ PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}" \
14
+ python3 -m egregore_runtime.harness_cli prompt-hook --harness "$HARNESS" || true
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
+ export EGREGORE_ROOT="${EGREGORE_ROOT:-$ROOT}"
6
+ exec python3 -m egregore_runtime.onboarding_cli "$@"