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,146 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Recurring handoff lifecycle runner.
|
|
5
|
+
#
|
|
6
|
+
# `scan` is read-only. `run` applies only lifecycle-v1, explicitly classified
|
|
7
|
+
# handoffs, then creates approval-required notification proposals for eligible
|
|
8
|
+
# seven-day nudges. It never dispatches. Legacy unclassified backfill is
|
|
9
|
+
# deliberately outside this job.
|
|
10
|
+
#
|
|
11
|
+
# Usage:
|
|
12
|
+
# bash bin/handoff-lifecycle-job.sh scan
|
|
13
|
+
# bash bin/handoff-lifecycle-job.sh run
|
|
14
|
+
|
|
15
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
16
|
+
USE_LEGACY_GRAPH=false
|
|
17
|
+
ARGS=()
|
|
18
|
+
for argument in "$@"; do
|
|
19
|
+
if [[ "$argument" == "--graph" ]]; then
|
|
20
|
+
USE_LEGACY_GRAPH=true
|
|
21
|
+
else
|
|
22
|
+
ARGS+=("$argument")
|
|
23
|
+
fi
|
|
24
|
+
done
|
|
25
|
+
ACTION="${ARGS[0]:-scan}"
|
|
26
|
+
case "$ACTION" in
|
|
27
|
+
scan|run) ;;
|
|
28
|
+
*) jq -n '{error:"action must be scan or run"}'; exit 2 ;;
|
|
29
|
+
esac
|
|
30
|
+
|
|
31
|
+
# Canonical Markdown and append-only lifecycle events are authoritative. The
|
|
32
|
+
# default job never queries graph state and never sends notifications. It may
|
|
33
|
+
# only apply typed, snapshot-bound attention expiry; age cannot complete work.
|
|
34
|
+
if [[ "$USE_LEGACY_GRAPH" != true ]]; then
|
|
35
|
+
PLAN="$(bash "$SCRIPT_DIR/bin/handoff-lifecycle.sh" scan --managed-only)"
|
|
36
|
+
if [[ "$ACTION" == "scan" ]]; then
|
|
37
|
+
printf '%s\n' "$PLAN" | jq '{
|
|
38
|
+
schema:"egregore-handoff-lifecycle-job/v2",
|
|
39
|
+
mode:"scan",
|
|
40
|
+
authority:"canonical_markdown",
|
|
41
|
+
graph_dependency:false,
|
|
42
|
+
applied:false,
|
|
43
|
+
plan:.
|
|
44
|
+
}'
|
|
45
|
+
exit 0
|
|
46
|
+
fi
|
|
47
|
+
SNAPSHOT="$(printf '%s\n' "$PLAN" | jq -r '.snapshot_id')"
|
|
48
|
+
TRANSITIONS="$(bash "$SCRIPT_DIR/bin/handoff-lifecycle.sh" apply \
|
|
49
|
+
--managed-only \
|
|
50
|
+
--snapshot "$SNAPSHOT" \
|
|
51
|
+
--confirm APPLY_SAFE_HANDOFF_LIFECYCLE)"
|
|
52
|
+
jq -n \
|
|
53
|
+
--argjson transitions "$TRANSITIONS" \
|
|
54
|
+
--argjson review "$(printf '%s\n' "$PLAN" | jq '.review_candidates')" \
|
|
55
|
+
'{
|
|
56
|
+
schema:"egregore-handoff-lifecycle-job/v2",
|
|
57
|
+
mode:"run",
|
|
58
|
+
authority:"canonical_markdown",
|
|
59
|
+
graph_dependency:false,
|
|
60
|
+
applied:true,
|
|
61
|
+
transitions:$transitions.transitions,
|
|
62
|
+
review_candidates:$review,
|
|
63
|
+
notifications:[]
|
|
64
|
+
}'
|
|
65
|
+
exit 0
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
MODE="$(jq -r '.mode // "connected"' "$SCRIPT_DIR/egregore.json" 2>/dev/null || echo connected)"
|
|
69
|
+
if [[ "$MODE" != "connected" ]]; then
|
|
70
|
+
jq -n '{
|
|
71
|
+
schema:"egregore-handoff-lifecycle-job/v1",
|
|
72
|
+
availability:"unavailable_in_this_configuration",
|
|
73
|
+
applied:false
|
|
74
|
+
}'
|
|
75
|
+
exit 0
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
PLAN="$(bash "$SCRIPT_DIR/bin/handoff-lifecycle.sh" scan --managed-only)"
|
|
79
|
+
if [[ "$ACTION" == "scan" ]]; then
|
|
80
|
+
printf '%s\n' "$PLAN" | jq '{
|
|
81
|
+
schema:"egregore-handoff-lifecycle-job/v1",
|
|
82
|
+
mode:"scan",
|
|
83
|
+
applied:false,
|
|
84
|
+
plan:.
|
|
85
|
+
}'
|
|
86
|
+
exit 0
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
SNAPSHOT="$(printf '%s\n' "$PLAN" | jq -r '.snapshot_id')"
|
|
90
|
+
TRANSITIONS="$(bash "$SCRIPT_DIR/bin/handoff-lifecycle.sh" apply \
|
|
91
|
+
--managed-only \
|
|
92
|
+
--snapshot "$SNAPSHOT" \
|
|
93
|
+
--confirm APPLY_SAFE_HANDOFF_LIFECYCLE)"
|
|
94
|
+
|
|
95
|
+
NUDGE_RESULTS='[]'
|
|
96
|
+
while IFS= read -r ITEM; do
|
|
97
|
+
[[ -n "$ITEM" ]] || continue
|
|
98
|
+
SID="$(printf '%s\n' "$ITEM" | jq -r '.id')"
|
|
99
|
+
CLAIM="$(bash "$SCRIPT_DIR/bin/graph-op.sh" claim-handoff-nudge "$SID")"
|
|
100
|
+
if ! printf '%s\n' "$CLAIM" | jq -e '.values[0][0] != null' >/dev/null 2>&1; then
|
|
101
|
+
continue
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
TOPIC="$(printf '%s\n' "$CLAIM" | jq -r '.values[0][1] // "handoff"')"
|
|
105
|
+
RECIPIENTS="$(printf '%s\n' "$CLAIM" | jq -c '.values[0][2] // []')"
|
|
106
|
+
PROPOSALS='[]'
|
|
107
|
+
FAILED=0
|
|
108
|
+
while IFS= read -r RECIPIENT; do
|
|
109
|
+
[[ -n "$RECIPIENT" ]] || continue
|
|
110
|
+
MESSAGE="Handoff waiting for you: ${TOPIC}. Open /activity to read, complete, or expire it."
|
|
111
|
+
NOTIFY_RESULT="$(bash "$SCRIPT_DIR/bin/notify.sh" plan send "$RECIPIENT" "$MESSAGE" 2>/dev/null || echo '{}')"
|
|
112
|
+
if printf '%s\n' "$NOTIFY_RESULT" | jq -e '.status == "approval_required"' >/dev/null 2>&1; then
|
|
113
|
+
PROPOSALS="$(printf '%s\n' "$PROPOSALS" | jq \
|
|
114
|
+
--argjson proposal "$NOTIFY_RESULT" '. + [$proposal]')"
|
|
115
|
+
else
|
|
116
|
+
FAILED=$((FAILED + 1))
|
|
117
|
+
fi
|
|
118
|
+
done < <(printf '%s\n' "$RECIPIENTS" | jq -r '.[]')
|
|
119
|
+
|
|
120
|
+
bash "$SCRIPT_DIR/bin/graph-op.sh" release-handoff-nudge "$SID" >/dev/null
|
|
121
|
+
if [[ "$(printf '%s\n' "$PROPOSALS" | jq 'length')" -gt 0 ]]; then
|
|
122
|
+
STATUS="approval_required"
|
|
123
|
+
else
|
|
124
|
+
STATUS="unavailable"
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
NUDGE_RESULTS="$(printf '%s\n' "$NUDGE_RESULTS" | jq \
|
|
128
|
+
--arg id "$SID" \
|
|
129
|
+
--arg topic "$TOPIC" \
|
|
130
|
+
--arg status "$STATUS" \
|
|
131
|
+
--argjson proposals "$PROPOSALS" \
|
|
132
|
+
--argjson failed "$FAILED" \
|
|
133
|
+
'. + [{id:$id,topic:$topic,status:$status,proposals:$proposals,failed:$failed}]')"
|
|
134
|
+
done < <(printf '%s\n' "$PLAN" | jq -c '.review_candidates[] | select(.action=="nudge")')
|
|
135
|
+
|
|
136
|
+
jq -n \
|
|
137
|
+
--argjson transitions "$TRANSITIONS" \
|
|
138
|
+
--argjson nudges "$NUDGE_RESULTS" \
|
|
139
|
+
'{
|
|
140
|
+
schema:"egregore-handoff-lifecycle-job/v1",
|
|
141
|
+
mode:"run",
|
|
142
|
+
applied:true,
|
|
143
|
+
managed_only:true,
|
|
144
|
+
transitions:$transitions.transitions,
|
|
145
|
+
nudges:$nudges
|
|
146
|
+
}'
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Deterministic handoff lifecycle reconciliation.
|
|
5
|
+
#
|
|
6
|
+
# `scan` is read-only and produces a versioned, hash-bound plan. `apply` can
|
|
7
|
+
# execute only high-confidence transitions from an unchanged plan:
|
|
8
|
+
# - read/claimed -> done when one recipient has a completed IMPLEMENTS session
|
|
9
|
+
# - open FYI -> expired after the configured age floor
|
|
10
|
+
# - untouched pending -> expired after the configured lifecycle TTL
|
|
11
|
+
#
|
|
12
|
+
# Age never marks a handoff done. Read/claimed action and feedback handoffs
|
|
13
|
+
# without implementation evidence stay open for human review.
|
|
14
|
+
|
|
15
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
16
|
+
USE_LEGACY_GRAPH=false
|
|
17
|
+
RUNTIME_ARGS=()
|
|
18
|
+
for argument in "$@"; do
|
|
19
|
+
if [ "$argument" = "--graph" ]; then
|
|
20
|
+
USE_LEGACY_GRAPH=true
|
|
21
|
+
else
|
|
22
|
+
RUNTIME_ARGS+=("$argument")
|
|
23
|
+
fi
|
|
24
|
+
done
|
|
25
|
+
|
|
26
|
+
# Canonical Markdown is authoritative in every mode. The preserved graph
|
|
27
|
+
# implementation is an explicit compatibility/projection adapter only.
|
|
28
|
+
if [ "$USE_LEGACY_GRAPH" != true ]; then
|
|
29
|
+
export PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}"
|
|
30
|
+
exec python3 -m egregore_runtime.lifecycle_cli "${RUNTIME_ARGS[@]}"
|
|
31
|
+
fi
|
|
32
|
+
set -- "${RUNTIME_ARGS[@]}"
|
|
33
|
+
|
|
34
|
+
GS="$SCRIPT_DIR/bin/graph.sh"
|
|
35
|
+
ACTION="${1:-scan}"
|
|
36
|
+
shift || true
|
|
37
|
+
|
|
38
|
+
usage() {
|
|
39
|
+
cat <<'EOF'
|
|
40
|
+
Usage:
|
|
41
|
+
handoff-lifecycle.sh scan [--days N] [--user HANDLE] [--managed-only]
|
|
42
|
+
handoff-lifecycle.sh action <read|claim|done|expire|reopen|review> ARTIFACT_ID
|
|
43
|
+
[--expected-revision REV]
|
|
44
|
+
handoff-lifecycle.sh apply --snapshot SHA256 --confirm APPLY_SAFE_HANDOFF_LIFECYCLE
|
|
45
|
+
[--days N] [--user HANDLE] [--managed-only]
|
|
46
|
+
|
|
47
|
+
scan is read-only. apply fails closed when canonical state changed after scan.
|
|
48
|
+
--managed-only limits the plan to lifecycle-v1 handoffs with explicit intent;
|
|
49
|
+
it is the safe boundary for unattended recurring execution.
|
|
50
|
+
Add --graph to use the preserved legacy graph projection explicitly.
|
|
51
|
+
EOF
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if [[ "$ACTION" == "--help" || "$ACTION" == "-h" ]]; then
|
|
55
|
+
usage
|
|
56
|
+
exit 0
|
|
57
|
+
fi
|
|
58
|
+
if [[ "$ACTION" != "scan" && "$ACTION" != "apply" ]]; then
|
|
59
|
+
echo '{"error":"action must be scan or apply"}'
|
|
60
|
+
exit 2
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
DAYS=14
|
|
64
|
+
USER_REF=""
|
|
65
|
+
EXPECTED_SNAPSHOT=""
|
|
66
|
+
CONFIRM=""
|
|
67
|
+
MANAGED_ONLY=false
|
|
68
|
+
while [[ $# -gt 0 ]]; do
|
|
69
|
+
case "$1" in
|
|
70
|
+
--days) DAYS="${2:?missing days}"; shift 2 ;;
|
|
71
|
+
--user) USER_REF="${2:?missing user}"; shift 2 ;;
|
|
72
|
+
--managed-only) MANAGED_ONLY=true; shift ;;
|
|
73
|
+
--snapshot) EXPECTED_SNAPSHOT="${2:?missing snapshot}"; shift 2 ;;
|
|
74
|
+
--confirm) CONFIRM="${2:?missing confirmation}"; shift 2 ;;
|
|
75
|
+
*) echo '{"error":"unknown option","option":"'"$1"'"}'; exit 2 ;;
|
|
76
|
+
esac
|
|
77
|
+
done
|
|
78
|
+
|
|
79
|
+
if ! [[ "$DAYS" =~ ^[0-9]+$ ]] || [[ "$DAYS" -lt 1 || "$DAYS" -gt 365 ]]; then
|
|
80
|
+
echo '{"error":"days must be between 1 and 365"}'
|
|
81
|
+
exit 2
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
MODE="$(jq -r '.mode // "connected"' "$SCRIPT_DIR/egregore.json" 2>/dev/null || echo connected)"
|
|
85
|
+
if [[ "$MODE" == "local" ]]; then
|
|
86
|
+
echo '{"schema":"egregore-handoff-lifecycle-plan/v1","availability":"unavailable_in_this_configuration","must_abstain":true}'
|
|
87
|
+
exit 0
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
build_plan() {
|
|
91
|
+
local raw rows snapshot
|
|
92
|
+
raw="$(bash "$GS" query "
|
|
93
|
+
MATCH (s:Session)-[:HANDED_TO]->(recipient:Person)
|
|
94
|
+
WHERE (\$user = ''
|
|
95
|
+
OR toLower(recipient.name) = toLower(\$user)
|
|
96
|
+
OR toLower(coalesce(recipient.github, '')) = toLower(\$user))
|
|
97
|
+
AND coalesce(s.handoffStatus, 'pending') IN ['pending','read','claimed']
|
|
98
|
+
AND (NOT \$managedOnly
|
|
99
|
+
OR (coalesce(s.handoffLifecycleVersion, 0) >= 1
|
|
100
|
+
AND coalesce(s.handoffIntent, 'unclassified') IN ['action','feedback','fyi']))
|
|
101
|
+
WITH DISTINCT s, recipient
|
|
102
|
+
OPTIONAL MATCH (s)-[:BY]->(author:Person)
|
|
103
|
+
WITH s, recipient, author,
|
|
104
|
+
size([(s)-[:HANDED_TO]->(:Person) | 1]) AS recipientCount
|
|
105
|
+
OPTIONAL MATCH (impl:Session)-[:IMPLEMENTS]->(s)
|
|
106
|
+
OPTIONAL MATCH (impl)-[:BY]->(implAuthor:Person)
|
|
107
|
+
WITH s, recipient, author, recipientCount,
|
|
108
|
+
head([candidate IN collect(DISTINCT
|
|
109
|
+
CASE
|
|
110
|
+
WHEN implAuthor = recipient
|
|
111
|
+
AND (impl.wrappedAt IS NOT NULL
|
|
112
|
+
OR impl.status IN ['completed','handed_off','wrapped'])
|
|
113
|
+
THEN {id: impl.id, status: impl.status}
|
|
114
|
+
ELSE null
|
|
115
|
+
END) WHERE candidate IS NOT NULL]) AS implementation
|
|
116
|
+
WITH s, recipient, author, recipientCount, implementation,
|
|
117
|
+
CASE WHEN s.date IS NULL THEN null
|
|
118
|
+
ELSE duration.inDays(date(s.date), date()).days END AS ageDays
|
|
119
|
+
RETURN s.id AS id,
|
|
120
|
+
s.topic AS topic,
|
|
121
|
+
coalesce(author.name, s.author, 'unknown') AS author,
|
|
122
|
+
recipient.name AS recipient,
|
|
123
|
+
toString(s.date) AS date,
|
|
124
|
+
coalesce(s.handoffStatus, 'pending') AS status,
|
|
125
|
+
coalesce(s.handoffIntent, 'unclassified') AS intent,
|
|
126
|
+
ageDays,
|
|
127
|
+
recipientCount,
|
|
128
|
+
implementation.id AS implementationId,
|
|
129
|
+
implementation.status AS implementationStatus,
|
|
130
|
+
s.handoffLifecycleVersion AS lifecycleVersion,
|
|
131
|
+
toString(s.handoffNudgedAt) AS nudgedAt
|
|
132
|
+
ORDER BY s.date DESC, recipient.name
|
|
133
|
+
" "$(jq -n --arg user "$USER_REF" --argjson managedOnly "$MANAGED_ONLY" \
|
|
134
|
+
'{user:$user,managedOnly:$managedOnly}')")"
|
|
135
|
+
|
|
136
|
+
if ! rows="$(printf '%s' "$raw" | jq -c '
|
|
137
|
+
(.values // []) | map({
|
|
138
|
+
id:.[0], topic:.[1], author:.[2], recipient:.[3], date:.[4],
|
|
139
|
+
status:.[5], intent:.[6], age_days:.[7], recipient_count:.[8],
|
|
140
|
+
implementation_id:.[9], implementation_status:.[10],
|
|
141
|
+
lifecycle_version:.[11], nudged_at:.[12]
|
|
142
|
+
}) | sort_by(.id, .recipient)
|
|
143
|
+
' 2>/dev/null)"; then
|
|
144
|
+
echo '{"error":"invalid graph response"}'
|
|
145
|
+
return 1
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
snapshot="$(printf '%s' "$rows" | openssl dgst -sha256 | awk '{print $NF}')"
|
|
149
|
+
jq -n \
|
|
150
|
+
--arg snapshot "$snapshot" \
|
|
151
|
+
--arg user "$USER_REF" \
|
|
152
|
+
--argjson days "$DAYS" \
|
|
153
|
+
--argjson managed_only "$MANAGED_ONLY" \
|
|
154
|
+
--argjson rows "$rows" '
|
|
155
|
+
def recommendation:
|
|
156
|
+
if ((.status == "read" or .status == "claimed")
|
|
157
|
+
and .recipient_count == 1
|
|
158
|
+
and .implementation_id != null)
|
|
159
|
+
then {action:"close", reason:"single_recipient_implemented", confidence:"high"}
|
|
160
|
+
elif (.intent == "fyi" and (.age_days // 0) >= $days)
|
|
161
|
+
then {action:"expire", reason:"fyi_age_floor", confidence:"high"}
|
|
162
|
+
elif (.status == "pending" and (.age_days // 0) >= $days)
|
|
163
|
+
then {action:"expire", reason:"pending_ttl_elapsed", confidence:"policy"}
|
|
164
|
+
elif ((.age_days // 0) >= $days)
|
|
165
|
+
then {action:"review", reason:
|
|
166
|
+
(if .intent == "unclassified"
|
|
167
|
+
then "stale_unclassified"
|
|
168
|
+
else "stale_requires_human" end),
|
|
169
|
+
confidence:"none"}
|
|
170
|
+
elif ((.age_days // 0) >= 7 and .recipient_count > 1)
|
|
171
|
+
then {action:"review", reason:"multi_recipient_requires_human", confidence:"none"}
|
|
172
|
+
elif ((.age_days // 0) >= 7 and .nudged_at == null)
|
|
173
|
+
then {action:"nudge", reason:"open_seven_days", confidence:"none"}
|
|
174
|
+
elif ((.age_days // 0) >= 7)
|
|
175
|
+
then {action:"keep", reason:"awaiting_after_nudge", confidence:"none"}
|
|
176
|
+
else {action:"keep", reason:"recent_open", confidence:"none"}
|
|
177
|
+
end;
|
|
178
|
+
($rows | map(. + recommendation)) as $items
|
|
179
|
+
| {
|
|
180
|
+
schema:"egregore-handoff-lifecycle-plan/v1",
|
|
181
|
+
snapshot_id:$snapshot,
|
|
182
|
+
subject:(if $user == "" then "all" else $user end),
|
|
183
|
+
threshold_days:$days,
|
|
184
|
+
managed_only:$managed_only,
|
|
185
|
+
state_scope:"session",
|
|
186
|
+
state_scope_warning:"Status is stored on Session, so automatic close requires exactly one recipient.",
|
|
187
|
+
counts:{
|
|
188
|
+
open_rows:($items|length),
|
|
189
|
+
unique_handoffs:([$items[].id]|unique|length),
|
|
190
|
+
duplicate_recipient_rows:(($items|length)-([$items[].id]|unique|length)),
|
|
191
|
+
close:([$items[]|select(.action=="close")]|unique_by(.id)|length),
|
|
192
|
+
expire:([$items[]|select(.action=="expire")]|unique_by(.id)|length),
|
|
193
|
+
review:([$items[]|select(.action=="review")]|unique_by(.id)|length),
|
|
194
|
+
nudge:([$items[]|select(.action=="nudge")]|unique_by(.id)|length),
|
|
195
|
+
keep:([$items[]|select(.action=="keep")]|unique_by(.id)|length),
|
|
196
|
+
unclassified:([$items[]|select(.intent=="unclassified")]|unique_by(.id)|length)
|
|
197
|
+
},
|
|
198
|
+
safe_candidates:([$items[]|select(.action=="close" or .action=="expire")]|unique_by(.id)),
|
|
199
|
+
review_candidates:([$items[]|select(.action=="review" or .action=="nudge")]|unique_by(.id)),
|
|
200
|
+
items:$items,
|
|
201
|
+
apply_contract:{
|
|
202
|
+
requires_snapshot:true,
|
|
203
|
+
confirmation:"APPLY_SAFE_HANDOFF_LIFECYCLE",
|
|
204
|
+
age_alone_never_marks_done:true,
|
|
205
|
+
pending_ttl_may_expire_unacknowledged_work:true
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
'
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
PLAN="$(build_plan)"
|
|
212
|
+
if [[ "$ACTION" == "scan" ]]; then
|
|
213
|
+
printf '%s\n' "$PLAN"
|
|
214
|
+
exit 0
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
if [[ -z "$EXPECTED_SNAPSHOT" || "$CONFIRM" != "APPLY_SAFE_HANDOFF_LIFECYCLE" ]]; then
|
|
218
|
+
printf '%s\n' "$PLAN" | jq '. + {
|
|
219
|
+
applied:false,
|
|
220
|
+
error:"apply requires the current --snapshot and --confirm APPLY_SAFE_HANDOFF_LIFECYCLE"
|
|
221
|
+
}'
|
|
222
|
+
exit 3
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
CURRENT_SNAPSHOT="$(printf '%s' "$PLAN" | jq -r '.snapshot_id')"
|
|
226
|
+
if [[ "$CURRENT_SNAPSHOT" != "$EXPECTED_SNAPSHOT" ]]; then
|
|
227
|
+
printf '%s\n' "$PLAN" | jq --arg expected "$EXPECTED_SNAPSHOT" '. + {
|
|
228
|
+
applied:false,
|
|
229
|
+
error:"snapshot_changed",
|
|
230
|
+
expected_snapshot:$expected
|
|
231
|
+
}'
|
|
232
|
+
exit 4
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
CLOSE_IDS="$(printf '%s' "$PLAN" | jq -c '[.safe_candidates[]|select(.action=="close")|.id]|unique')"
|
|
236
|
+
EXPIRE_IDS="$(printf '%s' "$PLAN" | jq -c '[.safe_candidates[]|select(.action=="expire")|.id]|unique')"
|
|
237
|
+
|
|
238
|
+
if [[ "$CLOSE_IDS" == "[]" && "$EXPIRE_IDS" == "[]" ]]; then
|
|
239
|
+
printf '%s\n' "$PLAN" | jq '. + {applied:true,transitions:{closed:0,expired:0}}'
|
|
240
|
+
exit 0
|
|
241
|
+
fi
|
|
242
|
+
|
|
243
|
+
RESULT="$(bash "$GS" query "
|
|
244
|
+
UNWIND \$closeIds AS closeId
|
|
245
|
+
MATCH (closed:Session {id: closeId})
|
|
246
|
+
WHERE coalesce(closed.handoffStatus, 'pending') IN ['read','claimed']
|
|
247
|
+
SET closed.handoffStatus = 'done',
|
|
248
|
+
closed.handoffDoneAt = coalesce(closed.handoffDoneAt, datetime()),
|
|
249
|
+
closed.handoffUpdatedAt = datetime(),
|
|
250
|
+
closed.handoffLifecycleReason = 'single_recipient_implemented',
|
|
251
|
+
closed.handoffLifecycleVersion = 1
|
|
252
|
+
WITH count(closed) AS closedCount
|
|
253
|
+
CALL {
|
|
254
|
+
WITH \$expireIds AS expireIds
|
|
255
|
+
UNWIND expireIds AS expireId
|
|
256
|
+
MATCH (expired:Session {id: expireId})
|
|
257
|
+
WHERE coalesce(expired.handoffStatus, 'pending') IN ['pending','read','claimed']
|
|
258
|
+
AND (expired.handoffIntent = 'fyi'
|
|
259
|
+
OR coalesce(expired.handoffStatus, 'pending') = 'pending')
|
|
260
|
+
SET expired.handoffStatus = 'expired',
|
|
261
|
+
expired.handoffExpiredAt = coalesce(expired.handoffExpiredAt, datetime()),
|
|
262
|
+
expired.handoffUpdatedAt = datetime(),
|
|
263
|
+
expired.handoffLifecycleReason =
|
|
264
|
+
CASE WHEN expired.handoffIntent = 'fyi'
|
|
265
|
+
THEN 'fyi_age_floor'
|
|
266
|
+
ELSE 'pending_ttl_elapsed' END,
|
|
267
|
+
expired.handoffLifecycleVersion = 1
|
|
268
|
+
RETURN count(expired) AS expiredCount
|
|
269
|
+
}
|
|
270
|
+
RETURN closedCount, expiredCount
|
|
271
|
+
" "$(jq -n --argjson closeIds "$CLOSE_IDS" --argjson expireIds "$EXPIRE_IDS" \
|
|
272
|
+
'{closeIds:$closeIds,expireIds:$expireIds}')")"
|
|
273
|
+
|
|
274
|
+
printf '%s\n' "$PLAN" | jq --argjson result "$RESULT" '. + {
|
|
275
|
+
applied:true,
|
|
276
|
+
transitions:{
|
|
277
|
+
closed:($result.values[0][0] // 0),
|
|
278
|
+
expired:($result.values[0][1] // 0)
|
|
279
|
+
}
|
|
280
|
+
}'
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# handoff-pr-backfill.sh — fill in PR numbers in a handoff file's ## Repo State
|
|
3
|
+
# table, then re-commit + push the memory repo. Detached fire-and-forget from
|
|
4
|
+
# /handoff's hot path so user-visible latency doesn't include N × `gh pr list`.
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# handoff-pr-backfill.sh <abs-handoff-file> <topic>
|
|
8
|
+
#
|
|
9
|
+
# Reads the ## Repo State table, looks up each (repo, branch)'s open PR via
|
|
10
|
+
# `gh pr list`, rewrites the PR column from `—` to `#N`, commits the memory
|
|
11
|
+
# repo, pushes to main. Silent on all failures — this is cosmetic.
|
|
12
|
+
#
|
|
13
|
+
# Detached usage (the skill / orchestrator call it this way):
|
|
14
|
+
# ( bash bin/handoff-pr-backfill.sh "$ABS_FILE" "$TOPIC" >/dev/null 2>&1 & ) >/dev/null 2>&1
|
|
15
|
+
|
|
16
|
+
set -uo pipefail
|
|
17
|
+
|
|
18
|
+
ABS_FILE="${1:-}"
|
|
19
|
+
TOPIC="${2:-handoff}"
|
|
20
|
+
|
|
21
|
+
[ -n "$ABS_FILE" ] && [ -f "$ABS_FILE" ] || exit 0
|
|
22
|
+
|
|
23
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
24
|
+
CONFIG="$SCRIPT_DIR/egregore.json"
|
|
25
|
+
|
|
26
|
+
command -v gh >/dev/null 2>&1 || exit 0
|
|
27
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
28
|
+
|
|
29
|
+
GITHUB_ORG=$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)
|
|
30
|
+
[ -n "$GITHUB_ORG" ] || exit 0
|
|
31
|
+
|
|
32
|
+
# Extract the ## Repo State table rows: format is `| repo | branch | — | base |`.
|
|
33
|
+
# Skip header and separator lines (first two rows of the markdown table).
|
|
34
|
+
ROWS=$(awk '
|
|
35
|
+
/^## Repo State/ { in_section=1; next }
|
|
36
|
+
in_section && /^## / { in_section=0 }
|
|
37
|
+
in_section && /^\|/ && !/^\|[-\s]/ && !/^\| Repo/ { print }
|
|
38
|
+
' "$ABS_FILE" 2>/dev/null)
|
|
39
|
+
|
|
40
|
+
[ -n "$ROWS" ] || exit 0
|
|
41
|
+
|
|
42
|
+
UPDATED=0
|
|
43
|
+
while IFS= read -r row; do
|
|
44
|
+
[ -z "$row" ] && continue
|
|
45
|
+
# Parse: | repo | branch | pr | base |
|
|
46
|
+
repo=$(echo "$row" | awk -F'|' '{gsub(/^ +| +$/,"",$2); print $2}')
|
|
47
|
+
branch=$(echo "$row" | awk -F'|' '{gsub(/^ +| +$/,"",$3); print $3}')
|
|
48
|
+
pr_col=$(echo "$row" | awk -F'|' '{gsub(/^ +| +$/,"",$4); print $4}')
|
|
49
|
+
|
|
50
|
+
# Only backfill `—` cells (leave `#N` alone)
|
|
51
|
+
[ "$pr_col" = "—" ] || continue
|
|
52
|
+
[ -n "$repo" ] && [ -n "$branch" ] || continue
|
|
53
|
+
|
|
54
|
+
pr_num=$(gh pr list --repo "$GITHUB_ORG/$repo" --head "$branch" --json number --jq '.[0].number // empty' 2>/dev/null || echo "")
|
|
55
|
+
[ -n "$pr_num" ] || continue
|
|
56
|
+
|
|
57
|
+
# Rewrite the `—` in this branch's row to `#N`. Match by branch name to
|
|
58
|
+
# avoid cross-repo collisions when repos share branch names.
|
|
59
|
+
awk -v branch="$branch" -v pr="#$pr_num" '
|
|
60
|
+
BEGIN { in_section=0 }
|
|
61
|
+
/^## Repo State/ { in_section=1; print; next }
|
|
62
|
+
in_section && /^## / { in_section=0 }
|
|
63
|
+
in_section && $0 ~ "\\| " branch " " && /—/ {
|
|
64
|
+
sub(/—/, pr)
|
|
65
|
+
print; next
|
|
66
|
+
}
|
|
67
|
+
{ print }
|
|
68
|
+
' "$ABS_FILE" > "$ABS_FILE.tmp" && mv "$ABS_FILE.tmp" "$ABS_FILE"
|
|
69
|
+
UPDATED=1
|
|
70
|
+
done <<< "$ROWS"
|
|
71
|
+
|
|
72
|
+
[ "$UPDATED" = "1" ] || exit 0
|
|
73
|
+
|
|
74
|
+
# Re-commit + push the memory repo with the backfilled PR numbers.
|
|
75
|
+
MEMORY_DIR="$SCRIPT_DIR/memory"
|
|
76
|
+
if [ -d "$MEMORY_DIR" ]; then
|
|
77
|
+
(
|
|
78
|
+
cd "$MEMORY_DIR" || exit 0
|
|
79
|
+
git add -A >/dev/null 2>&1
|
|
80
|
+
git commit -m "chore(handoff): backfill PR numbers for $TOPIC" >/dev/null 2>&1 || exit 0
|
|
81
|
+
git pull --rebase origin main --quiet >/dev/null 2>&1
|
|
82
|
+
git push origin main --quiet >/dev/null 2>&1
|
|
83
|
+
) || true
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
exit 0
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Private preview/approval bridge for internal handoffs. Canonical Markdown is
|
|
5
|
+
# supplied once during preview; approval references an opaque, single-use token.
|
|
6
|
+
|
|
7
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
8
|
+
STORE_ROOT="${EGREGORE_HANDOFF_PREVIEW_DIR:-${TMPDIR:-/tmp}/egregore-handoff-previews}"
|
|
9
|
+
MAX_AGE_SECONDS="${EGREGORE_HANDOFF_PREVIEW_MAX_AGE:-21600}"
|
|
10
|
+
|
|
11
|
+
usage() {
|
|
12
|
+
cat >&2 <<'EOF'
|
|
13
|
+
usage:
|
|
14
|
+
bash bin/handoff-preview.sh preview --author HANDLE --recipient HANDLE \
|
|
15
|
+
--topic TOPIC --intent action|feedback|fyi \
|
|
16
|
+
--content-mode supplied|generated < handoff.md
|
|
17
|
+
bash bin/handoff-preview.sh approve TOKEN
|
|
18
|
+
EOF
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
sha256_file() {
|
|
22
|
+
if command -v openssl >/dev/null 2>&1; then
|
|
23
|
+
openssl dgst -sha256 "$1" | awk '{print $NF}'
|
|
24
|
+
elif command -v shasum >/dev/null 2>&1; then
|
|
25
|
+
shasum -a 256 "$1" | awk '{print $1}'
|
|
26
|
+
else
|
|
27
|
+
sha256sum "$1" | awk '{print $1}'
|
|
28
|
+
fi
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
new_token() {
|
|
32
|
+
if command -v openssl >/dev/null 2>&1; then
|
|
33
|
+
openssl rand -hex 16
|
|
34
|
+
else
|
|
35
|
+
printf '%s' "$(date +%s)-$$-${RANDOM:-0}" | sha256sum | awk '{print substr($1,1,32)}'
|
|
36
|
+
fi
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
validate_token() {
|
|
40
|
+
[[ "$1" =~ ^[a-f0-9]{32}$ ]] || {
|
|
41
|
+
echo "handoff preview token is invalid" >&2
|
|
42
|
+
exit 2
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
preview() {
|
|
47
|
+
local author="" recipient="" topic="" intent="" content_mode=""
|
|
48
|
+
while [ $# -gt 0 ]; do
|
|
49
|
+
case "$1" in
|
|
50
|
+
--author) author="${2:-}"; shift 2 ;;
|
|
51
|
+
--recipient) recipient="${2:-}"; shift 2 ;;
|
|
52
|
+
--topic) topic="${2:-}"; shift 2 ;;
|
|
53
|
+
--intent) intent="${2:-}"; shift 2 ;;
|
|
54
|
+
--content-mode) content_mode="${2:-}"; shift 2 ;;
|
|
55
|
+
*) echo "unknown preview option: $1" >&2; usage; exit 2 ;;
|
|
56
|
+
esac
|
|
57
|
+
done
|
|
58
|
+
|
|
59
|
+
[ -n "$author" ] || { echo "handoff preview requires --author" >&2; exit 2; }
|
|
60
|
+
[ -n "$topic" ] || { echo "handoff preview requires --topic" >&2; exit 2; }
|
|
61
|
+
case "$intent" in action|feedback|fyi) ;; *) echo "invalid handoff intent" >&2; exit 2 ;; esac
|
|
62
|
+
case "$content_mode" in supplied|generated) ;; *) echo "invalid handoff content mode" >&2; exit 2 ;; esac
|
|
63
|
+
|
|
64
|
+
umask 077
|
|
65
|
+
mkdir -p "$STORE_ROOT"
|
|
66
|
+
chmod 700 "$STORE_ROOT"
|
|
67
|
+
|
|
68
|
+
local token content_file metadata_file digest
|
|
69
|
+
token="$(new_token)"
|
|
70
|
+
validate_token "$token"
|
|
71
|
+
content_file="$STORE_ROOT/$token.md"
|
|
72
|
+
metadata_file="$STORE_ROOT/$token.json"
|
|
73
|
+
cat > "$content_file"
|
|
74
|
+
[ -s "$content_file" ] || {
|
|
75
|
+
rm -f "$content_file"
|
|
76
|
+
echo "handoff preview input is empty" >&2
|
|
77
|
+
exit 2
|
|
78
|
+
}
|
|
79
|
+
digest="$(sha256_file "$content_file")"
|
|
80
|
+
jq -n \
|
|
81
|
+
--arg author "$author" \
|
|
82
|
+
--arg recipient "$recipient" \
|
|
83
|
+
--arg topic "$topic" \
|
|
84
|
+
--arg intent "$intent" \
|
|
85
|
+
--arg contentMode "$content_mode" \
|
|
86
|
+
--arg digest "$digest" \
|
|
87
|
+
--argjson createdAt "$(date +%s)" \
|
|
88
|
+
'{author:$author,recipient:$recipient,topic:$topic,intent:$intent,contentMode:$contentMode,digest:$digest,createdAt:$createdAt}' \
|
|
89
|
+
> "$metadata_file"
|
|
90
|
+
|
|
91
|
+
if ! bash "$ROOT/bin/node-run.sh" \
|
|
92
|
+
"$ROOT/packages/egregore-artifacts/bin/cli.js" handoff "$content_file" \
|
|
93
|
+
--verify-fidelity; then
|
|
94
|
+
rm -f "$content_file" "$metadata_file"
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
printf 'HANDOFF_PREVIEW_TOKEN=%s\n' "$token"
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
approve() {
|
|
102
|
+
[ $# -eq 1 ] || { usage; exit 2; }
|
|
103
|
+
local token="$1"
|
|
104
|
+
validate_token "$token"
|
|
105
|
+
|
|
106
|
+
local content_file="$STORE_ROOT/$token.md"
|
|
107
|
+
local metadata_file="$STORE_ROOT/$token.json"
|
|
108
|
+
local lock_dir="$STORE_ROOT/$token.approving"
|
|
109
|
+
[ -f "$content_file" ] && [ -f "$metadata_file" ] || {
|
|
110
|
+
echo "handoff preview is missing, expired, or already used" >&2
|
|
111
|
+
exit 1
|
|
112
|
+
}
|
|
113
|
+
if ! mkdir "$lock_dir" 2>/dev/null; then
|
|
114
|
+
echo "handoff preview approval is already running" >&2
|
|
115
|
+
exit 1
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
local expected_digest actual_digest created_at now age
|
|
119
|
+
expected_digest="$(jq -er '.digest' "$metadata_file")"
|
|
120
|
+
actual_digest="$(sha256_file "$content_file")"
|
|
121
|
+
if [ "$expected_digest" != "$actual_digest" ]; then
|
|
122
|
+
rmdir "$lock_dir" 2>/dev/null || true
|
|
123
|
+
echo "handoff preview content changed after approval was requested" >&2
|
|
124
|
+
exit 1
|
|
125
|
+
fi
|
|
126
|
+
created_at="$(jq -er '.createdAt' "$metadata_file")"
|
|
127
|
+
now="$(date +%s)"
|
|
128
|
+
age=$((now - created_at))
|
|
129
|
+
if [ "$age" -lt 0 ] || [ "$age" -gt "$MAX_AGE_SECONDS" ]; then
|
|
130
|
+
rmdir "$lock_dir" 2>/dev/null || true
|
|
131
|
+
echo "handoff preview expired; render a fresh preview" >&2
|
|
132
|
+
exit 1
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
local author recipient topic intent content_mode
|
|
136
|
+
author="$(jq -er '.author' "$metadata_file")"
|
|
137
|
+
recipient="$(jq -er '.recipient' "$metadata_file")"
|
|
138
|
+
topic="$(jq -er '.topic' "$metadata_file")"
|
|
139
|
+
intent="$(jq -er '.intent' "$metadata_file")"
|
|
140
|
+
content_mode="$(jq -er '.contentMode' "$metadata_file")"
|
|
141
|
+
|
|
142
|
+
local result_tmp
|
|
143
|
+
result_tmp="$(mktemp -d -t egregore-handoff-result-XXXXXX)"
|
|
144
|
+
local args=(
|
|
145
|
+
capture --mode addressed --author "$author" --topic "$topic"
|
|
146
|
+
--intent "$intent" --content-mode "$content_mode"
|
|
147
|
+
)
|
|
148
|
+
[ -z "$recipient" ] || args+=(--recipient "$recipient")
|
|
149
|
+
|
|
150
|
+
if ! TMPDIR="$result_tmp" bash "$ROOT/bin/artifact-writeback.sh" "${args[@]}" \
|
|
151
|
+
< "$content_file"; then
|
|
152
|
+
rmdir "$lock_dir" 2>/dev/null || true
|
|
153
|
+
exit 1
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
# Consume the approved token before rendering. A renderer failure must not
|
|
157
|
+
# make a successful canonical write eligible for accidental replay.
|
|
158
|
+
mv "$content_file" "$result_tmp/approved-handoff.md"
|
|
159
|
+
mv "$metadata_file" "$result_tmp/approved-handoff.json"
|
|
160
|
+
rmdir "$lock_dir" 2>/dev/null || true
|
|
161
|
+
bash "$ROOT/bin/render-card.sh" \
|
|
162
|
+
--result "$result_tmp/capture-run-result.json"
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
case "${1:-}" in
|
|
166
|
+
preview) shift; preview "$@" ;;
|
|
167
|
+
approve) shift; approve "$@" ;;
|
|
168
|
+
*) usage; exit 2 ;;
|
|
169
|
+
esac
|