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,224 @@
1
+ #!/usr/bin/env bash
2
+ # handoff-save-egregore.sh — background save+auto-merge for the core repo after a handoff.
3
+ #
4
+ # /handoff renders its card first, then fires this detached. The user never waits on git.
5
+ #
6
+ # Behavior:
7
+ # - If nothing to save (clean working tree + up-to-date with origin) → exit silently.
8
+ # - If on the configured base (or another protected branch) → create a
9
+ # dev/{author}/handoff-{YYYY-MM-DD} branch from origin/{base}.
10
+ # - Commit all changes, rebase onto origin/{base}, push.
11
+ # - If push succeeds: create a PR to the configured base (or reuse existing), then:
12
+ # - Markdown-only diff → `gh pr merge --auto --merge` (auto-merges when checks pass).
13
+ # - Code/config present → leave PR open for review (no auto-merge).
14
+ #
15
+ # Usage:
16
+ # handoff-save-egregore.sh <author> <topic> [--repo-dir <path>]
17
+ #
18
+ # --repo-dir overrides the default working directory (normally the script's
19
+ # own repo root, resolved from $0). Tests and sandbox runs MUST pass it;
20
+ # without it, the script operates on the real repo regardless of caller cwd.
21
+ #
22
+ # Detached usage (the skill calls it this way):
23
+ # ( bash bin/handoff-save-egregore.sh "$AUTHOR" "$TOPIC" >/dev/null 2>&1 & ) >/dev/null 2>&1
24
+ #
25
+ # Exit 0 on any non-fatal outcome. The caller never reads stdout/stderr — all status
26
+ # lives in the PR itself and in `git log`.
27
+
28
+ set -uo pipefail
29
+
30
+ AUTHOR="${1:-}"
31
+ TOPIC="${2:-session work}"
32
+ shift 2 2>/dev/null || true
33
+
34
+ REPO_DIR=""
35
+ KIND="handoff"
36
+ BRANCH_SUFFIX=""
37
+ PUBLISH="auto"
38
+ while [ $# -gt 0 ]; do
39
+ case "$1" in
40
+ --repo-dir) REPO_DIR="${2:-}"; shift 2 ;;
41
+ --kind) KIND="${2:-handoff}"; shift 2 ;;
42
+ --branch-suffix) BRANCH_SUFFIX="${2:-}"; shift 2 ;;
43
+ --publish) PUBLISH="${2:-auto}"; shift 2 ;;
44
+ *) shift ;;
45
+ esac
46
+ done
47
+
48
+ case "$KIND" in
49
+ autosave)
50
+ MSG_PREFIX="chore(autosave): save"
51
+ PR_WHAT="Save session content captured by the opted-in autosave workflow."
52
+ PR_WHY="This preserves unattended non-coding work without requiring an explicit /save."
53
+ ;;
54
+ *)
55
+ MSG_PREFIX="chore(handoff): record"
56
+ PR_WHAT="Save core-repository session work captured when the handoff was created."
57
+ PR_WHY="The handoff records shared context immediately; this companion PR keeps the originating checkout's work from remaining only local."
58
+ ;;
59
+ esac
60
+ [ -n "$AUTHOR" ] || { echo "handoff-save-egregore: missing author" >&2; exit 1; }
61
+
62
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
63
+ # If --repo-dir wasn't given, default to the script's own repo root.
64
+ [ -z "$REPO_DIR" ] && REPO_DIR="$SCRIPT_DIR"
65
+ cd "$REPO_DIR" || exit 1
66
+
67
+ # Resolve the target checkout's configured integration branch. SCRIPT_DIR points
68
+ # at the framework that owns this helper, while CONFIG must follow --repo-dir so
69
+ # sandboxed and installed instances read their own egregore.json.
70
+ CONFIG="$REPO_DIR/egregore.json"
71
+ [ -f "$SCRIPT_DIR/bin/lib/config.sh" ] || {
72
+ echo "handoff-save-egregore: base-branch resolver is unavailable" >&2
73
+ exit 1
74
+ }
75
+ # shellcheck source=bin/lib/config.sh
76
+ . "$SCRIPT_DIR/bin/lib/config.sh" 2>/dev/null || exit 1
77
+ if ! BASE_BRANCH=$(_get_base_branch); then
78
+ echo "handoff-save-egregore: could not resolve the configured base branch" >&2
79
+ exit 1
80
+ fi
81
+ BASE_REF="origin/$BASE_BRANCH"
82
+
83
+ # Shared safe-staging guard — never auto-commit stray sibling-repo gitlinks.
84
+ # shellcheck source=bin/lib/git-safe.sh
85
+ . "$SCRIPT_DIR/bin/lib/git-safe.sh" 2>/dev/null || true
86
+ type git_add_guarded >/dev/null 2>&1 || git_add_guarded() { git add -A 2>/dev/null || true; }
87
+
88
+ # Shared commit/PR message mechanics (trailers + skeleton body shape).
89
+ # shellcheck source=bin/lib/git-message.sh
90
+ . "$SCRIPT_DIR/bin/lib/git-message.sh" 2>/dev/null || true
91
+ type egregore_commit >/dev/null 2>&1 || egregore_commit() {
92
+ local gd="$1" m="$3"; shift 3; git -C "$gd" commit -m "$m" "$@"
93
+ }
94
+ type egregore_pr_skeleton >/dev/null 2>&1 || egregore_pr_skeleton() {
95
+ printf '## What\n%s\n\n## Why\n%s\n\n## Verification\n%s\n\n%s\n' "$1" "$2" "$3" "$4"
96
+ }
97
+ PR_BODY=$(egregore_pr_skeleton \
98
+ "- $PR_WHAT" \
99
+ "$PR_WHY Topic: \`$TOPIC\`." \
100
+ "Not verified — background $KIND save; review code or configuration changes before merging." \
101
+ "🤖 Saved via \`bin/handoff-save-egregore.sh\`")
102
+
103
+ # Shared non-coding classifier (auto-merge policy lives in one place).
104
+ # shellcheck source=bin/lib/noncode.sh
105
+ . "$SCRIPT_DIR/bin/lib/noncode.sh" 2>/dev/null || true
106
+ type noncode_blockers >/dev/null 2>&1 || noncode_blockers() {
107
+ git -C "${2:-.}" diff "${1:-$BASE_REF}...HEAD" --name-only 2>/dev/null | grep -v '\.md$' | head -1 || true
108
+ }
109
+
110
+ # --- Early exit if nothing to do -----------------------------------------
111
+ DIRTY=0
112
+ [ -n "$(git status --porcelain 2>/dev/null)" ] && DIRTY=1
113
+
114
+ CURRENT_BRANCH=$(git branch --show-current 2>/dev/null || echo "")
115
+ AHEAD=0
116
+ if [ -n "$CURRENT_BRANCH" ]; then
117
+ # A missing remote base is not evidence that there is nothing to save. The
118
+ # former `|| echo 0` made a main-only instance silently discard clean,
119
+ # committed topic work because origin/develop did not exist.
120
+ if ! AHEAD=$(git rev-list --count "$BASE_REF..HEAD" 2>/dev/null); then
121
+ AHEAD=1
122
+ fi
123
+ fi
124
+
125
+ if [ "$DIRTY" = "0" ] && [ "$AHEAD" = "0" ]; then
126
+ exit 0
127
+ fi
128
+
129
+ # --- Protect the protected branches: create a working branch if needed --
130
+ if [ -z "$CURRENT_BRANCH" ] || [ "$CURRENT_BRANCH" = "$BASE_BRANCH" ] \
131
+ || [ "$CURRENT_BRANCH" = "develop" ] || [ "$CURRENT_BRANCH" = "main" ] \
132
+ || [ "$CURRENT_BRANCH" = "master" ]; then
133
+ SLUG_DATE=$(date +%Y-%m-%d)
134
+ # --branch-suffix keeps concurrent rescues distinct (e.g. per-checkout
135
+ # hash from the autosave sweep) — same-name pushes wedge on non-FF.
136
+ NEW_BRANCH="dev/${AUTHOR}/${KIND}-${SLUG_DATE}${BRANCH_SUFFIX:+-$BRANCH_SUFFIX}"
137
+ git fetch origin "$BASE_BRANCH" --quiet 2>/dev/null || true
138
+ git checkout --no-track -b "$NEW_BRANCH" "$BASE_REF" --quiet 2>/dev/null || \
139
+ git checkout "$NEW_BRANCH" --quiet 2>/dev/null || exit 0
140
+ CURRENT_BRANCH="$NEW_BRANCH"
141
+ fi
142
+
143
+ # --- Commit whatever is uncommitted --------------------------------------
144
+ if [ -n "$(git status --porcelain 2>/dev/null)" ]; then
145
+ git_add_guarded
146
+ egregore_commit . "$REPO_DIR" "${MSG_PREFIX} ${TOPIC}" --quiet 2>/dev/null || true
147
+ fi
148
+
149
+ # --- Rebase onto the configured base, fall back to merge on conflicts ----
150
+ git fetch origin "$BASE_BRANCH" --quiet 2>/dev/null || true
151
+ if ! git rebase "$BASE_REF" --quiet 2>/dev/null; then
152
+ git rebase --abort 2>/dev/null || true
153
+ if ! git merge "$BASE_REF" --quiet -m "Sync with $BASE_BRANCH" 2>/dev/null; then
154
+ # Conflicts we can't auto-resolve. Leave the branch as-is; the user will see it
155
+ # next session or when they run /save explicitly.
156
+ git merge --abort 2>/dev/null || true
157
+ exit 0
158
+ fi
159
+ fi
160
+
161
+ # --- Push ---------------------------------------------------------------
162
+ if ! git push -u origin "$CURRENT_BRANCH" --quiet 2>/dev/null; then
163
+ # Push failed (network, auth). Commits are safe locally.
164
+ exit 0
165
+ fi
166
+
167
+ # --- Ledger: the user-visible trail of background saves ------------------
168
+ # Read by session-autosave.sh (immediate Stop-hook notice) and the greeting
169
+ # (next-launch summary). Machine-scoped so worktree saves surface everywhere.
170
+ LEDGER="${EGREGORE_AUTOSAVE_LOG:-$HOME/.egregore/autosave.log}"
171
+ ledger_write() { # pr outcome
172
+ local n_files
173
+ n_files=$(git diff "$BASE_REF...HEAD" --name-only 2>/dev/null | grep -c . || echo 0)
174
+ mkdir -p "$(dirname "$LEDGER")" 2>/dev/null || true
175
+ printf '%s|%s|%s|%s|%s|%s|%s\n' \
176
+ "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$KIND" "$REPO_DIR" "$CURRENT_BRANCH" \
177
+ "$1" "$2" "$n_files" >> "$LEDGER" 2>/dev/null || true
178
+ }
179
+
180
+ # --- PR: reuse open PR on this branch, or create one --------------------
181
+ command -v gh >/dev/null 2>&1 || { ledger_write "-" "pushed"; exit 0; }
182
+
183
+ PR_NUMBER=""
184
+ EXISTING=$(gh pr list --head "$CURRENT_BRANCH" --state open --json number,baseRefName --jq '.[0]' 2>/dev/null)
185
+ EXISTING_NUMBER=$(echo "$EXISTING" | jq -r '.number // empty' 2>/dev/null)
186
+ EXISTING_BASE=$(echo "$EXISTING" | jq -r '.baseRefName // empty' 2>/dev/null)
187
+
188
+ if [ -n "$EXISTING_NUMBER" ]; then
189
+ PR_NUMBER="$EXISTING_NUMBER"
190
+ if [ "$EXISTING_BASE" != "$BASE_BRANCH" ]; then
191
+ gh pr edit "$PR_NUMBER" --base "$BASE_BRANCH" >/dev/null 2>&1 || true
192
+ fi
193
+ else
194
+ PR_URL=$(gh pr create \
195
+ --base "$BASE_BRANCH" \
196
+ --head "$CURRENT_BRANCH" \
197
+ --title "${MSG_PREFIX} ${TOPIC}" \
198
+ --body "$PR_BODY" \
199
+ 2>/dev/null || echo "")
200
+ PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$' || echo "")
201
+ fi
202
+
203
+ [ -n "$PR_NUMBER" ] || { ledger_write "-" "pushed"; exit 0; }
204
+
205
+ # --- Merge decision -------------------------------------------------------
206
+ # Non-coding + publish=auto → merge now. publish=gate → the PR is staged and
207
+ # the merge waits for the user's explicit word (the /autosave consent gate).
208
+ # `--auto` only works when the repo allows auto-merge AND required checks are
209
+ # pending; on a repo with no branch protection it always errors. Fall back to
210
+ # an immediate merge so non-coding PRs never sit open.
211
+ OUTCOME="open"
212
+ NON_CODE_BLOCKER=$(noncode_blockers "$BASE_REF" .)
213
+ if [ -z "$NON_CODE_BLOCKER" ]; then
214
+ if [ "$PUBLISH" = "gate" ]; then
215
+ OUTCOME="staged"
216
+ elif gh pr merge "$PR_NUMBER" --auto --merge >/dev/null 2>&1 \
217
+ || gh pr merge "$PR_NUMBER" --merge >/dev/null 2>&1; then
218
+ OUTCOME="merged"
219
+ fi
220
+ fi
221
+
222
+ ledger_write "$PR_NUMBER" "$OUTCOME"
223
+
224
+ exit 0
@@ -0,0 +1,322 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Index a single handoff file into the Neo4j graph.
5
+ # Usage: bash bin/index-handoff.sh <file-path>
6
+ # Returns: {"sessionId":"...","resolved":0} or {"error":"..."}.
7
+ # `resolved` remains for compatibility; lifecycle reconciliation is queued by
8
+ # capture-run.sh after indexing.
9
+ #
10
+ # The file-path should be relative to memory/ (e.g. handoffs/2026-02/14-oz-topic.md)
11
+ # or an absolute/relative path that contains "handoffs/" somewhere in it.
12
+
13
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
14
+
15
+ if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
16
+ echo "Usage: index-handoff.sh <handoff-file-path>"
17
+ echo ""
18
+ echo "Index a single handoff file into the Neo4j graph."
19
+ echo "Parses metadata (author, date, topic, recipients) from"
20
+ echo "markdown headers or YAML front matter, creates Session"
21
+ echo "and relationship nodes. Lifecycle completion is queued separately."
22
+ echo ""
23
+ echo "Returns: {\"sessionId\":\"...\",\"resolved\":N}"
24
+ exit 0
25
+ fi
26
+
27
+ # --- Local mode gate: bail immediately ---
28
+ _MODE=$(jq -r '.mode // "connected"' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
29
+ if [ "$_MODE" = "local" ]; then
30
+ echo '{"sessionId":"","resolved":0,"mode":"local"}'
31
+ exit 0
32
+ fi
33
+
34
+ # --- Validate input ---
35
+ FILE_ARG="${1:?Usage: index-handoff.sh <handoff-file-path>}"
36
+
37
+ # Resolve to absolute path if needed
38
+ if [[ "$FILE_ARG" = /* ]]; then
39
+ FILE_PATH="$FILE_ARG"
40
+ elif [[ "$FILE_ARG" = memory/* ]]; then
41
+ FILE_PATH="$SCRIPT_DIR/$FILE_ARG"
42
+ else
43
+ FILE_PATH="$SCRIPT_DIR/memory/$FILE_ARG"
44
+ fi
45
+
46
+ if [ ! -f "$FILE_PATH" ]; then
47
+ echo '{"error":"File not found: '"$FILE_ARG"'"}'
48
+ exit 1
49
+ fi
50
+
51
+ # --- Derive filePath (relative to memory/) and sessionId ---
52
+ REL_PATH="${FILE_PATH##*/memory/}"
53
+ if [[ "$REL_PATH" = "$FILE_PATH" ]]; then
54
+ REL_PATH="handoffs/${FILE_PATH##*handoffs/}"
55
+ fi
56
+
57
+ FILENAME="$(basename "$FILE_PATH" .md)"
58
+ DIR_MONTH="$(basename "$(dirname "$FILE_PATH")")"
59
+
60
+ # sessionId = YYYY-MM-DD-author-topic
61
+ # If file is in a YYYY-MM subdirectory, derive from dir + filename
62
+ # If file is in root handoffs/ (no month subdir), extract date from filename
63
+ if [[ "$DIR_MONTH" =~ ^[0-9]{4}-[0-9]{2}$ ]]; then
64
+ DAY="${FILENAME%%-*}"
65
+ REST="${FILENAME#*-}"
66
+ SESSION_ID="${DIR_MONTH}-${DAY}-${REST}"
67
+ else
68
+ # Filename starts with YYYY-MM-DD — use it directly
69
+ SESSION_ID="$FILENAME"
70
+ DAY="$(echo "$FILENAME" | grep -oE '^[0-9]{4}-[0-9]{2}-[0-9]{2}' || true)"
71
+ REST="${FILENAME#*-*-*-}"
72
+ DIR_MONTH="$(echo "$DAY" | grep -oE '^[0-9]{4}-[0-9]{2}' || true)"
73
+ fi
74
+
75
+ # --- Parse handoff metadata from markdown ---
76
+ CONTENT="$(cat "$FILE_PATH")"
77
+
78
+ # Helper: extract from markdown headers, handles both **Key**: Value and **Key:** Value
79
+ md_extract() {
80
+ echo "$CONTENT" | grep -m1 "$1" 2>/dev/null | sed "$2" || true
81
+ }
82
+
83
+ # Helper: extract markdown field by name (handles **Key**: and **Key:** patterns)
84
+ md_field() {
85
+ local key="$1"
86
+ local val
87
+ # Try **Key**: Value (colon outside bold)
88
+ val="$(echo "$CONTENT" | grep -m1 "^\*\*${key}\*\*:" 2>/dev/null | sed "s/\*\*${key}\*\*:[[:space:]]*//" | tr -d '\n' || true)"
89
+ # Try **Key:** Value (colon inside bold)
90
+ if [ -z "$val" ]; then
91
+ val="$(echo "$CONTENT" | grep -m1 "^\*\*${key}:\*\*" 2>/dev/null | sed "s/\*\*${key}:\*\*[[:space:]]*//" | tr -d '\n' || true)"
92
+ fi
93
+ echo "$val"
94
+ }
95
+
96
+ # Helper: extract from YAML front matter (key: value between --- delimiters)
97
+ yaml_extract() {
98
+ local key="$1"
99
+ sed -n '/^---$/,/^---$/p' "$FILE_PATH" 2>/dev/null | grep -m1 "^${key}:" 2>/dev/null | sed "s/^${key}:[[:space:]]*//" | sed 's/^"//' | sed 's/"$//' | xargs 2>/dev/null || true
100
+ }
101
+
102
+ # H1 topic (always from markdown body, not front matter)
103
+ TOPIC="$(md_extract '^# ' 's/^# //; s/^Handoff: //')"
104
+ # Also check YAML front matter topic
105
+ [ -z "$TOPIC" ] && TOPIC="$(yaml_extract 'topic')"
106
+ [ -z "$TOPIC" ] && TOPIC="$REST"
107
+
108
+ # Date: try markdown header, then YAML
109
+ DATE="$(md_field 'Date')"
110
+ [ -z "$DATE" ] && DATE="$(yaml_extract 'date')"
111
+ [ -z "$DATE" ] && DATE="${DIR_MONTH}-${DAY}"
112
+
113
+ # Author: try markdown header (Author or From), then YAML (author or from)
114
+ AUTHOR="$(md_field 'Author')"
115
+ [ -z "$AUTHOR" ] && AUTHOR="$(md_field 'From')"
116
+ [ -z "$AUTHOR" ] && AUTHOR="$(yaml_extract 'author')"
117
+ [ -z "$AUTHOR" ] && AUTHOR="$(yaml_extract 'from')"
118
+ # Strip " → recipient" if present (e.g. "cem → oz" → "cem")
119
+ AUTHOR_HANDLE="$(echo "$AUTHOR" | sed 's/[[:space:]]*→.*//' | awk '{print tolower($1)}')"
120
+ [ -z "$AUTHOR_HANDLE" ] && AUTHOR_HANDLE="unknown"
121
+
122
+ # Recipients: try markdown header, then canonical/legacy YAML names.
123
+ RECIPIENTS_RAW="$(md_field 'To')"
124
+ [ -z "$RECIPIENTS_RAW" ] && RECIPIENTS_RAW="$(md_field 'For')"
125
+ [ -z "$RECIPIENTS_RAW" ] && RECIPIENTS_RAW="$(yaml_extract 'to')"
126
+ [ -z "$RECIPIENTS_RAW" ] && RECIPIENTS_RAW="$(yaml_extract 'for')"
127
+ [ -z "$RECIPIENTS_RAW" ] && RECIPIENTS_RAW="$(yaml_extract 'addressed_to')"
128
+ # Also extract from "From: author → recipient" pattern
129
+ if [ -z "$RECIPIENTS_RAW" ] && echo "$AUTHOR" | grep -q '→' 2>/dev/null; then
130
+ RECIPIENTS_RAW="$(echo "$AUTHOR" | sed 's/.*→[[:space:]]*//')"
131
+ fi
132
+
133
+ # Project: try markdown header, then YAML
134
+ PROJECT="$(md_field 'Project')"
135
+ [ -z "$PROJECT" ] && PROJECT="$(yaml_extract 'project')"
136
+
137
+ # Handoff kind: used by readers to distinguish automatic captures from manual handoffs.
138
+ KIND="$(md_field 'Kind')"
139
+ [ -z "$KIND" ] && KIND="$(yaml_extract 'kind')"
140
+
141
+ # Lifecycle intent determines which automatic transitions are safe.
142
+ INTENT="$(md_field 'Intent')"
143
+ [ -z "$INTENT" ] && INTENT="$(yaml_extract 'intent')"
144
+ INTENT="$(printf '%s' "${INTENT:-unclassified}" | tr '[:upper:]' '[:lower:]')"
145
+ case "$INTENT" in
146
+ action|feedback|fyi|unclassified) ;;
147
+ *) INTENT="unclassified" ;;
148
+ esac
149
+
150
+ # Summary: 5-level precedence chain
151
+ # 1. Frontmatter summary field
152
+ SUMMARY="$(yaml_extract 'summary')"
153
+ # 2. First non-empty paragraph after ## Briefing
154
+ [ -z "$SUMMARY" ] && SUMMARY="$(echo "$CONTENT" | awk '/^## Briefing/{found=1; next} found && /^#/{exit} found && /^[^#]/ && !/^[[:space:]]*$/{print; exit}' || true)"
155
+ # 3. First non-empty paragraph after ## Session Summary (legacy)
156
+ [ -z "$SUMMARY" ] && SUMMARY="$(echo "$CONTENT" | awk '/^## Session Summary/{found=1; next} found && /^#/{exit} found && /^[^#]/ && !/^[[:space:]]*$/{print; exit}' || true)"
157
+ # 4. First non-heading, non-metadata, non-empty line in body
158
+ [ -z "$SUMMARY" ] && SUMMARY="$(echo "$CONTENT" | awk '!/^[[:space:]]*$/ && !/^#/ && !/^\*\*/ && !/^---/ && !/^\|/ && !/^- /{print; exit}' || true)"
159
+ # 5. Topic fallback
160
+ [ -z "$SUMMARY" ] && SUMMARY="$TOPIC"
161
+
162
+ # Repo State: parse markdown table after "## Repo State"
163
+ # Extracts repo, branch, PR number, and base branch from each table row
164
+ REPO_STATE_JSON="[]"
165
+ REPO_TABLE=$(echo "$CONTENT" | awk '/^## Repo State/{found=1; next} found && /^#/{exit} found && /^\|[^-]/ && !/^\| Repo/{print}' || true)
166
+ if [ -n "$REPO_TABLE" ]; then
167
+ REPO_STATE_JSON=$(echo "$REPO_TABLE" | while IFS='|' read -r _ R_REPO R_BRANCH R_PR R_BASE _; do
168
+ R_REPO=$(echo "$R_REPO" | xargs 2>/dev/null || true)
169
+ R_BRANCH=$(echo "$R_BRANCH" | xargs 2>/dev/null || true)
170
+ R_PR=$(echo "$R_PR" | xargs 2>/dev/null | sed 's/^#//' | sed 's/—//' || true)
171
+ R_BASE=$(echo "$R_BASE" | xargs 2>/dev/null || true)
172
+ [ -z "$R_REPO" ] && continue
173
+ if [ -n "$R_PR" ] && [ "$R_PR" -eq "$R_PR" ] 2>/dev/null; then
174
+ jq -n --arg repo "$R_REPO" --arg branch "$R_BRANCH" --argjson pr "$R_PR" --arg base "$R_BASE" \
175
+ '{repo:$repo, branch:$branch, pr:$pr, base:$base}'
176
+ else
177
+ jq -n --arg repo "$R_REPO" --arg branch "$R_BRANCH" --arg base "$R_BASE" \
178
+ '{repo:$repo, branch:$branch, pr:null, base:$base}'
179
+ fi
180
+ done | jq -s '.' 2>/dev/null || echo "[]")
181
+ fi
182
+
183
+ # --- Build Cypher queries ---
184
+
185
+ # Q1: MERGE Session + relationships
186
+ HANDED_TO_CYPHER=""
187
+ _RECIP_ARGS=()
188
+ if [ -n "$RECIPIENTS_RAW" ]; then
189
+ IFS=',' read -ra RECIPS <<< "$RECIPIENTS_RAW"
190
+ for i in "${!RECIPS[@]}"; do
191
+ R="$(echo "${RECIPS[$i]}" | xargs | tr '[:upper:]' '[:lower:]')"
192
+ [ -z "$R" ] && continue
193
+ HANDED_TO_CYPHER="${HANDED_TO_CYPHER}
194
+ WITH s
195
+ OPTIONAL MATCH (r${i}:Person) WHERE toLower(r${i}.name) = \$recipient${i} OR toLower(r${i}.github) = \$recipient${i} OR toLower(r${i}.fullName) = \$recipient${i} OR \$recipient${i} IN [x IN coalesce(r${i}.previousNames, []) | toLower(x)] OR \$recipient${i} IN [x IN coalesce(r${i}.githubAliases, []) | toLower(x)] OR \$recipient${i} IN [x IN coalesce(r${i}.emails, []) | toLower(x)]
196
+ FOREACH (_ IN CASE WHEN r${i} IS NOT NULL THEN [1] ELSE [] END |
197
+ MERGE (s)-[:HANDED_TO]->(r${i})
198
+ )"
199
+ _RECIP_ARGS+=("--arg" "recipient${i}" "$R")
200
+ done
201
+ fi
202
+
203
+ PROJECT_CYPHER=""
204
+ _PROJECT_ARGS=()
205
+ if [ -n "$PROJECT" ]; then
206
+ PROJECT_CYPHER="
207
+ WITH s
208
+ OPTIONAL MATCH (proj:Project) WHERE toLower(proj.name) = toLower(\$project)
209
+ FOREACH (_ IN CASE WHEN proj IS NOT NULL THEN [1] ELSE [] END |
210
+ MERGE (s)-[:ABOUT]->(proj)
211
+ )"
212
+ _PROJECT_ARGS=("--arg" "project" "$PROJECT")
213
+ fi
214
+
215
+ Q1_CYPHER="MATCH (p:Person) WHERE toLower(p.name) = \$author OR toLower(p.github) = \$author OR toLower(p.fullName) = \$author OR \$author IN [x IN coalesce(p.previousNames, []) | toLower(x)] OR \$author IN [x IN coalesce(p.githubAliases, []) | toLower(x)] OR \$author IN [x IN coalesce(p.emails, []) | toLower(x)]
216
+ MERGE (s:Session {id: \$sessionId})
217
+ ON CREATE SET s.date = date(\$date), s.topic = \$topic, s.summary = \$summary, s.filePath = \$filePath, s.author = \$author, s.handoffKind = CASE WHEN \$kind = '' THEN null ELSE \$kind END, s.handoffStatus = 'pending', s.handoffIntent = \$intent, s.handoffLifecycleVersion = 1, s.repoState = \$repoState, s.startedAt = datetime(\$date + 'T00:00:00Z')
218
+ ON MATCH SET s.topic = \$topic, s.summary = \$summary, s.filePath = \$filePath, s.author = \$author, s.handoffKind = CASE WHEN \$kind = '' THEN null ELSE \$kind END, s.handoffIntent = CASE WHEN \$intent = 'unclassified' THEN coalesce(s.handoffIntent, 'unclassified') ELSE \$intent END, s.handoffLifecycleVersion = 1, s.repoState = \$repoState
219
+ WITH s, p
220
+ MERGE (s)-[:BY]->(p)${PROJECT_CYPHER}${HANDED_TO_CYPHER}
221
+ RETURN s.id AS sessionId"
222
+
223
+ Q1_PARAMS=$(jq -n \
224
+ --arg sessionId "$SESSION_ID" \
225
+ --arg author "$AUTHOR_HANDLE" \
226
+ --arg date "$DATE" \
227
+ --arg topic "$TOPIC" \
228
+ --arg summary "$SUMMARY" \
229
+ --arg filePath "$REL_PATH" \
230
+ --arg kind "$KIND" \
231
+ --arg intent "$INTENT" \
232
+ --arg repoState "$REPO_STATE_JSON" \
233
+ "${_PROJECT_ARGS[@]:+${_PROJECT_ARGS[@]}}" \
234
+ "${_RECIP_ARGS[@]:+${_RECIP_ARGS[@]}}" \
235
+ '$ARGS.named')
236
+
237
+ # Q2: Preserve the stable three-result batch shape without mutating lifecycle.
238
+ # Completion used to run inside this foreground indexing request. It now enters
239
+ # through capture-run.sh's local WAL queue and is reconciled off the caller's
240
+ # critical path.
241
+ Q2_CYPHER="MATCH (s:Session {id: \$sessionId})
242
+ RETURN 0 AS resolved"
243
+
244
+ Q2_PARAMS=$(jq -n --arg sessionId "$SESSION_ID" '{sessionId: $sessionId}')
245
+
246
+ # Q3: Capture the handoff's knowledge-graph neighborhood for artifact rendering.
247
+ # Only the "graph-only" relations — things not already visible in the markdown
248
+ # header. Author/recipients/project live in the metadata row above the graph,
249
+ # so including them would be noise.
250
+ Q3_CYPHER="MATCH (s:Session {id: \$sessionId})
251
+ OPTIONAL MATCH (s)-[:IMPLEMENTS]->(prior:Session)
252
+ OPTIONAL MATCH (prior)-[:BY]->(priorAuthor:Person)
253
+ OPTIONAL MATCH (later:Session)-[:IMPLEMENTS]->(s)
254
+ OPTIONAL MATCH (later)-[:BY]->(laterAuthor:Person)
255
+ OPTIONAL MATCH (s)-[:CONTINUES]->(cont:Session)
256
+ OPTIONAL MATCH (cont)-[:BY]->(contAuthor:Person)
257
+ OPTIONAL MATCH (s)-[:ADVANCED|INVOLVES]->(quest:Quest)
258
+ OPTIONAL MATCH (s)-[:HAS_ACTIVITY]->(art:Artifact)
259
+ OPTIONAL MATCH (s)-[:PRODUCED]->(pr:PR)
260
+ RETURN
261
+ collect(DISTINCT {id: prior.id, topic: prior.topic, author: priorAuthor.name}) AS implementsHandoff,
262
+ collect(DISTINCT {id: later.id, topic: later.topic, author: laterAuthor.name}) AS implementedBy,
263
+ collect(DISTINCT {id: cont.id, topic: cont.topic, author: contAuthor.name}) AS continues,
264
+ collect(DISTINCT {id: quest.id, title: quest.title}) AS quests,
265
+ collect(DISTINCT {id: art.id, title: art.title, type: art.type, path: art.path}) AS artifacts,
266
+ collect(DISTINCT {id: pr.id, number: pr.number, title: pr.title, repo: pr.repo}) AS prs"
267
+
268
+ Q3_PARAMS=$(jq -n --arg sessionId "$SESSION_ID" '{sessionId: $sessionId}')
269
+
270
+ # --- Build batch request ---
271
+ BATCH_JSON=$(jq -n \
272
+ --arg q1 "$Q1_CYPHER" \
273
+ --argjson p1 "$Q1_PARAMS" \
274
+ --arg q2 "$Q2_CYPHER" \
275
+ --argjson p2 "$Q2_PARAMS" \
276
+ --arg q3 "$Q3_CYPHER" \
277
+ --argjson p3 "$Q3_PARAMS" \
278
+ '[{statement: $q1, parameters: $p1}, {statement: $q2, parameters: $p2}, {statement: $q3, parameters: $p3}]')
279
+
280
+ # --- Execute ---
281
+ RESPONSE=$(bash "$SCRIPT_DIR/bin/graph-batch.sh" "$BATCH_JSON" 2>/dev/null) || {
282
+ echo '{"error":"graph-batch.sh failed"}'
283
+ exit 1
284
+ }
285
+
286
+ # --- Mark auto-captured personal Session as handed_off ---
287
+ PROJ_HASH=$(echo -n "$SCRIPT_DIR" | md5 2>/dev/null || echo -n "$SCRIPT_DIR" | md5sum 2>/dev/null | cut -d' ' -f1)
288
+ CURRENT_SID=$(cat "$HOME/.egregore/session-${PROJ_HASH}.id" 2>/dev/null || echo "")
289
+ if [ -n "$CURRENT_SID" ]; then
290
+ bash "$SCRIPT_DIR/bin/graph.sh" query \
291
+ "MATCH (s:Session {id: \$sid}) SET s.status = 'handed_off' RETURN s.id" \
292
+ "$(jq -n --arg sid "$CURRENT_SID" '{sid: $sid}')" >/dev/null 2>&1 || true
293
+ fi
294
+
295
+ # --- Parse response ---
296
+ RESOLVED=$(echo "$RESPONSE" | jq -r '.results[1].values[0][0] // 0' 2>/dev/null || echo "0")
297
+
298
+ # Parse Q3 neighborhood into a subgraph object. Collect() entries that didn't
299
+ # match anything come back as {name: null, ...} — filter those out.
300
+ EMPTY_SG='{"implementsHandoff":[],"implementedBy":[],"continues":[],"quests":[],"artifacts":[],"prs":[]}'
301
+ SUBGRAPH_JSON=$(echo "$RESPONSE" | jq -c '
302
+ (.results[2] // null) as $r
303
+ | if $r == null or (($r.values // []) | length) == 0 then
304
+ {implementsHandoff:[], implementedBy:[], continues:[], quests:[], artifacts:[], prs:[]}
305
+ else
306
+ ($r.fields // []) as $f
307
+ | ($r.values[0] // []) as $v
308
+ | reduce range(0; ($f | length)) as $i ({}; .[$f[$i]] = $v[$i])
309
+ | {
310
+ implementsHandoff: ((.implementsHandoff // []) | map(select(.id != null))),
311
+ implementedBy: ((.implementedBy // []) | map(select(.id != null))),
312
+ continues: ((.continues // []) | map(select(.id != null))),
313
+ quests: ((.quests // []) | map(select(.id != null))),
314
+ artifacts: ((.artifacts // []) | map(select(.id != null or .path != null))),
315
+ prs: ((.prs // []) | map(select(.number != null or .id != null)))
316
+ }
317
+ end
318
+ ' 2>/dev/null || echo "$EMPTY_SG")
319
+ [ -z "$SUBGRAPH_JSON" ] && SUBGRAPH_JSON="$EMPTY_SG"
320
+
321
+ jq -n --arg sessionId "$SESSION_ID" --argjson resolved "$RESOLVED" --argjson subgraph "$SUBGRAPH_JSON" \
322
+ '{sessionId: $sessionId, resolved: $resolved, subgraph: $subgraph}'
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Validate, plan, or apply a durable ingestion manifest to the organization graph.
5
+ # The planner owns the source-to-graph contract; this wrapper owns mode detection,
6
+ # batching, and truthful delivery receipts.
7
+
8
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
9
+ SCRIPT_DIR="$ROOT"
10
+ CONFIG="${CONFIG:-$ROOT/egregore.json}"
11
+ PLANNER="${EGREGORE_INGEST_GRAPH_PLANNER:-$ROOT/bin/ingest_graph.py}"
12
+ GRAPH_BATCH="${EGREGORE_INGEST_GRAPH_BATCH:-$ROOT/bin/graph-batch.sh}"
13
+
14
+ # shellcheck source=bin/lib/config.sh
15
+ source "$ROOT/bin/lib/config.sh"
16
+
17
+ usage() {
18
+ echo "usage: bash bin/ingest-graph.sh {validate|plan|apply} MANIFEST" >&2
19
+ exit 2
20
+ }
21
+
22
+ mode="${1:-}"
23
+ manifest="${2:-}"
24
+ [ -n "$mode" ] && [ -n "$manifest" ] || usage
25
+
26
+ case "$mode" in
27
+ validate|plan)
28
+ exec python3 "$PLANNER" "$mode" "$manifest"
29
+ ;;
30
+ apply) ;;
31
+ *) usage ;;
32
+ esac
33
+
34
+ if ! _graph_projection_enabled; then
35
+ jq -cn \
36
+ '{status:"stored",graph:"disabled",reason:"graph_projection_disabled",queries:0,batches:0,failed:0,replayable:true}'
37
+ exit 0
38
+ fi
39
+
40
+ plan="$(python3 "$PLANNER" plan "$manifest")"
41
+ manifest_id="$(printf '%s' "$plan" | jq -r '.manifest_id')"
42
+ query_count="$(printf '%s' "$plan" | jq -r '.query_count')"
43
+
44
+ if [ "$(_detect_mode)" = "local" ]; then
45
+ jq -cn \
46
+ --arg manifest_id "$manifest_id" \
47
+ --argjson queries "$query_count" \
48
+ '{status:"stored",graph:"unavailable-in-local-mode",manifest_id:$manifest_id,queries:$queries,batches:0,failed:0,replayable:true}'
49
+ exit 0
50
+ fi
51
+
52
+ total=0
53
+ succeeded=0
54
+ failed=0
55
+ while IFS= read -r batch; do
56
+ [ -n "$batch" ] || continue
57
+ total=$((total + 1))
58
+ expected="$(printf '%s' "$batch" | jq 'length')"
59
+ if response="$(bash "$GRAPH_BATCH" "$batch" 2>/dev/null)" \
60
+ && actual="$(printf '%s' "$response" | jq -er '.results | length' 2>/dev/null)" \
61
+ && [ "$actual" -eq "$expected" ]; then
62
+ succeeded=$((succeeded + 1))
63
+ else
64
+ failed=$((failed + 1))
65
+ fi
66
+ done < <(
67
+ printf '%s' "$plan" |
68
+ jq -c '.queries | map({statement, parameters}) as $all | range(0; length; 20) as $i | $all[$i:$i+20]'
69
+ )
70
+
71
+ if [ "$failed" -gt 0 ]; then
72
+ jq -cn \
73
+ --arg manifest_id "$manifest_id" \
74
+ --argjson queries "$query_count" \
75
+ --argjson batches "$total" \
76
+ --argjson succeeded "$succeeded" \
77
+ --argjson failed "$failed" \
78
+ '{status:"partial",manifest_id:$manifest_id,queries:$queries,batches:$batches,succeeded:$succeeded,failed:$failed,replayable:true}'
79
+ exit 1
80
+ fi
81
+
82
+ jq -cn \
83
+ --arg manifest_id "$manifest_id" \
84
+ --argjson queries "$query_count" \
85
+ --argjson batches "$total" \
86
+ '{status:"projected",manifest_id:$manifest_id,queries:$queries,batches:$batches,failed:0,replayable:true}'
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bash
2
+ # Runtime-neutral adapter for one external source's staged admission lifecycle.
3
+ set -euo pipefail
4
+
5
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
6
+ export EGREGORE_ROOT="${EGREGORE_ROOT:-$ROOT}"
7
+ export EGREGORE_SESSION_ID="${EGREGORE_SESSION_ID:-$(cat "$ROOT/.egregore-session-id" 2>/dev/null || true)}"
8
+ export PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}"
9
+
10
+ exec python3 -m egregore_runtime.ingest_cli "$@"