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,692 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ # handoff-run.sh — atomic orchestrator for /handoff.
4
+ #
5
+ # Everything mechanical happens here, in one bash process, so the main
6
+ # session renders a single collapsed Bash tool block instead of 6+.
7
+ #
8
+ # Usage:
9
+ # bash bin/handoff-run.sh \
10
+ # --author <handle> \
11
+ # --topic "<short topic>" \
12
+ # [--recipient <name>] \
13
+ # [--project <name>] \
14
+ # [--intent <action|feedback|fyi>] \
15
+ # [--content-mode <supplied|generated>] \
16
+ # [--include-session-artifacts] \
17
+ # <<'HANDOFFEOF'
18
+ # ...full markdown body of the handoff...
19
+ # HANDOFFEOF
20
+ #
21
+ # The full file body is read from stdin. The script:
22
+ # 1. Computes the file path: memory/handoffs/YYYY-MM/DD-author-slug.md
23
+ # 2. Writes the file
24
+ # 3. In generated mode, appends ## Repo State when non-empty
25
+ # 4. Prepends memory/handoffs/index.md with a new entry
26
+ # 5. Runs bin/index-handoff.sh (connected mode only) — creates Session node
27
+ # and returns a subgraph snapshot in the result JSON
28
+ # 6. Commits + pushes memory repo (with orphan-stash dance if needed)
29
+ # 7. Publishes HTML artifact via bin/publish-artifact.sh
30
+ # 8. Creates an exact notification proposal via bin/notify.sh (never sends)
31
+ # 9. Emits ONE status line and ONE JSON blob on stdout
32
+ #
33
+ # Exit codes:
34
+ # 0 on success (even if graph/publish/notify individually fail — they are
35
+ # non-blocking and reported in the JSON).
36
+ # 1 on unrecoverable failure (file write, memory push, bad args).
37
+
38
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
39
+ # shellcheck source=bin/lib/git-message.sh
40
+ if [ -f "$SCRIPT_DIR/bin/lib/git-message.sh" ]; then
41
+ . "$SCRIPT_DIR/bin/lib/git-message.sh"
42
+ fi
43
+ type egregore_commit >/dev/null 2>&1 || egregore_commit() {
44
+ local gd="$1" m="$3"; shift 3; git -C "$gd" commit -m "$m" "$@"
45
+ }
46
+ CONFIG="$SCRIPT_DIR/egregore.json"
47
+
48
+ if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
49
+ sed -n '2,30p' "$0"
50
+ exit 0
51
+ fi
52
+
53
+ # --- Parse args ----------------------------------------------------------
54
+ AUTHOR=""
55
+ TOPIC=""
56
+ RECIPIENT=""
57
+ PROJECT=""
58
+ INTENT="action"
59
+ NO_PUSH=0
60
+ NO_NOTIFY=0
61
+ NO_PUBLISH=0
62
+ NO_INDEX=0
63
+ COMPOSED="" # optional house-kit JSON — the agent-composed render spec
64
+ CONTENT_MODE="generated"
65
+ INCLUDE_SESSION_ARTIFACTS=0
66
+
67
+ while [ $# -gt 0 ]; do
68
+ case "$1" in
69
+ --author) AUTHOR="${2:?}"; shift 2 ;;
70
+ --topic) TOPIC="${2:?}"; shift 2 ;;
71
+ --recipient) RECIPIENT="${2:-}"; shift 2 ;;
72
+ --project) PROJECT="${2:-}"; shift 2 ;;
73
+ --intent) INTENT="${2:-}"; shift 2 ;;
74
+ --composed) COMPOSED="${2:-}"; shift 2 ;;
75
+ --content-mode) CONTENT_MODE="${2:-}"; shift 2 ;;
76
+ --include-session-artifacts) INCLUDE_SESSION_ARTIFACTS=1; shift ;;
77
+ --no-push) NO_PUSH=1; shift ;;
78
+ --no-notify) NO_NOTIFY=1; shift ;;
79
+ --no-publish) NO_PUBLISH=1; shift ;;
80
+ --no-index) NO_INDEX=1; shift ;;
81
+ *) echo "Unknown arg: $1" >&2; exit 1 ;;
82
+ esac
83
+ done
84
+
85
+ # The render source: the agent-composed house-kit JSON when supplied (rich
86
+ # component render), else the markdown handoff (deterministic floor). The
87
+ # markdown file is ALWAYS the memory record + graph index either way.
88
+ RENDER_TYPE="handoff"
89
+ RENDER_SRC="" # resolved to $ABS_FILE after the file is written, unless composed
90
+ if [ "$CONTENT_MODE" = "generated" ] && [ -n "$COMPOSED" ] && [ -f "$COMPOSED" ]; then
91
+ RENDER_TYPE="composed"
92
+ RENDER_SRC="$COMPOSED"
93
+ fi
94
+
95
+ [ -z "$AUTHOR" ] && { echo "Missing --author" >&2; exit 1; }
96
+ [ -z "$TOPIC" ] && { echo "Missing --topic" >&2; exit 1; }
97
+ case "$INTENT" in
98
+ action|feedback|fyi) ;;
99
+ *) echo "Invalid --intent: $INTENT (action|feedback|fyi)" >&2; exit 1 ;;
100
+ esac
101
+ case "$CONTENT_MODE" in
102
+ supplied|generated) ;;
103
+ *) echo "Invalid --content-mode: $CONTENT_MODE (supplied|generated)" >&2; exit 1 ;;
104
+ esac
105
+ if [ "$CONTENT_MODE" = "supplied" ] && [ -n "$COMPOSED" ]; then
106
+ echo "--composed cannot be used with --content-mode supplied" >&2
107
+ exit 1
108
+ fi
109
+
110
+ MODE=$(jq -r '.mode // "connected"' "$CONFIG" 2>/dev/null || echo "connected")
111
+ GRAPH_ENABLED="${EGREGORE_GRAPH_PROJECTION:-0}"
112
+ TODAY=$(date +%Y-%m-%d)
113
+ YYYY_MM=$(date +%Y-%m)
114
+ DD=$(date +%d)
115
+
116
+ # --- Derive slug + file path --------------------------------------------
117
+ _slugify() {
118
+ echo "$1" \
119
+ | tr '[:upper:]' '[:lower:]' \
120
+ | sed -E 's/[^a-z0-9]+/-/g' \
121
+ | sed -E 's/^-+|-+$//g' \
122
+ | cut -c1-50
123
+ }
124
+
125
+ SLUG=$(_slugify "$TOPIC")
126
+ REL_FILE="handoffs/${YYYY_MM}/${DD}-${AUTHOR}-${SLUG}.md"
127
+ ABS_FILE="$SCRIPT_DIR/memory/${REL_FILE}"
128
+
129
+ # Collision avoidance: append -N if file already exists
130
+ N=2
131
+ while [ -e "$ABS_FILE" ]; do
132
+ REL_FILE="handoffs/${YYYY_MM}/${DD}-${AUTHOR}-${SLUG}-${N}.md"
133
+ ABS_FILE="$SCRIPT_DIR/memory/${REL_FILE}"
134
+ N=$((N+1))
135
+ [ $N -gt 99 ] && { echo "Too many collisions for $SLUG" >&2; exit 1; }
136
+ done
137
+
138
+ mkdir -p "$(dirname "$ABS_FILE")"
139
+
140
+ # --- Write the file from stdin ------------------------------------------
141
+ cat > "$ABS_FILE"
142
+
143
+ if [ ! -s "$ABS_FILE" ]; then
144
+ echo "Empty stdin — handoff body is required" >&2
145
+ rm -f "$ABS_FILE"
146
+ exit 1
147
+ fi
148
+
149
+ # --- Canonical metadata boundary ----------------------------------------
150
+ # Callers are allowed to send prose-only markdown, but persisted handoffs are
151
+ # not. Normalize every input to the same frontmatter contract before indexing
152
+ # or rendering so title/author/recipient cannot disappear at the adapter seam.
153
+ HAS_FRONTMATTER=0
154
+ [ "$(head -1 "$ABS_FILE")" = "---" ] && HAS_FRONTMATTER=1
155
+
156
+ _has_frontmatter_key() {
157
+ [ "$HAS_FRONTMATTER" = "1" ] && sed -n '2,/^---$/p' "$ABS_FILE" | grep -qiE "^${1}:"
158
+ }
159
+
160
+ MISSING_SCHEMA=0; _has_frontmatter_key capture_schema || MISSING_SCHEMA=1
161
+ MISSING_MODE=0; _has_frontmatter_key capture_mode || MISSING_MODE=1
162
+ MISSING_KIND=0; _has_frontmatter_key kind || MISSING_KIND=1
163
+ MISSING_FROM=0; _has_frontmatter_key from || _has_frontmatter_key author || MISSING_FROM=1
164
+ MISSING_DATE=0; _has_frontmatter_key date || MISSING_DATE=1
165
+ MISSING_TOPIC=0; _has_frontmatter_key topic || MISSING_TOPIC=1
166
+ MISSING_INTENT=0; _has_frontmatter_key intent || MISSING_INTENT=1
167
+ MISSING_CONTENT_MODE=0; _has_frontmatter_key content_mode || MISSING_CONTENT_MODE=1
168
+ MISSING_RECIPIENT=0
169
+ if [ -n "$RECIPIENT" ]; then
170
+ _has_frontmatter_key addressed_to || _has_frontmatter_key to || MISSING_RECIPIENT=1
171
+ fi
172
+
173
+ awk \
174
+ -v has_frontmatter="$HAS_FRONTMATTER" \
175
+ -v schema="$MISSING_SCHEMA" -v mode="$MISSING_MODE" -v kind="$MISSING_KIND" \
176
+ -v from="$MISSING_FROM" -v date_missing="$MISSING_DATE" \
177
+ -v topic_missing="$MISSING_TOPIC" -v intent_missing="$MISSING_INTENT" \
178
+ -v content_mode_missing="$MISSING_CONTENT_MODE" \
179
+ -v recipient_missing="$MISSING_RECIPIENT" \
180
+ -v author="$AUTHOR" -v date="$TODAY" -v topic="$TOPIC" \
181
+ -v intent="$INTENT" -v recipient="$RECIPIENT" -v content_mode="$CONTENT_MODE" '
182
+ function metadata() {
183
+ if (schema) print "capture_schema: egregore-capture/v1"
184
+ if (mode) print "capture_mode: addressed"
185
+ if (kind) print "kind: addressed"
186
+ if (from) print "from: " author
187
+ if (recipient_missing) print "addressed_to: " recipient
188
+ if (date_missing) print "date: " date
189
+ if (topic_missing) print "topic: " topic
190
+ if (intent_missing) print "intent: " intent
191
+ if (content_mode_missing) print "content_mode: " content_mode
192
+ }
193
+ BEGIN {
194
+ if (!has_frontmatter) {
195
+ print "---"
196
+ metadata()
197
+ print "---"
198
+ if (content_mode != "supplied") print ""
199
+ }
200
+ }
201
+ has_frontmatter && NR == 1 {
202
+ print
203
+ metadata()
204
+ next
205
+ }
206
+ { print }
207
+ ' "$ABS_FILE" > "$ABS_FILE.new" && mv "$ABS_FILE.new" "$ABS_FILE"
208
+
209
+ # --- Append repo state ---------------------------------------------------
210
+ # --no-pr skips `gh pr list` (~400–600ms per repo). A detached PR backfill
211
+ # after the parallel phase rewrites `—` → `#N` and re-pushes memory.
212
+ REPO_STATE=""
213
+ if [ "$CONTENT_MODE" = "generated" ] || [ "$INCLUDE_SESSION_ARTIFACTS" = "1" ]; then
214
+ REPO_STATE=$(bash "$SCRIPT_DIR/bin/repo-state.sh" --no-pr 2>/dev/null || true)
215
+ fi
216
+ if [ -n "$REPO_STATE" ]; then
217
+ printf '\n%s\n' "$REPO_STATE" >> "$ABS_FILE"
218
+ fi
219
+
220
+ # --- Legacy handoff ledger ----------------------------------------------
221
+ # Runtime-owned capture skips this compatibility index. The canonical handoff
222
+ # file is independently discoverable and QMD is a rebuildable projection;
223
+ # mutating a second Markdown file would create a second canonical write that
224
+ # the Runtime transaction did not authorize or include in provenance.
225
+ if [ "$NO_INDEX" = "0" ]; then
226
+ INDEX="$SCRIPT_DIR/memory/handoffs/index.md"
227
+ mkdir -p "$(dirname "$INDEX")"
228
+ [ -f "$INDEX" ] || printf '# Handoffs\n\n' > "$INDEX"
229
+
230
+ if [ -n "$RECIPIENT" ]; then
231
+ IDX_LINE="- **${TODAY}** — ${AUTHOR}: ${TOPIC} (handoff to ${RECIPIENT})"
232
+ else
233
+ IDX_LINE="- **${TODAY}** — ${AUTHOR}: ${TOPIC} (handoff)"
234
+ fi
235
+
236
+ awk -v line="$IDX_LINE" '
237
+ BEGIN { inserted = 0 }
238
+ /^$/ && !inserted { print; print line; inserted = 1; next }
239
+ { print }
240
+ END { if (!inserted) print line }
241
+ ' "$INDEX" > "$INDEX.new" && mv "$INDEX.new" "$INDEX"
242
+ fi
243
+
244
+ # --- Parallel stage: graph + memory + (publish → notification proposal) -
245
+ #
246
+ # Three independent branches fork here and join before we emit the result:
247
+ # A. Graph index — reads ABS_FILE, writes Session node to Neo4j, and
248
+ # returns the handoff's neighborhood as subgraph JSON.
249
+ # B. Memory push — commits + pushes memory repo (orphan-stash dance).
250
+ # C. Publish+plan — publishes HTML artifact, then creates an immutable
251
+ # notification proposal with the artifact URL embedded.
252
+ #
253
+ # Each branch writes its result to a tmpfile. Wall-clock is max(A,B,C).
254
+ #
255
+ # The published artifact runs its own live re-query via bin/graph.sh at
256
+ # render time, so it picks up the subgraph even though Branch A may not
257
+ # have indexed the session yet by the time Branch C fires publish.
258
+
259
+ MEMORY_DIR="$SCRIPT_DIR/memory"
260
+
261
+ TMPD=$(mktemp -d -t handoff-run-XXXXXX)
262
+ trap 'rm -rf "$TMPD"' EXIT
263
+
264
+ # Extract briefing text once (used by publish and the proposal) so we don't
265
+ # re-awk the same file inside multiple workers.
266
+ BRIEFING_LEAD=$(awk '/^## Briefing/{found=1; next} found && /^##/{exit} found && NF{print}' "$ABS_FILE" 2>/dev/null \
267
+ | head -2 | tr '\n' ' ' | cut -c1-200 || true)
268
+ BRIEFING_SHORT=$(awk '/^## Briefing/{found=1; next} found && /^##/{exit} found && NF{print}' "$ABS_FILE" 2>/dev/null \
269
+ | head -3 | tr '\n' ' ' | cut -c1-280 || true)
270
+
271
+ # --- Branch A: Graph index ---
272
+ (
273
+ if [ "$MODE" = "connected" ] && [ "$GRAPH_ENABLED" = "1" ]; then
274
+ GJ=$(bash "$SCRIPT_DIR/bin/index-handoff.sh" "$ABS_FILE" 2>/dev/null || echo '{}')
275
+ SID=$(echo "$GJ" | jq -r '.sessionId // ""' 2>/dev/null || echo "")
276
+ RES=$(echo "$GJ" | jq -r '.resolved // 0' 2>/dev/null || echo 0)
277
+ SG=$(echo "$GJ" | jq -c '.subgraph // null' 2>/dev/null || echo "null")
278
+ echo "$SG" > "$TMPD/subgraph"
279
+ if [ -n "$SID" ]; then
280
+ printf '%s\n%s\nok\n' "$SID" "$RES" > "$TMPD/graph"
281
+ else
282
+ printf '\n0\noffline\n' > "$TMPD/graph"
283
+ fi
284
+ else
285
+ echo "null" > "$TMPD/subgraph"
286
+ printf '\n0\ndisabled\n' > "$TMPD/graph"
287
+ fi
288
+ ) &
289
+ PID_GRAPH=$!
290
+
291
+ # --- Branch D: Today's artifacts (connected mode only) ---
292
+ # The graph is the right tool for this: indexed by date + author + excluded
293
+ # tag, returns a small structured list. The filesystem would require a full
294
+ # walk of memory/knowledge/* to answer. Runs in parallel; Branch B waits on
295
+ # this before committing so the file always has the section.
296
+ (
297
+ ARTIFACTS_JSON="[]"
298
+ if [ "$MODE" = "connected" ] && [ "$GRAPH_ENABLED" = "1" ]; then
299
+ YY=$(date +%Y); MM=$(date +%-m); DD_NUM=$(date +%-d)
300
+ RAW=$(bash "$SCRIPT_DIR/bin/graph.sh" query "
301
+ MATCH (a:Artifact)-[:CONTRIBUTED_BY]->(p:Person {github: \$gh})
302
+ WHERE a.created >= datetime({year: $YY, month: $MM, day: $DD_NUM})
303
+ AND NOT 'tutorial-generated' IN coalesce(a.topics, [])
304
+ RETURN a.title AS title, a.type AS type, a.filePath AS path
305
+ ORDER BY a.created DESC
306
+ LIMIT 5" "$(jq -nc --arg gh "$AUTHOR" '{gh:$gh}')" 2>/dev/null || echo '{}')
307
+ # Response shape: {"fields":[...], "values":[[...], ...]}. Convert to
308
+ # an array of {title, type, path} objects.
309
+ ARTIFACTS_JSON=$(echo "$RAW" | jq -c '
310
+ (.fields // []) as $f
311
+ | (.values // [])
312
+ | map(. as $row | reduce range(0; ($f | length)) as $i ({}; .[$f[$i]] = $row[$i]))
313
+ ' 2>/dev/null || echo '[]')
314
+ [ -z "$ARTIFACTS_JSON" ] && ARTIFACTS_JSON="[]"
315
+ fi
316
+ echo "$ARTIFACTS_JSON" > "$TMPD/artifacts"
317
+ ) &
318
+ PID_ARTIFACTS=$!
319
+
320
+ # --- Branch B: Memory commit + push ---
321
+ (
322
+ if [ "$NO_PUSH" = "1" ]; then
323
+ echo "skipped (--no-push)" > "$TMPD/memory"
324
+ else
325
+ # Wait for Branch D (artifacts query) so the committed file has the
326
+ # `## Session Artifacts` section. D is fast (~1s) and runs parallel
327
+ # with Branch A; this wait doesn't extend the critical path because
328
+ # Branch C (publish) is the bottleneck.
329
+ wait "$PID_ARTIFACTS" 2>/dev/null || true
330
+ if [ -s "$TMPD/artifacts" ]; then
331
+ ART_COUNT=$(jq 'length' "$TMPD/artifacts" 2>/dev/null || echo 0)
332
+ if [ "${ART_COUNT:-0}" -gt 0 ]; then
333
+ {
334
+ printf '\n## Session Artifacts\n\n'
335
+ jq -r '.[] | "- \(.type // "Artifact"): \(.title) -> \(.path // "")"' "$TMPD/artifacts" 2>/dev/null
336
+ } >> "$ABS_FILE"
337
+ fi
338
+ fi
339
+
340
+ cd "$MEMORY_DIR"
341
+ if [ "$NO_INDEX" = "1" ]; then
342
+ git add "$REL_FILE" >/dev/null 2>&1
343
+ else
344
+ git add "$REL_FILE" handoffs/index.md >/dev/null 2>&1
345
+ fi
346
+
347
+ if [ -n "$RECIPIENT" ]; then
348
+ MSG_COMMIT="chore(handoff): record ${TOPIC} (to ${RECIPIENT})"
349
+ else
350
+ MSG_COMMIT="chore(handoff): record ${TOPIC}"
351
+ fi
352
+
353
+ egregore_commit . "$SCRIPT_DIR" "$MSG_COMMIT" >/dev/null 2>&1 || true
354
+
355
+ STASHED=0
356
+ if [ -n "$(git status --porcelain 2>/dev/null)" ]; then
357
+ git stash push -u -m "handoff-run pre-pull stash" >/dev/null 2>&1 && STASHED=1
358
+ fi
359
+
360
+ MEM_OK=0
361
+ for i in 1 2 3; do
362
+ if git pull --rebase origin main --quiet >/dev/null 2>&1 \
363
+ && git push origin main --quiet >/dev/null 2>&1; then
364
+ MEM_OK=1
365
+ break
366
+ fi
367
+ sleep 1
368
+ done
369
+
370
+ [ "$STASHED" = "1" ] && git stash pop >/dev/null 2>&1 || true
371
+
372
+ if [ "$MEM_OK" = "1" ]; then
373
+ echo "ok" > "$TMPD/memory"
374
+ else
375
+ echo "failed" > "$TMPD/memory"
376
+ fi
377
+ fi
378
+ ) &
379
+ PID_MEMORY=$!
380
+
381
+ # --- Branch C: Publish artifact → Notify ---
382
+ #
383
+ # Strategy: handoffs publish ONCE, through the emissary write API, using
384
+ # `render_mode: "custom"` so the server serves OUR pre-rendered HTML
385
+ # verbatim (the same egregore-artifacts handoff template /view/ has
386
+ # always used). This gives us:
387
+ # - one artifact, one URL (no legacy + new double-publish)
388
+ # - permanent egregore.xyz/emissary/e/<id> URL with /raw endpoint
389
+ # - handoff design fully owned client-side (egregore-artifacts) — the
390
+ # emissary server template is never invoked for handoffs and remains
391
+ # completely untouched
392
+ #
393
+ # Fallback: if emissary publish fails (token missing, network, size cap,
394
+ # rendering failure), fall back to the legacy publish-artifact.sh path so
395
+ # a handoff still gets a Telegram-able URL.
396
+ (
397
+ V1URL=""
398
+ AURL=""
399
+ if [ "$NO_PUBLISH" = "0" ]; then
400
+ EMISSARY_CONFIG="$HOME/.egregore/emissary-config.json"
401
+ EMISSARY_TOKEN=""
402
+ if [ -f "$EMISSARY_CONFIG" ]; then
403
+ EMISSARY_TOKEN=$(jq -r '.auth_token // empty' "$EMISSARY_CONFIG" 2>/dev/null)
404
+ fi
405
+ EMISSARY_API_URL="${EMISSARY_API_URL:-https://egregore-production-55f2.up.railway.app/api/v1/emissary}"
406
+
407
+ # /handoff is an internal team primitive, not an implicit public-emissary
408
+ # composer. Use the emissary route only for an explicit recipient, and make
409
+ # that artifact directed-private. Recipient-less handoffs fall through to
410
+ # the org-scoped publisher (connected) or opt-in relay (local).
411
+ if [ -n "$EMISSARY_TOKEN" ] && [ -n "$RECIPIENT" ]; then
412
+ # Step 1: render the handoff to HTML locally using egregore-artifacts.
413
+ # Same renderer + template publish-artifact.sh uses today — handoffs
414
+ # keep their familiar look.
415
+ RENDERED_HTML="$TMPD/handoff.html"
416
+ RENDER_OK=0
417
+ LOCAL_CLI="$SCRIPT_DIR/packages/egregore-artifacts/bin/cli.js"
418
+ FIDELITY_ARGS=(--verify-fidelity)
419
+ if [ "$RENDER_TYPE" = "composed" ]; then
420
+ FIDELITY_ARGS+=(--source "$ABS_FILE")
421
+ fi
422
+ # Node always runs through the adapter (broken Volta/NVM shims are a
423
+ # live hazard in harness shells), and there is no npx/@latest fallback:
424
+ # a hidden registry fetch of a floating version is never an acceptable
425
+ # renderer. Missing local renderer → structured-only handoff.
426
+ if [ -f "$LOCAL_CLI" ] && [ -d "$SCRIPT_DIR/packages/egregore-artifacts/node_modules/react" ]; then
427
+ if bash "$SCRIPT_DIR/bin/node-run.sh" "$LOCAL_CLI" "$RENDER_TYPE" "${RENDER_SRC:-$ABS_FILE}" "${FIDELITY_ARGS[@]}" --output "$RENDERED_HTML" >/dev/null 2>"$TMPD/render-error"; then
428
+ RENDER_OK=1
429
+ fi
430
+ else
431
+ echo "local egregore-artifacts renderer unavailable; sending structured handoff without custom HTML" > "$TMPD/render-error"
432
+ fi
433
+
434
+ # Step 2: build the emissary payload. If rendering succeeded AND the
435
+ # HTML fits the server's 100KB cap, send it with render_mode=custom.
436
+ # If not, fall through to the structured-only path (server-rendered
437
+ # via the emissary template — undesirable for handoffs but still
438
+ # better than no URL).
439
+ if [ "$RENDER_OK" = "1" ] && [ -f "$RENDERED_HTML" ]; then
440
+ RENDER_SIZE=$(wc -c < "$RENDERED_HTML" | tr -d ' ')
441
+ if [ "$RENDER_SIZE" -gt 0 ] && [ "$RENDER_SIZE" -lt 100000 ]; then
442
+ # Author display name
443
+ DISPLAY_NAME="$AUTHOR"
444
+ PERSON_FILE="$SCRIPT_DIR/memory/people/${AUTHOR}.md"
445
+ if [ -f "$PERSON_FILE" ]; then
446
+ DISPLAY_NAME=$(head -1 "$PERSON_FILE" | sed 's/^# //')
447
+ fi
448
+
449
+ RECIP_HANDLE=$(echo "$RECIPIENT" | tr '[:upper:]' '[:lower:]' | awk '{print $1}')
450
+ ADDRESSED_TO=$(jq -nc --arg h "$RECIP_HANDLE" --arg d "$RECIPIENT" '[{"handle":$h,"display":$d}]')
451
+
452
+ CLAIM=$(echo "$BRIEFING_LEAD" | cut -c1-200)
453
+
454
+ # body.prose is schema-required non-empty even when render_mode is
455
+ # "custom" (server validates structurally regardless of render
456
+ # mode). The visible page is the custom HTML; prose just needs to
457
+ # be non-empty plain text for /raw consumers and validation. Use
458
+ # the briefing lead (which the lead/claim is already derived from).
459
+ PROSE_TEXT="${BRIEFING_LEAD:-$TOPIC}"
460
+
461
+ # Use --rawfile so the rendered HTML is read directly from disk
462
+ # into a JSON-string. Faster than shell-var roundtrip and avoids
463
+ # any quoting headaches for HTML.
464
+ V1JSON=$(jq -nc \
465
+ --arg topic "$TOPIC" \
466
+ --arg claim "$CLAIM" \
467
+ --arg summary "$CLAIM" \
468
+ --arg prose "$PROSE_TEXT" \
469
+ --argjson addressed "$ADDRESSED_TO" \
470
+ --rawfile render_html "$RENDERED_HTML" \
471
+ '{
472
+ kind: "continuation",
473
+ topic: $topic,
474
+ claim: $claim,
475
+ summary: $summary,
476
+ body: { prose: $prose },
477
+ audience: {
478
+ addressed_to: $addressed,
479
+ visible_to: $addressed,
480
+ extendable_by: $addressed
481
+ },
482
+ parents: [],
483
+ render_mode: "custom",
484
+ render_html: $render_html
485
+ }')
486
+
487
+ V1RESULT=$(curl -sf -X POST "$EMISSARY_API_URL/emissaries" \
488
+ -H "Content-Type: application/json" \
489
+ -H "Authorization: Bearer $EMISSARY_TOKEN" \
490
+ -d "$V1JSON" 2>/dev/null || echo '{}')
491
+
492
+ V1URL=$(echo "$V1RESULT" | jq -r '.url // ""' 2>/dev/null || echo "")
493
+ fi
494
+ fi
495
+ fi
496
+ fi
497
+
498
+ # Fallback: if a directed emissary publish didn't produce a URL—or this is a
499
+ # recipient-less team handoff—use publish-artifact.sh. Connected mode is
500
+ # authenticated and org-scoped; local mode's public relay is opt-in.
501
+ PUBLISH_RC=0
502
+ if [ -z "$V1URL" ] && [ "$NO_PUBLISH" = "0" ] && [ -x "$SCRIPT_DIR/bin/publish-artifact.sh" ]; then
503
+ AURL=$(bash "$SCRIPT_DIR/bin/publish-artifact.sh" "$RENDER_TYPE" "${RENDER_SRC:-$ABS_FILE}" \
504
+ --verify-fidelity \
505
+ --source "$ABS_FILE" \
506
+ --title "$TOPIC" \
507
+ --author "$AUTHOR" \
508
+ --description "$BRIEFING_LEAD" 2>"$TMPD/publish-error") || PUBLISH_RC=$?
509
+ fi
510
+
511
+ PS="published"
512
+ if [ "$NO_PUBLISH" = "1" ]; then
513
+ PS="disabled"
514
+ elif [ -n "$V1URL" ] || [ -n "$AURL" ]; then
515
+ PS="published"
516
+ elif [ "$PUBLISH_RC" = "4" ]; then
517
+ PS="relay-off"
518
+ elif [ "$PUBLISH_RC" = "3" ]; then
519
+ PS="hosting-off"
520
+ elif grep -q 'Handoff fidelity check failed' "$TMPD/render-error" "$TMPD/publish-error" 2>/dev/null; then
521
+ PS="fidelity-failed"
522
+ else
523
+ PS="failed"
524
+ fi
525
+ echo "$PS" > "$TMPD/publish"
526
+
527
+ # Prefer v1 (emissary-rendered) URL when available; fall back to the
528
+ # legacy egregore-artifacts URL only if the v1 publish failed.
529
+ NOTIFY_URL=""
530
+ if [ -n "$V1URL" ]; then
531
+ echo "$V1URL" > "$TMPD/artifact"
532
+ NOTIFY_URL="$V1URL"
533
+ else
534
+ echo "$AURL" > "$TMPD/artifact"
535
+ NOTIFY_URL="$AURL"
536
+ fi
537
+
538
+ NS="skipped"
539
+ echo '{}' > "$TMPD/notify-plan"
540
+ if [ "$NO_NOTIFY" = "0" ]; then
541
+ if [ -n "$NOTIFY_URL" ]; then
542
+ MSG_NOTIFY="Handoff from ${AUTHOR}: ${TOPIC}
543
+
544
+ \"${BRIEFING_SHORT}\"
545
+
546
+ View: ${NOTIFY_URL}"
547
+ else
548
+ MSG_NOTIFY="Handoff from ${AUTHOR}: ${TOPIC}
549
+
550
+ \"${BRIEFING_SHORT}\""
551
+ fi
552
+
553
+ # Resolve the exact destination, but never approve or dispatch here. The
554
+ # interactive harness must show this proposal in a separate checkpoint.
555
+ if [ -n "$RECIPIENT" ]; then
556
+ NR=$(bash "$SCRIPT_DIR/bin/notify.sh" plan send "$RECIPIENT" "$MSG_NOTIFY" 2>/dev/null || echo '{}')
557
+ else
558
+ NR=$(bash "$SCRIPT_DIR/bin/notify.sh" plan group "$MSG_NOTIFY" 2>/dev/null || echo '{}')
559
+ fi
560
+
561
+ if printf '%s' "$NR" | jq -e '.status == "approval_required"' >/dev/null 2>&1; then
562
+ NS="approval_required"
563
+ printf '%s\n' "$NR" > "$TMPD/notify-plan"
564
+ else
565
+ NS="unavailable"
566
+ fi
567
+ fi
568
+ echo "$NS" > "$TMPD/notify"
569
+ ) &
570
+ PID_PUBNOT=$!
571
+
572
+ # Join (never fail parent — each branch reports its own status).
573
+ # Branch D (PID_ARTIFACTS) is already awaited inside Branch B, but we wait
574
+ # again here to be safe if B skipped the wait (--no-push path).
575
+ wait "$PID_GRAPH" 2>/dev/null || true
576
+ wait "$PID_MEMORY" 2>/dev/null || true
577
+ wait "$PID_PUBNOT" 2>/dev/null || true
578
+ wait "$PID_ARTIFACTS" 2>/dev/null || true
579
+
580
+ # --- Collect results from tmpfiles --------------------------------------
581
+ SESSION_ID=""
582
+ RESOLVED=0
583
+ GRAPH_STATUS="skipped"
584
+ if [ -s "$TMPD/graph" ]; then
585
+ SESSION_ID=$(sed -n '1p' "$TMPD/graph")
586
+ RESOLVED=$(sed -n '2p' "$TMPD/graph")
587
+ GRAPH_STATUS=$(sed -n '3p' "$TMPD/graph")
588
+ fi
589
+ [ -z "$RESOLVED" ] && RESOLVED=0
590
+ # Sanitize: --argjson requires a number. If RESOLVED came back as a slug or
591
+ # anything non-numeric (the index-handoff.sh output format has drifted in
592
+ # the past — defensive guard), fall back to 0 so the result file still builds.
593
+ if ! echo "$RESOLVED" | grep -qE '^[0-9]+$'; then
594
+ RESOLVED=0
595
+ fi
596
+
597
+ SUBGRAPH_JSON=$(cat "$TMPD/subgraph" 2>/dev/null || echo "null")
598
+ [ -z "$SUBGRAPH_JSON" ] && SUBGRAPH_JSON="null"
599
+ # Sanitize: --argjson requires valid JSON. Multiple writes to the same
600
+ # tmpfile have produced concatenated values in the past (e.g. "null\n{...}"),
601
+ # which jq rejects on multi-document input. Validate; on failure, take the
602
+ # LAST non-empty line and re-validate; if still bad, fall back to null.
603
+ if ! printf '%s' "$SUBGRAPH_JSON" | jq -s 'length == 1' 2>/dev/null | grep -q '^true$'; then
604
+ LAST_LINE=$(printf '%s\n' "$SUBGRAPH_JSON" | awk 'NF{last=$0} END{print last}')
605
+ if printf '%s' "$LAST_LINE" | jq -e '.' >/dev/null 2>&1; then
606
+ SUBGRAPH_JSON="$LAST_LINE"
607
+ else
608
+ SUBGRAPH_JSON="null"
609
+ fi
610
+ fi
611
+
612
+ MEMORY_STATUS=$(cat "$TMPD/memory" 2>/dev/null || echo "skipped")
613
+ ARTIFACT_URL=$(cat "$TMPD/artifact" 2>/dev/null || echo "")
614
+ NOTIFY_STATUS=$(cat "$TMPD/notify" 2>/dev/null || echo "skipped")
615
+ NOTIFY_PLAN=$(cat "$TMPD/notify-plan" 2>/dev/null || echo "{}")
616
+ PUBLISH_STATUS=$(cat "$TMPD/publish" 2>/dev/null || echo "skipped")
617
+ [ -z "$PUBLISH_STATUS" ] && PUBLISH_STATUS="skipped"
618
+ ARTIFACTS_ARR=$(cat "$TMPD/artifacts" 2>/dev/null || echo "[]")
619
+ [ -z "$ARTIFACTS_ARR" ] && ARTIFACTS_ARR="[]"
620
+
621
+ # --- Detached PR-number backfill ----------------------------------------
622
+ # repo-state.sh was called with --no-pr for speed; now fire the backfill in
623
+ # the background so PR columns get populated without blocking this script.
624
+ # Reparented to init via `( cmd & ) >/dev/null 2>&1` — survives our exit.
625
+ if [ "$MEMORY_STATUS" = "ok" ] && grep -q '^## Repo State' "$ABS_FILE" 2>/dev/null; then
626
+ ( bash "$SCRIPT_DIR/bin/handoff-pr-backfill.sh" "$ABS_FILE" "$TOPIC" >/dev/null 2>&1 & ) >/dev/null 2>&1
627
+ fi
628
+
629
+ # --- Emit minimal stdout, stash structured data in a tmpfile ------------
630
+ #
631
+ # The Bash tool block shows stdout verbatim and collapses after ~3 lines.
632
+ # We keep stdout to exactly one compact status line so the block is
633
+ # visually quiet. Full structured data goes to a well-known tmpfile that
634
+ # the caller (skill) reads to render the rich card.
635
+ STATUS_BITS=("saved")
636
+ [ "$GRAPH_STATUS" = "ok" ] && STATUS_BITS+=("graphed")
637
+ [ "$MEMORY_STATUS" = "ok" ] && STATUS_BITS+=("pushed")
638
+ [ "$NOTIFY_STATUS" = "approval_required" ] && STATUS_BITS+=("notify approval pending")
639
+ [ -n "$ARTIFACT_URL" ] && STATUS_BITS+=("published")
640
+ [ "$PUBLISH_STATUS" = "relay-off" ] && STATUS_BITS+=("not published")
641
+ [ "$PUBLISH_STATUS" = "fidelity-failed" ] && STATUS_BITS+=("artifact fidelity failed")
642
+
643
+ STATUS_LINE=""
644
+ for bit in "${STATUS_BITS[@]}"; do
645
+ if [ -z "$STATUS_LINE" ]; then
646
+ STATUS_LINE="$bit"
647
+ else
648
+ STATUS_LINE="${STATUS_LINE} · ${bit}"
649
+ fi
650
+ done
651
+
652
+ # Stash structured result for the caller
653
+ RESULT_FILE="${TMPDIR:-/tmp}/handoff-run-result.json"
654
+ jq -cn \
655
+ --arg mode "$MODE" \
656
+ --arg file "$REL_FILE" \
657
+ --arg absFile "$ABS_FILE" \
658
+ --arg sessionId "$SESSION_ID" \
659
+ --argjson resolved "${RESOLVED:-0}" \
660
+ --arg graphStatus "$GRAPH_STATUS" \
661
+ --arg memoryStatus "$MEMORY_STATUS" \
662
+ --arg notifyStatus "$NOTIFY_STATUS" \
663
+ --argjson notifyPlan "$NOTIFY_PLAN" \
664
+ --arg artifactUrl "$ARTIFACT_URL" \
665
+ --arg publishStatus "$PUBLISH_STATUS" \
666
+ --arg recipient "$RECIPIENT" \
667
+ --arg topic "$TOPIC" \
668
+ --arg author "$AUTHOR" \
669
+ --argjson subgraph "$SUBGRAPH_JSON" \
670
+ --argjson artifacts "$ARTIFACTS_ARR" \
671
+ '{
672
+ mode:$mode,
673
+ file:$file,
674
+ absFile:$absFile,
675
+ sessionId:$sessionId,
676
+ resolved:$resolved,
677
+ graphStatus:$graphStatus,
678
+ memoryStatus:$memoryStatus,
679
+ notifyStatus:$notifyStatus,
680
+ notifyPlan:$notifyPlan,
681
+ artifactUrl:$artifactUrl,
682
+ publishStatus:$publishStatus,
683
+ recipient:$recipient,
684
+ topic:$topic,
685
+ author:$author,
686
+ subgraph:$subgraph,
687
+ artifacts:$artifacts
688
+ }' > "$RESULT_FILE"
689
+
690
+ # One clean line for the Bash tool block.
691
+ # The caller reads structured data from $TMPDIR/handoff-run-result.json.
692
+ echo "⇌ ${STATUS_LINE}"