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,783 @@
1
+ #!/usr/bin/env bash
2
+ # Runtime-neutral Egregore agent bridge.
3
+ #
4
+ # This script exposes the Git-backed memory protocol without requiring
5
+ # Claude Code hooks or slash-command skills. Any agent runtime that can run
6
+ # shell commands inside an Egregore checkout can use it to sync memory,
7
+ # create handoffs, ask questions, answer questions, and inspect activity.
8
+ set -euo pipefail
9
+
10
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
11
+ MAIN_PROJECT_DIR="$SCRIPT_DIR"
12
+ if [ -f "$SCRIPT_DIR/.git" ]; then
13
+ WT_GITDIR=$(sed 's/^gitdir: //' "$SCRIPT_DIR/.git" 2>/dev/null || true)
14
+ [ -n "$WT_GITDIR" ] && MAIN_PROJECT_DIR=$(cd "$WT_GITDIR/../../.." 2>/dev/null && pwd || echo "$SCRIPT_DIR")
15
+ fi
16
+ if [ -f "$SCRIPT_DIR/bin/lib/worktree-links.sh" ]; then
17
+ source "$SCRIPT_DIR/bin/lib/worktree-links.sh" >/dev/null 2>/dev/null || true
18
+ egregore_link_shared_state "$SCRIPT_DIR" "$MAIN_PROJECT_DIR" >/dev/null 2>/dev/null || true
19
+ fi
20
+ CONFIG="$SCRIPT_DIR/egregore.json"
21
+ MEMORY_DIR="${EGREGORE_MEMORY_DIR:-$SCRIPT_DIR/memory}"
22
+ if [ -f "$SCRIPT_DIR/bin/lib/config.sh" ]; then
23
+ # shellcheck source=bin/lib/config.sh
24
+ source "$SCRIPT_DIR/bin/lib/config.sh"
25
+ fi
26
+ # Shared commit/PR message mechanics (trailers + skeleton body shape).
27
+ # shellcheck source=bin/lib/git-message.sh
28
+ . "$SCRIPT_DIR/bin/lib/git-message.sh" 2>/dev/null || true
29
+ type egregore_commit >/dev/null 2>&1 || egregore_commit() {
30
+ local gd="$1" m="$3"; shift 3; git -C "$gd" commit -m "$m" "$@"
31
+ }
32
+ type egregore_pr_skeleton >/dev/null 2>&1 || egregore_pr_skeleton() {
33
+ printf '## What\n%s\n\n## Why\n%s\n\n## Verification\n%s\n\n%s\n' "$1" "$2" "$3" "$4"
34
+ }
35
+
36
+ usage() {
37
+ cat <<'EOF'
38
+ Usage: agent.sh <command> [options]
39
+
40
+ Runtime-neutral commands:
41
+ protocol Print the portable agent protocol
42
+ sync Pull latest shared memory
43
+ activity [--for <person>] Show recent handoffs and questions
44
+ search "query" [-n N] [--fast|--semantic]
45
+ Hybrid recall over shared memory (qmd)
46
+ people List known people from memory/people
47
+ branch --topic TEXT Create or reuse a task branch/worktree
48
+ save [--message TEXT] [--pr-body TEXT|--pr-body-file PATH]
49
+ Commit and push current repo + memory changes;
50
+ PR body follows .claude/context/pr-format.md
51
+ (auto-generated skeleton if not provided)
52
+ autosave [status|on|off|scope|publish|merge] Personal ambient-save settings + consent
53
+ wrap --topic T --summary TEXT Write a session wrap to memory/wraps
54
+ handoff --from A --to B --topic T [--intent action|feedback|fyi]
55
+ [--body TEXT|--body-file PATH] [--no-push] [--no-publish] [--no-notify] [--json]
56
+ ask --from A --to B [--to-actor-id ID] --topic T --question TEXT [--no-push]
57
+ [--harvest-id ID --harvest-session-id ID --turn N
58
+ --question-intent TEXT --context-mode blind|disclosed|comparative]
59
+ answer --from A --question PATH --body TEXT [--no-push]
60
+
61
+ The script uses the existing memory/ repository and keeps Claude Code
62
+ behavior unchanged.
63
+ EOF
64
+ }
65
+
66
+ die() {
67
+ echo "agent.sh: $*" >&2
68
+ exit 1
69
+ }
70
+
71
+ resolve_base_branch() {
72
+ local base
73
+ if ! base=$(_get_base_branch); then
74
+ echo "agent.sh: could not resolve the configured base branch" >&2
75
+ return 1
76
+ fi
77
+ echo "$base"
78
+ }
79
+
80
+ slugify() {
81
+ echo "$1" \
82
+ | tr '[:upper:]' '[:lower:]' \
83
+ | sed -E 's/[^a-z0-9]+/-/g' \
84
+ | sed -E 's/^-+|-+$//g' \
85
+ | cut -c1-60
86
+ }
87
+
88
+ # Reject control characters that would break YAML frontmatter when interpolated.
89
+ reject_newlines() {
90
+ case "$2" in
91
+ *$'\n'*|*$'\r'*) die "invalid $1: must not contain newlines" ;;
92
+ esac
93
+ }
94
+
95
+ # Emit a value as a JSON-encoded string (valid YAML), so colons, quotes,
96
+ # and other YAML metacharacters in user-supplied values cannot inject keys.
97
+ yaml_str() {
98
+ jq -n --arg v "$1" '$v'
99
+ }
100
+
101
+ ensure_memory() {
102
+ [ -d "$MEMORY_DIR" ] || die "memory directory not found: $MEMORY_DIR"
103
+ }
104
+
105
+ is_memory_git() {
106
+ git -C "$MEMORY_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1
107
+ }
108
+
109
+ memory_branch() {
110
+ git -C "$MEMORY_DIR" branch --show-current 2>/dev/null || echo "main"
111
+ }
112
+
113
+ sync_memory() {
114
+ ensure_memory
115
+ if is_memory_git && git -C "$MEMORY_DIR" remote get-url origin >/dev/null 2>&1; then
116
+ local branch
117
+ branch="$(memory_branch)"
118
+ [ -z "$branch" ] && branch="main"
119
+ git -C "$MEMORY_DIR" pull --rebase origin "$branch" --quiet 2>/dev/null || true
120
+ fi
121
+ }
122
+
123
+ save_memory() {
124
+ local message="$1"
125
+ shift
126
+ local no_push="${NO_PUSH:-0}"
127
+
128
+ ensure_memory
129
+ if ! is_memory_git; then
130
+ return 0
131
+ fi
132
+
133
+ git -C "$MEMORY_DIR" add "$@" >/dev/null 2>&1 || true
134
+ if ! git -C "$MEMORY_DIR" diff --cached --quiet 2>/dev/null; then
135
+ git -C "$MEMORY_DIR" commit -m "$message" --quiet 2>/dev/null || true
136
+ fi
137
+
138
+ [ "$no_push" = "1" ] && return 0
139
+ git -C "$MEMORY_DIR" remote get-url origin >/dev/null 2>&1 || return 0
140
+
141
+ local branch
142
+ branch="$(memory_branch)"
143
+ [ -z "$branch" ] && branch="main"
144
+ for _try in 1 2 3; do
145
+ if git -C "$MEMORY_DIR" pull --rebase origin "$branch" --quiet 2>/dev/null \
146
+ && git -C "$MEMORY_DIR" push origin "$branch" --quiet 2>/dev/null; then
147
+ return 0
148
+ fi
149
+ sleep 1
150
+ done
151
+ die "could not push memory after 3 attempts"
152
+ }
153
+
154
+ person_from_state() {
155
+ if [ -f "$SCRIPT_DIR/.egregore-state.json" ]; then
156
+ jq -r '.github_username // .name // empty' "$SCRIPT_DIR/.egregore-state.json" 2>/dev/null || true
157
+ fi
158
+ }
159
+
160
+ current_author() {
161
+ local author
162
+ author="$(person_from_state)"
163
+ [ -n "$author" ] || author="$(git -C "$SCRIPT_DIR" config user.name 2>/dev/null | awk '{print tolower($1)}')"
164
+ [ -n "$author" ] || author="agent"
165
+ echo "$author"
166
+ }
167
+
168
+ worktree_for_branch() {
169
+ local branch="$1"
170
+ git -C "$MAIN_PROJECT_DIR" worktree list --porcelain 2>/dev/null | awk -v ref="refs/heads/$branch" '
171
+ $1 == "worktree" { path = $2 }
172
+ $1 == "branch" && $2 == ref { print path; exit }
173
+ '
174
+ }
175
+
176
+ base_ref() {
177
+ local base
178
+ base="$(resolve_base_branch)" || return 1
179
+ git -C "$MAIN_PROJECT_DIR" fetch origin "$base" --quiet 2>/dev/null || true
180
+ if git -C "$MAIN_PROJECT_DIR" show-ref --verify --quiet "refs/remotes/origin/$base" 2>/dev/null; then
181
+ echo "origin/$base"
182
+ elif git -C "$MAIN_PROJECT_DIR" show-ref --verify --quiet "refs/heads/$base" 2>/dev/null; then
183
+ echo "$base"
184
+ else
185
+ echo "agent.sh: configured base branch '$base' does not exist locally or on origin" >&2
186
+ return 1
187
+ fi
188
+ }
189
+
190
+ clear_base_upstream() {
191
+ local repo="$1" branch="$2" base="$3" upstream=""
192
+ case "$branch" in dev/*|feature/*|bugfix/*) ;; *) return 0 ;; esac
193
+ upstream="$(git -C "$repo" rev-parse --abbrev-ref "${branch}@{upstream}" 2>/dev/null || true)"
194
+ if [ "$upstream" = "$base" ]; then
195
+ git -C "$repo" branch --unset-upstream "$branch" >/dev/null 2>&1 || true
196
+ fi
197
+ }
198
+
199
+ cmd_protocol() {
200
+ cat <<'EOF'
201
+ Egregore portable agent protocol
202
+
203
+ 1. Work inside an Egregore checkout with a linked memory/ repository.
204
+ 2. Run `bin/agent.sh sync` before reading shared state.
205
+ 3. Read `memory/people/` for collaborators.
206
+ 4. Use `bin/agent.sh handoff` to leave structured context for another agent.
207
+ 5. Use `bin/agent.sh ask` and `bin/agent.sh answer` for asynchronous questions.
208
+ 6. Run `bin/agent.sh activity --for <person>` to see pending work.
209
+ 7. Run `bin/agent.sh search "<query>"` to recall shared memory (decisions, handoffs, knowledge) before answering questions about past work.
210
+ 8. Run `bin/agent.sh branch --topic "<what you are working on>"` before code changes when you need a task branch/worktree.
211
+ 9. Run `bin/agent.sh save` and `bin/agent.sh wrap` for portable save/wrap flows.
212
+
213
+ This protocol is runtime-neutral. Claude Code may still use .claude hooks and
214
+ skills, while Codex or another agent can call this script directly.
215
+ EOF
216
+ }
217
+
218
+ cmd_people() {
219
+ ensure_memory
220
+ local people_dir="$MEMORY_DIR/people"
221
+ [ -d "$people_dir" ] || return 0
222
+ local f github display
223
+ for f in "$people_dir"/*.md; do
224
+ [ -f "$f" ] || continue
225
+ github="$(basename "$f" .md)"
226
+ display="$(sed -nE 's/^name:[[:space:]]*(.*)$/\1/p; s/^# (.*)$/\1/p' "$f" | head -1)"
227
+ [ -z "$display" ] && display="$github"
228
+ printf '%s\t%s\n' "$github" "$display"
229
+ done
230
+ }
231
+
232
+ cmd_sync() {
233
+ ensure_memory
234
+ EGREGORE_ROOT="$SCRIPT_DIR" \
235
+ PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}" \
236
+ python3 -m egregore_runtime.harness_cli sync
237
+ }
238
+
239
+ cmd_activity() {
240
+ ensure_memory
241
+ local for_person=""
242
+ local limit=12
243
+ while [ $# -gt 0 ]; do
244
+ case "$1" in
245
+ --for) for_person="${2:-}"; shift 2 ;;
246
+ --limit) limit="${2:-12}"; shift 2 ;;
247
+ *) die "unknown activity option: $1" ;;
248
+ esac
249
+ done
250
+
251
+ echo "Handoffs"
252
+ local lifecycle_args=(scan --managed-only)
253
+ [ -n "$for_person" ] && lifecycle_args+=(--user "$for_person")
254
+ EGREGORE_ROOT="$SCRIPT_DIR" EGREGORE_LIFECYCLE_PUSH=0 \
255
+ python3 -m egregore_runtime.lifecycle_cli "${lifecycle_args[@]}" 2>/dev/null |
256
+ jq -r --argjson limit "$limit" '
257
+ .items[:$limit][]?
258
+ | "- \(.from) -> \(.to // "team") [\(.status)]: \(.topic) (\(.filePath))"
259
+ ' || true
260
+
261
+ echo
262
+ echo "Questions"
263
+ EGREGORE_ROOT="$SCRIPT_DIR" bash "$SCRIPT_DIR/bin/question.sh" pending \
264
+ --limit "$limit" 2>/dev/null |
265
+ jq -r '.questions[]? | "- \(.sender) -> \(.recipient) [pending]: \(.topic) (\(.canonical_path))"' || true
266
+ }
267
+
268
+ cmd_branch() {
269
+ local topic="" author="" branch_type="" slug="" branch="" wt_path="" existing_wt="" base=""
270
+
271
+ while [ $# -gt 0 ]; do
272
+ case "$1" in
273
+ --topic|--description) topic="${2:-}"; shift 2 ;;
274
+ --from|--author) author="${2:-}"; shift 2 ;;
275
+ --type) branch_type="${2:-}"; shift 2 ;;
276
+ *) die "unknown branch option: $1" ;;
277
+ esac
278
+ done
279
+
280
+ [ -n "$topic" ] || topic="$(date +%Y-%m-%d)"
281
+ [ -n "$author" ] || author="$(current_author)"
282
+
283
+ if [ -z "$branch_type" ]; then
284
+ case "$(echo "$topic" | tr '[:upper:]' '[:lower:]')" in
285
+ *fix*|*bug*|*broken*|*crash*) branch_type="bugfix" ;;
286
+ *feature*|*add*|*implement*|*new*) branch_type="feature" ;;
287
+ *) branch_type="dev" ;;
288
+ esac
289
+ fi
290
+ case "$branch_type" in
291
+ dev|feature|bugfix) ;;
292
+ *) die "invalid --type: $branch_type (valid: dev|feature|bugfix)" ;;
293
+ esac
294
+
295
+ slug="$(slugify "$topic")"
296
+ [ -n "$slug" ] || slug="$(date +%Y-%m-%d)"
297
+ case "$branch_type" in
298
+ dev) branch="dev/${author}/${slug}" ;;
299
+ feature) branch="feature/${slug}" ;;
300
+ bugfix) branch="bugfix/${slug}" ;;
301
+ esac
302
+
303
+ base="$(base_ref)" || die "could not find a safe branch point"
304
+
305
+ if [ -f "$SCRIPT_DIR/.git" ]; then
306
+ if git -C "$SCRIPT_DIR" show-ref --verify --quiet "refs/heads/$branch" 2>/dev/null; then
307
+ git -C "$SCRIPT_DIR" checkout "$branch" --quiet
308
+ else
309
+ git -C "$SCRIPT_DIR" checkout --no-track -b "$branch" "$base" --quiet
310
+ fi
311
+ clear_base_upstream "$SCRIPT_DIR" "$branch" "$base"
312
+ egregore_link_shared_state "$SCRIPT_DIR" "$MAIN_PROJECT_DIR" >/dev/null 2>/dev/null || true
313
+ echo "branch: $branch"
314
+ echo "worktree: $SCRIPT_DIR"
315
+ return 0
316
+ fi
317
+
318
+ existing_wt="$(worktree_for_branch "$branch")"
319
+ if [ -n "$existing_wt" ] && [ -d "$existing_wt" ]; then
320
+ bash "$MAIN_PROJECT_DIR/bin/worktree.sh" setup "$existing_wt" "$MAIN_PROJECT_DIR" >/dev/null 2>/dev/null || true
321
+ echo "branch: $branch"
322
+ echo "worktree: $existing_wt"
323
+ return 0
324
+ fi
325
+
326
+ if ! git -C "$MAIN_PROJECT_DIR" show-ref --verify --quiet "refs/heads/$branch" 2>/dev/null; then
327
+ git -C "$MAIN_PROJECT_DIR" branch --no-track "$branch" "$base" >/dev/null 2>&1 || die "failed to create branch $branch"
328
+ fi
329
+ clear_base_upstream "$MAIN_PROJECT_DIR" "$branch" "$base"
330
+
331
+ wt_path="$MAIN_PROJECT_DIR/.claude/worktrees/$slug"
332
+ if [ -e "$wt_path" ]; then
333
+ die "worktree path already exists: $wt_path"
334
+ fi
335
+
336
+ mkdir -p "$MAIN_PROJECT_DIR/.claude/worktrees"
337
+ git -C "$MAIN_PROJECT_DIR" worktree add "$wt_path" "$branch" --quiet 2>/dev/null || die "failed to create worktree at $wt_path"
338
+ bash "$MAIN_PROJECT_DIR/bin/worktree.sh" setup "$wt_path" "$MAIN_PROJECT_DIR" >/dev/null 2>/dev/null || true
339
+
340
+ echo "branch: $branch"
341
+ echo "worktree: $wt_path"
342
+ }
343
+
344
+ ensure_working_branch() {
345
+ local topic="${1:-$(date +%Y-%m-%d)}"
346
+ local author branch slug base
347
+ branch="$(git -C "$SCRIPT_DIR" branch --show-current 2>/dev/null || echo "")"
348
+ case "$branch" in
349
+ dev/*|feature/*|bugfix/*) echo "$branch"; return 0 ;;
350
+ esac
351
+
352
+ author="$(current_author)"
353
+ slug="$(slugify "$topic")"
354
+ [ -n "$slug" ] || slug="$(date +%Y-%m-%d)"
355
+ branch="dev/${author}/${slug}"
356
+ base="$(base_ref)" || die "could not find a safe branch point"
357
+
358
+ if git -C "$SCRIPT_DIR" show-ref --verify --quiet "refs/heads/$branch" 2>/dev/null; then
359
+ git -C "$SCRIPT_DIR" checkout "$branch" --quiet || die "failed to checkout $branch"
360
+ else
361
+ git -C "$SCRIPT_DIR" checkout --no-track -b "$branch" "$base" --quiet || die "failed to create $branch"
362
+ fi
363
+ clear_base_upstream "$SCRIPT_DIR" "$branch" "$base"
364
+ echo "$branch"
365
+ }
366
+
367
+ build_pr_body() {
368
+ # Compliant fallback PR body (spec: .claude/context/pr-format.md) built
369
+ # from the commit log + diff when the calling agent supplies none.
370
+ local topic="${1:-portable save}" base commits stat
371
+ base="$(resolve_base_branch)" || return 1
372
+ commits="$(git -C "$SCRIPT_DIR" log --pretty='- %s' "origin/$base..HEAD" 2>/dev/null | head -8)"
373
+ [ -n "$commits" ] || commits="- (commit list unavailable — see the Files tab)"
374
+ stat="$(git -C "$SCRIPT_DIR" diff --shortstat "origin/$base...HEAD" 2>/dev/null | sed 's/^ *//')"
375
+ egregore_pr_skeleton \
376
+ "$commits" \
377
+ "Shell-agent session save — topic: $topic. Body auto-generated by bin/agent.sh; pass --pr-body for a hand-written description." \
378
+ "Not verified — auto-generated skeleton; review the diff before merging.${stat:+ ($stat)}" \
379
+ "🤖 Saved via bin/agent.sh"
380
+ }
381
+
382
+ cmd_save() {
383
+ local message="" topic="" no_pr=0 branch base pushed="false" committed="false" pr_url="" existing_pr="" pr_number="" non_md="" merged="false" pr_body="" pr_body_file=""
384
+
385
+ while [ $# -gt 0 ]; do
386
+ case "$1" in
387
+ --message|-m) message="${2:-}"; shift 2 ;;
388
+ --topic) topic="${2:-}"; shift 2 ;;
389
+ --pr-body) pr_body="${2:-}"; shift 2 ;;
390
+ --pr-body-file) pr_body_file="${2:-}"; shift 2 ;;
391
+ --no-pr) no_pr=1; shift ;;
392
+ *) die "unknown save option: $1" ;;
393
+ esac
394
+ done
395
+
396
+ [ -n "$topic" ] || topic="portable save"
397
+ [ -n "$message" ] || message="chore(save): $topic"
398
+ base="$(resolve_base_branch)" || die "save stopped before Git changes"
399
+
400
+ if [ -d "$MEMORY_DIR" ]; then
401
+ save_memory "$message" "."
402
+ echo "memory: synced"
403
+ fi
404
+
405
+ branch="$(git -C "$SCRIPT_DIR" branch --show-current 2>/dev/null || echo "")"
406
+ if [ -n "$(git -C "$SCRIPT_DIR" status --porcelain 2>/dev/null | head -1)" ]; then
407
+ branch="$(ensure_working_branch "$topic")"
408
+ git -C "$SCRIPT_DIR" add -A >/dev/null 2>&1 || die "git add failed"
409
+ if ! git -C "$SCRIPT_DIR" diff --cached --quiet 2>/dev/null; then
410
+ egregore_commit "$SCRIPT_DIR" "$SCRIPT_DIR" "$message" --quiet || die "git commit failed"
411
+ committed="true"
412
+ fi
413
+ fi
414
+ [ -n "$branch" ] || branch="$(git -C "$SCRIPT_DIR" branch --show-current 2>/dev/null || echo "")"
415
+
416
+ if [ -n "$branch" ] && git -C "$SCRIPT_DIR" remote get-url origin >/dev/null 2>&1; then
417
+ if git -C "$SCRIPT_DIR" push -u origin "$branch" --quiet 2>/dev/null; then
418
+ pushed="true"
419
+ else
420
+ die "push failed for $branch; commits are safe locally"
421
+ fi
422
+ fi
423
+
424
+ if [ "$no_pr" = "0" ] && [ "$pushed" = "true" ] && command -v gh >/dev/null 2>&1; then
425
+ existing_pr="$(gh pr list --head "$branch" --state open --json url --jq '.[0].url // empty' 2>/dev/null || true)"
426
+ if [ -n "$existing_pr" ]; then
427
+ pr_url="$existing_pr"
428
+ else
429
+ if [ -z "$pr_body" ] && [ -n "$pr_body_file" ] && [ -f "$pr_body_file" ]; then
430
+ pr_body="$(cat "$pr_body_file")"
431
+ fi
432
+ [ -n "$pr_body" ] || pr_body="$(build_pr_body "$topic")"
433
+ pr_url="$(gh pr create --base "$base" --head "$branch" --title "${message%%$'\n'*}" --body "$pr_body" 2>/dev/null || true)"
434
+ fi
435
+ fi
436
+
437
+ # Non-coding saves auto-merge to the configured base (same rule as /save and the
438
+ # handoff helper; policy in bin/lib/noncode.sh). `--auto` needs repo
439
+ # auto-merge + pending required checks; without branch protection it always
440
+ # errors, so fall back to a direct merge.
441
+ if [ -n "$pr_url" ]; then
442
+ # shellcheck source=bin/lib/noncode.sh
443
+ . "$SCRIPT_DIR/bin/lib/noncode.sh" 2>/dev/null || true
444
+ type noncode_blockers >/dev/null 2>&1 || noncode_blockers() {
445
+ git -C "${2:-.}" diff "${1:-origin/$base}...HEAD" --name-only 2>/dev/null | grep -v '\.md$' | head -1 || true
446
+ }
447
+ pr_number="${pr_url##*/}"
448
+ non_code="$(noncode_blockers "origin/$base" "$SCRIPT_DIR")"
449
+ if [ -z "$non_code" ] && [ -n "$pr_number" ]; then
450
+ if gh pr merge "$pr_number" --auto --merge >/dev/null 2>&1 \
451
+ || gh pr merge "$pr_number" --merge >/dev/null 2>&1; then
452
+ merged="true"
453
+ fi
454
+ fi
455
+ fi
456
+
457
+ echo "branch: ${branch:-none}"
458
+ echo "commit: $committed"
459
+ echo "push: $pushed"
460
+ [ -n "$pr_url" ] && echo "pr: $pr_url"
461
+ [ "$merged" = "true" ] && echo "merge: non-coding, merged to $base"
462
+ return 0
463
+ }
464
+
465
+ # Deterministic wrap result card — the visible product surface of a wrap.
466
+ # Pure renderer: no writes, callable standalone (wrap-card) for tests.
467
+ render_wrap_card() {
468
+ local actor="" topic="" summary="" threads="0" path="" save=""
469
+ while [ $# -gt 0 ]; do
470
+ case "$1" in
471
+ --actor) actor="${2:-}"; shift 2 ;;
472
+ --topic) topic="${2:-}"; shift 2 ;;
473
+ --summary) summary="${2:-}"; shift 2 ;;
474
+ --threads) threads="${2:-0}"; shift 2 ;;
475
+ --path) path="${2:-}"; shift 2 ;;
476
+ --save) save="${2:-}"; shift 2 ;;
477
+ *) shift ;;
478
+ esac
479
+ done
480
+ local rule="──────────────────────────────────────────────────────────"
481
+ printf '┌%s\n' "$rule"
482
+ printf '│ EGREGORE ✦ SESSION WRAPPED\n'
483
+ printf '├%s\n' "$rule"
484
+ printf '│ actor %s\n' "$actor"
485
+ printf '│ topic %s\n' "$topic"
486
+ printf '%s\n' "$summary" | fold -s -w 48 | sed '1s/^/│ summary /; 2,$s/^/│ /'
487
+ printf '│ threads %s open\n' "$threads"
488
+ printf '│ path %s\n' "$path"
489
+ [ -n "$save" ] && printf '│ save %s\n' "$save"
490
+ printf '└%s\n' "$rule"
491
+ }
492
+
493
+ cmd_wrap() {
494
+ ensure_memory
495
+ local from="" topic="" summary="" body="" body_file="" no_push=0
496
+
497
+ while [ $# -gt 0 ]; do
498
+ case "$1" in
499
+ --from) from="${2:-}"; shift 2 ;;
500
+ --topic) topic="${2:-}"; shift 2 ;;
501
+ --summary) summary="${2:-}"; shift 2 ;;
502
+ --body) body="${2:-}"; shift 2 ;;
503
+ --body-file) body_file="${2:-}"; shift 2 ;;
504
+ --no-push) no_push=1; shift ;;
505
+ *) die "unknown wrap option: $1" ;;
506
+ esac
507
+ done
508
+
509
+ [ -n "$from" ] || from="$(current_author)"
510
+ [ -n "$topic" ] || die "wrap requires --topic"
511
+ [ -n "$summary" ] || die "wrap requires --summary"
512
+ if [ -n "$body_file" ]; then
513
+ [ -f "$body_file" ] || die "body file not found: $body_file"
514
+ body="$(cat "$body_file")"
515
+ elif [ -z "$body" ] && [ ! -t 0 ]; then
516
+ body="$(cat)"
517
+ fi
518
+ [ -n "$body" ] || body="$summary"
519
+
520
+ local tmpd result rel session_id branch
521
+ local capture_args=(--mode personal)
522
+ tmpd="$(mktemp -d -t egregore-agent-wrap-XXXXXX)"
523
+ trap 'rm -rf "$tmpd"' RETURN
524
+ session_id="$(cat "$SCRIPT_DIR/.egregore-session-id" 2>/dev/null || true)"
525
+ branch="$(git -C "$SCRIPT_DIR" branch --show-current 2>/dev/null || true)"
526
+ [ "$no_push" = "1" ] && capture_args+=(--no-push)
527
+
528
+ printf '%s\n' "$body" |
529
+ TMPDIR="$tmpd" bash "$SCRIPT_DIR/bin/artifact-writeback.sh" capture \
530
+ "${capture_args[@]}" \
531
+ --author "$from" \
532
+ --topic "$topic" \
533
+ --summary "$summary" \
534
+ --session-id "$session_id" \
535
+ --branch "$branch" >/dev/null
536
+
537
+ result="$tmpd/capture-run-result.json"
538
+ rel="$(jq -r '.file // empty' "$result" 2>/dev/null || true)"
539
+ [ -n "$rel" ] || die "wrap was not created"
540
+ echo "wrap: memory/$rel"
541
+
542
+ local open_threads save_line
543
+ open_threads="$(printf '%s\n' "$body" | grep -c '^\- \[ \]' 2>/dev/null || echo 0)"
544
+ if [ "$no_push" = "1" ]; then
545
+ save_line="✓ canonical writeback · push skipped (--no-push)"
546
+ else
547
+ save_line="✓ canonical writeback · session autosave sweeping in background"
548
+ fi
549
+ render_wrap_card \
550
+ --actor "$from" \
551
+ --topic "$topic" \
552
+ --summary "$summary" \
553
+ --threads "$open_threads" \
554
+ --path "memory/$rel" \
555
+ --save "$save_line"
556
+
557
+ # Session close: non-coding core-repo changes save + merge themselves
558
+ # (gated inside session-autosave.sh — code is never auto-committed).
559
+ if [ "$no_push" = "0" ]; then
560
+ ( bash "$SCRIPT_DIR/bin/session-autosave.sh" --dir "$SCRIPT_DIR" >/dev/null 2>&1 & ) >/dev/null 2>&1
561
+ fi
562
+ }
563
+
564
+ cmd_handoff() {
565
+ ensure_memory
566
+ local from="" to="" topic="" body="" body_file="" project="" intent="action"
567
+ local no_publish=0 no_notify=0 json=0 body_supplied=0 content_mode="generated"
568
+ NO_PUSH=0
569
+
570
+ while [ $# -gt 0 ]; do
571
+ case "$1" in
572
+ --from) from="${2:-}"; shift 2 ;;
573
+ --to) to="${2:-}"; shift 2 ;;
574
+ --topic) topic="${2:-}"; shift 2 ;;
575
+ --body) body="${2:-}"; shift 2 ;;
576
+ --body-file) body_file="${2:-}"; shift 2 ;;
577
+ --project) project="${2:-}"; shift 2 ;;
578
+ --intent) intent="${2:-}"; shift 2 ;;
579
+ --no-push) NO_PUSH=1; shift ;;
580
+ --no-publish) no_publish=1; shift ;;
581
+ --no-notify) no_notify=1; shift ;;
582
+ --json) json=1; shift ;;
583
+ *) die "unknown handoff option: $1" ;;
584
+ esac
585
+ done
586
+
587
+ [ -z "$from" ] && from="$(person_from_state)"
588
+ [ -n "$from" ] || die "handoff requires --from"
589
+ [ -n "$topic" ] || die "handoff requires --topic"
590
+ case "$intent" in
591
+ action|feedback|fyi) ;;
592
+ *) die "invalid --intent: $intent (action|feedback|fyi)" ;;
593
+ esac
594
+ if [ -n "$body_file" ]; then
595
+ [ -f "$body_file" ] || die "body file not found: $body_file"
596
+ body="$(cat "$body_file")"
597
+ body_supplied=1
598
+ elif [ -z "$body" ] && [ ! -t 0 ]; then
599
+ body="$(cat)"
600
+ [ -n "$body" ] && body_supplied=1
601
+ elif [ -n "$body" ]; then
602
+ body_supplied=1
603
+ fi
604
+ [ "$body_supplied" = "1" ] && content_mode="supplied"
605
+
606
+ local today tmpd result result_out rel stdout_file
607
+ local handoff_args=()
608
+ today="$(date +%Y-%m-%d)"
609
+ tmpd="$(mktemp -d -t egregore-agent-handoff-XXXXXX)"
610
+ trap 'rm -rf "$tmpd"' RETURN
611
+ result_out="$(mktemp -t egregore-agent-handoff-result-XXXXXX.json)"
612
+ stdout_file="$tmpd/stdout"
613
+
614
+ [ -n "$to" ] && handoff_args+=(--recipient "$to")
615
+ [ -n "$project" ] && handoff_args+=(--project "$project")
616
+ handoff_args+=(--intent "$intent" --content-mode "$content_mode")
617
+ [ "$content_mode" = "generated" ] && handoff_args+=(--include-session-artifacts)
618
+ [ "$NO_PUSH" = "1" ] && handoff_args+=(--no-push)
619
+ [ "$no_publish" = "1" ] && handoff_args+=(--no-publish)
620
+ [ "$no_notify" = "1" ] && handoff_args+=(--no-notify)
621
+
622
+ {
623
+ printf '%s\n' '---'
624
+ printf 'capture_schema: egregore-capture/v1\n'
625
+ printf 'capture_mode: addressed\n'
626
+ printf 'kind: addressed\n'
627
+ printf 'content_mode: %s\n' "$content_mode"
628
+ printf 'from: %s\n' "$(yaml_str "$from")"
629
+ [ -n "$to" ] && printf 'addressed_to: %s\n' "$(yaml_str "$to")"
630
+ printf 'date: %s\n' "$today"
631
+ printf 'topic: %s\n' "$(yaml_str "$topic")"
632
+ printf 'intent: %s\n' "$intent"
633
+ [ -n "$project" ] && printf 'project: %s\n' "$(yaml_str "$project")"
634
+ printf '%s\n\n' '---'
635
+ if [ "$content_mode" = "supplied" ]; then
636
+ printf '%s\n' "$body"
637
+ else
638
+ printf '# Handoff: %s\n\n' "$topic"
639
+ printf '## Briefing\n\nNo briefing was supplied.\n\n'
640
+ printf '## Next Steps\n\n1. Continue from this handoff using the shared Egregore memory protocol.\n'
641
+ fi
642
+ } | TMPDIR="$tmpd" bash "$SCRIPT_DIR/bin/artifact-writeback.sh" capture \
643
+ --mode addressed \
644
+ --author "$from" \
645
+ --topic "$topic" \
646
+ "${handoff_args[@]}" \
647
+ > "$stdout_file"
648
+
649
+ result="$tmpd/handoff-run-result.json"
650
+ rel="$(jq -r '.file // empty' "$result" 2>/dev/null || true)"
651
+ [ -n "$rel" ] || die "handoff was not created"
652
+ cp "$result" "$result_out"
653
+ if [ "$json" = "1" ]; then
654
+ cat "$result_out"
655
+ return 0
656
+ fi
657
+ [ -s "$stdout_file" ] && sed 's/^/status: /' "$stdout_file"
658
+ echo "handoff: memory/$rel"
659
+ echo "result: $result_out"
660
+
661
+ # Parity with the Claude /handoff skill: save core-repo session work in the
662
+ # background (non-coding diffs auto-merge to the configured base; code stays
663
+ # in a PR).
664
+ if [ "$NO_PUSH" = "0" ]; then
665
+ ( bash "$SCRIPT_DIR/bin/handoff-save-egregore.sh" "$from" "$topic" --repo-dir "$SCRIPT_DIR" >/dev/null 2>&1 & ) >/dev/null 2>&1
666
+ fi
667
+ }
668
+
669
+ cmd_ask() {
670
+ ensure_memory
671
+ local from="" to="" to_actor_id="" topic="" question=""
672
+ local harvest_id="" harvest_session_id="" turn="" question_intent="" context_mode=""
673
+ NO_PUSH=0
674
+
675
+ while [ $# -gt 0 ]; do
676
+ case "$1" in
677
+ --from) from="${2:-}"; shift 2 ;;
678
+ --to) to="${2:-}"; shift 2 ;;
679
+ --to-actor-id) to_actor_id="${2:-}"; shift 2 ;;
680
+ --topic) topic="${2:-}"; shift 2 ;;
681
+ --question) question="${2:-}"; shift 2 ;;
682
+ --harvest-id) harvest_id="${2:-}"; shift 2 ;;
683
+ --harvest-session-id) harvest_session_id="${2:-}"; shift 2 ;;
684
+ --turn) turn="${2:-}"; shift 2 ;;
685
+ --question-intent) question_intent="${2:-}"; shift 2 ;;
686
+ --context-mode) context_mode="${2:-}"; shift 2 ;;
687
+ --no-push) NO_PUSH=1; shift ;;
688
+ *) die "unknown ask option: $1" ;;
689
+ esac
690
+ done
691
+
692
+ [ -z "$from" ] && from="$(person_from_state)"
693
+ [ -n "$from" ] || die "ask requires --from"
694
+ [ -n "$to" ] || die "ask requires --to"
695
+ [ -n "$topic" ] || die "ask requires --topic"
696
+ [ -n "$question" ] || die "ask requires --question"
697
+
698
+ if [ -n "$context_mode" ]; then
699
+ case "$context_mode" in
700
+ blind|disclosed|comparative) ;;
701
+ *) die "invalid --context-mode: $context_mode (valid: blind|disclosed|comparative)" ;;
702
+ esac
703
+ fi
704
+
705
+ if [ -n "$turn" ]; then
706
+ case "$turn" in
707
+ ''|*[!0-9]*) die "invalid --turn: must be a non-negative integer" ;;
708
+ esac
709
+ fi
710
+
711
+ reject_newlines "--from" "$from"
712
+ reject_newlines "--to" "$to"
713
+ reject_newlines "--to-actor-id" "$to_actor_id"
714
+ reject_newlines "--topic" "$topic"
715
+ reject_newlines "--question" "$question"
716
+ reject_newlines "--harvest-id" "$harvest_id"
717
+ reject_newlines "--harvest-session-id" "$harvest_session_id"
718
+ reject_newlines "--question-intent" "$question_intent"
719
+
720
+ local -a question_args
721
+ question_args=(create --from "$from" --to "$to" --topic "$topic" --question "$question")
722
+ [ -n "$to_actor_id" ] && question_args+=(--to-actor-id "$to_actor_id")
723
+ [ -n "$harvest_id" ] && question_args+=(--harvest-id "$harvest_id")
724
+ [ -n "$harvest_session_id" ] && question_args+=(--harvest-session-id "$harvest_session_id")
725
+ [ -n "$turn" ] && question_args+=(--turn "$turn")
726
+ [ -n "$question_intent" ] && question_args+=(--question-intent "$question_intent")
727
+ [ -n "$context_mode" ] && question_args+=(--context-mode "$context_mode")
728
+ [ "$NO_PUSH" = "1" ] && question_args+=(--no-push)
729
+
730
+ local receipt
731
+ receipt="$(bash "$SCRIPT_DIR/bin/question.sh" "${question_args[@]}")"
732
+ echo "question: $(printf '%s' "$receipt" | jq -r '.canonical_path')"
733
+ }
734
+
735
+ cmd_answer() {
736
+ ensure_memory
737
+ local from="" question_path="" body=""
738
+ NO_PUSH=0
739
+
740
+ while [ $# -gt 0 ]; do
741
+ case "$1" in
742
+ --from) from="${2:-}"; shift 2 ;;
743
+ --question) question_path="${2:-}"; shift 2 ;;
744
+ --body) body="${2:-}"; shift 2 ;;
745
+ --no-push) NO_PUSH=1; shift ;;
746
+ *) die "unknown answer option: $1" ;;
747
+ esac
748
+ done
749
+
750
+ [ -z "$from" ] && from="$(person_from_state)"
751
+ [ -n "$from" ] || die "answer requires --from"
752
+ [ -n "$question_path" ] || die "answer requires --question"
753
+ [ -n "$body" ] || die "answer requires --body"
754
+
755
+ local -a question_args
756
+ question_args=(answer --from "$from" --question "$question_path" --body "$body")
757
+ [ "$NO_PUSH" = "1" ] && question_args+=(--no-push)
758
+ local receipt
759
+ receipt="$(bash "$SCRIPT_DIR/bin/question.sh" "${question_args[@]}")"
760
+ echo "answered: $(printf '%s' "$receipt" | jq -r '.canonical_path')"
761
+ }
762
+
763
+ cmd_search() {
764
+ bash "$SCRIPT_DIR/bin/search.sh" query "$@"
765
+ }
766
+
767
+ case "${1:-}" in
768
+ --help|-h|help|"") usage ;;
769
+ protocol) shift; cmd_protocol "$@" ;;
770
+ sync) shift; cmd_sync "$@" ;;
771
+ activity) shift; cmd_activity "$@" ;;
772
+ search) shift; cmd_search "$@" ;;
773
+ people) shift; cmd_people "$@" ;;
774
+ branch) shift; cmd_branch "$@" ;;
775
+ save) shift; cmd_save "$@" ;;
776
+ autosave) shift; bash "$SCRIPT_DIR/bin/autosave.sh" "$@" ;;
777
+ wrap) shift; cmd_wrap "$@" ;;
778
+ wrap-card) shift; render_wrap_card "$@" ;;
779
+ handoff) shift; cmd_handoff "$@" ;;
780
+ ask) shift; cmd_ask "$@" ;;
781
+ answer) shift; cmd_answer "$@" ;;
782
+ *) die "unknown command: $1" ;;
783
+ esac