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
@@ -95,6 +95,24 @@ if [ -n "${CTX_SEED_TAR:-}" ] && [ -f "${CTX_SEED_TAR:-}" ]; then
95
95
  fi
96
96
  fi
97
97
  fi
98
+ # Record why a fresh bake was not used — seed misses silently cost a full
99
+ # live gather, so the reason must be observable in startup traces.
100
+ if [ "$CTX_SEED_USED" != "true" ]; then
101
+ _SEED_REASON="tar-extract"
102
+ if [ "$_SEED_TS" != "0" ] || [ -n "$_SEED_AUTHOR" ]; then
103
+ if [ "$_SEED_AUTHOR" != "$AUTHOR" ]; then _SEED_REASON="author"
104
+ elif [ "$_SEED_MODE" != "${LOCAL_MODE:-false}" ]; then _SEED_REASON="mode"
105
+ elif [ "$_SEED_CONFIG" != "$_NOW_CONFIG" ]; then _SEED_REASON="config"
106
+ elif [ "$_SEED_SCOPE" != "$_NOW_SCOPE" ]; then _SEED_REASON="scope"
107
+ elif [ "$_SEED_SCHEMA" != "$_NOW_SCHEMA" ]; then _SEED_REASON="schema"
108
+ elif [ "$_SEED_AGE" -lt 0 ] || [ "$_SEED_AGE" -ge 900 ]; then _SEED_REASON="age:${_SEED_AGE}s"
109
+ else _SEED_REASON="completeness"
110
+ fi
111
+ fi
112
+ type egregore_trace_mark >/dev/null 2>&1 && egregore_trace_mark "context:seed-rejected:${_SEED_REASON}"
113
+ else
114
+ type egregore_trace_mark >/dev/null 2>&1 && egregore_trace_mark "context:seed-accepted"
115
+ fi
98
116
  rm -rf "$_SEED_TMP"
99
117
  fi
100
118
 
@@ -370,28 +388,21 @@ fi
370
388
  JSON="[]"
371
389
  RICH="[]"
372
390
  if [ -d "$SCRIPT_DIR/memory/handoffs" ]; then
373
- # One definition everywhere: in connected mode the list comes from the
374
- # graph's open-handoffs named read (open = pending/unread/read/claimed,
375
- # matched by name/github/aliases) — the same definition the dashboard
376
- # uses. The file grep below stays as the local-mode/offline fallback.
391
+ # One definition everywhere: Egregore Runtime folds canonical lifecycle
392
+ # state for both Local and Connected instances. Graph is an optional
393
+ # projection and must never become the startup/default retrieval path.
377
394
  ADDRESSED=""
378
- if [ "${LOCAL_MODE:-false}" != "true" ]; then
379
- _GRAPH_LIST=$(bash "$SCRIPT_DIR/bin/graph-op.sh" open-handoffs "$AUTHOR" 5 2>/dev/null || true)
380
- if echo "$_GRAPH_LIST" | jq -e '.values | length > 0' >/dev/null 2>&1; then
381
- ADDRESSED=$(echo "$_GRAPH_LIST" | jq -r '.values[][0]' 2>/dev/null | awk '!seen[$0]++' | while IFS= read -r _SID; do
382
- # Two on-disk layouts: dated subdirs (YYYY-MM/DD-slug.md, the id's
383
- # own shape) and flat files at the handoffs root. Probe both, else
384
- # a graph-listed handoff silently vanishes from the greeting.
385
- _MONTH="${_SID:0:7}"
386
- _REST="${_SID:8}"
387
- _F="$SCRIPT_DIR/memory/handoffs/$_MONTH/$_REST.md"
388
- if [ -f "$_F" ]; then
389
- echo "$_F"
390
- elif [ -f "$SCRIPT_DIR/memory/handoffs/$_SID.md" ]; then
391
- echo "$SCRIPT_DIR/memory/handoffs/$_SID.md"
392
- fi
393
- done | head -5)
394
- fi
395
+ _RUNTIME_STATUS=$(bash "$SCRIPT_DIR/bin/activity-data.sh" 2>/dev/null || true)
396
+ if echo "$_RUNTIME_STATUS" | jq -e '.handoffs_to_me | type == "array"' >/dev/null 2>&1; then
397
+ ADDRESSED=$(echo "$_RUNTIME_STATUS" | jq -r '.handoffs_to_me[0:5][]?.filePath // empty' 2>/dev/null | while IFS= read -r _REL; do
398
+ _F=""
399
+ if [[ "$_REL" == memory/* ]]; then
400
+ _F="$SCRIPT_DIR/$_REL"
401
+ elif [[ "$_REL" == handoffs/* ]]; then
402
+ _F="$SCRIPT_DIR/memory/$_REL"
403
+ fi
404
+ [ -n "$_F" ] && [ -f "$_F" ] && printf '%s\n' "$_F"
405
+ done)
395
406
  fi
396
407
  # Match github username, display name, github_name first word, and people-file name
397
408
  # Handoff files may use "to: name", "**To**: name", or "To: name"
@@ -410,6 +421,8 @@ fi
410
421
  echo "$_GREP_PAT" | grep -qF "$_VARIANT" && continue
411
422
  _GREP_PAT="$_GREP_PAT\|[Tt]o[*]*: *$_VARIANT\|[Tt]o[*]*:$_VARIANT"
412
423
  done
424
+ # Compatibility fallback for an unavailable Runtime. It reads canonical
425
+ # Markdown directly and never calls graph or a control-plane retrieval API.
413
426
  if [ -z "$ADDRESSED" ]; then
414
427
  ADDRESSED=$(grep -rli "$_GREP_PAT" "$SCRIPT_DIR/memory/handoffs/" 2>/dev/null | sort -r | head -5 || true)
415
428
  fi
@@ -509,12 +522,20 @@ fi
509
522
 
510
523
  # 7. Graph health (background — zero added latency, runs in parallel; seeded)
511
524
  [ "$CTX_SEED_USED" != "true" ] && (
512
- if [ "$LOCAL_MODE" = "true" ]; then
525
+ if [ "$LOCAL_MODE" = "true" ] || ! _graph_projection_enabled; then
513
526
  echo "skip"
514
- elif bash "$SCRIPT_DIR/bin/graph.sh" test 2>/dev/null | grep -q "Connected"; then
515
- echo "ok"
516
527
  else
517
- echo "fail"
528
+ _GRAPH_TEST=$(bash "$SCRIPT_DIR/bin/graph.sh" test 2>/dev/null)
529
+ if printf '%s' "$_GRAPH_TEST" | grep -q "runtime_qmd_active"; then
530
+ # Not a failure: the activated Runtime/QMD does not use graph
531
+ # retrieval — the greeting already carries that receipt, so /checkup
532
+ # nagging here would be false alarm.
533
+ echo "skip"
534
+ elif printf '%s' "$_GRAPH_TEST" | grep -q "Connected"; then
535
+ echo "ok"
536
+ else
537
+ echo "fail"
538
+ fi
518
539
  fi
519
540
  ) > "$CTX_DIR/graph_health" 2>/dev/null &
520
541
 
@@ -21,6 +21,8 @@
21
21
  FRAMEWORK_UPDATED="false"
22
22
  FRAMEWORK_UPDATED_COUNT=0
23
23
  FRAMEWORK_UPDATED_FILES=""
24
+ HEALTH_RETRIEVAL="skip"
25
+ SYNC_RECEIPT=""
24
26
 
25
27
  # The core repo's integration branch: "develop" unless egregore.json sets
26
28
  # base_branch. session-start.sh resolves this before sourcing; resolve it here
@@ -115,6 +117,7 @@ fi
115
117
 
116
118
  # Wait for all fetches
117
119
  wait 2>/dev/null || true
120
+ type egregore_trace_mark >/dev/null 2>&1 && egregore_trace_mark "sync:fetch-join(refs_fresh=$_REFS_FRESH)"
118
121
 
119
122
  # --- Auto-update framework from upstream (deferred) ---
120
123
  # Moved AFTER setup_develop() so framework commits land on develop, not on
@@ -278,6 +281,17 @@ setup_develop() {
278
281
  COMMITS_AHEAD=$(git rev-list "origin/main..$BASE_BRANCH" --count 2>/dev/null || echo "0")
279
282
  fi
280
283
 
284
+ # Read-only invocations (tests, card/prompt renders exercised outside a
285
+ # real session start) stop here: the ref updates above are working-tree
286
+ # safe, but autosave commits, branch pushes, and parking the checkout on
287
+ # the base branch mutate a live repo out from under whatever session owns
288
+ # it.
289
+ if [ "${EGREGORE_GIT_SYNC_READONLY:-0}" = "1" ]; then
290
+ ACTION="ready"
291
+ SAVED_BRANCH=""
292
+ return 0
293
+ fi
294
+
281
295
  # Always start from the base branch
282
296
  # Every session begins there. Claude creates a fresh topic branch
283
297
  # (dev/{author}/{topic-slug}) when the user says what they're working on.
@@ -397,15 +411,65 @@ if [ "$IS_WORKTREE" != "true" ] && [ "$BASE_BRANCH_READY" = "true" ]; then
397
411
  _apply_framework_update 2>/dev/null || true
398
412
  fi
399
413
 
400
- # --- Sync memory (symlink or direct directory — both valid) ---
414
+ # --- Synchronize canonical memory and retrieval readiness ---
415
+ type egregore_trace_mark >/dev/null 2>&1 && egregore_trace_mark "sync:branch-setup"
401
416
  if [ -d "$SCRIPT_DIR/memory/.git" ]; then
402
- MEM_LOCAL=$(git -C "$SCRIPT_DIR/memory" rev-parse HEAD 2>/dev/null || echo "")
403
- MEM_REMOTE=$(git -C "$SCRIPT_DIR/memory" rev-parse origin/main 2>/dev/null || echo "")
404
- if [ -n "$MEM_LOCAL" ] && [ -n "$MEM_REMOTE" ] && [ "$MEM_LOCAL" != "$MEM_REMOTE" ]; then
405
- git -C "$SCRIPT_DIR/memory" pull origin main --quiet 2>/dev/null || true
417
+ # Runtime owns the whole receipt: canonical Git state gates the synchronous
418
+ # lexical refresh, then semantic construction is scheduled in the
419
+ # background. Capture stderr as part of a visible failure instead of turning
420
+ # a failed pull into a false "memory synced" state.
421
+ # When the attendant's warm marker proved a successful fetch round within
422
+ # the freshness window, the memory remote-tracking ref is already current —
423
+ # let the Runtime sync reuse it instead of fetching a second time. Boots
424
+ # without that proof keep the Runtime's own fetch as the canonical gate.
425
+ _SYNC_FETCH_FRESH=0
426
+ [ "${_REFS_FRESH:-false}" = "true" ] && _SYNC_FETCH_FRESH=1
427
+ SYNC_RECEIPT=$(EGREGORE_ROOT="$SCRIPT_DIR" \
428
+ PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}" \
429
+ EGREGORE_SYNC_FETCH_FRESH="$_SYNC_FETCH_FRESH" \
430
+ python3 -m egregore_runtime.harness_cli sync --json 2>&1) || true
431
+ if printf '%s' "$SYNC_RECEIPT" | jq -e '.schema_version == "egregore-runtime-sync/v1"' >/dev/null 2>&1; then
432
+ if [ "$(printf '%s' "$SYNC_RECEIPT" | jq -r '.canonical_current')" = "true" ]; then
433
+ MEMORY_SYNCED="true"
434
+ else
435
+ MEMORY_SYNCED="false"
436
+ HEALTH_GIT="fail"
437
+ fi
438
+ if [ "$(printf '%s' "$SYNC_RECEIPT" | jq -r '.status')" = "ready" ]; then
439
+ HEALTH_RETRIEVAL="ok"
440
+ else
441
+ HEALTH_RETRIEVAL="fail"
442
+ fi
443
+ else
444
+ # Import/runtime failures are still retained as the startup receipt and
445
+ # surfaced through health; never call this synchronized.
446
+ MEMORY_SYNCED="false"
447
+ HEALTH_GIT="fail"
448
+ HEALTH_RETRIEVAL="fail"
449
+ fi
450
+
451
+ # Canonical synchronization and local retrieval readiness are independent
452
+ # health dimensions. A dirty or diverged memory repository must keep Git
453
+ # red, but it does not invalidate a BM25 index that is aligned with the
454
+ # exact local canonical snapshot. Consult the typed health surface after a
455
+ # failed/degraded sync so the greeting does not report retrieval unavailable
456
+ # when QMD can safely answer from that snapshot. Semantic warming is healthy.
457
+ if [ "$HEALTH_RETRIEVAL" != "ok" ]; then
458
+ RETRIEVAL_HEALTH=$(EGREGORE_ROOT="$SCRIPT_DIR" \
459
+ PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}" \
460
+ python3 -m egregore_runtime.harness_cli status --json 2>/dev/null) || true
461
+ if printf '%s' "$RETRIEVAL_HEALTH" | jq -e '
462
+ .available == true
463
+ and .canonical_state_ready == true
464
+ and .bm25_ready == true
465
+ and .index_source_revision != null
466
+ and .index_source_revision == .source_revision
467
+ ' >/dev/null 2>&1; then
468
+ HEALTH_RETRIEVAL="ok"
469
+ fi
406
470
  fi
407
- MEMORY_SYNCED="true"
408
471
  fi
472
+ type egregore_trace_mark >/dev/null 2>&1 && egregore_trace_mark "sync:memory-retrieval"
409
473
 
410
474
  # --- Sync managed repos ---
411
475
  # Managed repos sync silently — they are a CLI concern and never render in the
@@ -103,7 +103,7 @@ if [ "$LOCAL_MODE" = "true" ]; then
103
103
  # Local mode: only check github + git, skip api-key/graph/telegram
104
104
  HAS_FAILURE="false"
105
105
  FAILED_SERVICES=""
106
- for pair in "github:$HEALTH_GITHUB" "git:$HEALTH_GIT"; do
106
+ for pair in "github:$HEALTH_GITHUB" "git:$HEALTH_GIT" "retrieval:${HEALTH_RETRIEVAL:-skip}"; do
107
107
  svc="${pair%%:*}"
108
108
  svc_status="${pair#*:}"
109
109
  if [ "$svc_status" = "fail" ]; then
@@ -125,7 +125,7 @@ else
125
125
  # Connected mode: check all services
126
126
  HAS_FAILURE="false"
127
127
  FAILED_SERVICES=""
128
- for pair in "github:$HEALTH_GITHUB" "git:$HEALTH_GIT" "api-key:$HEALTH_APIKEY" "graph:$HEALTH_GRAPH" "telegram:$HEALTH_TELEGRAM"; do
128
+ for pair in "github:$HEALTH_GITHUB" "git:$HEALTH_GIT" "retrieval:${HEALTH_RETRIEVAL:-skip}" "api-key:$HEALTH_APIKEY" "graph:$HEALTH_GRAPH" "telegram:$HEALTH_TELEGRAM"; do
129
129
  svc="${pair%%:*}"
130
130
  svc_status="${pair#*:}"
131
131
  if [ "$svc_status" = "fail" ]; then
@@ -141,7 +141,11 @@ else
141
141
  FOOTER_LEFT=" ✓ ready"
142
142
  FOOTER_RIGHT=""
143
143
  if [ "$MEMORY_SYNCED" = "true" ]; then
144
- FOOTER_RIGHT="◆ memory synced"
144
+ if [ "${HEALTH_RETRIEVAL:-skip}" = "ok" ]; then
145
+ FOOTER_RIGHT="◆ memory + recall ready"
146
+ else
147
+ FOOTER_RIGHT="◆ memory synced · recall unavailable"
148
+ fi
145
149
  fi
146
150
 
147
151
  FL_LEN=${#FOOTER_LEFT}
@@ -152,6 +156,31 @@ else
152
156
  fi
153
157
  fi
154
158
 
159
+ # Runtime update summary — cached durable state only, never a live probe, so
160
+ # session start stays fast. One compact line; silent when nothing is staged.
161
+ # Keyed by stable org identity composed with the main installation path
162
+ # (mirrors egregore_runtime.upgrade.instance_key); no org_id → no summary.
163
+ _UPGRADE_ORG=$(jq -r '.org_id // empty' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
164
+ _UPGRADE_MAIN=$(cd "${MAIN_PROJECT_DIR:-$SCRIPT_DIR}" 2>/dev/null && pwd -P || true)
165
+ if [ -n "$_UPGRADE_ORG" ] && [ -n "$_UPGRADE_MAIN" ]; then
166
+ _UPGRADE_HASH=$(printf '%s|%s' "$_UPGRADE_ORG" "$_UPGRADE_MAIN" | shasum -a 256 2>/dev/null | cut -c1-16)
167
+ _UPGRADE_DIR="${EGREGORE_UPGRADE_ROOT:-$HOME/.egregore/runtime/upgrade}/${_UPGRADE_HASH}"
168
+ if [ -f "$_UPGRADE_DIR/active.json" ] \
169
+ && [ "$(jq -r '.retrieval // empty' "$_UPGRADE_DIR/active.json" 2>/dev/null)" = "runtime-qmd" ]; then
170
+ _UPGRADE_VER=$(jq -r '.active_version // "?"' "$_UPGRADE_DIR/active.json" 2>/dev/null)
171
+ echo " ◆ runtime ${_UPGRADE_VER} active · organizational retrieval: Runtime/QMD"
172
+ elif [ -f "$_UPGRADE_DIR/state.json" ]; then
173
+ case "$(jq -r '.status // empty' "$_UPGRADE_DIR/state.json" 2>/dev/null)" in
174
+ preparing)
175
+ echo " ◐ runtime update preparing in background — egregore settings" ;;
176
+ ready-to-activate)
177
+ echo " ● runtime update ready to activate — egregore settings" ;;
178
+ failed)
179
+ echo " ⚠ runtime update needs attention — egregore settings" ;;
180
+ esac
181
+ fi
182
+ fi
183
+
155
184
  # Framework update trail — an auto-update overwrites every framework path from
156
185
  # upstream, local edits included. It used to surface as the footer word
157
186
  # "updated" in local mode and as nothing at all in connected mode, which is not
@@ -282,7 +311,7 @@ _print_pending_scroll_turns() {
282
311
  | select(if $mode == "scroll" then true else (is_applied($events; $turn.id) | not) end)]
283
312
  | length
284
313
  ' --arg mode scroll "$file" 2>/dev/null) || continue
285
- [[ "$count" =~ ^[0-9]+$ ]] || return 0
314
+ [[ "$count" =~ ^[0-9]+$ ]] || continue
286
315
  [ "$count" -gt 0 ] && rows+="${safe_slug}"$'\t'"${count}"$'\n'
287
316
  done
288
317
 
@@ -326,7 +355,7 @@ _print_pending_scroll_turns() {
326
355
  | select((is_declined($events; $received; $turn.id) | not))]
327
356
  | length
328
357
  ' --arg mode harvest "$file" 2>/dev/null) || continue
329
- [[ "$count" =~ ^[0-9]+$ ]] || return 0
358
+ [[ "$count" =~ ^[0-9]+$ ]] || continue
330
359
  [ "$count" -gt 0 ] && rows+="${safe_slug}"$'\t'"${count}"$'\n'
331
360
  done
332
361
 
@@ -0,0 +1,97 @@
1
+ # shellcheck shell=bash
2
+ # Shared handoff metadata extraction for legacy markdown headers and YAML front matter.
3
+
4
+ eg_handoff_md_field() {
5
+ local file="$1"
6
+ local key="$2"
7
+ local val
8
+
9
+ val="$(grep -m1 "^\*\*${key}\*\*:" "$file" 2>/dev/null | sed "s/^\*\*${key}\*\*:[[:space:]]*//" | xargs 2>/dev/null || true)"
10
+ if [ -z "$val" ]; then
11
+ val="$(grep -m1 "^\*\*${key}:\*\*" "$file" 2>/dev/null | sed "s/^\*\*${key}:\*\*[[:space:]]*//" | xargs 2>/dev/null || true)"
12
+ fi
13
+
14
+ printf '%s\n' "$val"
15
+ }
16
+
17
+ eg_handoff_yaml_field() {
18
+ local file="$1"
19
+ local key="$2"
20
+
21
+ sed -n '/^---$/,/^---$/p' "$file" 2>/dev/null \
22
+ | grep -m1 "^${key}:" 2>/dev/null \
23
+ | sed "s/^${key}:[[:space:]]*//" \
24
+ | sed 's/^"//; s/"$//' \
25
+ | sed "s/^'//; s/'$//" \
26
+ | xargs 2>/dev/null || true
27
+ }
28
+
29
+ eg_handoff_author_from_filename() {
30
+ local file="$1"
31
+ local name
32
+
33
+ name="$(basename "$file" .md)"
34
+ if [[ "$name" =~ ^[0-9]{2}-([^-]+)- ]]; then
35
+ printf '%s\n' "${BASH_REMATCH[1]}"
36
+ elif [[ "$name" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}-([^-]+)- ]]; then
37
+ printf '%s\n' "${BASH_REMATCH[1]}"
38
+ fi
39
+ }
40
+
41
+ eg_handoff_date_from_filename() {
42
+ local file="$1"
43
+ local name dir day
44
+
45
+ name="$(basename "$file" .md)"
46
+ dir="$(basename "$(dirname "$file")")"
47
+ if [[ "$dir" =~ ^[0-9]{4}-[0-9]{2}$ && "$name" =~ ^([0-9]{2})- ]]; then
48
+ day="${BASH_REMATCH[1]}"
49
+ printf '%s-%s\n' "$dir" "$day"
50
+ elif [[ "$name" =~ ^([0-9]{4}-[0-9]{2}-[0-9]{2})- ]]; then
51
+ printf '%s\n' "${BASH_REMATCH[1]}"
52
+ fi
53
+ }
54
+
55
+ eg_handoff_author() {
56
+ local file="$1"
57
+ local author
58
+
59
+ author="$(eg_handoff_md_field "$file" "Author")"
60
+ [ -z "$author" ] && author="$(eg_handoff_md_field "$file" "From")"
61
+ [ -z "$author" ] && author="$(grep -m1 '^From:' "$file" 2>/dev/null | sed 's/^From:[[:space:]]*//' | xargs 2>/dev/null || true)"
62
+ [ -z "$author" ] && author="$(eg_handoff_yaml_field "$file" "author")"
63
+ [ -z "$author" ] && author="$(eg_handoff_yaml_field "$file" "from")"
64
+ [ -z "$author" ] && author="$(eg_handoff_author_from_filename "$file")"
65
+
66
+ printf '%s\n' "$author" | sed 's/[[:space:]]*→.*//' | xargs 2>/dev/null || true
67
+ }
68
+
69
+ eg_handoff_topic() {
70
+ local file="$1"
71
+ local topic
72
+
73
+ topic="$(grep -m1 '^# ' "$file" 2>/dev/null | sed 's/^# //; s/^Handoff:[[:space:]]*//' | xargs 2>/dev/null || true)"
74
+ [ -z "$topic" ] && topic="$(eg_handoff_yaml_field "$file" "topic")"
75
+ printf '%s\n' "$topic"
76
+ }
77
+
78
+ eg_handoff_date() {
79
+ local file="$1"
80
+ local date
81
+
82
+ date="$(eg_handoff_md_field "$file" "Date")"
83
+ [ -z "$date" ] && date="$(grep -m1 '^Date:' "$file" 2>/dev/null | sed 's/^Date:[[:space:]]*//' | xargs 2>/dev/null || true)"
84
+ [ -z "$date" ] && date="$(eg_handoff_yaml_field "$file" "date")"
85
+ [ -z "$date" ] && date="$(eg_handoff_date_from_filename "$file")"
86
+ printf '%s\n' "$date"
87
+ }
88
+
89
+ eg_handoff_metadata_json() {
90
+ local file="$1"
91
+
92
+ jq -cn \
93
+ --arg author "$(eg_handoff_author "$file")" \
94
+ --arg topic "$(eg_handoff_topic "$file")" \
95
+ --arg date "$(eg_handoff_date "$file")" \
96
+ '{author:$author, topic:$topic, date:$date}'
97
+ }
@@ -47,6 +47,12 @@ egregore_link_shared_state() {
47
47
 
48
48
  if [ -L "$dst" ]; then
49
49
  ln -sfn "$src" "$dst" 2>/dev/null || true
50
+ elif [ -f "$dst" ] && cmp -s "$src" "$dst"; then
51
+ # Older atomic writers could replace a shared-state symlink with an
52
+ # identical private file. Exact equality makes this repair lossless;
53
+ # differing files are left untouched for explicit reconciliation.
54
+ rm -f "$dst" 2>/dev/null || continue
55
+ ln -s "$src" "$dst" 2>/dev/null || true
50
56
  elif [ ! -e "$dst" ]; then
51
57
  ln -s "$src" "$dst" 2>/dev/null || true
52
58
  fi
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Resolve a working Node executable without trusting a broken version-manager
5
+ # shim. Skills call this adapter instead of embedding Volta/NVM paths.
6
+ working_node() {
7
+ local candidate
8
+ candidate="$(command -v node 2>/dev/null || true)"
9
+ if [ -n "$candidate" ] && "$candidate" --version >/dev/null 2>&1; then
10
+ printf '%s\n' "$candidate"
11
+ return 0
12
+ fi
13
+
14
+ for root in \
15
+ "${VOLTA_HOME:-$HOME/.volta}/tools/image/node" \
16
+ "${NVM_DIR:-$HOME/.nvm}/versions/node"
17
+ do
18
+ [ -d "$root" ] || continue
19
+ while IFS= read -r candidate; do
20
+ if [ -x "$candidate" ] && "$candidate" --version >/dev/null 2>&1; then
21
+ printf '%s\n' "$candidate"
22
+ return 0
23
+ fi
24
+ done < <(find "$root" -type f -path '*/bin/node' 2>/dev/null)
25
+ done
26
+
27
+ for candidate in /opt/homebrew/bin/node /usr/local/bin/node /usr/bin/node; do
28
+ if [ -x "$candidate" ] && "$candidate" --version >/dev/null 2>&1; then
29
+ printf '%s\n' "$candidate"
30
+ return 0
31
+ fi
32
+ done
33
+ return 1
34
+ }
35
+
36
+ NODE_BIN="$(working_node || true)"
37
+ if [ -z "$NODE_BIN" ]; then
38
+ echo "egregore: Node is unavailable; install Node 22, then retry" >&2
39
+ exit 126
40
+ fi
41
+
42
+ exec "$NODE_BIN" "$@"
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
+ EGREGORE_ROOT="$ROOT" PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}" \
6
+ exec python3 -m egregore_runtime.notification_cli "$@"
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # Compile authorized organizational context for harness UserPromptSubmit hooks.
3
+ # Input: the harness hook JSON on stdin. Output: a hook additionalContext JSON
4
+ # envelope, or nothing when the prompt is not organizational recall.
5
+
6
+ set -u
7
+
8
+ ROOT="${EGREGORE_ROOT:-${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "$0")/.." && pwd)}}"
9
+ HARNESS="${1:-shell}"
10
+
11
+ EGREGORE_ROOT="$ROOT" \
12
+ EGREGORE_RUNTIME="$HARNESS" \
13
+ PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}" \
14
+ python3 -m egregore_runtime.harness_cli prompt-hook --harness "$HARNESS" || true
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
+ export EGREGORE_ROOT="${EGREGORE_ROOT:-$ROOT}"
6
+ exec python3 -m egregore_runtime.onboarding_cli "$@"
@@ -104,6 +104,10 @@ def display_slug(value: str) -> str:
104
104
 
105
105
 
106
106
  def atomic_text(path: Path, text: str) -> None:
107
+ # Worktrees and transient harness clones share personal state through a
108
+ # symlink to the primary instance. Replace the target, never the link.
109
+ if path.is_symlink():
110
+ path = path.resolve()
107
111
  path.parent.mkdir(parents=True, exist_ok=True)
108
112
  fd, temp_name = tempfile.mkstemp(prefix=path.name + ".", dir=path.parent)
109
113
  try:
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
- # One identity spine for .egregore-state.json, memory/people, Supabase, and
5
- # Neo4j. GitHub's numeric id is the durable key when available.
4
+ # Provider-independent identity spine for local state, canonical people files,
5
+ # and the shared control plane. Neo4j is an optional derived projection.
6
6
 
7
7
  ROOT="$(cd "$(dirname "$0")/.." && pwd)"
8
8
  SCRIPT_DIR="$ROOT"
@@ -18,6 +18,13 @@ usage() {
18
18
  exit 2
19
19
  }
20
20
 
21
+ authorize_identity() {
22
+ permission="$1"
23
+ resource="$2"
24
+ EGREGORE_ROOT="$ROOT" python3 -m egregore_runtime.identity_cli \
25
+ authorize-self "$permission" "$resource" >/dev/null
26
+ }
27
+
21
28
  remote_config() {
22
29
  api_url="${EGREGORE_API_URL:-$(_config_val api_url)}"
23
30
  api_key="${EGREGORE_API_KEY:-$(_load_env_var EGREGORE_API_KEY)}"
@@ -46,6 +53,12 @@ sync_remote_identity() {
46
53
  --max-time 10 2>/dev/null || true)"
47
54
  api_status="$(printf '%s' "$api_result" | jq -r '.status // "failed"' 2>/dev/null || echo failed)"
48
55
  platform_user_id="$(printf '%s' "$api_result" | jq -r '.user_id // empty' 2>/dev/null || true)"
56
+ if [ "$api_status" = "ok" ]; then
57
+ if ! printf '%s' "$api_result" | EGREGORE_ROOT="$ROOT" \
58
+ python3 -m egregore_runtime.identity_cli >/dev/null 2>&1; then
59
+ api_status="identity-reconcile-failed"
60
+ fi
61
+ fi
49
62
  fi
50
63
 
51
64
  # A removed membership is terminal until an admin explicitly re-invites
@@ -82,8 +95,11 @@ sync_remote_identity() {
82
95
  platformUserId:$platformUserId
83
96
  }')"
84
97
 
85
- graph_status="failed"
86
- if graph_result="$(bash "$ROOT/bin/graph.sh" query "
98
+ graph_enabled="${EGREGORE_GRAPH_PROJECTION:-0}"
99
+ graph_status="disabled"
100
+ if [ "$graph_enabled" = "1" ]; then
101
+ graph_status="failed"
102
+ if graph_result="$(bash "$ROOT/bin/graph.sh" query "
87
103
  OPTIONAL MATCH (legacy:Person)
88
104
  WHERE NOT coalesce(legacy.kind, '') IN ['external', 'identity_alias']
89
105
  AND coalesce(legacy.status, 'active') = 'active'
@@ -140,11 +156,12 @@ sync_remote_identity() {
140
156
  MATCH (o:Org {id: \$_org})
141
157
  MERGE (p)-[:MEMBER_OF]->(o)
142
158
  RETURN p.personId AS personId
143
- " "$params" 2>/dev/null)"; then
144
- if printf '%s' "$graph_result" | jq -e \
145
- --arg personId "$(printf '%s' "$identity" | jq -r .person_id)" \
146
- '.values[0][0] == $personId' >/dev/null 2>&1; then
147
- graph_status="synced"
159
+ " "$params" 2>/dev/null)"; then
160
+ if printf '%s' "$graph_result" | jq -e \
161
+ --arg personId "$(printf '%s' "$identity" | jq -r .person_id)" \
162
+ '.values[0][0] == $personId' >/dev/null 2>&1; then
163
+ graph_status="synced"
164
+ fi
148
165
  fi
149
166
  fi
150
167
 
@@ -188,7 +205,9 @@ sync_remote_identity() {
188
205
 
189
206
  status="synced"
190
207
  [ "$api_status" = "ok" ] || status="partial"
191
- [ "$graph_status" = "synced" ] || status="partial"
208
+ if [ "$graph_enabled" = "1" ] && [ "$graph_status" != "synced" ]; then
209
+ status="partial"
210
+ fi
192
211
  printf '%s' "$identity" | jq \
193
212
  --arg status "$status" \
194
213
  --arg supabase "$api_status" \
@@ -366,6 +385,7 @@ command="${1:-}"
366
385
  [ -n "$command" ] || usage
367
386
 
368
387
  if [ "$command" = "show" ]; then
388
+ authorize_identity read "identity:self"
369
389
  jq '{
370
390
  person_id,
371
391
  display_name,
@@ -382,6 +402,7 @@ if [ "$command" = "show" ]; then
382
402
  fi
383
403
 
384
404
  if [ "$command" = "backfill" ]; then
405
+ authorize_identity administer "identity:roster"
385
406
  backfill_people "$@"
386
407
  exit $?
387
408
  fi
@@ -413,6 +434,13 @@ case "$command" in
413
434
  *) usage ;;
414
435
  esac
415
436
 
437
+ # Bootstrap reconciliation is allowed to establish the first ActorContext;
438
+ # every explicit self-service mutation must authorize before provider lookup,
439
+ # canonical profile writes, control-plane reconciliation, or projection.
440
+ if [ "$command" = "set-name" ] || [ "$command" = "set-email" ]; then
441
+ authorize_identity administer "identity:self"
442
+ fi
443
+
416
444
  github_args=()
417
445
  state_github="$(jq -r '.github_username // empty' "$STATE" 2>/dev/null)"
418
446
  if command -v gh >/dev/null 2>&1; then
@@ -437,8 +465,13 @@ fi
437
465
  if [ "$(jq -r '.onboarding_complete // false' "$STATE" 2>/dev/null)" = "true" ]; then
438
466
  onboard_args=(--onboarded)
439
467
  fi
468
+ # macOS still ships Bash 3.2, where expanding an empty array under `set -u`
469
+ # raises "unbound variable". Disable nounset only for this argument expansion;
470
+ # every value remains passed as a separately quoted argument.
471
+ set +u
440
472
  identity="$(python3 "$PERSON_PY" sync-local \
441
473
  "${display_args[@]}" "${github_args[@]}" "${email_args[@]}" "${onboard_args[@]}")"
474
+ set -u
442
475
 
443
476
  if [ "$(_detect_mode)" = "local" ]; then
444
477
  printf '%s' "$identity" | jq '. + {status:"synced-local",supabase:"unavailable",graph:"unavailable"}'