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,275 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -o pipefail
|
|
3
|
+
|
|
4
|
+
# Codex does not run Claude Code SessionStart hooks. This is the runtime-neutral
|
|
5
|
+
# startup card: it reuses the same identity, git sync, and context-gathering
|
|
6
|
+
# libraries as Claude's SessionStart, then renders a terminal greeting before
|
|
7
|
+
# Codex itself starts.
|
|
8
|
+
|
|
9
|
+
FRAMEWORK_VERSION="7"
|
|
10
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
11
|
+
cd "$SCRIPT_DIR" || exit 1
|
|
12
|
+
|
|
13
|
+
IS_WORKTREE="false"
|
|
14
|
+
MAIN_PROJECT_DIR="$SCRIPT_DIR"
|
|
15
|
+
if [ -f "$SCRIPT_DIR/.git" ]; then
|
|
16
|
+
IS_WORKTREE="true"
|
|
17
|
+
WT_GITDIR=$(sed 's/^gitdir: //' "$SCRIPT_DIR/.git" 2>/dev/null)
|
|
18
|
+
MAIN_PROJECT_DIR=$(cd "$WT_GITDIR/../../.." 2>/dev/null && pwd)
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# Clear any branch-guard consent from a previous session — consent to write on
|
|
22
|
+
# a protected branch is asked fresh each session (see AGENTS.md branch-guard protocol).
|
|
23
|
+
rm -f "$SCRIPT_DIR/.egregore-branch-consent" "$MAIN_PROJECT_DIR/.egregore-branch-consent" 2>/dev/null
|
|
24
|
+
# Same for boundary-crossing consent — grants are session-scoped (AGENTS.md
|
|
25
|
+
# environment-isolation protocol); durable grants belong in .egregore-boundary.local.json.
|
|
26
|
+
rm -f "$SCRIPT_DIR/.egregore-boundary-consent" "$MAIN_PROJECT_DIR/.egregore-boundary-consent" 2>/dev/null
|
|
27
|
+
|
|
28
|
+
if [ -f "$SCRIPT_DIR/bin/lib/worktree-links.sh" ]; then
|
|
29
|
+
source "$SCRIPT_DIR/bin/lib/worktree-links.sh" >/dev/null 2>/dev/null || true
|
|
30
|
+
egregore_link_shared_state "$SCRIPT_DIR" "$MAIN_PROJECT_DIR" >/dev/null 2>/dev/null || true
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
HEALTH_GITHUB="skip"
|
|
34
|
+
HEALTH_GIT="skip"
|
|
35
|
+
HEALTH_APIKEY="skip"
|
|
36
|
+
HEALTH_GRAPH="skip"
|
|
37
|
+
HEALTH_TELEGRAM="skip"
|
|
38
|
+
|
|
39
|
+
STATE_FILE="$SCRIPT_DIR/.egregore-state.json"
|
|
40
|
+
ENV_FILE="$SCRIPT_DIR/.env"
|
|
41
|
+
CONFIG="$SCRIPT_DIR/egregore.json"
|
|
42
|
+
DATE=$(date +%Y-%m-%d)
|
|
43
|
+
|
|
44
|
+
source "$SCRIPT_DIR/bin/lib/config.sh"
|
|
45
|
+
source "$SCRIPT_DIR/bin/lib/hash.sh"
|
|
46
|
+
source "$SCRIPT_DIR/bin/lib/time.sh"
|
|
47
|
+
source "$SCRIPT_DIR/bin/lib/identity.sh" >/dev/null 2>/dev/null
|
|
48
|
+
|
|
49
|
+
# Resolve missing stable ids before gathering context. This is synchronous only
|
|
50
|
+
# for a legacy instance; established identities keep the normal fast startup.
|
|
51
|
+
if [ -f "$SCRIPT_DIR/bin/runtime-identity.sh" ]; then
|
|
52
|
+
bash "$SCRIPT_DIR/bin/runtime-identity.sh" ensure >/dev/null 2>&1 || true
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# Keep the durable local profile current, then refresh shared projections in
|
|
56
|
+
# the background. Observe never waits on this once stable ids are persisted.
|
|
57
|
+
if [ -f "$STATE_FILE" ] && [ -f "$SCRIPT_DIR/bin/person.py" ]; then
|
|
58
|
+
python3 "$SCRIPT_DIR/bin/person.py" sync-local >/dev/null 2>&1 || true
|
|
59
|
+
fi
|
|
60
|
+
if [ -f "$SCRIPT_DIR/bin/person.sh" ]; then
|
|
61
|
+
( bash "$SCRIPT_DIR/bin/person.sh" sync >/dev/null 2>&1 & ) 2>/dev/null
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
LOCAL_MODE="false"
|
|
65
|
+
[ "$(_detect_mode)" = "local" ] && LOCAL_MODE="true"
|
|
66
|
+
MODE_BADGE="$(_runtime_mode_badge)"
|
|
67
|
+
|
|
68
|
+
if [ "$LOCAL_MODE" != "true" ]; then
|
|
69
|
+
if [ -f "$ENV_FILE" ] && grep -q '^EGREGORE_API_KEY=.' "$ENV_FILE" 2>/dev/null; then
|
|
70
|
+
HEALTH_APIKEY="ok"
|
|
71
|
+
else
|
|
72
|
+
HEALTH_APIKEY="fail"
|
|
73
|
+
fi
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
source "$SCRIPT_DIR/bin/lib/git-sync.sh" >/dev/null 2>/dev/null
|
|
77
|
+
# Warm-state parity with the Claude SessionStart path: hand context.sh the
|
|
78
|
+
# pre-baked snapshot and route greeting reads through the warm graph cache.
|
|
79
|
+
# The attendant daemon is deliberately NOT started from the Codex/Pi path —
|
|
80
|
+
# its dead-session detection reads Claude transcripts only, so a live Codex
|
|
81
|
+
# or Pi session with 12 quiet minutes would look dead and could have its
|
|
82
|
+
# unfinished work ripcorded/auto-pushed. Codex sessions still benefit from
|
|
83
|
+
# any snapshot a Claude session's attendant maintains; runtime-neutral
|
|
84
|
+
# liveness tracking is the prerequisite for starting the daemon here.
|
|
85
|
+
if [ -n "${_ATT_KEY:-}" ]; then
|
|
86
|
+
export CTX_SEED_TAR="${ATTENDANT_HOME:-$HOME/.egregore/attendant}/${_ATT_KEY}.ctx.tar"
|
|
87
|
+
fi
|
|
88
|
+
export EGREGORE_GRAPH_CACHE_TTL=600
|
|
89
|
+
source "$SCRIPT_DIR/bin/lib/context.sh" >/dev/null 2>/dev/null
|
|
90
|
+
unset EGREGORE_GRAPH_CACHE_TTL CTX_SEED_TAR
|
|
91
|
+
source "$SCRIPT_DIR/bin/lib/metrics.sh" >/dev/null 2>/dev/null
|
|
92
|
+
trap 'rm -rf "${CTX_DIR:-}"' EXIT
|
|
93
|
+
|
|
94
|
+
# Rescue non-coding leftovers from sessions that died without ceremony
|
|
95
|
+
# (terminal closed). Gated + idle-guarded inside the script; fire-and-forget.
|
|
96
|
+
( bash "$SCRIPT_DIR/bin/session-autosave.sh" --sweep >/dev/null 2>&1 & ) 2>/dev/null
|
|
97
|
+
|
|
98
|
+
# Connected instances pick up newly released Connect skills without
|
|
99
|
+
# re-running the launcher. Local mode exits instantly inside the script.
|
|
100
|
+
# Pi shares this path (pi-session-start.sh delegates here).
|
|
101
|
+
( bash "$SCRIPT_DIR/bin/connect-refresh.sh" >/dev/null 2>&1 & ) 2>/dev/null
|
|
102
|
+
|
|
103
|
+
read_json() {
|
|
104
|
+
local file="$1"
|
|
105
|
+
local expr="$2"
|
|
106
|
+
local fallback="${3:-}"
|
|
107
|
+
if [ -f "$file" ] && command -v jq >/dev/null 2>&1; then
|
|
108
|
+
jq -r "$expr // empty" "$file" 2>/dev/null | head -1
|
|
109
|
+
else
|
|
110
|
+
printf '%s\n' "$fallback"
|
|
111
|
+
fi
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
ORG_NAME="$(read_json "$CONFIG" '.org_name' '')"
|
|
115
|
+
[ -z "$ORG_NAME" ] && ORG_NAME="$(read_json "$CONFIG" '.slug' 'Egregore')"
|
|
116
|
+
GITHUB_ORG="$(read_json "$CONFIG" '.github_org' '')"
|
|
117
|
+
REPO_NAME="$(read_json "$CONFIG" '.repo_name' 'egregore')"
|
|
118
|
+
SLUG="$(read_json "$CONFIG" '.slug' '')"
|
|
119
|
+
DISPLAY_NAME="$(read_json "$STATE_FILE" '.display_name' '')"
|
|
120
|
+
[ -z "$DISPLAY_NAME" ] && DISPLAY_NAME="${DISPLAY_NAME_STATE:-$AUTHOR}"
|
|
121
|
+
ONBOARDING_COMPLETE="$(read_json "$STATE_FILE" '.onboarding_complete' '')"
|
|
122
|
+
[ -z "$ONBOARDING_COMPLETE" ] && ONBOARDING_COMPLETE="unknown"
|
|
123
|
+
|
|
124
|
+
ADDRESSED_RICH="$(cat "$CTX_DIR/addressed_rich" 2>/dev/null || echo "[]")"
|
|
125
|
+
PENDING_Q="$(cat "$CTX_DIR/pending_questions" 2>/dev/null || echo "[]")"
|
|
126
|
+
ADDRESSED_COUNT="$(echo "$ADDRESSED_RICH" | jq 'length' 2>/dev/null || echo "0")"
|
|
127
|
+
PENDING_Q_COUNT="$(echo "$PENDING_Q" | jq 'length' 2>/dev/null || echo "0")"
|
|
128
|
+
|
|
129
|
+
render_pending_line() {
|
|
130
|
+
if [ "$PENDING_Q_COUNT" -gt 0 ] 2>/dev/null; then
|
|
131
|
+
local senders noun
|
|
132
|
+
senders="$(echo "$PENDING_Q" | jq -r '[.[].from] | unique | join(", ")' 2>/dev/null)"
|
|
133
|
+
[ "$PENDING_Q_COUNT" = "1" ] && noun="question" || noun="questions"
|
|
134
|
+
if [ -n "$senders" ]; then
|
|
135
|
+
printf ' ◐ %s pending %s from %s - bin/agent.sh answer\n' "$PENDING_Q_COUNT" "$noun" "$senders"
|
|
136
|
+
else
|
|
137
|
+
printf ' ◐ %s pending %s - bin/agent.sh answer\n' "$PENDING_Q_COUNT" "$noun"
|
|
138
|
+
fi
|
|
139
|
+
fi
|
|
140
|
+
if [ "$ADDRESSED_COUNT" -gt 0 ] 2>/dev/null; then
|
|
141
|
+
printf ' ◇ %s handoffs for %s - say "show my handoffs" to review or close\n' "$ADDRESSED_COUNT" "$AUTHOR"
|
|
142
|
+
fi
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
banner() {
|
|
146
|
+
cat <<'EOF'
|
|
147
|
+
|
|
148
|
+
███████╗ ██████╗ ██████╗ ███████╗ ██████╗ ██████╗ ██████╗ ███████╗
|
|
149
|
+
██╔════╝██╔════╝ ██╔══██╗██╔════╝██╔════╝ ██╔═══██╗██╔══██╗██╔════╝
|
|
150
|
+
█████╗ ██║ ███╗██████╔╝█████╗ ██║ ███╗██║ ██║██████╔╝█████╗
|
|
151
|
+
██╔══╝ ██║ ██║██╔══██╗██╔══╝ ██║ ██║██║ ██║██╔══██╗██╔══╝
|
|
152
|
+
███████╗╚██████╔╝██║ ██║███████╗╚██████╔╝╚██████╔╝██║ ██║███████╗
|
|
153
|
+
╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝
|
|
154
|
+
|
|
155
|
+
EOF
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
render_card() {
|
|
159
|
+
local separator identity_left identity_right line_width pad footer_left footer_right board_url has_failure failed_services
|
|
160
|
+
separator=" ..................................................................."
|
|
161
|
+
identity_left=" ${GITHUB_ORG:-$ORG_NAME}/${REPO_NAME} · ${MODE_BADGE}"
|
|
162
|
+
identity_right="${DISPLAY_NAME} · ${BRANCH:-?}"
|
|
163
|
+
line_width=67
|
|
164
|
+
pad=$((line_width - ${#identity_left} - ${#identity_right}))
|
|
165
|
+
[ "$pad" -lt 1 ] && pad=1
|
|
166
|
+
|
|
167
|
+
banner
|
|
168
|
+
printf '%s%*s%s\n' "$identity_left" "$pad" "" "$identity_right"
|
|
169
|
+
printf '%s\n' "$separator"
|
|
170
|
+
SEPARATOR="$separator" LINE_WIDTH=$line_width _render_momentum_board
|
|
171
|
+
render_pending_line
|
|
172
|
+
printf '%s\n' "$separator"
|
|
173
|
+
|
|
174
|
+
has_failure="false"
|
|
175
|
+
failed_services=""
|
|
176
|
+
for pair in "github:$HEALTH_GITHUB" "git:$HEALTH_GIT" "retrieval:${HEALTH_RETRIEVAL:-skip}" "api-key:$HEALTH_APIKEY" "graph:$HEALTH_GRAPH" "telegram:$HEALTH_TELEGRAM"; do
|
|
177
|
+
svc="${pair%%:*}"
|
|
178
|
+
svc_status="${pair#*:}"
|
|
179
|
+
if [ "$svc_status" = "fail" ]; then
|
|
180
|
+
has_failure="true"
|
|
181
|
+
failed_services="${failed_services} ${svc} ✗"
|
|
182
|
+
fi
|
|
183
|
+
done
|
|
184
|
+
|
|
185
|
+
if [ "$has_failure" = "true" ]; then
|
|
186
|
+
printf ' ⚠%s\n' "$failed_services"
|
|
187
|
+
else
|
|
188
|
+
footer_left=" ✓ ready"
|
|
189
|
+
if [ "${MEMORY_SYNCED:-false}" = "true" ]; then
|
|
190
|
+
if [ "${HEALTH_RETRIEVAL:-skip}" = "ok" ]; then
|
|
191
|
+
footer_right="◆ memory + recall ready"
|
|
192
|
+
else
|
|
193
|
+
footer_right="◆ memory synced · recall unavailable"
|
|
194
|
+
fi
|
|
195
|
+
else
|
|
196
|
+
footer_right="◆ memory not synced"
|
|
197
|
+
fi
|
|
198
|
+
pad=$((line_width - ${#footer_left} - ${#footer_right}))
|
|
199
|
+
[ "$pad" -lt 1 ] && pad=1
|
|
200
|
+
printf '%s%*s%s\n' "$footer_left" "$pad" "" "$footer_right"
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
# Autosave trail — background saves since the last greeting (same ledger
|
|
204
|
+
# the Claude greeting reads; sweep rescues become visible here).
|
|
205
|
+
autosave_log="${EGREGORE_AUTOSAVE_LOG:-$HOME/.egregore/autosave.log}"
|
|
206
|
+
autosave_seen="${autosave_log}.seen"
|
|
207
|
+
if [ -f "$autosave_log" ]; then
|
|
208
|
+
total_as=$(grep -c '|autosave|' "$autosave_log" 2>/dev/null || echo 0)
|
|
209
|
+
seen_as=$(cat "$autosave_seen" 2>/dev/null || echo 0)
|
|
210
|
+
case "$seen_as" in ''|*[!0-9]*) seen_as=0 ;; esac
|
|
211
|
+
if [ "$total_as" -gt "$seen_as" ]; then
|
|
212
|
+
new_as=$((total_as - seen_as))
|
|
213
|
+
merged_as=$(grep '|autosave|' "$autosave_log" 2>/dev/null | tail -n "$new_as" | grep -c '|merged|' || echo 0)
|
|
214
|
+
if [ "$merged_as" -gt 0 ]; then
|
|
215
|
+
printf ' ⟲ auto-saved %s non-coding save(s) → develop while you were away\n' "$merged_as"
|
|
216
|
+
fi
|
|
217
|
+
fi
|
|
218
|
+
printf '%s' "$total_as" > "$autosave_seen" 2>/dev/null || true
|
|
219
|
+
fi
|
|
220
|
+
|
|
221
|
+
# Staged auto-saves awaiting the user's merge (the autosave consent gate).
|
|
222
|
+
# Live gh query so the line persists until the PRs actually merge.
|
|
223
|
+
# Shown only while the autosave experiment is enabled.
|
|
224
|
+
autosave_on=$(jq -r '.autosave_enabled // false' "$STATE_FILE" 2>/dev/null)
|
|
225
|
+
if [ "$autosave_on" = "true" ] && command -v gh >/dev/null 2>&1; then
|
|
226
|
+
gh_self=$(jq -r '.github_username // empty' "$STATE_FILE" 2>/dev/null)
|
|
227
|
+
if [ -n "$gh_self" ]; then
|
|
228
|
+
waiting_as=$(gh pr list --state open --author "$gh_self" --limit 20 \
|
|
229
|
+
--json number,title --jq '[.[] | select(.title | startswith("Auto-save:")) | .number] | join(", #")' 2>/dev/null || true)
|
|
230
|
+
if [ -n "$waiting_as" ]; then
|
|
231
|
+
printf ' ⟲ auto-saves awaiting your merge: PR #%s — \$autosave merge (or bin/agent.sh autosave merge)\n' "$waiting_as"
|
|
232
|
+
fi
|
|
233
|
+
fi
|
|
234
|
+
fi
|
|
235
|
+
|
|
236
|
+
# Greeting links. Org config `pinned_links` in egregore.json replaces the
|
|
237
|
+
# default board link — same contract as bin/lib/greeting.sh.
|
|
238
|
+
pinned_links=$(jq -c '.pinned_links // []' "$CONFIG" 2>/dev/null || echo "[]")
|
|
239
|
+
if [ "$(printf '%s' "$pinned_links" | jq 'length' 2>/dev/null || echo 0)" -gt 0 ]; then
|
|
240
|
+
printf '%s' "$pinned_links" | jq -r '.[] |
|
|
241
|
+
if type == "string" then " ◆ \(.)"
|
|
242
|
+
elif (.label // "") != "" then " ◆ \(.label): \(.url)"
|
|
243
|
+
else " ◆ \(.url)" end' 2>/dev/null
|
|
244
|
+
elif [ -n "$SLUG" ]; then
|
|
245
|
+
board_url="https://egregore.xyz/view/${SLUG}/board"
|
|
246
|
+
printf ' ◆ %s\n' "$board_url"
|
|
247
|
+
fi
|
|
248
|
+
printf '\nWhat are you working on?\n'
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
case "${1:---card}" in
|
|
252
|
+
--card|card)
|
|
253
|
+
render_card
|
|
254
|
+
;;
|
|
255
|
+
--prompt|prompt)
|
|
256
|
+
cat <<EOF
|
|
257
|
+
You are Codex running inside Egregore for ${ORG_NAME} as ${AUTHOR}.
|
|
258
|
+
The launcher already rendered the Egregore startup card using the shared identity, git-sync, graph, and filesystem context pipeline.
|
|
259
|
+
This session is Trusted Codex: full shell/network access is enabled and approval prompts are disabled by the launcher.
|
|
260
|
+
Do not rerun startup checks or narrate startup unless the user asks.
|
|
261
|
+
Follow AGENTS.md before code changes.
|
|
262
|
+
After the user names what they are working on, use bin/agent.sh branch --topic "<work topic>" if you are not already in an appropriate task worktree, then continue file work from the printed worktree path.
|
|
263
|
+
Use bin/agent.sh to update shared activity: handoff, ask, and answer write to memory/ and push when possible.
|
|
264
|
+
Use bin/agent.sh handoff for internal team session-handoffs. Portable external capsules are emissaries; use egregore-emissary when installed, not the deprecated egregore-handoff CLI.
|
|
265
|
+
Codex reserves leading slash commands for built-ins, so custom Egregore /activity-style commands will not reach the agent. Egregore native Codex skills are: \$activity, \$handoff, \$wrap, \$announce, \$harvest, \$the-spiral, \$dashboard, \$deep-reflect, \$quest, \$invite, \$ask, \$save, \$view, and \$scroll. Natural-language requests such as "show activity", "make a handoff", or "render this as a scroll" work too. Remaining mirrored workflows are adapter skills for long-tail coverage.
|
|
266
|
+
\$save is the user-facing abstraction for committing, pushing, opening or reusing pull requests, and syncing memory; do not make users manage the git workflow by hand.
|
|
267
|
+
Egregore Codex workflows are skill invocations, not Claude Code slash commands. Do not rely on Claude Code-only command machinery.
|
|
268
|
+
If onboarding_complete is false, use the memory protocol directly and make sure memory/people/${AUTHOR}.md exists before the first handoff.
|
|
269
|
+
EOF
|
|
270
|
+
;;
|
|
271
|
+
*)
|
|
272
|
+
echo "usage: bin/codex-session-start.sh [--card|--prompt]" >&2
|
|
273
|
+
exit 2
|
|
274
|
+
;;
|
|
275
|
+
esac
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
|
|
4
|
+
const WIDTH = 72;
|
|
5
|
+
|
|
6
|
+
function usage() {
|
|
7
|
+
console.error(`usage:
|
|
8
|
+
bash bin/node-run.sh bin/codex-skill-render.mjs classify-graph [--mode connected|local] [--attempt initial|retry] [file|-]
|
|
9
|
+
bash bin/node-run.sh bin/codex-skill-render.mjs activity-card [file|-]
|
|
10
|
+
bash bin/node-run.sh bin/codex-skill-render.mjs dashboard-card [file|-]
|
|
11
|
+
bash bin/node-run.sh bin/codex-skill-render.mjs handoff-card [file|-]`);
|
|
12
|
+
process.exit(2);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function readInput(file) {
|
|
16
|
+
if (!file || file === '-') {
|
|
17
|
+
return fs.readFileSync(0, 'utf8');
|
|
18
|
+
}
|
|
19
|
+
return fs.readFileSync(file, 'utf8');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function readJson(file) {
|
|
23
|
+
const raw = readInput(file).trim() || '{}';
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(raw);
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.error(`invalid JSON${file ? ` in ${file}` : ''}: ${error.message}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function parseFlags(args) {
|
|
33
|
+
const flags = {};
|
|
34
|
+
const rest = [];
|
|
35
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
36
|
+
const arg = args[i];
|
|
37
|
+
if (arg === '--mode' || arg === '--attempt') {
|
|
38
|
+
flags[arg.slice(2)] = args[i + 1];
|
|
39
|
+
i += 1;
|
|
40
|
+
} else {
|
|
41
|
+
rest.push(arg);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { flags, rest };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function asArray(value) {
|
|
48
|
+
return Array.isArray(value) ? value : [];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function firstArray(data, paths) {
|
|
52
|
+
for (const p of paths) {
|
|
53
|
+
const value = p.split('.').reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : undefined), data);
|
|
54
|
+
if (Array.isArray(value)) return value;
|
|
55
|
+
}
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function valueOf(item, keys, fallback = '') {
|
|
60
|
+
for (const key of keys) {
|
|
61
|
+
if (item && item[key] !== undefined && item[key] !== null && String(item[key]).trim() !== '') {
|
|
62
|
+
return String(item[key]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return fallback;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function truncate(value, max) {
|
|
69
|
+
const text = String(value || '').replace(/\s+/g, ' ').trim();
|
|
70
|
+
if (text.length <= max) return text;
|
|
71
|
+
return `${text.slice(0, Math.max(0, max - 3))}...`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function padLine(left, right = '') {
|
|
75
|
+
const inner = WIDTH - 4;
|
|
76
|
+
const r = right ? truncate(right, Math.min(18, inner - 1)) : '';
|
|
77
|
+
const l = truncate(left, inner - (r ? r.length + 1 : 0));
|
|
78
|
+
const space = Math.max(0, inner - l.length - r.length);
|
|
79
|
+
return `│ ${l}${' '.repeat(space)}${r} │`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function topRule() {
|
|
83
|
+
return `┌${'─'.repeat(WIDTH - 2)}┐`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function rule() {
|
|
87
|
+
return `├${'─'.repeat(WIDTH - 2)}┤`;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function bottomRule() {
|
|
91
|
+
return `└${'─'.repeat(WIDTH - 2)}┘`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function graphFields(data) {
|
|
95
|
+
return {
|
|
96
|
+
status: data.graph_status || data.graphStatus || data.graph?.status || '',
|
|
97
|
+
reason: data.graph_reason || data.graphReason || data.graph?.reason || '',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function classifyGraph(data, options = {}) {
|
|
102
|
+
const mode = options.mode || data.mode || 'connected';
|
|
103
|
+
const attempt = options.attempt || 'initial';
|
|
104
|
+
const { status, reason } = graphFields(data);
|
|
105
|
+
|
|
106
|
+
if (mode === 'local') {
|
|
107
|
+
return {
|
|
108
|
+
status: 'local',
|
|
109
|
+
retry: false,
|
|
110
|
+
reason: reason || 'local_mode',
|
|
111
|
+
message: 'Local mode uses memory files as the source of truth.',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (status === 'connected') {
|
|
116
|
+
return {
|
|
117
|
+
status: 'connected',
|
|
118
|
+
retry: false,
|
|
119
|
+
reason: '',
|
|
120
|
+
message: 'Graph connected.',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (reason === 'unreachable' && attempt !== 'retry') {
|
|
125
|
+
return {
|
|
126
|
+
status: 'retry',
|
|
127
|
+
retry: true,
|
|
128
|
+
reason,
|
|
129
|
+
message: 'Connected-mode graph was unreachable; retry with network escalation.',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const finalReason = reason || status || 'offline';
|
|
134
|
+
return {
|
|
135
|
+
status: 'offline',
|
|
136
|
+
retry: false,
|
|
137
|
+
reason: finalReason,
|
|
138
|
+
message: `Graph offline (${finalReason}). Render filesystem fallback.`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function renderActivity(data) {
|
|
143
|
+
const graph = classifyGraph(data, { mode: data.mode || 'connected', attempt: 'retry' });
|
|
144
|
+
const org = data.org || data.organization || 'Egregore';
|
|
145
|
+
const date = data.date || '';
|
|
146
|
+
const me = typeof data.me === 'string'
|
|
147
|
+
? data.me
|
|
148
|
+
: data.me?.github || data.me?.name || data.github_username || '';
|
|
149
|
+
const handoffs = firstArray(data, ['handoffs_to_me', 'handoffs', 'pending_handoffs', 'me.handoffs', 'addressed_handoffs']);
|
|
150
|
+
const questions = firstArray(data, ['questions', 'pending_questions', 'me.questions']);
|
|
151
|
+
const prs = asArray(data.prs);
|
|
152
|
+
const mine = firstArray(data, ['local_sessions.my_sessions', 'my_sessions', 'sessions']);
|
|
153
|
+
const team = firstArray(data, ['local_sessions.team_sessions', 'team_sessions', 'team.sessions']);
|
|
154
|
+
|
|
155
|
+
const brand = `${truncate(org, 20).toUpperCase()} EGREGORE ✦ ACTIVITY DASHBOARD`;
|
|
156
|
+
const lines = [topRule(), padLine(brand), padLine([me, date].filter(Boolean).join(' · ')), rule()];
|
|
157
|
+
if (data.connected_enrichment && graph.status !== 'connected') {
|
|
158
|
+
lines.push(padLine(`graph: ${graph.status}`, graph.reason));
|
|
159
|
+
lines.push(rule());
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
lines.push(padLine('FOR YOU'));
|
|
163
|
+
if (questions.length === 0 && handoffs.length === 0) {
|
|
164
|
+
lines.push(padLine('nothing pending'));
|
|
165
|
+
} else {
|
|
166
|
+
if (questions.length > 0) {
|
|
167
|
+
lines.push(padLine('QUESTIONS'));
|
|
168
|
+
questions.slice(0, 4).forEach((q) => {
|
|
169
|
+
lines.push(padLine(`● ${valueOf(q, ['from', 'author', 'asker'], 'someone')}: ${valueOf(q, ['topic', 'title', 'question'], 'question')}`));
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (handoffs.length > 0) {
|
|
173
|
+
lines.push(padLine('HANDOFFS'));
|
|
174
|
+
const glyph = { pending: '●', read: '◐', claimed: '◆', done: '✓', completed: '✓', expired: '×' };
|
|
175
|
+
handoffs.slice(0, 6).forEach((h, index) => {
|
|
176
|
+
const status = valueOf(h, ['status'], 'pending');
|
|
177
|
+
const age = valueOf(h, ['ageDays', 'age_days'], '');
|
|
178
|
+
const intent = valueOf(h, ['intent'], '');
|
|
179
|
+
const meta = [
|
|
180
|
+
age === '' ? '' : `${age}d`,
|
|
181
|
+
intent && intent !== 'unclassified' ? intent : '',
|
|
182
|
+
status,
|
|
183
|
+
].filter(Boolean).join(' · ');
|
|
184
|
+
lines.push(padLine(
|
|
185
|
+
`[${index + 1}] ${glyph[status] || '○'} ⇌ ${valueOf(h, ['author', 'from'], 'someone')}: ${valueOf(h, ['topic', 'title'], 'handoff')}`,
|
|
186
|
+
meta,
|
|
187
|
+
));
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
lines.push(rule());
|
|
193
|
+
lines.push(padLine('RECENT WORK'));
|
|
194
|
+
if (mine.length === 0) {
|
|
195
|
+
lines.push(padLine('no recent local sessions found'));
|
|
196
|
+
} else {
|
|
197
|
+
mine.slice(0, 5).forEach((s) => {
|
|
198
|
+
lines.push(padLine(`${valueOf(s, ['date', 'when'], '')} ${valueOf(s, ['topic', 'title', 'branch'], 'session')}`, valueOf(s, ['type', 'status', 'duration'], '')));
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (team.length > 0 || prs.length > 0) {
|
|
203
|
+
lines.push(rule());
|
|
204
|
+
lines.push(padLine('AROUND'));
|
|
205
|
+
team.slice(0, 3).forEach((s) => {
|
|
206
|
+
lines.push(padLine(`${valueOf(s, ['author', 'name'], 'teammate')}: ${valueOf(s, ['topic', 'title', 'branch'], 'session')}`));
|
|
207
|
+
});
|
|
208
|
+
prs.slice(0, 3).forEach((pr) => {
|
|
209
|
+
lines.push(padLine(`#${valueOf(pr, ['number'], '')} ${valueOf(pr, ['title'], 'pull request')}`, valueOf(pr.author || {}, ['login', 'name'], '')));
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
lines.push(rule());
|
|
214
|
+
if (handoffs.length > 0) {
|
|
215
|
+
lines.push(padLine('Handoff actions: done N · expire N · reopen N'));
|
|
216
|
+
lines.push(padLine('Type a number to act, or keep working.'));
|
|
217
|
+
} else {
|
|
218
|
+
lines.push(padLine('Focus choices: questions, recent work, dashboard, done'));
|
|
219
|
+
}
|
|
220
|
+
lines.push(bottomRule());
|
|
221
|
+
return lines.join('\n');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function humanTopic(session) {
|
|
225
|
+
const topic = valueOf(session, ['topic', 'title'], '');
|
|
226
|
+
if (topic) return topic;
|
|
227
|
+
const branch = valueOf(session, ['branch'], '');
|
|
228
|
+
if (branch && !['develop', 'main', 'master'].includes(branch)) {
|
|
229
|
+
return branch.replace(/^dev\/[^/]+\//, '').replace(/[-_]+/g, ' ');
|
|
230
|
+
}
|
|
231
|
+
return valueOf(session, ['id', 'date'], 'session');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function renderDashboard(data) {
|
|
235
|
+
const graph = classifyGraph(data, { mode: data.mode || 'connected', attempt: 'retry' });
|
|
236
|
+
const org = data.org || 'Egregore';
|
|
237
|
+
const date = data.date || '';
|
|
238
|
+
const me = typeof data.me === 'string'
|
|
239
|
+
? data.me
|
|
240
|
+
: data.me?.github || data.me?.name || data.github_username || '';
|
|
241
|
+
const current = data.current_session || {};
|
|
242
|
+
const sessions = firstArray(data, ['sessions', 'local_sessions.sessions']);
|
|
243
|
+
const todos = firstArray(data, ['todos', 'open_todos']);
|
|
244
|
+
const quests = firstArray(data, ['quests', 'active_quests']);
|
|
245
|
+
const handoffs = firstArray(data, ['handoffs', 'pending_handoffs']);
|
|
246
|
+
const threads = firstArray(data, ['open_threads', 'threads']);
|
|
247
|
+
const stats = data.stats || {};
|
|
248
|
+
|
|
249
|
+
const lines = [topRule(), padLine('DASHBOARD', [org, me, date].filter(Boolean).join(' · ')), rule()];
|
|
250
|
+
if (data.connected_enrichment && graph.status !== 'connected') {
|
|
251
|
+
lines.push(padLine(`graph: ${graph.status}`, graph.reason));
|
|
252
|
+
lines.push(rule());
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
lines.push(padLine(`* ${humanTopic(current) || '(starting...)'}`, 'active'));
|
|
256
|
+
|
|
257
|
+
if (threads.length > 0) {
|
|
258
|
+
lines.push(rule());
|
|
259
|
+
lines.push(padLine('PICK UP WHERE YOU LEFT OFF'));
|
|
260
|
+
threads.slice(0, 5).forEach((thread) => {
|
|
261
|
+
lines.push(padLine(`- ${valueOf(thread, ['text', 'thread', 'title', 'topic'], 'open thread')}`));
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (todos.length > 0) {
|
|
266
|
+
lines.push(rule());
|
|
267
|
+
lines.push(padLine(`OPEN TODOS (${todos.length})`));
|
|
268
|
+
todos.slice(0, 3).forEach((todo, index) => {
|
|
269
|
+
lines.push(padLine(`[${index + 1}] ${valueOf(todo, ['text', 'title'], 'todo')}`, valueOf(todo, ['status'], '')));
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (handoffs.length > 0) {
|
|
274
|
+
lines.push(rule());
|
|
275
|
+
lines.push(padLine(`HANDOFFS (${handoffs.length} pending)`));
|
|
276
|
+
handoffs.slice(0, 3).forEach((handoff) => {
|
|
277
|
+
lines.push(padLine(`${valueOf(handoff, ['author', 'from'], 'someone')}: ${valueOf(handoff, ['topic', 'title'], 'handoff')}`, valueOf(handoff, ['when', 'date'], '')));
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
lines.push(rule());
|
|
282
|
+
lines.push(padLine(`SESSIONS (${data.range_label || 'recent'})`));
|
|
283
|
+
if (sessions.length === 0) {
|
|
284
|
+
lines.push(padLine('No activity recorded yet'));
|
|
285
|
+
} else {
|
|
286
|
+
sessions.slice(0, 5).forEach((session) => {
|
|
287
|
+
lines.push(padLine(`${valueOf(session, ['date', 'when'], '')} ${humanTopic(session)}`, valueOf(session, ['status', 'type'], '')));
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (quests.length > 0) {
|
|
292
|
+
lines.push(rule());
|
|
293
|
+
lines.push(padLine(`QUESTS (${quests.length} active)`));
|
|
294
|
+
quests.slice(0, 3).forEach((quest) => {
|
|
295
|
+
lines.push(padLine(valueOf(quest, ['id', 'quest', 'slug', 'title'], 'quest'), valueOf(quest, ['status', 'summary'], '')));
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
lines.push(rule());
|
|
300
|
+
const total = stats.totalSessions ?? data.local_sessions?.session_count ?? sessions.length;
|
|
301
|
+
const wrapped = stats.wrappedSessions ?? sessions.filter((s) => valueOf(s, ['status', 'type'], '').includes('wrap')).length;
|
|
302
|
+
lines.push(padLine(`${total} sessions · ${wrapped}/${total} wrapped · ${stats.openTodos ?? todos.length} open todos`));
|
|
303
|
+
lines.push(padLine("What's next?"));
|
|
304
|
+
lines.push(bottomRule());
|
|
305
|
+
return lines.join('\n');
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function renderHandoff(data) {
|
|
309
|
+
const file = data.file ? `memory/${data.file}` : '';
|
|
310
|
+
const statuses = [
|
|
311
|
+
data.graphStatus ? `graph=${data.graphStatus}` : '',
|
|
312
|
+
data.memoryStatus ? `memory=${data.memoryStatus}` : '',
|
|
313
|
+
data.notifyStatus ? `notify=${data.notifyStatus}` : '',
|
|
314
|
+
data.publishStatus ? `publish=${data.publishStatus}` : '',
|
|
315
|
+
].filter(Boolean).join(' · ');
|
|
316
|
+
|
|
317
|
+
const lines = [topRule(), padLine('⇌ HANDOFF', data.author || ''), rule()];
|
|
318
|
+
lines.push(padLine(`Topic: ${data.topic || '(untitled)'}`));
|
|
319
|
+
if (data.recipient) lines.push(padLine(`To: ${data.recipient}`));
|
|
320
|
+
if (file) lines.push(padLine(`Path: ${file}`));
|
|
321
|
+
if (data.artifactUrl) lines.push(padLine(`Link: ${data.artifactUrl}`));
|
|
322
|
+
if (statuses) lines.push(padLine(statuses));
|
|
323
|
+
if (data.publishStatus === 'fidelity-failed') {
|
|
324
|
+
lines.push(rule());
|
|
325
|
+
lines.push(padLine('Artifact not published — restore missing content and preview again.'));
|
|
326
|
+
}
|
|
327
|
+
lines.push(bottomRule());
|
|
328
|
+
return lines.join('\n');
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const [command, ...rawArgs] = process.argv.slice(2);
|
|
332
|
+
if (!command) usage();
|
|
333
|
+
|
|
334
|
+
if (command === 'classify-graph') {
|
|
335
|
+
const { flags, rest } = parseFlags(rawArgs);
|
|
336
|
+
const data = readJson(rest[0]);
|
|
337
|
+
console.log(JSON.stringify(classifyGraph(data, flags)));
|
|
338
|
+
} else if (command === 'activity-card') {
|
|
339
|
+
const data = readJson(rawArgs[0]);
|
|
340
|
+
console.log(renderActivity(data));
|
|
341
|
+
} else if (command === 'dashboard-card') {
|
|
342
|
+
const data = readJson(rawArgs[0]);
|
|
343
|
+
console.log(renderDashboard(data));
|
|
344
|
+
} else if (command === 'handoff-card') {
|
|
345
|
+
const data = readJson(rawArgs[0]);
|
|
346
|
+
console.log(renderHandoff(data));
|
|
347
|
+
} else {
|
|
348
|
+
usage();
|
|
349
|
+
}
|