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,532 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # settings.sh — deterministic config verbs for an Egregore instance.
5
+ #
6
+ # Edits egregore.json atomically. No agent, no session. Idempotent: re-adding
7
+ # an existing item is a no-op success; removing a missing one is too. Switching
8
+ # to staged releases is the one networked verb: it creates origin/develop first.
9
+ # This is the deterministic core the launcher settings screen (and slash
10
+ # commands) call — the reliability lives here, the surfaces are thin callers.
11
+ #
12
+ # Usage:
13
+ # settings.sh hosting status|on|off
14
+ # settings.sh relay status|on|off
15
+ # settings.sh workflow status|simple|staged
16
+ # settings.sh repo list | add <name> [description] | remove <name>
17
+ # settings.sh admin list | add <github-handle> | remove <github-handle>
18
+ # settings.sh dump # full settings snapshot as JSON (for the launcher)
19
+ #
20
+ # Add --json to a read verb (status/list) for machine-readable output.
21
+ #
22
+ # Exit codes: 0 ok · 1 usage/validation error · 2 config not found.
23
+
24
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
25
+ CONFIG="$SCRIPT_DIR/egregore.json"
26
+
27
+ # ── helpers ──────────────────────────────────────────────────────────────
28
+
29
+ _die() { echo "$1" >&2; exit "${2:-1}"; }
30
+
31
+ _valid_token() {
32
+ # non-empty, GitHub-handle / repo-name safe charset
33
+ [ -n "${1:-}" ] && printf '%s' "$1" | grep -qE '^[A-Za-z0-9._-]+$'
34
+ }
35
+
36
+ _save() {
37
+ # _save '<jq-filter>' [jq-args...] — apply filter to CONFIG, write atomically.
38
+ local filter="$1"; shift
39
+ local tmp
40
+ tmp="$(mktemp "$CONFIG.XXXXXX")" || _die "cannot create temp file" 1
41
+ if jq "$@" "$filter" "$CONFIG" > "$tmp" 2>/dev/null && [ -s "$tmp" ]; then
42
+ mv "$tmp" "$CONFIG"
43
+ else
44
+ rm -f "$tmp"
45
+ _die "failed to update $CONFIG (invalid jq filter or unwritable file)" 1
46
+ fi
47
+ }
48
+
49
+ _has_repo() { jq -e --arg n "$1" 'any(.repos[]?; (if type=="object" then .name else . end) == $n)' "$CONFIG" >/dev/null; }
50
+ _has_admin() { jq -e --arg h "$1" 'any(.admins[]?; . == $h)' "$CONFIG" >/dev/null; }
51
+
52
+ usage() {
53
+ cat >&2 <<'EOF'
54
+ settings.sh — Egregore instance settings
55
+
56
+ settings.sh hosting status|on|off
57
+ settings.sh relay status|on|off
58
+ settings.sh workflow status|simple|staged
59
+ settings.sh repo list | add <name> [description] | remove <name>
60
+ settings.sh admin list | add <github-handle> | remove <github-handle>
61
+ settings.sh people list | add <github-handle> | remove <github-handle>
62
+ settings.sh dump full snapshot (JSON)
63
+
64
+ --json machine-readable output for status/list
65
+ EOF
66
+ exit "${1:-1}"
67
+ }
68
+
69
+ # ── verbs ────────────────────────────────────────────────────────────────
70
+
71
+ cmd_hosting() {
72
+ local action="${1:-status}"
73
+ # NEVER use jq's `// "true"` here: `//` treats an explicit `false` as empty and
74
+ # would return the default, silently defeating the off-switch. Test `!= false`
75
+ # so absent/true => enabled, explicit false => disabled. `enabled` is the
76
+ # resolved boolean string ("true"/"false").
77
+ local enabled; enabled="$(jq -r '.features.publishing != false' "$CONFIG" 2>/dev/null || echo "true")"
78
+ case "$action" in
79
+ status)
80
+ if [ "$JSON" = 1 ]; then
81
+ jq -n --argjson on "$enabled" '{domain:"hosting", publishing:$on}'
82
+ elif [ "$enabled" = "false" ]; then echo "Hosting (egregore.xyz): OFF"
83
+ else echo "Hosting (egregore.xyz): ON"; fi ;;
84
+ on)
85
+ _save '.features.publishing = true'
86
+ echo "Hosting (egregore.xyz): ON" ;;
87
+ off)
88
+ _save '.features.publishing = false'
89
+ echo "Hosting (egregore.xyz): OFF — artifacts will no longer upload to egregore.xyz" ;;
90
+ *) _die "usage: settings.sh hosting status|on|off" 1 ;;
91
+ esac
92
+ }
93
+
94
+ # The public share relay is the only upload route when there is no org API
95
+ # key. It is unauthenticated, readable by anyone with the URL, and expires
96
+ # after 7 days, so it is OFF unless explicitly enabled.
97
+ cmd_relay() {
98
+ local action="${1:-status}"
99
+ local enabled; enabled="$(jq -r 'if .features.public_relay == true then "true" else "false" end' "$CONFIG" 2>/dev/null || echo "false")"
100
+ case "$action" in
101
+ status)
102
+ if [ "$JSON" = 1 ]; then
103
+ jq -n --argjson on "$enabled" '{domain:"relay", public_relay:$on}'
104
+ elif [ "$enabled" = "true" ]; then
105
+ echo "Public share relay: ON — artifacts published without an org API key upload to a public, unauthenticated URL (expires after 7 days)"
106
+ else
107
+ echo "Public share relay: OFF — without an org API key, nothing uploads anywhere"
108
+ fi ;;
109
+ on)
110
+ _save '.features.public_relay = true'
111
+ echo "Public share relay: ON"
112
+ echo " Artifacts published without an org API key now upload to a public, unauthenticated URL that anyone with the link can read for 7 days." ;;
113
+ off)
114
+ _save '.features.public_relay = false'
115
+ echo "Public share relay: OFF — without an org API key, nothing uploads anywhere" ;;
116
+ *) _die "usage: settings.sh relay status|on|off" 1 ;;
117
+ esac
118
+ }
119
+
120
+ cmd_workflow() {
121
+ local action="${1:-status}"
122
+ local base
123
+ base="$(jq -r 'if has("base_branch") then .base_branch else "develop" end' "$CONFIG" 2>/dev/null)"
124
+ case "$action" in
125
+ status)
126
+ local workflow="custom"
127
+ [ "$base" = "main" ] && workflow="simple"
128
+ [ "$base" = "develop" ] && workflow="staged"
129
+ if [ "$JSON" = 1 ]; then
130
+ jq -n --arg workflow "$workflow" --arg base_branch "$base" \
131
+ '{domain:"workflow", workflow:$workflow, base_branch:$base_branch}'
132
+ elif [ "$workflow" = "simple" ]; then
133
+ echo "Git workflow: SIMPLE — pull requests target main"
134
+ elif [ "$workflow" = "staged" ]; then
135
+ echo "Git workflow: STAGED — pull requests target develop; releases promote to main"
136
+ else
137
+ echo "Git workflow: CUSTOM — pull requests target $base"
138
+ fi
139
+ ;;
140
+ simple)
141
+ if [ "$base" != "main" ]; then
142
+ git -C "$SCRIPT_DIR" rev-parse --git-dir >/dev/null 2>&1 \
143
+ || _die "cannot switch workflow: $SCRIPT_DIR is not a Git repository" 1
144
+ git -C "$SCRIPT_DIR" ls-remote --exit-code --heads origin main >/dev/null 2>&1 \
145
+ || _die "cannot switch workflow: origin/main does not exist or could not be reached" 1
146
+ _save '.base_branch = "main"'
147
+ fi
148
+ echo "Git workflow: SIMPLE — pull requests now target main"
149
+ ;;
150
+ staged)
151
+ if [ "$base" != "develop" ]; then
152
+ git -C "$SCRIPT_DIR" rev-parse --git-dir >/dev/null 2>&1 \
153
+ || _die "cannot switch workflow: $SCRIPT_DIR is not a Git repository" 1
154
+ bash "$SCRIPT_DIR/bin/lib/ensure-develop.sh" "$SCRIPT_DIR" >/dev/null \
155
+ || _die "could not create develop; workflow is unchanged" 1
156
+ git -C "$SCRIPT_DIR" ls-remote --exit-code --heads origin develop >/dev/null 2>&1 \
157
+ || _die "could not verify origin/develop; workflow is unchanged" 1
158
+ _save '.base_branch = "develop"'
159
+ elif ! jq -e 'has("base_branch")' "$CONFIG" >/dev/null 2>&1; then
160
+ _save '.base_branch = "develop"'
161
+ fi
162
+ echo "Git workflow: STAGED — pull requests now target develop; releases promote to main"
163
+ ;;
164
+ *) _die "usage: settings.sh workflow status|simple|staged" 1 ;;
165
+ esac
166
+ }
167
+
168
+ cmd_repo() {
169
+ local action="${1:-list}"; shift || true
170
+ case "$action" in
171
+ list)
172
+ if [ "$JSON" = 1 ]; then
173
+ jq '[.repos[]? | if type=="object" then . else {name:.} end]' "$CONFIG"
174
+ else
175
+ jq -r '.repos[]? | if type=="object" then " " + .name + (if .description then " — " + .description else "" end) else " " + . end' "$CONFIG"
176
+ fi ;;
177
+ add)
178
+ local name="${1:-}"; shift || true
179
+ local desc="${*:-}"
180
+ _valid_token "$name" || _die "usage: settings.sh repo add <name> [description]" 1
181
+ if _has_repo "$name"; then echo "repo '$name' already managed"; return 0; fi
182
+ if [ -n "$desc" ]; then
183
+ _save '.repos = ((.repos // []) + [{name:$n, description:$d}])' --arg n "$name" --arg d "$desc"
184
+ else
185
+ _save '.repos = ((.repos // []) + [{name:$n}])' --arg n "$name"
186
+ fi
187
+ echo "added repo '$name'"
188
+ echo " clone it with: /sync-repos (or reopen the egregore)" ;;
189
+ remove)
190
+ local name="${1:-}"
191
+ _valid_token "$name" || _die "usage: settings.sh repo remove <name>" 1
192
+ if ! _has_repo "$name"; then echo "repo '$name' is not managed"; return 0; fi
193
+ _save '.repos = [.repos[]? | select((if type=="object" then .name else . end) != $n)]' --arg n "$name"
194
+ echo "removed repo '$name' from config"
195
+ echo " note: the local ../$name checkout is left untouched" ;;
196
+ *) _die "usage: settings.sh repo list|add|remove" 1 ;;
197
+ esac
198
+ }
199
+
200
+ cmd_admin() {
201
+ local action="${1:-list}"; shift || true
202
+ case "$action" in
203
+ list)
204
+ if [ "$JSON" = 1 ]; then jq '{admins:(.admins // [])}' "$CONFIG"
205
+ else jq -r '.admins[]? | " " + .' "$CONFIG"; fi ;;
206
+ add)
207
+ local h="${1:-}"
208
+ _valid_token "$h" || _die "usage: settings.sh admin add <github-handle>" 1
209
+ if _has_admin "$h"; then echo "'$h' is already an admin"; return 0; fi
210
+ _save '.admins = ((.admins // []) + [$h])' --arg h "$h"
211
+ echo "added admin '$h'" ;;
212
+ remove)
213
+ local h="${1:-}"
214
+ _valid_token "$h" || _die "usage: settings.sh admin remove <github-handle>" 1
215
+ if ! _has_admin "$h"; then echo "'$h' is not an admin"; return 0; fi
216
+ local count; count="$(jq '(.admins // []) | length' "$CONFIG")"
217
+ [ "$count" -le 1 ] && _die "refusing to remove the last admin ('$h') — add another admin first" 1
218
+ _save '.admins = [.admins[]? | select(. != $h)]' --arg h "$h"
219
+ echo "removed admin '$h'" ;;
220
+ *) _die "usage: settings.sh admin list|add|remove" 1 ;;
221
+ esac
222
+ }
223
+
224
+ # ── people ───────────────────────────────────────────────────────────────
225
+ # People live as files in memory/people/. add/remove manage that directory AND
226
+ # GitHub repo access (the meaningful local grant). Connected-mode extras — the
227
+ # invite link + Telegram (/invite) and Supabase/Neo4j teardown (/delete-user) —
228
+ # are pointed to, not duplicated here.
229
+
230
+ _people_dir() { echo "$SCRIPT_DIR/memory/people"; }
231
+
232
+ _people_names() {
233
+ local pdir; pdir="$(_people_dir)"
234
+ [ -d "$pdir" ] || return 0
235
+ # Removals are durable: sessions and syncs can resurrect person FILES
236
+ # (observed: deleted members reappearing via session auto-saves), so the
237
+ # committed removal ledger in egregore.json, not file presence, decides
238
+ # who is listed. `people add` clears the tombstone.
239
+ local removed; removed="$(jq -r '(.people_removed // [])[] | ascii_downcase' "$CONFIG" 2>/dev/null | sort -u)"
240
+ ls "$pdir"/*.md 2>/dev/null | while IFS= read -r f; do
241
+ # Alias witness files (Alias-Of: other.md) are presentation metadata
242
+ # for an existing member, not members themselves — one person, one row.
243
+ if head -8 "$f" 2>/dev/null | grep -q '^Alias-Of:[[:space:]]*[^[:space:]]'; then
244
+ continue
245
+ fi
246
+ basename "$f" .md
247
+ done \
248
+ | grep -viE '^(index|readme)$' \
249
+ | while IFS= read -r name; do
250
+ if [ -n "$removed" ] && printf '%s\n' "$removed" | grep -qxF "$(printf '%s' "$name" | tr '[:upper:]' '[:lower:]')"; then
251
+ continue
252
+ fi
253
+ printf '%s\n' "$name"
254
+ done || true
255
+ }
256
+
257
+ _people_json() {
258
+ local names; names="$(_people_names)"
259
+ if [ -z "$names" ]; then echo '[]'; return; fi
260
+ printf '%s\n' "$names" | jq -R . | jq -sc 'map(select(length>0))'
261
+ }
262
+
263
+ _has_person() { [ -f "$(_people_dir)/$1.md" ]; }
264
+
265
+ # add|remove a GitHub push-collaborator across the instance's repos. Best-effort:
266
+ # no token/org => skip with a note; per-repo failures never abort.
267
+ _people_github() {
268
+ local user="$1" op="$2" token org repos r
269
+ token="$(grep '^GITHUB_TOKEN=' "$SCRIPT_DIR/.env" 2>/dev/null | cut -d= -f2- || true)"
270
+ org="$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)"
271
+ if [ -z "$token" ] || [ -z "$org" ]; then
272
+ echo " (no GitHub token/org — skipped repo access; run bin/github-auth.sh)" >&2
273
+ return 0
274
+ fi
275
+ repos="$(jq -r '[.repo_name, (.memory_repo // "" | split("/") | last | sub("\\.git$";"")), (.repos[]? | if type=="object" then .name else . end)] | map(select(. != null and . != "")) | unique | .[]' "$CONFIG" 2>/dev/null)"
276
+ for r in $repos; do
277
+ if [ "$op" = "add" ]; then
278
+ curl -s -o /dev/null -X PUT -H "Authorization: Bearer $token" -H "Accept: application/vnd.github+json" \
279
+ "https://api.github.com/repos/$org/$r/collaborators/$user" -d '{"permission":"push"}' 2>/dev/null || true
280
+ else
281
+ curl -s -o /dev/null -X DELETE -H "Authorization: Bearer $token" -H "Accept: application/vnd.github+json" \
282
+ "https://api.github.com/repos/$org/$r/collaborators/$user" 2>/dev/null || true
283
+ fi
284
+ done
285
+ }
286
+
287
+ # create|remove memory/people/<user>.md, committing ONLY the people dir.
288
+ _people_file() {
289
+ local user="$1" op="$2" pdir f inviter today
290
+ pdir="$(_people_dir)"
291
+ [ -d "$SCRIPT_DIR/memory" ] || { echo " (no memory dir — skipped person file)" >&2; return 0; }
292
+ mkdir -p "$pdir"
293
+ f="$pdir/$user.md"
294
+ if [ "$op" = "add" ]; then
295
+ if [ ! -f "$f" ]; then
296
+ inviter="$(jq -r '.display_name // .github_username // "admin"' "$SCRIPT_DIR/.egregore-state.json" 2>/dev/null || echo admin)"
297
+ today="$(date -u +%Y-%m-%d)"
298
+ printf -- '---\nname: %s\nperson_id: github-login:%s\ngithub: %s\ninvited_by: %s\njoined: %s\n---\n' "$user" "$(printf '%s' "$user" | tr '[:upper:]' '[:lower:]')" "$user" "$inviter" "$today" > "$f"
299
+ fi
300
+ else
301
+ rm -f "$f"
302
+ fi
303
+ ( cd "$SCRIPT_DIR/memory" 2>/dev/null && git add -A people/ 2>/dev/null \
304
+ && git commit -q -m "chore(settings): $op $user in people" 2>/dev/null \
305
+ && git push -q 2>/dev/null ) || true
306
+ }
307
+
308
+ cmd_people() {
309
+ local action="${1:-list}"; shift || true
310
+ case "$action" in
311
+ list)
312
+ if [ "$JSON" = 1 ]; then _people_json
313
+ else
314
+ local names; names="$(_people_names)"
315
+ if [ -n "$names" ]; then printf ' %s\n' $names; else echo " (none)"; fi
316
+ fi ;;
317
+ add)
318
+ local h="${1:-}"
319
+ _valid_token "$h" || _die "usage: settings.sh people add <github-handle>" 1
320
+ _save '.people_removed = ((.people_removed // []) | map(select(ascii_downcase != ($h | ascii_downcase)))) | if .people_removed == [] then del(.people_removed) else . end' --arg h "$h"
321
+ if _has_person "$h"; then echo "'$h' is already in people"; return 0; fi
322
+ _people_github "$h" "add"
323
+ _people_file "$h" "add"
324
+ echo "added '$h' (repo access + person file)"
325
+ [ -n "$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)" ] && echo " connected org: for the invite link + Telegram, run /invite $h" ;;
326
+ remove)
327
+ local h="${1:-}"
328
+ _valid_token "$h" || _die "usage: settings.sh people remove <github-handle>" 1
329
+ # Tombstone first: the removal ledger in committed org config keeps a
330
+ # removal durable even when a person file is later resurrected by a
331
+ # session write or sync.
332
+ _save '.people_removed = ((.people_removed // []) + [$h] | map(ascii_downcase) | unique)' --arg h "$h"
333
+ if ! _has_person "$h"; then echo "'$h' is not in people (removal recorded)"; return 0; fi
334
+ _people_github "$h" "remove"
335
+ _people_file "$h" "remove"
336
+ echo "removed '$h' (repo access + person file + durable removal record)"
337
+ [ -n "$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)" ] && echo " connected org: for full deprovision (Supabase/Neo4j), run /delete-user $h" ;;
338
+ *) _die "usage: settings.sh people list|add|remove" 1 ;;
339
+ esac
340
+ }
341
+
342
+ cmd_dump() {
343
+ # Always JSON — the launcher calls this once to render the whole settings screen.
344
+ local people; people="$(_people_json)"
345
+ jq --argjson people "$people" '{
346
+ org: .org_name,
347
+ slug: .slug,
348
+ hosting: (.features.publishing != false),
349
+ public_relay: (.features.public_relay == true),
350
+ workflow: (
351
+ if ((if has("base_branch") then .base_branch else "develop" end) == "main") then "simple"
352
+ elif ((if has("base_branch") then .base_branch else "develop" end) == "develop") then "staged"
353
+ else "custom"
354
+ end
355
+ ),
356
+ base_branch: (if has("base_branch") then .base_branch else "develop" end),
357
+ repos: [.repos[]? | if type=="object" then . else {name:.} end],
358
+ admins: (.admins // []),
359
+ people: $people
360
+ }' "$CONFIG"
361
+ }
362
+
363
+ # ── dispatch ─────────────────────────────────────────────────────────────
364
+
365
+ [ -f "$CONFIG" ] || _die "egregore.json not found at $CONFIG" 2
366
+
367
+ # Pull out --json (bash 3.2-safe array handling), leave the rest as positionals.
368
+ JSON=0
369
+ _args=()
370
+ for _a in "$@"; do
371
+ if [ "$_a" = "--json" ]; then JSON=1; else _args+=("$_a"); fi
372
+ done
373
+ set -- "${_args[@]+"${_args[@]}"}"
374
+
375
+ # ── privacy & access (read snapshot) ─────────────────────────────────────
376
+ # One composed JSON for the Settings Privacy & access panel. Identity,
377
+ # membership, and capability values come from the Runtime authorization
378
+ # backend (access-status); this shell layer adds only committed boundary
379
+ # config, the personal boundary-local file, isolation state, and honest
380
+ # constant statements. Never includes secrets, tokens, or internal paths.
381
+
382
+ _md5() { if command -v md5 >/dev/null 2>&1; then md5 -q -s "$1" 2>/dev/null || printf '%s' "$1" | md5; else printf '%s' "$1" | md5sum | cut -d' ' -f1; fi; }
383
+
384
+ _graph_retrieval_state() {
385
+ # Mirrors bin/search.sh: activation record keyed sha256(org_id|main)[:16].
386
+ local org main gitdir key record
387
+ org=$(jq -r '.org_id // empty' "$CONFIG" 2>/dev/null)
388
+ [ -n "$org" ] || { echo "unknown"; return; }
389
+ main="$SCRIPT_DIR"
390
+ if [ -f "$SCRIPT_DIR/.git" ]; then
391
+ gitdir=$(sed -n 's/^gitdir: //p' "$SCRIPT_DIR/.git" 2>/dev/null)
392
+ case "$gitdir" in */.git/worktrees/*) main="${gitdir%/.git/worktrees/*}" ;; esac
393
+ fi
394
+ main=$(cd "$main" 2>/dev/null && pwd -P) || { echo "unknown"; return; }
395
+ key=$(printf '%s|%s' "$org" "$main" | shasum -a 256 2>/dev/null | cut -c1-16)
396
+ record="${EGREGORE_UPGRADE_ROOT:-$HOME/.egregore/runtime/upgrade}/${key}/active.json"
397
+ if [ -f "$record" ] && [ "$(jq -r '.retrieval // empty' "$record" 2>/dev/null)" = "runtime-qmd" ]; then
398
+ echo "not-used-by-this-runtime"
399
+ else
400
+ echo "legacy"
401
+ fi
402
+ }
403
+
404
+ cmd_privacy() {
405
+ local access posture locked org_reads personal_reads denied digest graph
406
+ access=$(cd "$SCRIPT_DIR" && EGREGORE_ROOT="$SCRIPT_DIR" \
407
+ PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}" \
408
+ python3 -m egregore_runtime.harness_cli access-status 2>/dev/null) || true
409
+ printf '%s' "$access" | jq -e . >/dev/null 2>&1 || access='{"status":"attention"}'
410
+ posture=$(jq -r '.boundary.posture // "standard"' "$CONFIG" 2>/dev/null || echo standard)
411
+ locked=$(jq -r 'if (.boundary.locked // false) == true then "true" else "false" end' "$CONFIG" 2>/dev/null || echo false)
412
+ org_reads=$(jq -c '.boundary.read // []' "$CONFIG" 2>/dev/null || echo '[]')
413
+ personal_reads=$(jq -c '.read // []' "$SCRIPT_DIR/.egregore-boundary.local.json" 2>/dev/null || echo '[]')
414
+ digest=$(_md5 "$SCRIPT_DIR")
415
+ denied=$(jq -r '.denied_paths | length' "/tmp/egregore-boundary-${digest}.json" 2>/dev/null || echo 0)
416
+ graph=$(_graph_retrieval_state)
417
+ jq -n \
418
+ --argjson access "$access" \
419
+ --arg posture "$posture" \
420
+ --argjson locked "$locked" \
421
+ --argjson org_reads "$org_reads" \
422
+ --argjson personal_reads "$personal_reads" \
423
+ --argjson denied "${denied:-0}" \
424
+ --arg graph "$graph" \
425
+ '{
426
+ access: $access,
427
+ boundary: {
428
+ posture: $posture,
429
+ locked: $locked,
430
+ org_read_roots: $org_reads,
431
+ personal_read_roots: $personal_reads
432
+ },
433
+ isolation: { foreign_instances_denied: $denied },
434
+ graph_retrieval: $graph,
435
+ content_protection: {
436
+ admin_marked: "hidden on Egregore surfaces from non-admin members",
437
+ external_publication: "admin-marked content blocked unless an authorized admin separately confirms",
438
+ raw_repository_access: "organization-wide",
439
+ per_document_filesystem_acl: "not enabled"
440
+ }
441
+ }'
442
+ }
443
+
444
+ # ── personal boundary read roots ─────────────────────────────────────────
445
+ # Personal-only: edits .egregore-boundary.local.json for the current member.
446
+ # Respects org `locked: true` (no personal expansion), and never accepts a
447
+ # path inside another Egregore instance — the hard tier has no consent path.
448
+
449
+ LOCAL_BOUNDARY="$SCRIPT_DIR/.egregore-boundary.local.json"
450
+
451
+ _boundary_locked() {
452
+ [ "$(jq -r '.boundary.locked // false' "$CONFIG" 2>/dev/null)" = "true" ]
453
+ }
454
+
455
+ _inside_foreign_instance() {
456
+ local target="$1" registry="$HOME/.egregore/instances.json" p self
457
+ [ -f "$registry" ] || return 1
458
+ self=$(cd "$SCRIPT_DIR" 2>/dev/null && pwd -P)
459
+ while IFS= read -r p; do
460
+ [ -n "$p" ] || continue
461
+ p=$(cd "$p" 2>/dev/null && pwd -P) || continue
462
+ [ "$p" = "$self" ] && continue
463
+ case "$target" in "$p"|"$p"/*) return 0 ;; esac
464
+ done < <(jq -r '.[].path // empty' "$registry" 2>/dev/null)
465
+ return 1
466
+ }
467
+
468
+ cmd_boundary() {
469
+ local action="${1:-list}" raw target current
470
+ case "$action" in
471
+ list)
472
+ current=$(jq -c '.read // []' "$LOCAL_BOUNDARY" 2>/dev/null || echo '[]')
473
+ if [ "$JSON" -eq 1 ]; then
474
+ jq -n --argjson read "$current" --argjson locked "$(_boundary_locked && echo true || echo false)" \
475
+ '{personal_read_roots: $read, locked: $locked}'
476
+ else
477
+ echo "personal read roots:"
478
+ printf '%s\n' "$current" | jq -r '.[] // empty' | sed 's/^/ /'
479
+ _boundary_locked && echo "(organization boundary policy is locked — personal changes disabled)"
480
+ fi
481
+ ;;
482
+ add|remove)
483
+ raw="${2:-}"
484
+ [ -n "$raw" ] || _die "usage: settings.sh boundary $action <directory>" 1
485
+ if _boundary_locked; then
486
+ _die "boundary policy is managed by your organization and locked; personal read roots cannot change" 1
487
+ fi
488
+ case "$raw" in "~"*) target="$HOME${raw#\~}" ;; *) target="$raw" ;; esac
489
+ target=$(cd "$target" 2>/dev/null && pwd -P) || {
490
+ [ "$action" = "remove" ] && target="$raw" || _die "directory not found: $raw" 1
491
+ }
492
+ if [ "$action" = "add" ]; then
493
+ if _inside_foreign_instance "$target"; then
494
+ _die "that directory belongs to another Egregore instance; it can never be a personal read root" 1
495
+ fi
496
+ [ -f "$LOCAL_BOUNDARY" ] || printf '{}\n' > "$LOCAL_BOUNDARY"
497
+ tmp="$(mktemp "$LOCAL_BOUNDARY.XXXXXX")"
498
+ if jq --arg p "$target" '.read = ((.read // []) + [$p] | unique)' "$LOCAL_BOUNDARY" > "$tmp" 2>/dev/null && [ -s "$tmp" ]; then
499
+ mv "$tmp" "$LOCAL_BOUNDARY"
500
+ echo "added personal read root: $target (applies from the next session start)"
501
+ else
502
+ rm -f "$tmp"; _die "failed to update $LOCAL_BOUNDARY" 1
503
+ fi
504
+ else
505
+ [ -f "$LOCAL_BOUNDARY" ] || { echo "removed personal read root: $raw (was not present)"; return 0; }
506
+ tmp="$(mktemp "$LOCAL_BOUNDARY.XXXXXX")"
507
+ if jq --arg p "$target" --arg raw "$raw" '.read = ((.read // []) | map(select(. != $p and . != $raw)))' "$LOCAL_BOUNDARY" > "$tmp" 2>/dev/null && [ -s "$tmp" ]; then
508
+ mv "$tmp" "$LOCAL_BOUNDARY"
509
+ echo "removed personal read root: $target"
510
+ else
511
+ rm -f "$tmp"; _die "failed to update $LOCAL_BOUNDARY" 1
512
+ fi
513
+ fi
514
+ ;;
515
+ *) _die "usage: settings.sh boundary list|add <dir>|remove <dir>" 1 ;;
516
+ esac
517
+ }
518
+
519
+ DOMAIN="${1:-}"; shift || true
520
+ case "$DOMAIN" in
521
+ hosting) cmd_hosting "$@" ;;
522
+ relay) cmd_relay "$@" ;;
523
+ workflow) cmd_workflow "$@" ;;
524
+ repo) cmd_repo "$@" ;;
525
+ admin) cmd_admin "$@" ;;
526
+ people) cmd_people "$@" ;;
527
+ privacy) cmd_privacy ;;
528
+ boundary) cmd_boundary "$@" ;;
529
+ dump) cmd_dump ;;
530
+ ""|-h|--help|help) usage 0 ;;
531
+ *) _die "unknown settings domain: '$DOMAIN' (try: hosting, relay, workflow, repo, admin, people, privacy, boundary, dump)" 1 ;;
532
+ esac
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env bash
2
+ # startup-check.sh — Validate local config and phone home health status.
3
+ # Called by session-start.sh in background. Fire-and-forget.
4
+ set -uo pipefail
5
+
6
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
7
+ CONFIG="$SCRIPT_DIR/egregore.json"
8
+ ENV_FILE="$SCRIPT_DIR/.env"
9
+ STATE_FILE="$SCRIPT_DIR/.egregore-state.json"
10
+
11
+ # Bail if essential files missing
12
+ [ -f "$CONFIG" ] || exit 0
13
+ [ -f "$ENV_FILE" ] || exit 0
14
+
15
+ # --- Read config ---
16
+ API_URL=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)
17
+ MODE=$(jq -r '.mode // "local"' "$CONFIG" 2>/dev/null)
18
+ CONFIG_SLUG=$(jq -r '.slug // empty' "$CONFIG" 2>/dev/null)
19
+ ORG_NAME=$(jq -r '.org_name // empty' "$CONFIG" 2>/dev/null)
20
+ GITHUB_ORG=$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)
21
+
22
+ # shellcheck source=bin/lib/config.sh
23
+ source "$SCRIPT_DIR/bin/lib/config.sh"
24
+
25
+ # Runtime telemetry and diagnostics remain on-device by default. Historical
26
+ # Connected health reporting is retained only as an explicit operator action;
27
+ # merely having stale credentials in .env must never trigger an upload.
28
+ [ "$MODE" = "connected" ] || exit 0
29
+ [ "${EGREGORE_SHARE_HEALTH:-0}" = "1" ] || exit 0
30
+
31
+ GITHUB_TOKEN=$(grep '^GITHUB_TOKEN=' "$ENV_FILE" 2>/dev/null | cut -d'=' -f2-)
32
+ API_KEY=$(grep '^EGREGORE_API_KEY=' "$ENV_FILE" 2>/dev/null | cut -d'=' -f2-)
33
+
34
+ [ -z "$API_URL" ] && exit 0
35
+ [ -z "$GITHUB_TOKEN" ] && exit 0
36
+ [ -z "$CONFIG_SLUG" ] && exit 0
37
+
38
+ # --- Framework version ---
39
+ FRAMEWORK_VERSION=""
40
+ if [ -f "$SCRIPT_DIR/bin/session-start.sh" ]; then
41
+ FRAMEWORK_VERSION=$(grep '^FRAMEWORK_VERSION=' "$SCRIPT_DIR/bin/session-start.sh" 2>/dev/null | head -1 | cut -d'"' -f2)
42
+ fi
43
+
44
+ # --- Validate API key ---
45
+ KEY_VALID="false"
46
+ KEY_SLUG=""
47
+ ERRORS="[]"
48
+ ERR_LIST=""
49
+
50
+ if [ -n "$API_KEY" ]; then
51
+ KEY_SLUG=$(echo "$API_KEY" | cut -d'_' -f2)
52
+ if [ "$KEY_SLUG" = "$CONFIG_SLUG" ]; then
53
+ KEY_VALID="true"
54
+ elif _graph_projection_enabled; then
55
+ # Slug mismatch is not proof of a bad key — org renames leave the working
56
+ # key on the old slug. Ask the API before reporting it broken.
57
+ PROBE_CODE=$(curl -s -o /dev/null -w '%{http_code}' \
58
+ -H "Authorization: Bearer $API_KEY" \
59
+ "${API_URL}/api/graph/test" \
60
+ --connect-timeout 3 --max-time 5 2>/dev/null || echo "000")
61
+ if [ "$PROBE_CODE" = "401" ] || [ "$PROBE_CODE" = "403" ]; then
62
+ ERR_LIST="\"key_auth_failed: key=$KEY_SLUG config=$CONFIG_SLUG\""
63
+ else
64
+ KEY_VALID="true"
65
+ fi
66
+ else
67
+ # Graph is intentionally quarantined for this instance. Do not use its
68
+ # health endpoint as a generic Connected authentication probe.
69
+ KEY_VALID="true"
70
+ fi
71
+ else
72
+ ERR_LIST="\"no_api_key\""
73
+ fi
74
+
75
+ # --- Check memory directory ---
76
+ MEMORY_LINKED="false"
77
+ if [ -d "$SCRIPT_DIR/memory" ]; then
78
+ MEMORY_LINKED="true"
79
+ else
80
+ [ -n "$ERR_LIST" ] && ERR_LIST="$ERR_LIST,"
81
+ ERR_LIST="${ERR_LIST}\"memory_not_found\""
82
+ fi
83
+
84
+ # --- Check git sync ---
85
+ GIT_SYNCED="false"
86
+ BRANCH=""
87
+ if [ -d "$SCRIPT_DIR/.git" ]; then
88
+ BRANCH=$(git -C "$SCRIPT_DIR" branch --show-current 2>/dev/null || echo "")
89
+ LOCAL=$(git -C "$SCRIPT_DIR" rev-parse HEAD 2>/dev/null || echo "")
90
+ REMOTE=$(git -C "$SCRIPT_DIR" rev-parse origin/develop 2>/dev/null || echo "none")
91
+ if [ "$LOCAL" = "$REMOTE" ] || git -C "$SCRIPT_DIR" merge-base --is-ancestor origin/develop HEAD 2>/dev/null; then
92
+ GIT_SYNCED="true"
93
+ else
94
+ [ -n "$ERR_LIST" ] && ERR_LIST="$ERR_LIST,"
95
+ ERR_LIST="${ERR_LIST}\"git_behind_develop\""
96
+ fi
97
+ fi
98
+
99
+ ERRORS="[$ERR_LIST]"
100
+
101
+ # --- Platform info ---
102
+ PLATFORM=$(uname -s 2>/dev/null || echo "unknown")
103
+ SHELL_NAME=$(basename "$SHELL" 2>/dev/null || echo "unknown")
104
+
105
+ # --- POST health check-in (fire & forget) ---
106
+ PAYLOAD=$(jq -n \
107
+ --arg org_slug "$CONFIG_SLUG" \
108
+ --argjson key_valid "$KEY_VALID" \
109
+ --arg key_slug "$KEY_SLUG" \
110
+ --arg config_slug "$CONFIG_SLUG" \
111
+ --arg framework_version "$FRAMEWORK_VERSION" \
112
+ --argjson memory_linked "$MEMORY_LINKED" \
113
+ --argjson git_synced "$GIT_SYNCED" \
114
+ --arg branch "$BRANCH" \
115
+ --argjson errors "$ERRORS" \
116
+ --arg platform "$PLATFORM" \
117
+ --arg shell "$SHELL_NAME" \
118
+ '{
119
+ org_slug: $org_slug,
120
+ key_valid: $key_valid,
121
+ key_slug: $key_slug,
122
+ config_slug: $config_slug,
123
+ framework_version: $framework_version,
124
+ memory_linked: $memory_linked,
125
+ git_synced: $git_synced,
126
+ branch: $branch,
127
+ errors: $errors,
128
+ platform: $platform,
129
+ shell: $shell
130
+ }')
131
+
132
+ curl -sf "${API_URL}/api/health/checkin" \
133
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
134
+ -H "Content-Type: application/json" \
135
+ -d "$PAYLOAD" \
136
+ --connect-timeout 5 --max-time 10 >/dev/null 2>&1 || true