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,146 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Recurring handoff lifecycle runner.
5
+ #
6
+ # `scan` is read-only. `run` applies only lifecycle-v1, explicitly classified
7
+ # handoffs, then creates approval-required notification proposals for eligible
8
+ # seven-day nudges. It never dispatches. Legacy unclassified backfill is
9
+ # deliberately outside this job.
10
+ #
11
+ # Usage:
12
+ # bash bin/handoff-lifecycle-job.sh scan
13
+ # bash bin/handoff-lifecycle-job.sh run
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
16
+ USE_LEGACY_GRAPH=false
17
+ ARGS=()
18
+ for argument in "$@"; do
19
+ if [[ "$argument" == "--graph" ]]; then
20
+ USE_LEGACY_GRAPH=true
21
+ else
22
+ ARGS+=("$argument")
23
+ fi
24
+ done
25
+ ACTION="${ARGS[0]:-scan}"
26
+ case "$ACTION" in
27
+ scan|run) ;;
28
+ *) jq -n '{error:"action must be scan or run"}'; exit 2 ;;
29
+ esac
30
+
31
+ # Canonical Markdown and append-only lifecycle events are authoritative. The
32
+ # default job never queries graph state and never sends notifications. It may
33
+ # only apply typed, snapshot-bound attention expiry; age cannot complete work.
34
+ if [[ "$USE_LEGACY_GRAPH" != true ]]; then
35
+ PLAN="$(bash "$SCRIPT_DIR/bin/handoff-lifecycle.sh" scan --managed-only)"
36
+ if [[ "$ACTION" == "scan" ]]; then
37
+ printf '%s\n' "$PLAN" | jq '{
38
+ schema:"egregore-handoff-lifecycle-job/v2",
39
+ mode:"scan",
40
+ authority:"canonical_markdown",
41
+ graph_dependency:false,
42
+ applied:false,
43
+ plan:.
44
+ }'
45
+ exit 0
46
+ fi
47
+ SNAPSHOT="$(printf '%s\n' "$PLAN" | jq -r '.snapshot_id')"
48
+ TRANSITIONS="$(bash "$SCRIPT_DIR/bin/handoff-lifecycle.sh" apply \
49
+ --managed-only \
50
+ --snapshot "$SNAPSHOT" \
51
+ --confirm APPLY_SAFE_HANDOFF_LIFECYCLE)"
52
+ jq -n \
53
+ --argjson transitions "$TRANSITIONS" \
54
+ --argjson review "$(printf '%s\n' "$PLAN" | jq '.review_candidates')" \
55
+ '{
56
+ schema:"egregore-handoff-lifecycle-job/v2",
57
+ mode:"run",
58
+ authority:"canonical_markdown",
59
+ graph_dependency:false,
60
+ applied:true,
61
+ transitions:$transitions.transitions,
62
+ review_candidates:$review,
63
+ notifications:[]
64
+ }'
65
+ exit 0
66
+ fi
67
+
68
+ MODE="$(jq -r '.mode // "connected"' "$SCRIPT_DIR/egregore.json" 2>/dev/null || echo connected)"
69
+ if [[ "$MODE" != "connected" ]]; then
70
+ jq -n '{
71
+ schema:"egregore-handoff-lifecycle-job/v1",
72
+ availability:"unavailable_in_this_configuration",
73
+ applied:false
74
+ }'
75
+ exit 0
76
+ fi
77
+
78
+ PLAN="$(bash "$SCRIPT_DIR/bin/handoff-lifecycle.sh" scan --managed-only)"
79
+ if [[ "$ACTION" == "scan" ]]; then
80
+ printf '%s\n' "$PLAN" | jq '{
81
+ schema:"egregore-handoff-lifecycle-job/v1",
82
+ mode:"scan",
83
+ applied:false,
84
+ plan:.
85
+ }'
86
+ exit 0
87
+ fi
88
+
89
+ SNAPSHOT="$(printf '%s\n' "$PLAN" | jq -r '.snapshot_id')"
90
+ TRANSITIONS="$(bash "$SCRIPT_DIR/bin/handoff-lifecycle.sh" apply \
91
+ --managed-only \
92
+ --snapshot "$SNAPSHOT" \
93
+ --confirm APPLY_SAFE_HANDOFF_LIFECYCLE)"
94
+
95
+ NUDGE_RESULTS='[]'
96
+ while IFS= read -r ITEM; do
97
+ [[ -n "$ITEM" ]] || continue
98
+ SID="$(printf '%s\n' "$ITEM" | jq -r '.id')"
99
+ CLAIM="$(bash "$SCRIPT_DIR/bin/graph-op.sh" claim-handoff-nudge "$SID")"
100
+ if ! printf '%s\n' "$CLAIM" | jq -e '.values[0][0] != null' >/dev/null 2>&1; then
101
+ continue
102
+ fi
103
+
104
+ TOPIC="$(printf '%s\n' "$CLAIM" | jq -r '.values[0][1] // "handoff"')"
105
+ RECIPIENTS="$(printf '%s\n' "$CLAIM" | jq -c '.values[0][2] // []')"
106
+ PROPOSALS='[]'
107
+ FAILED=0
108
+ while IFS= read -r RECIPIENT; do
109
+ [[ -n "$RECIPIENT" ]] || continue
110
+ MESSAGE="Handoff waiting for you: ${TOPIC}. Open /activity to read, complete, or expire it."
111
+ NOTIFY_RESULT="$(bash "$SCRIPT_DIR/bin/notify.sh" plan send "$RECIPIENT" "$MESSAGE" 2>/dev/null || echo '{}')"
112
+ if printf '%s\n' "$NOTIFY_RESULT" | jq -e '.status == "approval_required"' >/dev/null 2>&1; then
113
+ PROPOSALS="$(printf '%s\n' "$PROPOSALS" | jq \
114
+ --argjson proposal "$NOTIFY_RESULT" '. + [$proposal]')"
115
+ else
116
+ FAILED=$((FAILED + 1))
117
+ fi
118
+ done < <(printf '%s\n' "$RECIPIENTS" | jq -r '.[]')
119
+
120
+ bash "$SCRIPT_DIR/bin/graph-op.sh" release-handoff-nudge "$SID" >/dev/null
121
+ if [[ "$(printf '%s\n' "$PROPOSALS" | jq 'length')" -gt 0 ]]; then
122
+ STATUS="approval_required"
123
+ else
124
+ STATUS="unavailable"
125
+ fi
126
+
127
+ NUDGE_RESULTS="$(printf '%s\n' "$NUDGE_RESULTS" | jq \
128
+ --arg id "$SID" \
129
+ --arg topic "$TOPIC" \
130
+ --arg status "$STATUS" \
131
+ --argjson proposals "$PROPOSALS" \
132
+ --argjson failed "$FAILED" \
133
+ '. + [{id:$id,topic:$topic,status:$status,proposals:$proposals,failed:$failed}]')"
134
+ done < <(printf '%s\n' "$PLAN" | jq -c '.review_candidates[] | select(.action=="nudge")')
135
+
136
+ jq -n \
137
+ --argjson transitions "$TRANSITIONS" \
138
+ --argjson nudges "$NUDGE_RESULTS" \
139
+ '{
140
+ schema:"egregore-handoff-lifecycle-job/v1",
141
+ mode:"run",
142
+ applied:true,
143
+ managed_only:true,
144
+ transitions:$transitions.transitions,
145
+ nudges:$nudges
146
+ }'
@@ -0,0 +1,280 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Deterministic handoff lifecycle reconciliation.
5
+ #
6
+ # `scan` is read-only and produces a versioned, hash-bound plan. `apply` can
7
+ # execute only high-confidence transitions from an unchanged plan:
8
+ # - read/claimed -> done when one recipient has a completed IMPLEMENTS session
9
+ # - open FYI -> expired after the configured age floor
10
+ # - untouched pending -> expired after the configured lifecycle TTL
11
+ #
12
+ # Age never marks a handoff done. Read/claimed action and feedback handoffs
13
+ # without implementation evidence stay open for human review.
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
16
+ USE_LEGACY_GRAPH=false
17
+ RUNTIME_ARGS=()
18
+ for argument in "$@"; do
19
+ if [ "$argument" = "--graph" ]; then
20
+ USE_LEGACY_GRAPH=true
21
+ else
22
+ RUNTIME_ARGS+=("$argument")
23
+ fi
24
+ done
25
+
26
+ # Canonical Markdown is authoritative in every mode. The preserved graph
27
+ # implementation is an explicit compatibility/projection adapter only.
28
+ if [ "$USE_LEGACY_GRAPH" != true ]; then
29
+ export PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}"
30
+ exec python3 -m egregore_runtime.lifecycle_cli "${RUNTIME_ARGS[@]}"
31
+ fi
32
+ set -- "${RUNTIME_ARGS[@]}"
33
+
34
+ GS="$SCRIPT_DIR/bin/graph.sh"
35
+ ACTION="${1:-scan}"
36
+ shift || true
37
+
38
+ usage() {
39
+ cat <<'EOF'
40
+ Usage:
41
+ handoff-lifecycle.sh scan [--days N] [--user HANDLE] [--managed-only]
42
+ handoff-lifecycle.sh action <read|claim|done|expire|reopen|review> ARTIFACT_ID
43
+ [--expected-revision REV]
44
+ handoff-lifecycle.sh apply --snapshot SHA256 --confirm APPLY_SAFE_HANDOFF_LIFECYCLE
45
+ [--days N] [--user HANDLE] [--managed-only]
46
+
47
+ scan is read-only. apply fails closed when canonical state changed after scan.
48
+ --managed-only limits the plan to lifecycle-v1 handoffs with explicit intent;
49
+ it is the safe boundary for unattended recurring execution.
50
+ Add --graph to use the preserved legacy graph projection explicitly.
51
+ EOF
52
+ }
53
+
54
+ if [[ "$ACTION" == "--help" || "$ACTION" == "-h" ]]; then
55
+ usage
56
+ exit 0
57
+ fi
58
+ if [[ "$ACTION" != "scan" && "$ACTION" != "apply" ]]; then
59
+ echo '{"error":"action must be scan or apply"}'
60
+ exit 2
61
+ fi
62
+
63
+ DAYS=14
64
+ USER_REF=""
65
+ EXPECTED_SNAPSHOT=""
66
+ CONFIRM=""
67
+ MANAGED_ONLY=false
68
+ while [[ $# -gt 0 ]]; do
69
+ case "$1" in
70
+ --days) DAYS="${2:?missing days}"; shift 2 ;;
71
+ --user) USER_REF="${2:?missing user}"; shift 2 ;;
72
+ --managed-only) MANAGED_ONLY=true; shift ;;
73
+ --snapshot) EXPECTED_SNAPSHOT="${2:?missing snapshot}"; shift 2 ;;
74
+ --confirm) CONFIRM="${2:?missing confirmation}"; shift 2 ;;
75
+ *) echo '{"error":"unknown option","option":"'"$1"'"}'; exit 2 ;;
76
+ esac
77
+ done
78
+
79
+ if ! [[ "$DAYS" =~ ^[0-9]+$ ]] || [[ "$DAYS" -lt 1 || "$DAYS" -gt 365 ]]; then
80
+ echo '{"error":"days must be between 1 and 365"}'
81
+ exit 2
82
+ fi
83
+
84
+ MODE="$(jq -r '.mode // "connected"' "$SCRIPT_DIR/egregore.json" 2>/dev/null || echo connected)"
85
+ if [[ "$MODE" == "local" ]]; then
86
+ echo '{"schema":"egregore-handoff-lifecycle-plan/v1","availability":"unavailable_in_this_configuration","must_abstain":true}'
87
+ exit 0
88
+ fi
89
+
90
+ build_plan() {
91
+ local raw rows snapshot
92
+ raw="$(bash "$GS" query "
93
+ MATCH (s:Session)-[:HANDED_TO]->(recipient:Person)
94
+ WHERE (\$user = ''
95
+ OR toLower(recipient.name) = toLower(\$user)
96
+ OR toLower(coalesce(recipient.github, '')) = toLower(\$user))
97
+ AND coalesce(s.handoffStatus, 'pending') IN ['pending','read','claimed']
98
+ AND (NOT \$managedOnly
99
+ OR (coalesce(s.handoffLifecycleVersion, 0) >= 1
100
+ AND coalesce(s.handoffIntent, 'unclassified') IN ['action','feedback','fyi']))
101
+ WITH DISTINCT s, recipient
102
+ OPTIONAL MATCH (s)-[:BY]->(author:Person)
103
+ WITH s, recipient, author,
104
+ size([(s)-[:HANDED_TO]->(:Person) | 1]) AS recipientCount
105
+ OPTIONAL MATCH (impl:Session)-[:IMPLEMENTS]->(s)
106
+ OPTIONAL MATCH (impl)-[:BY]->(implAuthor:Person)
107
+ WITH s, recipient, author, recipientCount,
108
+ head([candidate IN collect(DISTINCT
109
+ CASE
110
+ WHEN implAuthor = recipient
111
+ AND (impl.wrappedAt IS NOT NULL
112
+ OR impl.status IN ['completed','handed_off','wrapped'])
113
+ THEN {id: impl.id, status: impl.status}
114
+ ELSE null
115
+ END) WHERE candidate IS NOT NULL]) AS implementation
116
+ WITH s, recipient, author, recipientCount, implementation,
117
+ CASE WHEN s.date IS NULL THEN null
118
+ ELSE duration.inDays(date(s.date), date()).days END AS ageDays
119
+ RETURN s.id AS id,
120
+ s.topic AS topic,
121
+ coalesce(author.name, s.author, 'unknown') AS author,
122
+ recipient.name AS recipient,
123
+ toString(s.date) AS date,
124
+ coalesce(s.handoffStatus, 'pending') AS status,
125
+ coalesce(s.handoffIntent, 'unclassified') AS intent,
126
+ ageDays,
127
+ recipientCount,
128
+ implementation.id AS implementationId,
129
+ implementation.status AS implementationStatus,
130
+ s.handoffLifecycleVersion AS lifecycleVersion,
131
+ toString(s.handoffNudgedAt) AS nudgedAt
132
+ ORDER BY s.date DESC, recipient.name
133
+ " "$(jq -n --arg user "$USER_REF" --argjson managedOnly "$MANAGED_ONLY" \
134
+ '{user:$user,managedOnly:$managedOnly}')")"
135
+
136
+ if ! rows="$(printf '%s' "$raw" | jq -c '
137
+ (.values // []) | map({
138
+ id:.[0], topic:.[1], author:.[2], recipient:.[3], date:.[4],
139
+ status:.[5], intent:.[6], age_days:.[7], recipient_count:.[8],
140
+ implementation_id:.[9], implementation_status:.[10],
141
+ lifecycle_version:.[11], nudged_at:.[12]
142
+ }) | sort_by(.id, .recipient)
143
+ ' 2>/dev/null)"; then
144
+ echo '{"error":"invalid graph response"}'
145
+ return 1
146
+ fi
147
+
148
+ snapshot="$(printf '%s' "$rows" | openssl dgst -sha256 | awk '{print $NF}')"
149
+ jq -n \
150
+ --arg snapshot "$snapshot" \
151
+ --arg user "$USER_REF" \
152
+ --argjson days "$DAYS" \
153
+ --argjson managed_only "$MANAGED_ONLY" \
154
+ --argjson rows "$rows" '
155
+ def recommendation:
156
+ if ((.status == "read" or .status == "claimed")
157
+ and .recipient_count == 1
158
+ and .implementation_id != null)
159
+ then {action:"close", reason:"single_recipient_implemented", confidence:"high"}
160
+ elif (.intent == "fyi" and (.age_days // 0) >= $days)
161
+ then {action:"expire", reason:"fyi_age_floor", confidence:"high"}
162
+ elif (.status == "pending" and (.age_days // 0) >= $days)
163
+ then {action:"expire", reason:"pending_ttl_elapsed", confidence:"policy"}
164
+ elif ((.age_days // 0) >= $days)
165
+ then {action:"review", reason:
166
+ (if .intent == "unclassified"
167
+ then "stale_unclassified"
168
+ else "stale_requires_human" end),
169
+ confidence:"none"}
170
+ elif ((.age_days // 0) >= 7 and .recipient_count > 1)
171
+ then {action:"review", reason:"multi_recipient_requires_human", confidence:"none"}
172
+ elif ((.age_days // 0) >= 7 and .nudged_at == null)
173
+ then {action:"nudge", reason:"open_seven_days", confidence:"none"}
174
+ elif ((.age_days // 0) >= 7)
175
+ then {action:"keep", reason:"awaiting_after_nudge", confidence:"none"}
176
+ else {action:"keep", reason:"recent_open", confidence:"none"}
177
+ end;
178
+ ($rows | map(. + recommendation)) as $items
179
+ | {
180
+ schema:"egregore-handoff-lifecycle-plan/v1",
181
+ snapshot_id:$snapshot,
182
+ subject:(if $user == "" then "all" else $user end),
183
+ threshold_days:$days,
184
+ managed_only:$managed_only,
185
+ state_scope:"session",
186
+ state_scope_warning:"Status is stored on Session, so automatic close requires exactly one recipient.",
187
+ counts:{
188
+ open_rows:($items|length),
189
+ unique_handoffs:([$items[].id]|unique|length),
190
+ duplicate_recipient_rows:(($items|length)-([$items[].id]|unique|length)),
191
+ close:([$items[]|select(.action=="close")]|unique_by(.id)|length),
192
+ expire:([$items[]|select(.action=="expire")]|unique_by(.id)|length),
193
+ review:([$items[]|select(.action=="review")]|unique_by(.id)|length),
194
+ nudge:([$items[]|select(.action=="nudge")]|unique_by(.id)|length),
195
+ keep:([$items[]|select(.action=="keep")]|unique_by(.id)|length),
196
+ unclassified:([$items[]|select(.intent=="unclassified")]|unique_by(.id)|length)
197
+ },
198
+ safe_candidates:([$items[]|select(.action=="close" or .action=="expire")]|unique_by(.id)),
199
+ review_candidates:([$items[]|select(.action=="review" or .action=="nudge")]|unique_by(.id)),
200
+ items:$items,
201
+ apply_contract:{
202
+ requires_snapshot:true,
203
+ confirmation:"APPLY_SAFE_HANDOFF_LIFECYCLE",
204
+ age_alone_never_marks_done:true,
205
+ pending_ttl_may_expire_unacknowledged_work:true
206
+ }
207
+ }
208
+ '
209
+ }
210
+
211
+ PLAN="$(build_plan)"
212
+ if [[ "$ACTION" == "scan" ]]; then
213
+ printf '%s\n' "$PLAN"
214
+ exit 0
215
+ fi
216
+
217
+ if [[ -z "$EXPECTED_SNAPSHOT" || "$CONFIRM" != "APPLY_SAFE_HANDOFF_LIFECYCLE" ]]; then
218
+ printf '%s\n' "$PLAN" | jq '. + {
219
+ applied:false,
220
+ error:"apply requires the current --snapshot and --confirm APPLY_SAFE_HANDOFF_LIFECYCLE"
221
+ }'
222
+ exit 3
223
+ fi
224
+
225
+ CURRENT_SNAPSHOT="$(printf '%s' "$PLAN" | jq -r '.snapshot_id')"
226
+ if [[ "$CURRENT_SNAPSHOT" != "$EXPECTED_SNAPSHOT" ]]; then
227
+ printf '%s\n' "$PLAN" | jq --arg expected "$EXPECTED_SNAPSHOT" '. + {
228
+ applied:false,
229
+ error:"snapshot_changed",
230
+ expected_snapshot:$expected
231
+ }'
232
+ exit 4
233
+ fi
234
+
235
+ CLOSE_IDS="$(printf '%s' "$PLAN" | jq -c '[.safe_candidates[]|select(.action=="close")|.id]|unique')"
236
+ EXPIRE_IDS="$(printf '%s' "$PLAN" | jq -c '[.safe_candidates[]|select(.action=="expire")|.id]|unique')"
237
+
238
+ if [[ "$CLOSE_IDS" == "[]" && "$EXPIRE_IDS" == "[]" ]]; then
239
+ printf '%s\n' "$PLAN" | jq '. + {applied:true,transitions:{closed:0,expired:0}}'
240
+ exit 0
241
+ fi
242
+
243
+ RESULT="$(bash "$GS" query "
244
+ UNWIND \$closeIds AS closeId
245
+ MATCH (closed:Session {id: closeId})
246
+ WHERE coalesce(closed.handoffStatus, 'pending') IN ['read','claimed']
247
+ SET closed.handoffStatus = 'done',
248
+ closed.handoffDoneAt = coalesce(closed.handoffDoneAt, datetime()),
249
+ closed.handoffUpdatedAt = datetime(),
250
+ closed.handoffLifecycleReason = 'single_recipient_implemented',
251
+ closed.handoffLifecycleVersion = 1
252
+ WITH count(closed) AS closedCount
253
+ CALL {
254
+ WITH \$expireIds AS expireIds
255
+ UNWIND expireIds AS expireId
256
+ MATCH (expired:Session {id: expireId})
257
+ WHERE coalesce(expired.handoffStatus, 'pending') IN ['pending','read','claimed']
258
+ AND (expired.handoffIntent = 'fyi'
259
+ OR coalesce(expired.handoffStatus, 'pending') = 'pending')
260
+ SET expired.handoffStatus = 'expired',
261
+ expired.handoffExpiredAt = coalesce(expired.handoffExpiredAt, datetime()),
262
+ expired.handoffUpdatedAt = datetime(),
263
+ expired.handoffLifecycleReason =
264
+ CASE WHEN expired.handoffIntent = 'fyi'
265
+ THEN 'fyi_age_floor'
266
+ ELSE 'pending_ttl_elapsed' END,
267
+ expired.handoffLifecycleVersion = 1
268
+ RETURN count(expired) AS expiredCount
269
+ }
270
+ RETURN closedCount, expiredCount
271
+ " "$(jq -n --argjson closeIds "$CLOSE_IDS" --argjson expireIds "$EXPIRE_IDS" \
272
+ '{closeIds:$closeIds,expireIds:$expireIds}')")"
273
+
274
+ printf '%s\n' "$PLAN" | jq --argjson result "$RESULT" '. + {
275
+ applied:true,
276
+ transitions:{
277
+ closed:($result.values[0][0] // 0),
278
+ expired:($result.values[0][1] // 0)
279
+ }
280
+ }'
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env bash
2
+ # handoff-pr-backfill.sh — fill in PR numbers in a handoff file's ## Repo State
3
+ # table, then re-commit + push the memory repo. Detached fire-and-forget from
4
+ # /handoff's hot path so user-visible latency doesn't include N × `gh pr list`.
5
+ #
6
+ # Usage:
7
+ # handoff-pr-backfill.sh <abs-handoff-file> <topic>
8
+ #
9
+ # Reads the ## Repo State table, looks up each (repo, branch)'s open PR via
10
+ # `gh pr list`, rewrites the PR column from `—` to `#N`, commits the memory
11
+ # repo, pushes to main. Silent on all failures — this is cosmetic.
12
+ #
13
+ # Detached usage (the skill / orchestrator call it this way):
14
+ # ( bash bin/handoff-pr-backfill.sh "$ABS_FILE" "$TOPIC" >/dev/null 2>&1 & ) >/dev/null 2>&1
15
+
16
+ set -uo pipefail
17
+
18
+ ABS_FILE="${1:-}"
19
+ TOPIC="${2:-handoff}"
20
+
21
+ [ -n "$ABS_FILE" ] && [ -f "$ABS_FILE" ] || exit 0
22
+
23
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
24
+ CONFIG="$SCRIPT_DIR/egregore.json"
25
+
26
+ command -v gh >/dev/null 2>&1 || exit 0
27
+ command -v jq >/dev/null 2>&1 || exit 0
28
+
29
+ GITHUB_ORG=$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)
30
+ [ -n "$GITHUB_ORG" ] || exit 0
31
+
32
+ # Extract the ## Repo State table rows: format is `| repo | branch | — | base |`.
33
+ # Skip header and separator lines (first two rows of the markdown table).
34
+ ROWS=$(awk '
35
+ /^## Repo State/ { in_section=1; next }
36
+ in_section && /^## / { in_section=0 }
37
+ in_section && /^\|/ && !/^\|[-\s]/ && !/^\| Repo/ { print }
38
+ ' "$ABS_FILE" 2>/dev/null)
39
+
40
+ [ -n "$ROWS" ] || exit 0
41
+
42
+ UPDATED=0
43
+ while IFS= read -r row; do
44
+ [ -z "$row" ] && continue
45
+ # Parse: | repo | branch | pr | base |
46
+ repo=$(echo "$row" | awk -F'|' '{gsub(/^ +| +$/,"",$2); print $2}')
47
+ branch=$(echo "$row" | awk -F'|' '{gsub(/^ +| +$/,"",$3); print $3}')
48
+ pr_col=$(echo "$row" | awk -F'|' '{gsub(/^ +| +$/,"",$4); print $4}')
49
+
50
+ # Only backfill `—` cells (leave `#N` alone)
51
+ [ "$pr_col" = "—" ] || continue
52
+ [ -n "$repo" ] && [ -n "$branch" ] || continue
53
+
54
+ pr_num=$(gh pr list --repo "$GITHUB_ORG/$repo" --head "$branch" --json number --jq '.[0].number // empty' 2>/dev/null || echo "")
55
+ [ -n "$pr_num" ] || continue
56
+
57
+ # Rewrite the `—` in this branch's row to `#N`. Match by branch name to
58
+ # avoid cross-repo collisions when repos share branch names.
59
+ awk -v branch="$branch" -v pr="#$pr_num" '
60
+ BEGIN { in_section=0 }
61
+ /^## Repo State/ { in_section=1; print; next }
62
+ in_section && /^## / { in_section=0 }
63
+ in_section && $0 ~ "\\| " branch " " && /—/ {
64
+ sub(/—/, pr)
65
+ print; next
66
+ }
67
+ { print }
68
+ ' "$ABS_FILE" > "$ABS_FILE.tmp" && mv "$ABS_FILE.tmp" "$ABS_FILE"
69
+ UPDATED=1
70
+ done <<< "$ROWS"
71
+
72
+ [ "$UPDATED" = "1" ] || exit 0
73
+
74
+ # Re-commit + push the memory repo with the backfilled PR numbers.
75
+ MEMORY_DIR="$SCRIPT_DIR/memory"
76
+ if [ -d "$MEMORY_DIR" ]; then
77
+ (
78
+ cd "$MEMORY_DIR" || exit 0
79
+ git add -A >/dev/null 2>&1
80
+ git commit -m "chore(handoff): backfill PR numbers for $TOPIC" >/dev/null 2>&1 || exit 0
81
+ git pull --rebase origin main --quiet >/dev/null 2>&1
82
+ git push origin main --quiet >/dev/null 2>&1
83
+ ) || true
84
+ fi
85
+
86
+ exit 0
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Private preview/approval bridge for internal handoffs. Canonical Markdown is
5
+ # supplied once during preview; approval references an opaque, single-use token.
6
+
7
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
8
+ STORE_ROOT="${EGREGORE_HANDOFF_PREVIEW_DIR:-${TMPDIR:-/tmp}/egregore-handoff-previews}"
9
+ MAX_AGE_SECONDS="${EGREGORE_HANDOFF_PREVIEW_MAX_AGE:-21600}"
10
+
11
+ usage() {
12
+ cat >&2 <<'EOF'
13
+ usage:
14
+ bash bin/handoff-preview.sh preview --author HANDLE --recipient HANDLE \
15
+ --topic TOPIC --intent action|feedback|fyi \
16
+ --content-mode supplied|generated < handoff.md
17
+ bash bin/handoff-preview.sh approve TOKEN
18
+ EOF
19
+ }
20
+
21
+ sha256_file() {
22
+ if command -v openssl >/dev/null 2>&1; then
23
+ openssl dgst -sha256 "$1" | awk '{print $NF}'
24
+ elif command -v shasum >/dev/null 2>&1; then
25
+ shasum -a 256 "$1" | awk '{print $1}'
26
+ else
27
+ sha256sum "$1" | awk '{print $1}'
28
+ fi
29
+ }
30
+
31
+ new_token() {
32
+ if command -v openssl >/dev/null 2>&1; then
33
+ openssl rand -hex 16
34
+ else
35
+ printf '%s' "$(date +%s)-$$-${RANDOM:-0}" | sha256sum | awk '{print substr($1,1,32)}'
36
+ fi
37
+ }
38
+
39
+ validate_token() {
40
+ [[ "$1" =~ ^[a-f0-9]{32}$ ]] || {
41
+ echo "handoff preview token is invalid" >&2
42
+ exit 2
43
+ }
44
+ }
45
+
46
+ preview() {
47
+ local author="" recipient="" topic="" intent="" content_mode=""
48
+ while [ $# -gt 0 ]; do
49
+ case "$1" in
50
+ --author) author="${2:-}"; shift 2 ;;
51
+ --recipient) recipient="${2:-}"; shift 2 ;;
52
+ --topic) topic="${2:-}"; shift 2 ;;
53
+ --intent) intent="${2:-}"; shift 2 ;;
54
+ --content-mode) content_mode="${2:-}"; shift 2 ;;
55
+ *) echo "unknown preview option: $1" >&2; usage; exit 2 ;;
56
+ esac
57
+ done
58
+
59
+ [ -n "$author" ] || { echo "handoff preview requires --author" >&2; exit 2; }
60
+ [ -n "$topic" ] || { echo "handoff preview requires --topic" >&2; exit 2; }
61
+ case "$intent" in action|feedback|fyi) ;; *) echo "invalid handoff intent" >&2; exit 2 ;; esac
62
+ case "$content_mode" in supplied|generated) ;; *) echo "invalid handoff content mode" >&2; exit 2 ;; esac
63
+
64
+ umask 077
65
+ mkdir -p "$STORE_ROOT"
66
+ chmod 700 "$STORE_ROOT"
67
+
68
+ local token content_file metadata_file digest
69
+ token="$(new_token)"
70
+ validate_token "$token"
71
+ content_file="$STORE_ROOT/$token.md"
72
+ metadata_file="$STORE_ROOT/$token.json"
73
+ cat > "$content_file"
74
+ [ -s "$content_file" ] || {
75
+ rm -f "$content_file"
76
+ echo "handoff preview input is empty" >&2
77
+ exit 2
78
+ }
79
+ digest="$(sha256_file "$content_file")"
80
+ jq -n \
81
+ --arg author "$author" \
82
+ --arg recipient "$recipient" \
83
+ --arg topic "$topic" \
84
+ --arg intent "$intent" \
85
+ --arg contentMode "$content_mode" \
86
+ --arg digest "$digest" \
87
+ --argjson createdAt "$(date +%s)" \
88
+ '{author:$author,recipient:$recipient,topic:$topic,intent:$intent,contentMode:$contentMode,digest:$digest,createdAt:$createdAt}' \
89
+ > "$metadata_file"
90
+
91
+ if ! bash "$ROOT/bin/node-run.sh" \
92
+ "$ROOT/packages/egregore-artifacts/bin/cli.js" handoff "$content_file" \
93
+ --verify-fidelity; then
94
+ rm -f "$content_file" "$metadata_file"
95
+ exit 1
96
+ fi
97
+
98
+ printf 'HANDOFF_PREVIEW_TOKEN=%s\n' "$token"
99
+ }
100
+
101
+ approve() {
102
+ [ $# -eq 1 ] || { usage; exit 2; }
103
+ local token="$1"
104
+ validate_token "$token"
105
+
106
+ local content_file="$STORE_ROOT/$token.md"
107
+ local metadata_file="$STORE_ROOT/$token.json"
108
+ local lock_dir="$STORE_ROOT/$token.approving"
109
+ [ -f "$content_file" ] && [ -f "$metadata_file" ] || {
110
+ echo "handoff preview is missing, expired, or already used" >&2
111
+ exit 1
112
+ }
113
+ if ! mkdir "$lock_dir" 2>/dev/null; then
114
+ echo "handoff preview approval is already running" >&2
115
+ exit 1
116
+ fi
117
+
118
+ local expected_digest actual_digest created_at now age
119
+ expected_digest="$(jq -er '.digest' "$metadata_file")"
120
+ actual_digest="$(sha256_file "$content_file")"
121
+ if [ "$expected_digest" != "$actual_digest" ]; then
122
+ rmdir "$lock_dir" 2>/dev/null || true
123
+ echo "handoff preview content changed after approval was requested" >&2
124
+ exit 1
125
+ fi
126
+ created_at="$(jq -er '.createdAt' "$metadata_file")"
127
+ now="$(date +%s)"
128
+ age=$((now - created_at))
129
+ if [ "$age" -lt 0 ] || [ "$age" -gt "$MAX_AGE_SECONDS" ]; then
130
+ rmdir "$lock_dir" 2>/dev/null || true
131
+ echo "handoff preview expired; render a fresh preview" >&2
132
+ exit 1
133
+ fi
134
+
135
+ local author recipient topic intent content_mode
136
+ author="$(jq -er '.author' "$metadata_file")"
137
+ recipient="$(jq -er '.recipient' "$metadata_file")"
138
+ topic="$(jq -er '.topic' "$metadata_file")"
139
+ intent="$(jq -er '.intent' "$metadata_file")"
140
+ content_mode="$(jq -er '.contentMode' "$metadata_file")"
141
+
142
+ local result_tmp
143
+ result_tmp="$(mktemp -d -t egregore-handoff-result-XXXXXX)"
144
+ local args=(
145
+ capture --mode addressed --author "$author" --topic "$topic"
146
+ --intent "$intent" --content-mode "$content_mode"
147
+ )
148
+ [ -z "$recipient" ] || args+=(--recipient "$recipient")
149
+
150
+ if ! TMPDIR="$result_tmp" bash "$ROOT/bin/artifact-writeback.sh" "${args[@]}" \
151
+ < "$content_file"; then
152
+ rmdir "$lock_dir" 2>/dev/null || true
153
+ exit 1
154
+ fi
155
+
156
+ # Consume the approved token before rendering. A renderer failure must not
157
+ # make a successful canonical write eligible for accidental replay.
158
+ mv "$content_file" "$result_tmp/approved-handoff.md"
159
+ mv "$metadata_file" "$result_tmp/approved-handoff.json"
160
+ rmdir "$lock_dir" 2>/dev/null || true
161
+ bash "$ROOT/bin/render-card.sh" \
162
+ --result "$result_tmp/capture-run-result.json"
163
+ }
164
+
165
+ case "${1:-}" in
166
+ preview) shift; preview "$@" ;;
167
+ approve) shift; approve "$@" ;;
168
+ *) usage; exit 2 ;;
169
+ esac