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.
- package/assets/egregore-launcher.js +1013 -16
- package/bin/cli.js +11 -0
- package/lib/claude-runtime.js +192 -0
- package/lib/local.js +38 -31
- package/lib/pi-runtime.js +1 -0
- package/lib/prime-runtime.js +1 -0
- package/lib/runtime-identity.js +146 -0
- package/lib/setup.js +116 -17
- package/package.json +10 -6
- package/runtime/claude/.claude/context/commit-format.md +110 -0
- package/runtime/claude/.claude/context/git-language.md +46 -0
- package/runtime/claude/.claude/context/notification-consent.md +66 -0
- package/runtime/claude/.claude/context/pr-format.md +67 -0
- package/runtime/claude/.claude/context/telemetry.md +133 -0
- package/runtime/claude/.claude/hooks/boundary-check.sh +333 -0
- package/runtime/claude/.claude/hooks/branch-guard.sh +231 -0
- package/runtime/claude/.claude/hooks/card-context.sh +38 -0
- package/runtime/claude/.claude/hooks/emissary-detect.sh +53 -0
- package/runtime/claude/.claude/hooks/memory-refresh.sh +67 -0
- package/runtime/claude/.claude/hooks/onboarding-guard.sh +86 -0
- package/runtime/claude/.claude/hooks/retrieval-context.sh +43 -0
- package/runtime/claude/.claude/rules/voice-bedrock.md +73 -0
- package/runtime/claude/.claude/settings.json +131 -0
- package/runtime/claude/.claude/skills/activity/SKILL.md +68 -0
- package/runtime/claude/.claude/skills/announce/SKILL.md +54 -0
- package/runtime/claude/.claude/skills/archive/SKILL.md +71 -0
- package/runtime/claude/.claude/skills/branch/SKILL.md +147 -0
- package/runtime/claude/.claude/skills/checkup/SKILL.md +159 -0
- package/runtime/claude/.claude/skills/commit/SKILL.md +103 -0
- package/runtime/claude/.claude/skills/contribute/SKILL.md +343 -0
- package/runtime/claude/.claude/skills/create-skill/SKILL.md +135 -0
- package/runtime/claude/.claude/skills/dark-mode/SKILL.md +410 -0
- package/runtime/claude/.claude/skills/dashboard/SKILL.md +43 -0
- package/runtime/claude/.claude/skills/deep-reflect/REPORT.md +140 -0
- package/runtime/claude/.claude/skills/deep-reflect/RESEARCH.md +132 -0
- package/runtime/claude/.claude/skills/deep-reflect/ROLES.md +104 -0
- package/runtime/claude/.claude/skills/deep-reflect/SKILL.md +170 -0
- package/runtime/claude/.claude/skills/delete-user/SKILL.md +150 -0
- package/runtime/claude/.claude/skills/emissary/SKILL.md +220 -0
- package/runtime/claude/.claude/skills/handoff/SKILL.md +124 -0
- package/runtime/claude/.claude/skills/harvest/AUDIT.md +546 -0
- package/runtime/claude/.claude/skills/harvest/FORMAT.md +436 -0
- package/runtime/claude/.claude/skills/harvest/PROCESS.md +395 -0
- package/runtime/claude/.claude/skills/harvest/QUESTION_PALETTE.md +76 -0
- package/runtime/claude/.claude/skills/harvest/SKILL.md +100 -0
- package/runtime/claude/.claude/skills/ingest/SKILL.md +112 -0
- package/runtime/claude/.claude/skills/ingest-corpus/SKILL.md +187 -0
- package/runtime/claude/.claude/skills/ingest-notion/SKILL.md +214 -0
- package/runtime/claude/.claude/skills/ingest-user-interview/SKILL.md +65 -0
- package/runtime/claude/.claude/skills/ingest-user-interview/references/analysis-contract.md +125 -0
- package/runtime/claude/.claude/skills/invite/SKILL.md +111 -0
- package/runtime/claude/.claude/skills/issue/SKILL.md +104 -0
- package/runtime/claude/.claude/skills/me/SKILL.md +81 -0
- package/runtime/claude/.claude/skills/meeting/SKILL.md +76 -0
- package/runtime/claude/.claude/skills/meeting/references/analysis-contract.md +102 -0
- package/runtime/claude/.claude/skills/note/SKILL.md +71 -0
- package/runtime/claude/.claude/skills/notion-connect/SKILL.md +124 -0
- package/runtime/claude/.claude/skills/onboarding/SKILL.md +159 -0
- package/runtime/claude/.claude/skills/pr/SKILL.md +85 -0
- package/runtime/claude/.claude/skills/pull/SKILL.md +79 -0
- package/runtime/claude/.claude/skills/push/SKILL.md +47 -0
- package/runtime/claude/.claude/skills/quest/SKILL.md +121 -0
- package/runtime/claude/.claude/skills/reflect/SKILL.md +69 -0
- package/runtime/claude/.claude/skills/review-pr/SKILL.md +276 -0
- package/runtime/claude/.claude/skills/save/SKILL.md +92 -0
- package/runtime/claude/.claude/skills/slack-connect/SKILL.md +148 -0
- package/runtime/claude/.claude/skills/summon/SKILL.md +240 -0
- package/runtime/claude/.claude/skills/sync-repos/SKILL.md +82 -0
- package/runtime/claude/.claude/skills/teams-connect/SKILL.md +216 -0
- package/runtime/claude/.claude/skills/telegram-connect/SKILL.md +110 -0
- package/runtime/claude/.claude/skills/telemetry/SKILL.md +117 -0
- package/runtime/claude/.claude/skills/test/SKILL.md +87 -0
- package/runtime/claude/.claude/skills/the-spiral/SKILL.md +492 -0
- package/runtime/claude/.claude/skills/tui-design/SKILL.md +188 -0
- package/runtime/claude/.claude/skills/tutorial/SKILL.md +100 -0
- package/runtime/claude/.claude/skills/update/SKILL.md +265 -0
- package/runtime/claude/.claude/skills/view/SKILL.md +393 -0
- package/runtime/claude/.claude/skills/view/compose-scaffold.html +221 -0
- package/runtime/claude/.claude/skills/visual-explain/SKILL.md +132 -0
- package/runtime/claude/.claude/skills/wrap/SKILL.md +98 -0
- package/runtime/claude/CLAUDE.md +447 -0
- package/runtime/claude/bin/activity-action.sh +92 -0
- package/runtime/claude/bin/activity-data.sh +17 -0
- package/runtime/claude/bin/agent.sh +783 -0
- package/runtime/claude/bin/artifact-register.sh +164 -0
- package/runtime/claude/bin/artifact-writeback.sh +53 -0
- package/runtime/claude/bin/artifacts.sh +288 -0
- package/runtime/claude/bin/attendant.sh +707 -0
- package/runtime/claude/bin/autosave.sh +112 -0
- package/runtime/claude/bin/boundary.sh +253 -0
- package/runtime/claude/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/claude/bin/capture-reconcile.sh +69 -0
- package/runtime/claude/bin/capture-run.sh +357 -0
- package/runtime/claude/bin/codex-install-skills.sh +78 -0
- package/runtime/claude/bin/codex-render-spec.mjs +462 -0
- package/runtime/claude/bin/codex-session-start.sh +275 -0
- package/runtime/claude/bin/codex-skill-render.mjs +349 -0
- package/runtime/claude/bin/codex-sync-skills.sh +237 -0
- package/runtime/claude/bin/connect-refresh.sh +33 -0
- package/runtime/claude/bin/contribute-guard.sh +79 -0
- package/runtime/claude/bin/corpus_map.py +806 -0
- package/runtime/claude/bin/corpus_survey.py +304 -0
- package/runtime/claude/bin/dashboard-data.sh +18 -0
- package/runtime/claude/bin/github-auth.sh +121 -0
- package/runtime/claude/bin/graph-batch.sh +86 -0
- package/runtime/claude/bin/graph-op.sh +1106 -0
- package/runtime/claude/bin/graph-projection.sh +54 -0
- package/runtime/claude/bin/graph-wal.sh +242 -0
- package/runtime/claude/bin/graph.sh +267 -0
- package/runtime/claude/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/claude/bin/handoff-lifecycle.sh +280 -0
- package/runtime/claude/bin/handoff-pr-backfill.sh +86 -0
- package/runtime/claude/bin/handoff-preview.sh +169 -0
- package/runtime/claude/bin/handoff-run.sh +692 -0
- package/runtime/claude/bin/handoff-save-egregore.sh +224 -0
- package/runtime/claude/bin/index-handoff.sh +322 -0
- package/runtime/claude/bin/ingest-graph.sh +86 -0
- package/runtime/claude/bin/ingest-item.sh +10 -0
- package/runtime/claude/bin/ingest-surface.html +495 -0
- package/runtime/claude/bin/ingest.py +1011 -0
- package/runtime/claude/bin/ingest.sh +308 -0
- package/runtime/claude/bin/ingest_graph.py +856 -0
- package/runtime/claude/bin/ingest_surface.py +544 -0
- package/runtime/claude/bin/invite.sh +6 -0
- package/runtime/claude/bin/issue.sh +10 -0
- package/runtime/claude/bin/knowledge.sh +10 -0
- package/runtime/claude/bin/lib/artifact-id.sh +46 -0
- package/runtime/claude/bin/lib/config.sh +136 -0
- package/runtime/claude/bin/lib/context.sh +642 -0
- package/runtime/claude/bin/lib/dashboard-artifact.sh +242 -0
- package/runtime/claude/bin/lib/ensure-develop.sh +183 -0
- package/runtime/claude/bin/lib/git-message.sh +37 -0
- package/runtime/claude/bin/lib/git-sync.sh +494 -0
- package/runtime/claude/bin/lib/greeting.sh +548 -0
- package/runtime/claude/bin/lib/handoff-meta.sh +97 -0
- package/runtime/claude/bin/lib/hash.sh +13 -0
- package/runtime/claude/bin/lib/identity.sh +213 -0
- package/runtime/claude/bin/lib/metrics.sh +374 -0
- package/runtime/claude/bin/lib/noncode.sh +31 -0
- package/runtime/claude/bin/lib/permissions.sh +106 -0
- package/runtime/claude/bin/lib/time.sh +56 -0
- package/runtime/claude/bin/lib/worktree-links.sh +85 -0
- package/runtime/claude/bin/node-run.sh +42 -0
- package/runtime/claude/bin/notification.sh +6 -0
- package/runtime/claude/bin/notify.sh +636 -0
- package/runtime/claude/bin/observe-context.sh +14 -0
- package/runtime/claude/bin/onboarding.sh +6 -0
- package/runtime/claude/bin/person.py +634 -0
- package/runtime/claude/bin/person.sh +481 -0
- package/runtime/claude/bin/pi-render-spec.mjs +140 -0
- package/runtime/claude/bin/post-update.sh +37 -0
- package/runtime/claude/bin/prime-render-spec.mjs +147 -0
- package/runtime/claude/bin/publish-artifact.sh +324 -0
- package/runtime/claude/bin/publish-references.sh +144 -0
- package/runtime/claude/bin/quest.sh +9 -0
- package/runtime/claude/bin/question.sh +8 -0
- package/runtime/claude/bin/repo-state.sh +96 -0
- package/runtime/claude/bin/research-ingest.sh +7 -0
- package/runtime/claude/bin/restore-owned-skills.sh +67 -0
- package/runtime/claude/bin/retrieval_eval.py +385 -0
- package/runtime/claude/bin/runtime-identity.sh +70 -0
- package/runtime/claude/bin/runtime-upgrade.sh +43 -0
- package/runtime/claude/bin/scroll.sh +9 -0
- package/runtime/claude/bin/search.sh +318 -0
- package/runtime/claude/bin/session-autosave.sh +220 -0
- package/runtime/claude/bin/session-log.sh +199 -0
- package/runtime/claude/bin/session-start.sh +696 -0
- package/runtime/claude/bin/settings.sh +532 -0
- package/runtime/claude/bin/startup-check.sh +136 -0
- package/runtime/claude/bin/statusline.sh +41 -0
- package/runtime/claude/bin/telemetry.sh +666 -0
- package/runtime/claude/bin/test-changes.sh +344 -0
- package/runtime/claude/bin/thread.sh +9 -0
- package/runtime/claude/bin/todo.sh +9 -0
- package/runtime/claude/bin/view-render.sh +126 -0
- package/runtime/claude/bin/worktree-create.sh +145 -0
- package/runtime/claude/bin/worktree-remove.sh +50 -0
- package/runtime/claude/bin/worktree.sh +198 -0
- package/runtime/claude/egregore_runtime/__init__.py +228 -0
- package/runtime/claude/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/claude/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/claude/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/claude/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/claude/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/claude/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/claude/egregore_runtime/admin_gate.py +102 -0
- package/runtime/claude/egregore_runtime/artifacts.py +523 -0
- package/runtime/claude/egregore_runtime/contracts.py +499 -0
- package/runtime/claude/egregore_runtime/entitlements.py +85 -0
- package/runtime/claude/egregore_runtime/errors.py +10 -0
- package/runtime/claude/egregore_runtime/graph.py +356 -0
- package/runtime/claude/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/claude/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/claude/egregore_runtime/identity.py +734 -0
- package/runtime/claude/egregore_runtime/identity_cli.py +91 -0
- package/runtime/claude/egregore_runtime/ingest.py +575 -0
- package/runtime/claude/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/claude/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/claude/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/claude/egregore_runtime/invitations.py +116 -0
- package/runtime/claude/egregore_runtime/issue_cli.py +305 -0
- package/runtime/claude/egregore_runtime/issues.py +359 -0
- package/runtime/claude/egregore_runtime/knowledge.py +376 -0
- package/runtime/claude/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/claude/egregore_runtime/lifecycle.py +888 -0
- package/runtime/claude/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/claude/egregore_runtime/notification_cli.py +125 -0
- package/runtime/claude/egregore_runtime/notifications.py +230 -0
- package/runtime/claude/egregore_runtime/observe.py +342 -0
- package/runtime/claude/egregore_runtime/onboarding.py +290 -0
- package/runtime/claude/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/claude/egregore_runtime/policy.py +144 -0
- package/runtime/claude/egregore_runtime/profile.py +193 -0
- package/runtime/claude/egregore_runtime/quest_cli.py +216 -0
- package/runtime/claude/egregore_runtime/question_cli.py +180 -0
- package/runtime/claude/egregore_runtime/questions.py +304 -0
- package/runtime/claude/egregore_runtime/quests.py +419 -0
- package/runtime/claude/egregore_runtime/readiness.py +379 -0
- package/runtime/claude/egregore_runtime/research_ingest.py +256 -0
- package/runtime/claude/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/claude/egregore_runtime/runtime.py +464 -0
- package/runtime/claude/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/claude/egregore_runtime/scrolls.py +726 -0
- package/runtime/claude/egregore_runtime/status.py +412 -0
- package/runtime/claude/egregore_runtime/status_cli.py +174 -0
- package/runtime/claude/egregore_runtime/sync.py +218 -0
- package/runtime/claude/egregore_runtime/teamsync.py +139 -0
- package/runtime/claude/egregore_runtime/telemetry.py +640 -0
- package/runtime/claude/egregore_runtime/thread_cli.py +173 -0
- package/runtime/claude/egregore_runtime/threads.py +517 -0
- package/runtime/claude/egregore_runtime/todo_cli.py +142 -0
- package/runtime/claude/egregore_runtime/todos.py +244 -0
- package/runtime/claude/egregore_runtime/upgrade.py +770 -0
- package/runtime/claude/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/claude/egregore_runtime/writeback.py +391 -0
- package/runtime/claude/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/claude/manifest.json +284 -0
- package/runtime/codex/.codex/hooks/search-hint.js +21 -52
- package/runtime/codex/.codex/hooks.json +3 -3
- package/runtime/codex/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/codex/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/codex/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/codex/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/codex/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/codex/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/codex/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/codex/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/codex/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/codex/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/codex/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/codex/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/codex/.codex/skills/me/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/codex/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/codex/.codex/skills/note/SKILL.md +30 -25
- package/runtime/codex/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/codex/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/codex/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/codex/.codex/skills/save/SKILL.md +2 -2
- package/runtime/codex/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/test/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/codex/.codex/skills/view/SKILL.md +115 -111
- package/runtime/codex/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/codex/.codex/spec-manifest.json +9 -9
- package/runtime/codex/AGENTS.md +62 -58
- package/runtime/codex/bin/activity-action.sh +92 -0
- package/runtime/codex/bin/activity-data.sh +12 -233
- package/runtime/codex/bin/agent.sh +84 -100
- package/runtime/codex/bin/artifact-register.sh +164 -0
- package/runtime/codex/bin/artifact-writeback.sh +53 -0
- package/runtime/codex/bin/artifacts.sh +288 -0
- package/runtime/codex/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/codex/bin/capture-run.sh +18 -2
- package/runtime/codex/bin/codex-render-spec.mjs +41 -16
- package/runtime/codex/bin/codex-session-start.sh +14 -4
- package/runtime/codex/bin/codex-skill-render.mjs +9 -7
- package/runtime/codex/bin/corpus_map.py +806 -0
- package/runtime/codex/bin/corpus_survey.py +304 -0
- package/runtime/codex/bin/dashboard-data.sh +11 -171
- package/runtime/codex/bin/github-auth.sh +121 -0
- package/runtime/codex/bin/graph-batch.sh +7 -0
- package/runtime/codex/bin/graph-op.sh +4 -0
- package/runtime/codex/bin/graph-projection.sh +54 -0
- package/runtime/codex/bin/graph-wal.sh +13 -0
- package/runtime/codex/bin/graph.sh +44 -0
- package/runtime/codex/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/codex/bin/handoff-lifecycle.sh +280 -0
- package/runtime/codex/bin/handoff-preview.sh +169 -0
- package/runtime/codex/bin/handoff-run.sh +42 -26
- package/runtime/codex/bin/ingest-graph.sh +6 -0
- package/runtime/codex/bin/ingest-item.sh +10 -0
- package/runtime/codex/bin/ingest.sh +59 -30
- package/runtime/codex/bin/invite.sh +6 -0
- package/runtime/codex/bin/issue.sh +10 -0
- package/runtime/codex/bin/knowledge.sh +10 -0
- package/runtime/codex/bin/lib/config.sh +20 -0
- package/runtime/codex/bin/lib/context.sh +46 -25
- package/runtime/codex/bin/lib/git-sync.sh +70 -6
- package/runtime/codex/bin/lib/greeting.sh +34 -5
- package/runtime/codex/bin/lib/handoff-meta.sh +97 -0
- package/runtime/codex/bin/lib/worktree-links.sh +6 -0
- package/runtime/codex/bin/node-run.sh +42 -0
- package/runtime/codex/bin/notification.sh +6 -0
- package/runtime/codex/bin/observe-context.sh +14 -0
- package/runtime/codex/bin/onboarding.sh +6 -0
- package/runtime/codex/bin/person.py +4 -0
- package/runtime/codex/bin/person.sh +43 -10
- package/runtime/codex/bin/pi-render-spec.mjs +140 -0
- package/runtime/codex/bin/post-update.sh +37 -0
- package/runtime/codex/bin/prime-render-spec.mjs +147 -0
- package/runtime/codex/bin/publish-artifact.sh +55 -2
- package/runtime/codex/bin/quest.sh +9 -0
- package/runtime/codex/bin/question.sh +8 -0
- package/runtime/codex/bin/research-ingest.sh +7 -0
- package/runtime/codex/bin/restore-owned-skills.sh +67 -0
- package/runtime/codex/bin/retrieval_eval.py +385 -0
- package/runtime/codex/bin/runtime-identity.sh +70 -0
- package/runtime/codex/bin/runtime-upgrade.sh +43 -0
- package/runtime/codex/bin/scroll.sh +9 -0
- package/runtime/codex/bin/search.sh +231 -195
- package/runtime/codex/bin/settings.sh +174 -5
- package/runtime/codex/bin/startup-check.sh +136 -0
- package/runtime/codex/bin/telemetry.sh +522 -247
- package/runtime/codex/bin/test-changes.sh +344 -0
- package/runtime/codex/bin/thread.sh +9 -0
- package/runtime/codex/bin/todo.sh +9 -0
- package/runtime/codex/bin/view-render.sh +126 -0
- package/runtime/codex/bin/worktree-create.sh +19 -5
- package/runtime/codex/egregore_runtime/__init__.py +228 -0
- package/runtime/codex/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/codex/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/codex/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/codex/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/codex/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/codex/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/codex/egregore_runtime/admin_gate.py +102 -0
- package/runtime/codex/egregore_runtime/artifacts.py +523 -0
- package/runtime/codex/egregore_runtime/contracts.py +499 -0
- package/runtime/codex/egregore_runtime/entitlements.py +85 -0
- package/runtime/codex/egregore_runtime/errors.py +10 -0
- package/runtime/codex/egregore_runtime/graph.py +356 -0
- package/runtime/codex/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/codex/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/codex/egregore_runtime/identity.py +734 -0
- package/runtime/codex/egregore_runtime/identity_cli.py +91 -0
- package/runtime/codex/egregore_runtime/ingest.py +575 -0
- package/runtime/codex/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/codex/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/codex/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/codex/egregore_runtime/invitations.py +116 -0
- package/runtime/codex/egregore_runtime/issue_cli.py +305 -0
- package/runtime/codex/egregore_runtime/issues.py +359 -0
- package/runtime/codex/egregore_runtime/knowledge.py +376 -0
- package/runtime/codex/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/codex/egregore_runtime/lifecycle.py +888 -0
- package/runtime/codex/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/codex/egregore_runtime/notification_cli.py +125 -0
- package/runtime/codex/egregore_runtime/notifications.py +230 -0
- package/runtime/codex/egregore_runtime/observe.py +342 -0
- package/runtime/codex/egregore_runtime/onboarding.py +290 -0
- package/runtime/codex/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/codex/egregore_runtime/policy.py +144 -0
- package/runtime/codex/egregore_runtime/profile.py +193 -0
- package/runtime/codex/egregore_runtime/quest_cli.py +216 -0
- package/runtime/codex/egregore_runtime/question_cli.py +180 -0
- package/runtime/codex/egregore_runtime/questions.py +304 -0
- package/runtime/codex/egregore_runtime/quests.py +419 -0
- package/runtime/codex/egregore_runtime/readiness.py +379 -0
- package/runtime/codex/egregore_runtime/research_ingest.py +256 -0
- package/runtime/codex/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/codex/egregore_runtime/runtime.py +464 -0
- package/runtime/codex/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/codex/egregore_runtime/scrolls.py +726 -0
- package/runtime/codex/egregore_runtime/status.py +412 -0
- package/runtime/codex/egregore_runtime/status_cli.py +174 -0
- package/runtime/codex/egregore_runtime/sync.py +218 -0
- package/runtime/codex/egregore_runtime/teamsync.py +139 -0
- package/runtime/codex/egregore_runtime/telemetry.py +640 -0
- package/runtime/codex/egregore_runtime/thread_cli.py +173 -0
- package/runtime/codex/egregore_runtime/threads.py +517 -0
- package/runtime/codex/egregore_runtime/todo_cli.py +142 -0
- package/runtime/codex/egregore_runtime/todos.py +244 -0
- package/runtime/codex/egregore_runtime/upgrade.py +770 -0
- package/runtime/codex/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/codex/egregore_runtime/writeback.py +391 -0
- package/runtime/codex/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/codex/manifest.json +98 -1
- package/runtime/pi/.codex/hooks/search-hint.js +21 -52
- package/runtime/pi/.codex/hooks.json +3 -3
- package/runtime/pi/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/pi/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/pi/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/pi/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/pi/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/pi/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/pi/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/pi/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/pi/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/pi/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/pi/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/pi/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/pi/.codex/skills/me/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/pi/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/pi/.codex/skills/note/SKILL.md +30 -25
- package/runtime/pi/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/pi/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/pi/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/pi/.codex/skills/save/SKILL.md +2 -2
- package/runtime/pi/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/test/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/pi/.codex/skills/view/SKILL.md +115 -111
- package/runtime/pi/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/pi/.codex/spec-manifest.json +9 -9
- package/runtime/pi/.pi/APPEND_SYSTEM.md +57 -48
- package/runtime/pi/.pi/extensions/egregore.ts +7 -0
- package/runtime/pi/.pi/spec-manifest.json +2 -2
- package/runtime/pi/AGENTS.md +62 -58
- package/runtime/pi/bin/activity-action.sh +92 -0
- package/runtime/pi/bin/activity-data.sh +12 -233
- package/runtime/pi/bin/agent.sh +84 -100
- package/runtime/pi/bin/artifact-register.sh +164 -0
- package/runtime/pi/bin/artifact-writeback.sh +53 -0
- package/runtime/pi/bin/artifacts.sh +288 -0
- package/runtime/pi/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/pi/bin/capture-run.sh +18 -2
- package/runtime/pi/bin/codex-render-spec.mjs +41 -16
- package/runtime/pi/bin/codex-session-start.sh +14 -4
- package/runtime/pi/bin/codex-skill-render.mjs +9 -7
- package/runtime/pi/bin/corpus_map.py +806 -0
- package/runtime/pi/bin/corpus_survey.py +304 -0
- package/runtime/pi/bin/dashboard-data.sh +11 -171
- package/runtime/pi/bin/github-auth.sh +121 -0
- package/runtime/pi/bin/graph-batch.sh +7 -0
- package/runtime/pi/bin/graph-op.sh +4 -0
- package/runtime/pi/bin/graph-projection.sh +54 -0
- package/runtime/pi/bin/graph-wal.sh +13 -0
- package/runtime/pi/bin/graph.sh +44 -0
- package/runtime/pi/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/pi/bin/handoff-lifecycle.sh +280 -0
- package/runtime/pi/bin/handoff-preview.sh +169 -0
- package/runtime/pi/bin/handoff-run.sh +42 -26
- package/runtime/pi/bin/ingest-graph.sh +6 -0
- package/runtime/pi/bin/ingest-item.sh +10 -0
- package/runtime/pi/bin/ingest.sh +59 -30
- package/runtime/pi/bin/invite.sh +6 -0
- package/runtime/pi/bin/issue.sh +10 -0
- package/runtime/pi/bin/knowledge.sh +10 -0
- package/runtime/pi/bin/lib/config.sh +20 -0
- package/runtime/pi/bin/lib/context.sh +46 -25
- package/runtime/pi/bin/lib/git-sync.sh +70 -6
- package/runtime/pi/bin/lib/greeting.sh +34 -5
- package/runtime/pi/bin/lib/handoff-meta.sh +97 -0
- package/runtime/pi/bin/lib/worktree-links.sh +6 -0
- package/runtime/pi/bin/node-run.sh +42 -0
- package/runtime/pi/bin/notification.sh +6 -0
- package/runtime/pi/bin/observe-context.sh +14 -0
- package/runtime/pi/bin/onboarding.sh +6 -0
- package/runtime/pi/bin/person.py +4 -0
- package/runtime/pi/bin/person.sh +43 -10
- package/runtime/pi/bin/pi-observe-context.mjs +93 -0
- package/runtime/pi/bin/pi-product-workflows.mjs +1 -1
- package/runtime/pi/bin/pi-render-spec.mjs +1 -1
- package/runtime/pi/bin/post-update.sh +37 -0
- package/runtime/pi/bin/prime-render-spec.mjs +147 -0
- package/runtime/pi/bin/publish-artifact.sh +55 -2
- package/runtime/pi/bin/quest.sh +9 -0
- package/runtime/pi/bin/question.sh +8 -0
- package/runtime/pi/bin/research-ingest.sh +7 -0
- package/runtime/pi/bin/restore-owned-skills.sh +67 -0
- package/runtime/pi/bin/retrieval_eval.py +385 -0
- package/runtime/pi/bin/runtime-identity.sh +70 -0
- package/runtime/pi/bin/runtime-upgrade.sh +43 -0
- package/runtime/pi/bin/scroll.sh +9 -0
- package/runtime/pi/bin/search.sh +231 -195
- package/runtime/pi/bin/settings.sh +174 -5
- package/runtime/pi/bin/startup-check.sh +136 -0
- package/runtime/pi/bin/telemetry.sh +522 -247
- package/runtime/pi/bin/test-changes.sh +344 -0
- package/runtime/pi/bin/thread.sh +9 -0
- package/runtime/pi/bin/todo.sh +9 -0
- package/runtime/pi/bin/view-render.sh +126 -0
- package/runtime/pi/bin/worktree-create.sh +19 -5
- package/runtime/pi/egregore_runtime/__init__.py +228 -0
- package/runtime/pi/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/pi/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/pi/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/pi/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/pi/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/pi/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/pi/egregore_runtime/admin_gate.py +102 -0
- package/runtime/pi/egregore_runtime/artifacts.py +523 -0
- package/runtime/pi/egregore_runtime/contracts.py +499 -0
- package/runtime/pi/egregore_runtime/entitlements.py +85 -0
- package/runtime/pi/egregore_runtime/errors.py +10 -0
- package/runtime/pi/egregore_runtime/graph.py +356 -0
- package/runtime/pi/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/pi/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/pi/egregore_runtime/identity.py +734 -0
- package/runtime/pi/egregore_runtime/identity_cli.py +91 -0
- package/runtime/pi/egregore_runtime/ingest.py +575 -0
- package/runtime/pi/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/pi/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/pi/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/pi/egregore_runtime/invitations.py +116 -0
- package/runtime/pi/egregore_runtime/issue_cli.py +305 -0
- package/runtime/pi/egregore_runtime/issues.py +359 -0
- package/runtime/pi/egregore_runtime/knowledge.py +376 -0
- package/runtime/pi/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/pi/egregore_runtime/lifecycle.py +888 -0
- package/runtime/pi/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/pi/egregore_runtime/notification_cli.py +125 -0
- package/runtime/pi/egregore_runtime/notifications.py +230 -0
- package/runtime/pi/egregore_runtime/observe.py +342 -0
- package/runtime/pi/egregore_runtime/onboarding.py +290 -0
- package/runtime/pi/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/pi/egregore_runtime/policy.py +144 -0
- package/runtime/pi/egregore_runtime/profile.py +193 -0
- package/runtime/pi/egregore_runtime/quest_cli.py +216 -0
- package/runtime/pi/egregore_runtime/question_cli.py +180 -0
- package/runtime/pi/egregore_runtime/questions.py +304 -0
- package/runtime/pi/egregore_runtime/quests.py +419 -0
- package/runtime/pi/egregore_runtime/readiness.py +379 -0
- package/runtime/pi/egregore_runtime/research_ingest.py +256 -0
- package/runtime/pi/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/pi/egregore_runtime/runtime.py +464 -0
- package/runtime/pi/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/pi/egregore_runtime/scrolls.py +726 -0
- package/runtime/pi/egregore_runtime/status.py +412 -0
- package/runtime/pi/egregore_runtime/status_cli.py +174 -0
- package/runtime/pi/egregore_runtime/sync.py +218 -0
- package/runtime/pi/egregore_runtime/teamsync.py +139 -0
- package/runtime/pi/egregore_runtime/telemetry.py +640 -0
- package/runtime/pi/egregore_runtime/thread_cli.py +173 -0
- package/runtime/pi/egregore_runtime/threads.py +517 -0
- package/runtime/pi/egregore_runtime/todo_cli.py +142 -0
- package/runtime/pi/egregore_runtime/todos.py +244 -0
- package/runtime/pi/egregore_runtime/upgrade.py +770 -0
- package/runtime/pi/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/pi/egregore_runtime/writeback.py +391 -0
- package/runtime/pi/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/pi/manifest.json +98 -1
- package/runtime/prime/.codex/hooks/search-hint.js +21 -52
- package/runtime/prime/.codex/hooks.json +3 -3
- package/runtime/prime/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/prime/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/prime/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/prime/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/prime/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/prime/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/prime/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/prime/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/prime/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/prime/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/prime/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/prime/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/prime/.codex/skills/me/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/prime/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/prime/.codex/skills/note/SKILL.md +30 -25
- package/runtime/prime/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/prime/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/prime/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/prime/.codex/skills/save/SKILL.md +2 -2
- package/runtime/prime/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/test/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/prime/.codex/skills/view/SKILL.md +115 -111
- package/runtime/prime/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/prime/.codex/spec-manifest.json +9 -9
- package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +57 -48
- package/runtime/prime/.prime/agent/extensions/egregore.ts +7 -0
- package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
- package/runtime/prime/AGENTS.md +62 -58
- package/runtime/prime/bin/activity-action.sh +92 -0
- package/runtime/prime/bin/activity-data.sh +12 -233
- package/runtime/prime/bin/agent.sh +84 -100
- package/runtime/prime/bin/artifact-register.sh +164 -0
- package/runtime/prime/bin/artifact-writeback.sh +53 -0
- package/runtime/prime/bin/artifacts.sh +288 -0
- package/runtime/prime/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/prime/bin/capture-run.sh +18 -2
- package/runtime/prime/bin/codex-render-spec.mjs +41 -16
- package/runtime/prime/bin/codex-session-start.sh +14 -4
- package/runtime/prime/bin/codex-skill-render.mjs +9 -7
- package/runtime/prime/bin/corpus_map.py +806 -0
- package/runtime/prime/bin/corpus_survey.py +304 -0
- package/runtime/prime/bin/dashboard-data.sh +11 -171
- package/runtime/prime/bin/github-auth.sh +121 -0
- package/runtime/prime/bin/graph-batch.sh +7 -0
- package/runtime/prime/bin/graph-op.sh +4 -0
- package/runtime/prime/bin/graph-projection.sh +54 -0
- package/runtime/prime/bin/graph-wal.sh +13 -0
- package/runtime/prime/bin/graph.sh +44 -0
- package/runtime/prime/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/prime/bin/handoff-lifecycle.sh +280 -0
- package/runtime/prime/bin/handoff-preview.sh +169 -0
- package/runtime/prime/bin/handoff-run.sh +42 -26
- package/runtime/prime/bin/ingest-graph.sh +6 -0
- package/runtime/prime/bin/ingest-item.sh +10 -0
- package/runtime/prime/bin/ingest.sh +59 -30
- package/runtime/prime/bin/invite.sh +6 -0
- package/runtime/prime/bin/issue.sh +10 -0
- package/runtime/prime/bin/knowledge.sh +10 -0
- package/runtime/prime/bin/lib/config.sh +20 -0
- package/runtime/prime/bin/lib/context.sh +46 -25
- package/runtime/prime/bin/lib/git-sync.sh +70 -6
- package/runtime/prime/bin/lib/greeting.sh +34 -5
- package/runtime/prime/bin/lib/handoff-meta.sh +97 -0
- package/runtime/prime/bin/lib/worktree-links.sh +6 -0
- package/runtime/prime/bin/node-run.sh +42 -0
- package/runtime/prime/bin/notification.sh +6 -0
- package/runtime/prime/bin/observe-context.sh +14 -0
- package/runtime/prime/bin/onboarding.sh +6 -0
- package/runtime/prime/bin/person.py +4 -0
- package/runtime/prime/bin/person.sh +43 -10
- package/runtime/prime/bin/pi-observe-context.mjs +93 -0
- package/runtime/prime/bin/pi-product-workflows.mjs +1 -1
- package/runtime/prime/bin/pi-render-spec.mjs +140 -0
- package/runtime/prime/bin/post-update.sh +37 -0
- package/runtime/prime/bin/prime-render-spec.mjs +1 -1
- package/runtime/prime/bin/publish-artifact.sh +55 -2
- package/runtime/prime/bin/quest.sh +9 -0
- package/runtime/prime/bin/question.sh +8 -0
- package/runtime/prime/bin/research-ingest.sh +7 -0
- package/runtime/prime/bin/restore-owned-skills.sh +67 -0
- package/runtime/prime/bin/retrieval_eval.py +385 -0
- package/runtime/prime/bin/runtime-identity.sh +70 -0
- package/runtime/prime/bin/runtime-upgrade.sh +43 -0
- package/runtime/prime/bin/scroll.sh +9 -0
- package/runtime/prime/bin/search.sh +231 -195
- package/runtime/prime/bin/settings.sh +174 -5
- package/runtime/prime/bin/startup-check.sh +136 -0
- package/runtime/prime/bin/telemetry.sh +522 -247
- package/runtime/prime/bin/test-changes.sh +344 -0
- package/runtime/prime/bin/thread.sh +9 -0
- package/runtime/prime/bin/todo.sh +9 -0
- package/runtime/prime/bin/view-render.sh +126 -0
- package/runtime/prime/bin/worktree-create.sh +19 -5
- package/runtime/prime/egregore_runtime/__init__.py +228 -0
- package/runtime/prime/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/prime/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/prime/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/prime/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/prime/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/prime/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/prime/egregore_runtime/admin_gate.py +102 -0
- package/runtime/prime/egregore_runtime/artifacts.py +523 -0
- package/runtime/prime/egregore_runtime/contracts.py +499 -0
- package/runtime/prime/egregore_runtime/entitlements.py +85 -0
- package/runtime/prime/egregore_runtime/errors.py +10 -0
- package/runtime/prime/egregore_runtime/graph.py +356 -0
- package/runtime/prime/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/prime/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/prime/egregore_runtime/identity.py +734 -0
- package/runtime/prime/egregore_runtime/identity_cli.py +91 -0
- package/runtime/prime/egregore_runtime/ingest.py +575 -0
- package/runtime/prime/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/prime/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/prime/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/prime/egregore_runtime/invitations.py +116 -0
- package/runtime/prime/egregore_runtime/issue_cli.py +305 -0
- package/runtime/prime/egregore_runtime/issues.py +359 -0
- package/runtime/prime/egregore_runtime/knowledge.py +376 -0
- package/runtime/prime/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/prime/egregore_runtime/lifecycle.py +888 -0
- package/runtime/prime/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/prime/egregore_runtime/notification_cli.py +125 -0
- package/runtime/prime/egregore_runtime/notifications.py +230 -0
- package/runtime/prime/egregore_runtime/observe.py +342 -0
- package/runtime/prime/egregore_runtime/onboarding.py +290 -0
- package/runtime/prime/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/prime/egregore_runtime/policy.py +144 -0
- package/runtime/prime/egregore_runtime/profile.py +193 -0
- package/runtime/prime/egregore_runtime/quest_cli.py +216 -0
- package/runtime/prime/egregore_runtime/question_cli.py +180 -0
- package/runtime/prime/egregore_runtime/questions.py +304 -0
- package/runtime/prime/egregore_runtime/quests.py +419 -0
- package/runtime/prime/egregore_runtime/readiness.py +379 -0
- package/runtime/prime/egregore_runtime/research_ingest.py +256 -0
- package/runtime/prime/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/prime/egregore_runtime/runtime.py +464 -0
- package/runtime/prime/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/prime/egregore_runtime/scrolls.py +726 -0
- package/runtime/prime/egregore_runtime/status.py +412 -0
- package/runtime/prime/egregore_runtime/status_cli.py +174 -0
- package/runtime/prime/egregore_runtime/sync.py +218 -0
- package/runtime/prime/egregore_runtime/teamsync.py +139 -0
- package/runtime/prime/egregore_runtime/telemetry.py +640 -0
- package/runtime/prime/egregore_runtime/thread_cli.py +173 -0
- package/runtime/prime/egregore_runtime/threads.py +517 -0
- package/runtime/prime/egregore_runtime/todo_cli.py +142 -0
- package/runtime/prime/egregore_runtime/todos.py +244 -0
- package/runtime/prime/egregore_runtime/upgrade.py +770 -0
- package/runtime/prime/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/prime/egregore_runtime/writeback.py +391 -0
- package/runtime/prime/egregore_runtime/writeback_cli.py +114 -0
- 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 "$@"
|