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,54 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Explicit management boundary for the optional derived graph projection.
|
|
3
|
+
# Usage: bash bin/graph-projection.sh {status|verify|rebuild} [--enable]
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
7
|
+
COMMAND="${1:-status}"
|
|
8
|
+
shift || true
|
|
9
|
+
ENABLED=false
|
|
10
|
+
|
|
11
|
+
while [ "$#" -gt 0 ]; do
|
|
12
|
+
case "$1" in
|
|
13
|
+
--enable) ENABLED=true ;;
|
|
14
|
+
--help|-h)
|
|
15
|
+
echo "Usage: graph-projection.sh {status|verify|rebuild} [--enable]"
|
|
16
|
+
exit 0
|
|
17
|
+
;;
|
|
18
|
+
*) echo "Unknown option: $1" >&2; exit 2 ;;
|
|
19
|
+
esac
|
|
20
|
+
shift
|
|
21
|
+
done
|
|
22
|
+
|
|
23
|
+
case "$COMMAND" in
|
|
24
|
+
status|verify|rebuild) ;;
|
|
25
|
+
--help|-h)
|
|
26
|
+
echo "Usage: graph-projection.sh {status|verify|rebuild} [--enable]"
|
|
27
|
+
exit 0
|
|
28
|
+
;;
|
|
29
|
+
*) echo "Usage: graph-projection.sh {status|verify|rebuild} [--enable]" >&2; exit 2 ;;
|
|
30
|
+
esac
|
|
31
|
+
|
|
32
|
+
RUNTIME_PYTHONPATH="$ROOT"
|
|
33
|
+
if [ -n "${PYTHONPATH:-}" ]; then
|
|
34
|
+
RUNTIME_PYTHONPATH="$RUNTIME_PYTHONPATH:$PYTHONPATH"
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
GRAPH_OVERRIDE=0
|
|
38
|
+
[ "$ENABLED" = "true" ] && GRAPH_OVERRIDE=1
|
|
39
|
+
ROOT="$ROOT" ENABLED="$ENABLED" COMMAND="$COMMAND" \
|
|
40
|
+
EGREGORE_GRAPH_PROJECTION="$GRAPH_OVERRIDE" PYTHONPATH="$RUNTIME_PYTHONPATH" \
|
|
41
|
+
python3 - <<'PY'
|
|
42
|
+
import json
|
|
43
|
+
import os
|
|
44
|
+
from pathlib import Path
|
|
45
|
+
|
|
46
|
+
from egregore_runtime.graph import graph_projection
|
|
47
|
+
|
|
48
|
+
projection = graph_projection(
|
|
49
|
+
Path(os.environ["ROOT"]), enabled=os.environ["ENABLED"] == "true"
|
|
50
|
+
)
|
|
51
|
+
command = os.environ["COMMAND"]
|
|
52
|
+
health = projection.rebuild() if command == "rebuild" else projection.verify()
|
|
53
|
+
print(json.dumps(health.to_dict(), sort_keys=True))
|
|
54
|
+
PY
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
set -euo pipefail
|
|
13
13
|
|
|
14
14
|
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
15
|
+
CONFIG="$SCRIPT_DIR/egregore.json"
|
|
15
16
|
|
|
16
17
|
if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
|
|
17
18
|
echo "Usage: graph-wal.sh <command>"
|
|
@@ -25,6 +26,18 @@ if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
|
|
|
25
26
|
exit 0
|
|
26
27
|
fi
|
|
27
28
|
|
|
29
|
+
# Do not accumulate a shadow write backlog while the optional projection is
|
|
30
|
+
# quarantined. Canonical Markdown/Git remains the complete source of truth.
|
|
31
|
+
# shellcheck source=bin/lib/config.sh
|
|
32
|
+
source "$SCRIPT_DIR/bin/lib/config.sh"
|
|
33
|
+
if ! _graph_projection_enabled; then
|
|
34
|
+
case "${1:-status}" in
|
|
35
|
+
status) echo '{"pending":0,"bytes":0,"status":"disabled","reason":"graph_projection_disabled"}' ;;
|
|
36
|
+
*) echo '{"status":"disabled","reason":"graph_projection_disabled"}' ;;
|
|
37
|
+
esac
|
|
38
|
+
exit 0
|
|
39
|
+
fi
|
|
40
|
+
|
|
28
41
|
WAL_DIR="$HOME/.egregore"
|
|
29
42
|
# WAL file is per-instance to prevent cross-org data leakage on multi-instance machines
|
|
30
43
|
PROJ_HASH=$(echo -n "$SCRIPT_DIR" | md5 2>/dev/null || echo -n "$SCRIPT_DIR" | md5sum 2>/dev/null | cut -d' ' -f1)
|
|
@@ -9,6 +9,50 @@ if [ ! -f "$CONFIG" ]; then
|
|
|
9
9
|
exit 1
|
|
10
10
|
fi
|
|
11
11
|
|
|
12
|
+
# Optional compatibility projection. A dogfood instance can quarantine every
|
|
13
|
+
# graph path without changing its Connected control-plane mode.
|
|
14
|
+
# shellcheck source=bin/lib/config.sh
|
|
15
|
+
source "$SCRIPT_DIR/bin/lib/config.sh"
|
|
16
|
+
if ! _graph_projection_enabled; then
|
|
17
|
+
case "${1:-}" in
|
|
18
|
+
query) echo '{"results":[],"status":"disabled","reason":"graph_projection_disabled"}' ;;
|
|
19
|
+
schema) echo '{}' ;;
|
|
20
|
+
test) echo '{"status":"disabled","reason":"graph_projection_disabled"}' ;;
|
|
21
|
+
*) echo '{"results":[],"status":"disabled","reason":"graph_projection_disabled"}' ;;
|
|
22
|
+
esac
|
|
23
|
+
exit 0
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
# --- Runtime cutover gate --------------------------------------------------
|
|
27
|
+
# Once the Runtime/QMD MVP is activated, graph retrieval is not used by this
|
|
28
|
+
# Runtime: background callers (attendant cache warm, greeting enrichment,
|
|
29
|
+
# search enrichment) get silence with no network and no telemetry — observed
|
|
30
|
+
# live as a wall of graph_query telemetry events from the attendant on an
|
|
31
|
+
# upgraded instance. An explicitly requested projection read passes through
|
|
32
|
+
# by setting EGREGORE_GRAPH_EXPLICIT=1 (bin/graph-op.sh named reads do).
|
|
33
|
+
if [ "${EGREGORE_GRAPH_EXPLICIT:-0}" != "1" ]; then
|
|
34
|
+
_CUT_ORG=$(jq -r '.org_id // empty' "$CONFIG" 2>/dev/null)
|
|
35
|
+
if [ -n "$_CUT_ORG" ]; then
|
|
36
|
+
_CUT_MAIN="$SCRIPT_DIR"
|
|
37
|
+
if [ -f "$SCRIPT_DIR/.git" ]; then
|
|
38
|
+
_CUT_GD=$(sed -n 's/^gitdir: //p' "$SCRIPT_DIR/.git" 2>/dev/null)
|
|
39
|
+
case "$_CUT_GD" in */.git/worktrees/*) _CUT_MAIN="${_CUT_GD%/.git/worktrees/*}" ;; esac
|
|
40
|
+
fi
|
|
41
|
+
_CUT_MAIN=$(cd "$_CUT_MAIN" 2>/dev/null && pwd -P || printf '%s' "$SCRIPT_DIR")
|
|
42
|
+
_CUT_KEY=$(printf '%s|%s' "$_CUT_ORG" "$_CUT_MAIN" | shasum -a 256 2>/dev/null | cut -c1-16)
|
|
43
|
+
_CUT_REC="${EGREGORE_UPGRADE_ROOT:-$HOME/.egregore/runtime/upgrade}/${_CUT_KEY}/active.json"
|
|
44
|
+
if [ -f "$_CUT_REC" ] && [ "$(jq -r '.retrieval // empty' "$_CUT_REC" 2>/dev/null)" = "runtime-qmd" ]; then
|
|
45
|
+
case "${1:-}" in
|
|
46
|
+
query) echo '{"results":[],"status":"disabled","reason":"runtime_qmd_active"}' ;;
|
|
47
|
+
schema) echo '{}' ;;
|
|
48
|
+
test) echo '{"status":"disabled","reason":"runtime_qmd_active"}' ;;
|
|
49
|
+
*) echo '{"results":[],"status":"disabled","reason":"runtime_qmd_active"}' ;;
|
|
50
|
+
esac
|
|
51
|
+
exit 0
|
|
52
|
+
fi
|
|
53
|
+
fi
|
|
54
|
+
fi
|
|
55
|
+
|
|
12
56
|
# --- Local mode gate: bail immediately, no .env sourcing, no network ---
|
|
13
57
|
_MODE=$(jq -r '.mode // "connected"' "$CONFIG" 2>/dev/null)
|
|
14
58
|
if [ "$_MODE" = "local" ]; then
|
|
@@ -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
|
+
}'
|