create-egregore 0.21.6 → 0.22.0
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 +58 -6
- package/assets/egregore-launcher.sh +15 -2
- package/lib/claude-runtime.js +2 -0
- package/lib/codex-runtime.js +2 -0
- package/lib/setup.js +20 -3
- package/package.json +2 -2
- package/runtime/claude/.claude/context/commit-format.md +7 -4
- package/runtime/claude/.claude/context/handoff-claiming.md +32 -0
- package/runtime/claude/.claude/context/notification-consent.md +12 -9
- package/runtime/claude/.claude/hooks/boundary-check.sh +14 -331
- package/runtime/claude/.claude/hooks/memory-read-guard.sh +9 -1
- package/runtime/claude/.claude/rules/voice-bedrock.md +6 -2
- package/runtime/claude/.claude/settings.json +1 -1
- package/runtime/claude/.claude/skills/commit/SKILL.md +5 -3
- package/runtime/claude/.claude/skills/dark-mode/SKILL.md +48 -369
- package/runtime/claude/.claude/skills/records/SKILL.md +158 -0
- package/runtime/claude/.claude/skills/reflect/SKILL.md +50 -21
- package/runtime/claude/.claude/skills/review-pr/SKILL.md +4 -2
- package/runtime/claude/.claude/skills/save/SKILL.md +9 -3
- package/runtime/claude/.claude/skills/summon/SKILL.md +138 -207
- package/runtime/claude/.claude/skills/tui-design/SKILL.md +1 -1
- package/runtime/claude/.claude/skills/update/SKILL.md +1 -1
- package/runtime/claude/.claude/skills/view/SKILL.md +52 -16
- package/runtime/claude/.claude/skills/view/compose-scaffold.html +19 -13
- package/runtime/claude/CLAUDE.md +59 -95
- package/runtime/claude/bin/agent.sh +231 -7
- package/runtime/claude/bin/api-call.sh +44 -23
- package/runtime/claude/bin/artifact-register.sh +7 -1
- package/runtime/claude/bin/artifact-writeback.sh +1 -1
- package/runtime/claude/bin/artifacts.sh +66 -265
- package/runtime/claude/bin/attendant.sh +4 -1
- package/runtime/claude/bin/boundary-guard.cjs +1848 -0
- package/runtime/claude/bin/boundary-hook.sh +41 -0
- package/runtime/claude/bin/boundary.sh +15 -155
- package/runtime/claude/bin/capture-run.sh +32 -2
- package/runtime/claude/bin/codex-render-spec.mjs +24 -46
- package/runtime/claude/bin/codex-session-start.sh +19 -0
- package/runtime/claude/bin/codex-skill-render.mjs +18 -0
- package/runtime/claude/bin/config-get.sh +10 -1
- package/runtime/claude/bin/connect-refresh.sh +16 -0
- package/runtime/claude/bin/corpus_map.py +5 -0
- package/runtime/claude/bin/data/capabilities/claude.json +1480 -0
- package/runtime/claude/bin/genui.sh +19 -0
- package/runtime/claude/bin/graph-batch.sh +1 -1
- package/runtime/claude/bin/graph-op.sh +14 -0
- package/runtime/claude/bin/graph.sh +1 -1
- package/runtime/claude/bin/handoff-pr-backfill.sh +1 -1
- package/runtime/claude/bin/handoff-run.sh +11 -6
- package/runtime/claude/bin/ingest-item.sh +1 -1
- package/runtime/claude/bin/ingest-surface.html +22 -4
- package/runtime/claude/bin/issue.sh +1 -1
- package/runtime/claude/bin/knowledge.sh +1 -1
- package/runtime/claude/bin/lib/card-delivery.sh +329 -0
- package/runtime/claude/bin/lib/config.sh +148 -3
- package/runtime/claude/bin/lib/context.sh +38 -67
- package/runtime/claude/bin/lib/genui-entry.py +36 -0
- package/runtime/claude/bin/lib/git-message.sh +25 -6
- package/runtime/claude/bin/lib/git-sync.sh +12 -4
- package/runtime/claude/bin/lib/greeting.sh +255 -28
- package/runtime/claude/bin/lib/handoff_meta.py +294 -0
- package/runtime/claude/bin/lib/health-footer.sh +83 -2
- package/runtime/claude/bin/lib/identity.sh +31 -10
- package/runtime/claude/bin/lib/instance-registry.sh +71 -0
- package/runtime/claude/bin/lib/local_ci_receipt.py +249 -0
- package/runtime/claude/bin/lib/metrics.sh +121 -8
- package/runtime/claude/bin/lib/notices.sh +36 -0
- package/runtime/claude/bin/lib/record_outcomes.py +729 -0
- package/runtime/claude/bin/lib/reflexes.py +267 -0
- package/runtime/claude/bin/lib/retrieval_scorecard.py +624 -0
- package/runtime/claude/bin/lib/session-record-prompt.txt +18 -0
- package/runtime/claude/bin/lib/session_record.py +3747 -0
- package/runtime/claude/bin/lib/session_trail.py +1983 -0
- package/runtime/claude/bin/lib/settings-drift.sh +8 -5
- package/runtime/claude/bin/lib/startup-restart.sh +41 -0
- package/runtime/claude/bin/lib/worktree-links.sh +92 -0
- package/runtime/claude/bin/memory-push.sh +6 -0
- package/runtime/claude/bin/merge-gate.sh +498 -0
- package/runtime/claude/bin/notify.sh +5 -2
- package/runtime/claude/bin/page-access.sh +103 -0
- package/runtime/claude/bin/person.sh +13 -2
- package/runtime/claude/bin/pi-render-spec.mjs +0 -1
- package/runtime/claude/bin/pi-spirit-discovery.mjs +34 -0
- package/runtime/claude/bin/post-update.sh +181 -0
- package/runtime/claude/bin/prime-render-spec.mjs +0 -1
- package/runtime/claude/bin/publish-artifact.sh +89 -42
- package/runtime/claude/bin/qa-inventory.sh +2 -2
- package/runtime/claude/bin/quest.sh +1 -1
- package/runtime/claude/bin/records.sh +11 -0
- package/runtime/claude/bin/reflexes/05-vitals.sh +9 -0
- package/runtime/claude/bin/reflexes/10-open-items.sh +12 -0
- package/runtime/claude/bin/reflexes/15-retrieval.sh +8 -0
- package/runtime/claude/bin/reflexes/20-nightly.sh +100 -0
- package/runtime/claude/bin/reflexes/20-sandbox.sh +85 -0
- package/runtime/claude/bin/reflexes/30-cost.py +116 -0
- package/runtime/claude/bin/reflexes/40-shells.py +51 -0
- package/runtime/claude/bin/reflexes/README.md +61 -0
- package/runtime/claude/bin/reflexes.sh +7 -0
- package/runtime/claude/bin/runtime-identity.sh +140 -42
- package/runtime/claude/bin/screenshot.sh +77 -0
- package/runtime/claude/bin/scroll.sh +1 -1
- package/runtime/claude/bin/search.sh +31 -5
- package/runtime/claude/bin/session-autosave.sh +6 -3
- package/runtime/claude/bin/session-id.sh +147 -0
- package/runtime/claude/bin/session-log.sh +19 -0
- package/runtime/claude/bin/session-record.sh +26 -0
- package/runtime/claude/bin/session-start.sh +121 -151
- package/runtime/claude/bin/settings.sh +13 -8
- package/runtime/claude/bin/spirit-discovery-claude.sh +4 -0
- package/runtime/claude/bin/spirit-discovery-codex.sh +4 -0
- package/runtime/claude/bin/spirit-discovery-pi.sh +4 -0
- package/runtime/claude/bin/spirit-discovery-prime.sh +4 -0
- package/runtime/claude/bin/spirit-discovery.sh +4 -0
- package/runtime/claude/bin/startup-check.sh +1 -1
- package/runtime/claude/bin/telemetry.sh +11 -4
- package/runtime/claude/bin/test-baseline.sh +33 -5
- package/runtime/claude/bin/todo.sh +1 -1
- package/runtime/claude/bin/worktree-create.sh +15 -45
- package/runtime/claude/bin/worktree.sh +6 -0
- package/runtime/claude/docs/spirit-discovery.md +96 -0
- package/runtime/claude/egregore_runtime/__init__.py +18 -12
- package/runtime/claude/egregore_runtime/access.py +608 -0
- package/runtime/claude/egregore_runtime/access_cli.py +190 -0
- package/runtime/claude/egregore_runtime/adapters/invitation.py +5 -3
- package/runtime/claude/egregore_runtime/adapters/qmd.py +521 -47
- package/runtime/claude/egregore_runtime/admin_entry.py +56 -0
- package/runtime/claude/egregore_runtime/artifacts.py +222 -16
- package/runtime/claude/egregore_runtime/contracts.py +27 -0
- package/runtime/claude/egregore_runtime/eligibility.py +5 -12
- package/runtime/claude/egregore_runtime/episode_binding.py +16 -5
- package/runtime/claude/egregore_runtime/github_issues.py +2 -2
- package/runtime/claude/egregore_runtime/handoff_lookup.py +9 -20
- package/runtime/claude/egregore_runtime/harness_cli.py +674 -149
- package/runtime/claude/egregore_runtime/held.py +2436 -0
- package/runtime/claude/egregore_runtime/hosted_api.py +137 -0
- package/runtime/claude/egregore_runtime/identity.py +196 -65
- package/runtime/claude/egregore_runtime/identity_transfer.py +6 -2
- package/runtime/claude/egregore_runtime/ingest_cli.py +2 -2
- package/runtime/claude/egregore_runtime/ingest_index_cli.py +4 -16
- package/runtime/claude/egregore_runtime/installation.py +119 -0
- package/runtime/claude/egregore_runtime/investigation.py +64 -41
- package/runtime/claude/egregore_runtime/investigation_guidance.py +16 -11
- package/runtime/claude/egregore_runtime/issue_cli.py +51 -32
- package/runtime/claude/egregore_runtime/issue_reporting.py +4 -3
- package/runtime/claude/egregore_runtime/issue_triage_service.py +2 -2
- package/runtime/claude/egregore_runtime/issues.py +12 -6
- package/runtime/claude/egregore_runtime/knowledge.py +331 -5
- package/runtime/claude/egregore_runtime/knowledge_cli.py +57 -17
- package/runtime/claude/egregore_runtime/lifecycle.py +88 -22
- package/runtime/claude/egregore_runtime/lifecycle_cli.py +21 -13
- package/runtime/claude/egregore_runtime/line_ids.py +10 -0
- package/runtime/claude/egregore_runtime/memory_push.py +349 -0
- package/runtime/claude/egregore_runtime/observe.py +64 -25
- package/runtime/claude/egregore_runtime/observers.py +19 -0
- package/runtime/claude/egregore_runtime/optional_modules.py +13 -0
- package/runtime/claude/egregore_runtime/outputs_cli.py +321 -0
- package/runtime/claude/egregore_runtime/policy.py +651 -24
- package/runtime/claude/egregore_runtime/private_result.py +2 -1
- package/runtime/claude/egregore_runtime/projection.py +946 -0
- package/runtime/claude/egregore_runtime/quest_cli.py +20 -23
- package/runtime/claude/egregore_runtime/question_cli.py +15 -11
- package/runtime/claude/egregore_runtime/questions.py +10 -10
- package/runtime/claude/egregore_runtime/quests.py +10 -10
- package/runtime/claude/egregore_runtime/record_publish.py +548 -0
- package/runtime/claude/egregore_runtime/record_subject.py +564 -0
- package/runtime/claude/egregore_runtime/research_ingest.py +2 -4
- package/runtime/claude/egregore_runtime/runtime.py +169 -60
- package/runtime/claude/egregore_runtime/sandbox.py +194 -0
- package/runtime/claude/egregore_runtime/scroll_cli.py +22 -32
- package/runtime/claude/egregore_runtime/scrolls.py +23 -15
- package/runtime/claude/egregore_runtime/shadow.py +262 -0
- package/runtime/claude/egregore_runtime/spirit_discovery.py +487 -0
- package/runtime/claude/egregore_runtime/spirit_discovery_cli.py +25 -0
- package/runtime/claude/egregore_runtime/spirit_discovery_transport.py +18 -0
- package/runtime/claude/egregore_runtime/status.py +101 -44
- package/runtime/claude/egregore_runtime/status_cli.py +13 -5
- package/runtime/claude/egregore_runtime/sync.py +39 -21
- package/runtime/claude/egregore_runtime/taste.py +934 -0
- package/runtime/claude/egregore_runtime/taste_cli.py +242 -0
- package/runtime/claude/egregore_runtime/taste_rules.py +91 -0
- package/runtime/claude/egregore_runtime/telemetry.py +26 -3
- package/runtime/claude/egregore_runtime/todo_cli.py +15 -12
- package/runtime/claude/egregore_runtime/todos.py +3 -2
- package/runtime/claude/egregore_runtime/upgrade.py +85 -58
- package/runtime/claude/egregore_runtime/writeback.py +330 -24
- package/runtime/claude/manifest.json +65 -5
- package/runtime/codex/.claude/context/handoff-claiming.md +32 -0
- package/runtime/codex/.claude/context/notification-consent.md +12 -9
- package/runtime/codex/.claude/skills/view/SKILL.md +438 -0
- package/runtime/codex/.codex/hooks.json +11 -0
- package/runtime/codex/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/records/SKILL.md +29 -0
- package/runtime/codex/.codex/skills/summon/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/view/assets/compose-scaffold.html +19 -13
- package/runtime/codex/.codex/spec-manifest.json +13 -19
- package/runtime/codex/AGENTS.md +54 -105
- package/runtime/codex/bin/agent.sh +231 -7
- package/runtime/codex/bin/api-call.sh +44 -23
- package/runtime/codex/bin/artifact-register.sh +7 -1
- package/runtime/codex/bin/artifact-writeback.sh +1 -1
- package/runtime/codex/bin/artifacts.sh +66 -265
- package/runtime/codex/bin/attendant.sh +4 -1
- package/runtime/codex/bin/boundary-guard.cjs +1848 -0
- package/runtime/codex/bin/boundary-hook.sh +41 -0
- package/runtime/codex/bin/capture-run.sh +32 -2
- package/runtime/codex/bin/codex-render-spec.mjs +24 -46
- package/runtime/codex/bin/codex-session-start.sh +19 -0
- package/runtime/codex/bin/codex-skill-render.mjs +18 -0
- package/runtime/codex/bin/config-get.sh +10 -1
- package/runtime/codex/bin/connect-refresh.sh +16 -0
- package/runtime/codex/bin/corpus_map.py +5 -0
- package/runtime/codex/bin/data/capabilities/codex.json +1458 -0
- package/runtime/codex/bin/genui.sh +19 -0
- package/runtime/codex/bin/graph-batch.sh +1 -1
- package/runtime/codex/bin/graph-op.sh +14 -0
- package/runtime/codex/bin/graph.sh +1 -1
- package/runtime/codex/bin/handoff-pr-backfill.sh +1 -1
- package/runtime/codex/bin/handoff-run.sh +11 -6
- package/runtime/codex/bin/ingest-item.sh +1 -1
- package/runtime/codex/bin/ingest-surface.html +22 -4
- package/runtime/codex/bin/issue.sh +1 -1
- package/runtime/codex/bin/knowledge.sh +1 -1
- package/runtime/codex/bin/lib/card-delivery.sh +329 -0
- package/runtime/codex/bin/lib/config.sh +148 -3
- package/runtime/codex/bin/lib/context.sh +38 -67
- package/runtime/codex/bin/lib/genui-entry.py +36 -0
- package/runtime/codex/bin/lib/git-message.sh +25 -6
- package/runtime/codex/bin/lib/git-sync.sh +12 -4
- package/runtime/codex/bin/lib/greeting.sh +255 -28
- package/runtime/codex/bin/lib/handoff_meta.py +294 -0
- package/runtime/codex/bin/lib/health-footer.sh +83 -2
- package/runtime/codex/bin/lib/identity.sh +31 -10
- package/runtime/codex/bin/lib/instance-registry.sh +71 -0
- package/runtime/codex/bin/lib/local_ci_receipt.py +249 -0
- package/runtime/codex/bin/lib/metrics.sh +121 -8
- package/runtime/codex/bin/lib/notices.sh +36 -0
- package/runtime/codex/bin/lib/record_outcomes.py +729 -0
- package/runtime/codex/bin/lib/reflexes.py +267 -0
- package/runtime/codex/bin/lib/retrieval_scorecard.py +624 -0
- package/runtime/codex/bin/lib/session-record-prompt.txt +18 -0
- package/runtime/codex/bin/lib/session_record.py +3747 -0
- package/runtime/codex/bin/lib/session_trail.py +1983 -0
- package/runtime/codex/bin/lib/settings-drift.sh +8 -5
- package/runtime/codex/bin/lib/startup-restart.sh +41 -0
- package/runtime/codex/bin/lib/worktree-links.sh +92 -0
- package/runtime/codex/bin/memory-push.sh +6 -0
- package/runtime/codex/bin/merge-gate.sh +498 -0
- package/runtime/codex/bin/notify.sh +5 -2
- package/runtime/codex/bin/page-access.sh +103 -0
- package/runtime/codex/bin/person.sh +13 -2
- package/runtime/codex/bin/pi-render-spec.mjs +0 -1
- package/runtime/codex/bin/pi-spirit-discovery.mjs +34 -0
- package/runtime/codex/bin/post-update.sh +181 -0
- package/runtime/codex/bin/prime-render-spec.mjs +0 -1
- package/runtime/codex/bin/publish-artifact.sh +89 -42
- package/runtime/codex/bin/qa-inventory.sh +2 -2
- package/runtime/codex/bin/quest.sh +1 -1
- package/runtime/codex/bin/records.sh +11 -0
- package/runtime/codex/bin/reflexes/05-vitals.sh +9 -0
- package/runtime/codex/bin/reflexes/10-open-items.sh +12 -0
- package/runtime/codex/bin/reflexes/15-retrieval.sh +8 -0
- package/runtime/codex/bin/reflexes/20-nightly.sh +100 -0
- package/runtime/codex/bin/reflexes/20-sandbox.sh +85 -0
- package/runtime/codex/bin/reflexes/30-cost.py +116 -0
- package/runtime/codex/bin/reflexes/40-shells.py +51 -0
- package/runtime/codex/bin/reflexes/README.md +61 -0
- package/runtime/codex/bin/reflexes.sh +7 -0
- package/runtime/codex/bin/runtime-identity.sh +140 -42
- package/runtime/codex/bin/screenshot.sh +77 -0
- package/runtime/codex/bin/scroll.sh +1 -1
- package/runtime/codex/bin/search.sh +31 -5
- package/runtime/codex/bin/session-autosave.sh +6 -3
- package/runtime/codex/bin/session-id.sh +147 -0
- package/runtime/codex/bin/session-log.sh +19 -0
- package/runtime/codex/bin/session-record.sh +26 -0
- package/runtime/codex/bin/settings.sh +13 -8
- package/runtime/codex/bin/spirit-discovery-claude.sh +4 -0
- package/runtime/codex/bin/spirit-discovery-codex.sh +4 -0
- package/runtime/codex/bin/spirit-discovery-pi.sh +4 -0
- package/runtime/codex/bin/spirit-discovery-prime.sh +4 -0
- package/runtime/codex/bin/spirit-discovery.sh +4 -0
- package/runtime/codex/bin/startup-check.sh +1 -1
- package/runtime/codex/bin/telemetry.sh +11 -4
- package/runtime/codex/bin/test-baseline.sh +33 -5
- package/runtime/codex/bin/todo.sh +1 -1
- package/runtime/codex/bin/worktree-create.sh +15 -45
- package/runtime/codex/bin/worktree.sh +6 -0
- package/runtime/codex/docs/spirit-discovery.md +96 -0
- package/runtime/codex/egregore_runtime/__init__.py +18 -12
- package/runtime/codex/egregore_runtime/access.py +608 -0
- package/runtime/codex/egregore_runtime/access_cli.py +190 -0
- package/runtime/codex/egregore_runtime/adapters/invitation.py +5 -3
- package/runtime/codex/egregore_runtime/adapters/qmd.py +521 -47
- package/runtime/codex/egregore_runtime/admin_entry.py +56 -0
- package/runtime/codex/egregore_runtime/artifacts.py +222 -16
- package/runtime/codex/egregore_runtime/contracts.py +27 -0
- package/runtime/codex/egregore_runtime/eligibility.py +5 -12
- package/runtime/codex/egregore_runtime/episode_binding.py +16 -5
- package/runtime/codex/egregore_runtime/github_issues.py +2 -2
- package/runtime/codex/egregore_runtime/handoff_lookup.py +9 -20
- package/runtime/codex/egregore_runtime/harness_cli.py +674 -149
- package/runtime/codex/egregore_runtime/held.py +2436 -0
- package/runtime/codex/egregore_runtime/hosted_api.py +137 -0
- package/runtime/codex/egregore_runtime/identity.py +196 -65
- package/runtime/codex/egregore_runtime/identity_transfer.py +6 -2
- package/runtime/codex/egregore_runtime/ingest_cli.py +2 -2
- package/runtime/codex/egregore_runtime/ingest_index_cli.py +4 -16
- package/runtime/codex/egregore_runtime/installation.py +119 -0
- package/runtime/codex/egregore_runtime/investigation.py +64 -41
- package/runtime/codex/egregore_runtime/investigation_guidance.py +16 -11
- package/runtime/codex/egregore_runtime/issue_cli.py +51 -32
- package/runtime/codex/egregore_runtime/issue_reporting.py +4 -3
- package/runtime/codex/egregore_runtime/issue_triage_service.py +2 -2
- package/runtime/codex/egregore_runtime/issues.py +12 -6
- package/runtime/codex/egregore_runtime/knowledge.py +331 -5
- package/runtime/codex/egregore_runtime/knowledge_cli.py +57 -17
- package/runtime/codex/egregore_runtime/lifecycle.py +88 -22
- package/runtime/codex/egregore_runtime/lifecycle_cli.py +21 -13
- package/runtime/codex/egregore_runtime/line_ids.py +10 -0
- package/runtime/codex/egregore_runtime/memory_push.py +349 -0
- package/runtime/codex/egregore_runtime/observe.py +64 -25
- package/runtime/codex/egregore_runtime/observers.py +19 -0
- package/runtime/codex/egregore_runtime/optional_modules.py +13 -0
- package/runtime/codex/egregore_runtime/outputs_cli.py +321 -0
- package/runtime/codex/egregore_runtime/policy.py +651 -24
- package/runtime/codex/egregore_runtime/private_result.py +2 -1
- package/runtime/codex/egregore_runtime/projection.py +946 -0
- package/runtime/codex/egregore_runtime/quest_cli.py +20 -23
- package/runtime/codex/egregore_runtime/question_cli.py +15 -11
- package/runtime/codex/egregore_runtime/questions.py +10 -10
- package/runtime/codex/egregore_runtime/quests.py +10 -10
- package/runtime/codex/egregore_runtime/record_publish.py +548 -0
- package/runtime/codex/egregore_runtime/record_subject.py +564 -0
- package/runtime/codex/egregore_runtime/research_ingest.py +2 -4
- package/runtime/codex/egregore_runtime/runtime.py +169 -60
- package/runtime/codex/egregore_runtime/sandbox.py +194 -0
- package/runtime/codex/egregore_runtime/scroll_cli.py +22 -32
- package/runtime/codex/egregore_runtime/scrolls.py +23 -15
- package/runtime/codex/egregore_runtime/shadow.py +262 -0
- package/runtime/codex/egregore_runtime/spirit_discovery.py +487 -0
- package/runtime/codex/egregore_runtime/spirit_discovery_cli.py +25 -0
- package/runtime/codex/egregore_runtime/spirit_discovery_transport.py +18 -0
- package/runtime/codex/egregore_runtime/status.py +101 -44
- package/runtime/codex/egregore_runtime/status_cli.py +13 -5
- package/runtime/codex/egregore_runtime/sync.py +39 -21
- package/runtime/codex/egregore_runtime/taste.py +934 -0
- package/runtime/codex/egregore_runtime/taste_cli.py +242 -0
- package/runtime/codex/egregore_runtime/taste_rules.py +91 -0
- package/runtime/codex/egregore_runtime/telemetry.py +26 -3
- package/runtime/codex/egregore_runtime/todo_cli.py +15 -12
- package/runtime/codex/egregore_runtime/todos.py +3 -2
- package/runtime/codex/egregore_runtime/upgrade.py +85 -58
- package/runtime/codex/egregore_runtime/writeback.py +330 -24
- package/runtime/codex/manifest.json +66 -5
- package/runtime/pi/.claude/context/handoff-claiming.md +32 -0
- package/runtime/pi/.claude/context/notification-consent.md +12 -9
- package/runtime/pi/.claude/skills/view/SKILL.md +438 -0
- package/runtime/pi/.codex/hooks.json +11 -0
- package/runtime/pi/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/records/SKILL.md +29 -0
- package/runtime/pi/.codex/skills/summon/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/view/assets/compose-scaffold.html +19 -13
- package/runtime/pi/.codex/spec-manifest.json +13 -19
- package/runtime/pi/.pi/APPEND_SYSTEM.md +53 -99
- package/runtime/pi/.pi/extensions/egregore.ts +13 -1
- package/runtime/pi/.pi/spec-manifest.json +2 -2
- package/runtime/pi/AGENTS.md +54 -105
- package/runtime/pi/bin/agent.sh +231 -7
- package/runtime/pi/bin/api-call.sh +44 -23
- package/runtime/pi/bin/artifact-register.sh +7 -1
- package/runtime/pi/bin/artifact-writeback.sh +1 -1
- package/runtime/pi/bin/artifacts.sh +66 -265
- package/runtime/pi/bin/attendant.sh +4 -1
- package/runtime/pi/bin/boundary-guard.cjs +1848 -0
- package/runtime/pi/bin/boundary-hook.sh +41 -0
- package/runtime/pi/bin/capture-run.sh +32 -2
- package/runtime/pi/bin/codex-render-spec.mjs +24 -46
- package/runtime/pi/bin/codex-session-start.sh +19 -0
- package/runtime/pi/bin/codex-skill-render.mjs +18 -0
- package/runtime/pi/bin/config-get.sh +10 -1
- package/runtime/pi/bin/connect-refresh.sh +16 -0
- package/runtime/pi/bin/corpus_map.py +5 -0
- package/runtime/pi/bin/data/capabilities/pi.json +1458 -0
- package/runtime/pi/bin/genui.sh +19 -0
- package/runtime/pi/bin/graph-batch.sh +1 -1
- package/runtime/pi/bin/graph-op.sh +14 -0
- package/runtime/pi/bin/graph.sh +1 -1
- package/runtime/pi/bin/handoff-pr-backfill.sh +1 -1
- package/runtime/pi/bin/handoff-run.sh +11 -6
- package/runtime/pi/bin/ingest-item.sh +1 -1
- package/runtime/pi/bin/ingest-surface.html +22 -4
- package/runtime/pi/bin/issue.sh +1 -1
- package/runtime/pi/bin/knowledge.sh +1 -1
- package/runtime/pi/bin/lib/card-delivery.sh +329 -0
- package/runtime/pi/bin/lib/config.sh +148 -3
- package/runtime/pi/bin/lib/context.sh +38 -67
- package/runtime/pi/bin/lib/genui-entry.py +36 -0
- package/runtime/pi/bin/lib/git-message.sh +25 -6
- package/runtime/pi/bin/lib/git-sync.sh +12 -4
- package/runtime/pi/bin/lib/greeting.sh +255 -28
- package/runtime/pi/bin/lib/handoff_meta.py +294 -0
- package/runtime/pi/bin/lib/health-footer.sh +83 -2
- package/runtime/pi/bin/lib/identity.sh +31 -10
- package/runtime/pi/bin/lib/instance-registry.sh +71 -0
- package/runtime/pi/bin/lib/local_ci_receipt.py +249 -0
- package/runtime/pi/bin/lib/metrics.sh +121 -8
- package/runtime/pi/bin/lib/notices.sh +36 -0
- package/runtime/pi/bin/lib/record_outcomes.py +729 -0
- package/runtime/pi/bin/lib/reflexes.py +267 -0
- package/runtime/pi/bin/lib/retrieval_scorecard.py +624 -0
- package/runtime/pi/bin/lib/session-record-prompt.txt +18 -0
- package/runtime/pi/bin/lib/session_record.py +3747 -0
- package/runtime/pi/bin/lib/session_trail.py +1983 -0
- package/runtime/pi/bin/lib/settings-drift.sh +8 -5
- package/runtime/pi/bin/lib/startup-restart.sh +41 -0
- package/runtime/pi/bin/lib/worktree-links.sh +92 -0
- package/runtime/pi/bin/memory-push.sh +6 -0
- package/runtime/pi/bin/merge-gate.sh +498 -0
- package/runtime/pi/bin/notify.sh +5 -2
- package/runtime/pi/bin/page-access.sh +103 -0
- package/runtime/pi/bin/person.sh +13 -2
- package/runtime/pi/bin/pi-branch-policy.mjs +37 -0
- package/runtime/pi/bin/pi-observe-context.mjs +97 -4
- package/runtime/pi/bin/pi-render-spec.mjs +0 -1
- package/runtime/pi/bin/pi-session-start.sh +4 -1
- package/runtime/pi/bin/pi-spirit-discovery.mjs +34 -0
- package/runtime/pi/bin/post-update.sh +181 -0
- package/runtime/pi/bin/prime-render-spec.mjs +0 -1
- package/runtime/pi/bin/publish-artifact.sh +89 -42
- package/runtime/pi/bin/qa-inventory.sh +2 -2
- package/runtime/pi/bin/quest.sh +1 -1
- package/runtime/pi/bin/records.sh +11 -0
- package/runtime/pi/bin/reflexes/05-vitals.sh +9 -0
- package/runtime/pi/bin/reflexes/10-open-items.sh +12 -0
- package/runtime/pi/bin/reflexes/15-retrieval.sh +8 -0
- package/runtime/pi/bin/reflexes/20-nightly.sh +100 -0
- package/runtime/pi/bin/reflexes/20-sandbox.sh +85 -0
- package/runtime/pi/bin/reflexes/30-cost.py +116 -0
- package/runtime/pi/bin/reflexes/40-shells.py +51 -0
- package/runtime/pi/bin/reflexes/README.md +61 -0
- package/runtime/pi/bin/reflexes.sh +7 -0
- package/runtime/pi/bin/runtime-identity.sh +140 -42
- package/runtime/pi/bin/screenshot.sh +77 -0
- package/runtime/pi/bin/scroll.sh +1 -1
- package/runtime/pi/bin/search.sh +31 -5
- package/runtime/pi/bin/session-autosave.sh +6 -3
- package/runtime/pi/bin/session-id.sh +147 -0
- package/runtime/pi/bin/session-log.sh +19 -0
- package/runtime/pi/bin/session-record.sh +26 -0
- package/runtime/pi/bin/settings.sh +13 -8
- package/runtime/pi/bin/spirit-discovery-claude.sh +4 -0
- package/runtime/pi/bin/spirit-discovery-codex.sh +4 -0
- package/runtime/pi/bin/spirit-discovery-pi.sh +4 -0
- package/runtime/pi/bin/spirit-discovery-prime.sh +4 -0
- package/runtime/pi/bin/spirit-discovery.sh +4 -0
- package/runtime/pi/bin/startup-check.sh +1 -1
- package/runtime/pi/bin/telemetry.sh +11 -4
- package/runtime/pi/bin/test-baseline.sh +33 -5
- package/runtime/pi/bin/todo.sh +1 -1
- package/runtime/pi/bin/worktree-create.sh +15 -45
- package/runtime/pi/bin/worktree.sh +6 -0
- package/runtime/pi/docs/spirit-discovery.md +96 -0
- package/runtime/pi/egregore_runtime/__init__.py +18 -12
- package/runtime/pi/egregore_runtime/access.py +608 -0
- package/runtime/pi/egregore_runtime/access_cli.py +190 -0
- package/runtime/pi/egregore_runtime/adapters/invitation.py +5 -3
- package/runtime/pi/egregore_runtime/adapters/qmd.py +521 -47
- package/runtime/pi/egregore_runtime/admin_entry.py +56 -0
- package/runtime/pi/egregore_runtime/artifacts.py +222 -16
- package/runtime/pi/egregore_runtime/contracts.py +27 -0
- package/runtime/pi/egregore_runtime/eligibility.py +5 -12
- package/runtime/pi/egregore_runtime/episode_binding.py +16 -5
- package/runtime/pi/egregore_runtime/github_issues.py +2 -2
- package/runtime/pi/egregore_runtime/handoff_lookup.py +9 -20
- package/runtime/pi/egregore_runtime/harness_cli.py +674 -149
- package/runtime/pi/egregore_runtime/held.py +2436 -0
- package/runtime/pi/egregore_runtime/hosted_api.py +137 -0
- package/runtime/pi/egregore_runtime/identity.py +196 -65
- package/runtime/pi/egregore_runtime/identity_transfer.py +6 -2
- package/runtime/pi/egregore_runtime/ingest_cli.py +2 -2
- package/runtime/pi/egregore_runtime/ingest_index_cli.py +4 -16
- package/runtime/pi/egregore_runtime/installation.py +119 -0
- package/runtime/pi/egregore_runtime/investigation.py +64 -41
- package/runtime/pi/egregore_runtime/investigation_guidance.py +16 -11
- package/runtime/pi/egregore_runtime/issue_cli.py +51 -32
- package/runtime/pi/egregore_runtime/issue_reporting.py +4 -3
- package/runtime/pi/egregore_runtime/issue_triage_service.py +2 -2
- package/runtime/pi/egregore_runtime/issues.py +12 -6
- package/runtime/pi/egregore_runtime/knowledge.py +331 -5
- package/runtime/pi/egregore_runtime/knowledge_cli.py +57 -17
- package/runtime/pi/egregore_runtime/lifecycle.py +88 -22
- package/runtime/pi/egregore_runtime/lifecycle_cli.py +21 -13
- package/runtime/pi/egregore_runtime/line_ids.py +10 -0
- package/runtime/pi/egregore_runtime/memory_push.py +349 -0
- package/runtime/pi/egregore_runtime/observe.py +64 -25
- package/runtime/pi/egregore_runtime/observers.py +19 -0
- package/runtime/pi/egregore_runtime/optional_modules.py +13 -0
- package/runtime/pi/egregore_runtime/outputs_cli.py +321 -0
- package/runtime/pi/egregore_runtime/policy.py +651 -24
- package/runtime/pi/egregore_runtime/private_result.py +2 -1
- package/runtime/pi/egregore_runtime/projection.py +946 -0
- package/runtime/pi/egregore_runtime/quest_cli.py +20 -23
- package/runtime/pi/egregore_runtime/question_cli.py +15 -11
- package/runtime/pi/egregore_runtime/questions.py +10 -10
- package/runtime/pi/egregore_runtime/quests.py +10 -10
- package/runtime/pi/egregore_runtime/record_publish.py +548 -0
- package/runtime/pi/egregore_runtime/record_subject.py +564 -0
- package/runtime/pi/egregore_runtime/research_ingest.py +2 -4
- package/runtime/pi/egregore_runtime/runtime.py +169 -60
- package/runtime/pi/egregore_runtime/sandbox.py +194 -0
- package/runtime/pi/egregore_runtime/scroll_cli.py +22 -32
- package/runtime/pi/egregore_runtime/scrolls.py +23 -15
- package/runtime/pi/egregore_runtime/shadow.py +262 -0
- package/runtime/pi/egregore_runtime/spirit_discovery.py +487 -0
- package/runtime/pi/egregore_runtime/spirit_discovery_cli.py +25 -0
- package/runtime/pi/egregore_runtime/spirit_discovery_transport.py +18 -0
- package/runtime/pi/egregore_runtime/status.py +101 -44
- package/runtime/pi/egregore_runtime/status_cli.py +13 -5
- package/runtime/pi/egregore_runtime/sync.py +39 -21
- package/runtime/pi/egregore_runtime/taste.py +934 -0
- package/runtime/pi/egregore_runtime/taste_cli.py +242 -0
- package/runtime/pi/egregore_runtime/taste_rules.py +91 -0
- package/runtime/pi/egregore_runtime/telemetry.py +26 -3
- package/runtime/pi/egregore_runtime/todo_cli.py +15 -12
- package/runtime/pi/egregore_runtime/todos.py +3 -2
- package/runtime/pi/egregore_runtime/upgrade.py +85 -58
- package/runtime/pi/egregore_runtime/writeback.py +330 -24
- package/runtime/pi/manifest.json +66 -5
- package/runtime/prime/.claude/context/handoff-claiming.md +32 -0
- package/runtime/prime/.claude/context/notification-consent.md +12 -9
- package/runtime/prime/.claude/skills/view/SKILL.md +438 -0
- package/runtime/prime/.codex/hooks.json +11 -0
- package/runtime/prime/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/records/SKILL.md +29 -0
- package/runtime/prime/.codex/skills/summon/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/view/assets/compose-scaffold.html +19 -13
- package/runtime/prime/.codex/spec-manifest.json +13 -19
- package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +53 -99
- package/runtime/prime/.prime/agent/extensions/egregore.ts +14 -1
- package/runtime/prime/.prime/agent/skills/egregore/SKILL.md +14 -6
- package/runtime/prime/.prime/agent/skills/egregore/src/egregore/__init__.py +66 -1
- package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
- package/runtime/prime/AGENTS.md +54 -105
- package/runtime/prime/bin/agent.sh +231 -7
- package/runtime/prime/bin/api-call.sh +44 -23
- package/runtime/prime/bin/artifact-register.sh +7 -1
- package/runtime/prime/bin/artifact-writeback.sh +1 -1
- package/runtime/prime/bin/artifacts.sh +66 -265
- package/runtime/prime/bin/attendant.sh +4 -1
- package/runtime/prime/bin/boundary-guard.cjs +1848 -0
- package/runtime/prime/bin/boundary-hook.sh +41 -0
- package/runtime/prime/bin/capture-run.sh +32 -2
- package/runtime/prime/bin/codex-render-spec.mjs +24 -46
- package/runtime/prime/bin/codex-session-start.sh +19 -0
- package/runtime/prime/bin/codex-skill-render.mjs +18 -0
- package/runtime/prime/bin/config-get.sh +10 -1
- package/runtime/prime/bin/connect-refresh.sh +16 -0
- package/runtime/prime/bin/corpus_map.py +5 -0
- package/runtime/prime/bin/data/capabilities/prime.json +1458 -0
- package/runtime/prime/bin/genui.sh +19 -0
- package/runtime/prime/bin/graph-batch.sh +1 -1
- package/runtime/prime/bin/graph-op.sh +14 -0
- package/runtime/prime/bin/graph.sh +1 -1
- package/runtime/prime/bin/handoff-pr-backfill.sh +1 -1
- package/runtime/prime/bin/handoff-run.sh +11 -6
- package/runtime/prime/bin/ingest-item.sh +1 -1
- package/runtime/prime/bin/ingest-surface.html +22 -4
- package/runtime/prime/bin/issue.sh +1 -1
- package/runtime/prime/bin/knowledge.sh +1 -1
- package/runtime/prime/bin/lib/card-delivery.sh +329 -0
- package/runtime/prime/bin/lib/config.sh +148 -3
- package/runtime/prime/bin/lib/context.sh +38 -67
- package/runtime/prime/bin/lib/genui-entry.py +36 -0
- package/runtime/prime/bin/lib/git-message.sh +25 -6
- package/runtime/prime/bin/lib/git-sync.sh +12 -4
- package/runtime/prime/bin/lib/greeting.sh +255 -28
- package/runtime/prime/bin/lib/handoff_meta.py +294 -0
- package/runtime/prime/bin/lib/health-footer.sh +83 -2
- package/runtime/prime/bin/lib/identity.sh +31 -10
- package/runtime/prime/bin/lib/instance-registry.sh +71 -0
- package/runtime/prime/bin/lib/local_ci_receipt.py +249 -0
- package/runtime/prime/bin/lib/metrics.sh +121 -8
- package/runtime/prime/bin/lib/notices.sh +36 -0
- package/runtime/prime/bin/lib/record_outcomes.py +729 -0
- package/runtime/prime/bin/lib/reflexes.py +267 -0
- package/runtime/prime/bin/lib/retrieval_scorecard.py +624 -0
- package/runtime/prime/bin/lib/session-record-prompt.txt +18 -0
- package/runtime/prime/bin/lib/session_record.py +3747 -0
- package/runtime/prime/bin/lib/session_trail.py +1983 -0
- package/runtime/prime/bin/lib/settings-drift.sh +8 -5
- package/runtime/prime/bin/lib/startup-restart.sh +41 -0
- package/runtime/prime/bin/lib/worktree-links.sh +92 -0
- package/runtime/prime/bin/memory-push.sh +6 -0
- package/runtime/prime/bin/merge-gate.sh +498 -0
- package/runtime/prime/bin/notify.sh +5 -2
- package/runtime/prime/bin/page-access.sh +103 -0
- package/runtime/prime/bin/person.sh +13 -2
- package/runtime/prime/bin/pi-branch-policy.mjs +37 -0
- package/runtime/prime/bin/pi-observe-context.mjs +97 -4
- package/runtime/prime/bin/pi-render-spec.mjs +0 -1
- package/runtime/prime/bin/pi-spirit-discovery.mjs +34 -0
- package/runtime/prime/bin/post-update.sh +181 -0
- package/runtime/prime/bin/prime-render-spec.mjs +0 -1
- package/runtime/prime/bin/prime-session-start.sh +3 -1
- package/runtime/prime/bin/publish-artifact.sh +89 -42
- package/runtime/prime/bin/qa-inventory.sh +2 -2
- package/runtime/prime/bin/quest.sh +1 -1
- package/runtime/prime/bin/records.sh +11 -0
- package/runtime/prime/bin/reflexes/05-vitals.sh +9 -0
- package/runtime/prime/bin/reflexes/10-open-items.sh +12 -0
- package/runtime/prime/bin/reflexes/15-retrieval.sh +8 -0
- package/runtime/prime/bin/reflexes/20-nightly.sh +100 -0
- package/runtime/prime/bin/reflexes/20-sandbox.sh +85 -0
- package/runtime/prime/bin/reflexes/30-cost.py +116 -0
- package/runtime/prime/bin/reflexes/40-shells.py +51 -0
- package/runtime/prime/bin/reflexes/README.md +61 -0
- package/runtime/prime/bin/reflexes.sh +7 -0
- package/runtime/prime/bin/runtime-identity.sh +140 -42
- package/runtime/prime/bin/screenshot.sh +77 -0
- package/runtime/prime/bin/scroll.sh +1 -1
- package/runtime/prime/bin/search.sh +31 -5
- package/runtime/prime/bin/session-autosave.sh +6 -3
- package/runtime/prime/bin/session-id.sh +147 -0
- package/runtime/prime/bin/session-log.sh +19 -0
- package/runtime/prime/bin/session-record.sh +26 -0
- package/runtime/prime/bin/settings.sh +13 -8
- package/runtime/prime/bin/spirit-discovery-claude.sh +4 -0
- package/runtime/prime/bin/spirit-discovery-codex.sh +4 -0
- package/runtime/prime/bin/spirit-discovery-pi.sh +4 -0
- package/runtime/prime/bin/spirit-discovery-prime.sh +4 -0
- package/runtime/prime/bin/spirit-discovery.sh +4 -0
- package/runtime/prime/bin/startup-check.sh +1 -1
- package/runtime/prime/bin/telemetry.sh +11 -4
- package/runtime/prime/bin/test-baseline.sh +33 -5
- package/runtime/prime/bin/todo.sh +1 -1
- package/runtime/prime/bin/worktree-create.sh +15 -45
- package/runtime/prime/bin/worktree.sh +6 -0
- package/runtime/prime/docs/spirit-discovery.md +96 -0
- package/runtime/prime/egregore_runtime/__init__.py +18 -12
- package/runtime/prime/egregore_runtime/access.py +608 -0
- package/runtime/prime/egregore_runtime/access_cli.py +190 -0
- package/runtime/prime/egregore_runtime/adapters/invitation.py +5 -3
- package/runtime/prime/egregore_runtime/adapters/qmd.py +521 -47
- package/runtime/prime/egregore_runtime/admin_entry.py +56 -0
- package/runtime/prime/egregore_runtime/artifacts.py +222 -16
- package/runtime/prime/egregore_runtime/contracts.py +27 -0
- package/runtime/prime/egregore_runtime/eligibility.py +5 -12
- package/runtime/prime/egregore_runtime/episode_binding.py +16 -5
- package/runtime/prime/egregore_runtime/github_issues.py +2 -2
- package/runtime/prime/egregore_runtime/handoff_lookup.py +9 -20
- package/runtime/prime/egregore_runtime/harness_cli.py +674 -149
- package/runtime/prime/egregore_runtime/held.py +2436 -0
- package/runtime/prime/egregore_runtime/hosted_api.py +137 -0
- package/runtime/prime/egregore_runtime/identity.py +196 -65
- package/runtime/prime/egregore_runtime/identity_transfer.py +6 -2
- package/runtime/prime/egregore_runtime/ingest_cli.py +2 -2
- package/runtime/prime/egregore_runtime/ingest_index_cli.py +4 -16
- package/runtime/prime/egregore_runtime/installation.py +119 -0
- package/runtime/prime/egregore_runtime/investigation.py +64 -41
- package/runtime/prime/egregore_runtime/investigation_guidance.py +16 -11
- package/runtime/prime/egregore_runtime/issue_cli.py +51 -32
- package/runtime/prime/egregore_runtime/issue_reporting.py +4 -3
- package/runtime/prime/egregore_runtime/issue_triage_service.py +2 -2
- package/runtime/prime/egregore_runtime/issues.py +12 -6
- package/runtime/prime/egregore_runtime/knowledge.py +331 -5
- package/runtime/prime/egregore_runtime/knowledge_cli.py +57 -17
- package/runtime/prime/egregore_runtime/lifecycle.py +88 -22
- package/runtime/prime/egregore_runtime/lifecycle_cli.py +21 -13
- package/runtime/prime/egregore_runtime/line_ids.py +10 -0
- package/runtime/prime/egregore_runtime/memory_push.py +349 -0
- package/runtime/prime/egregore_runtime/observe.py +64 -25
- package/runtime/prime/egregore_runtime/observers.py +19 -0
- package/runtime/prime/egregore_runtime/optional_modules.py +13 -0
- package/runtime/prime/egregore_runtime/outputs_cli.py +321 -0
- package/runtime/prime/egregore_runtime/policy.py +651 -24
- package/runtime/prime/egregore_runtime/private_result.py +2 -1
- package/runtime/prime/egregore_runtime/projection.py +946 -0
- package/runtime/prime/egregore_runtime/quest_cli.py +20 -23
- package/runtime/prime/egregore_runtime/question_cli.py +15 -11
- package/runtime/prime/egregore_runtime/questions.py +10 -10
- package/runtime/prime/egregore_runtime/quests.py +10 -10
- package/runtime/prime/egregore_runtime/record_publish.py +548 -0
- package/runtime/prime/egregore_runtime/record_subject.py +564 -0
- package/runtime/prime/egregore_runtime/research_ingest.py +2 -4
- package/runtime/prime/egregore_runtime/runtime.py +169 -60
- package/runtime/prime/egregore_runtime/sandbox.py +194 -0
- package/runtime/prime/egregore_runtime/scroll_cli.py +22 -32
- package/runtime/prime/egregore_runtime/scrolls.py +23 -15
- package/runtime/prime/egregore_runtime/shadow.py +262 -0
- package/runtime/prime/egregore_runtime/spirit_discovery.py +487 -0
- package/runtime/prime/egregore_runtime/spirit_discovery_cli.py +25 -0
- package/runtime/prime/egregore_runtime/spirit_discovery_transport.py +18 -0
- package/runtime/prime/egregore_runtime/status.py +101 -44
- package/runtime/prime/egregore_runtime/status_cli.py +13 -5
- package/runtime/prime/egregore_runtime/sync.py +39 -21
- package/runtime/prime/egregore_runtime/taste.py +934 -0
- package/runtime/prime/egregore_runtime/taste_cli.py +242 -0
- package/runtime/prime/egregore_runtime/taste_rules.py +91 -0
- package/runtime/prime/egregore_runtime/telemetry.py +26 -3
- package/runtime/prime/egregore_runtime/todo_cli.py +15 -12
- package/runtime/prime/egregore_runtime/todos.py +3 -2
- package/runtime/prime/egregore_runtime/upgrade.py +85 -58
- package/runtime/prime/egregore_runtime/writeback.py +330 -24
- package/runtime/prime/manifest.json +66 -5
- package/runtime/claude/bin/thread.sh +0 -9
- package/runtime/claude/egregore_runtime/admin_gate.py +0 -102
- package/runtime/claude/egregore_runtime/thread_cli.py +0 -173
- package/runtime/claude/egregore_runtime/threads.py +0 -521
- package/runtime/codex/bin/thread.sh +0 -9
- package/runtime/codex/egregore_runtime/admin_gate.py +0 -102
- package/runtime/codex/egregore_runtime/thread_cli.py +0 -173
- package/runtime/codex/egregore_runtime/threads.py +0 -521
- package/runtime/pi/bin/thread.sh +0 -9
- package/runtime/pi/egregore_runtime/admin_gate.py +0 -102
- package/runtime/pi/egregore_runtime/thread_cli.py +0 -173
- package/runtime/pi/egregore_runtime/threads.py +0 -521
- package/runtime/prime/bin/thread.sh +0 -9
- package/runtime/prime/egregore_runtime/admin_gate.py +0 -102
- package/runtime/prime/egregore_runtime/thread_cli.py +0 -173
- package/runtime/prime/egregore_runtime/threads.py +0 -521
|
@@ -25,6 +25,126 @@ _config_val() {
|
|
|
25
25
|
fi
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
# --- Hosted API address -------------------------------------------------------
|
|
29
|
+
# The hosted API moved to api.egregore.xyz after the October 2026 security
|
|
30
|
+
# reset. Its old Railway origin is retired and no longer ours to trust: a token
|
|
31
|
+
# or key sent there could reach whoever holds that address next. Every request
|
|
32
|
+
# that carries a credential resolves its address through _hosted_api_url, so an
|
|
33
|
+
# egregore.json or environment saved before the move never reaches it.
|
|
34
|
+
#
|
|
35
|
+
# The rule is an allowlist, not a normalizer. Only a plain web address is
|
|
36
|
+
# used: http or https, a host of letters, digits, dots, hyphens and
|
|
37
|
+
# underscores, an optional port and a plain path. Every transport reads such
|
|
38
|
+
# an address the same way, so its host is the one the request reaches. A plain
|
|
39
|
+
# address on the retired host becomes the hosted API; any other plain address
|
|
40
|
+
# is kept. Anything else (userinfo, backslashes, percent-encoding, curl glob
|
|
41
|
+
# characters, a query, whitespace inside, non-ASCII) is refused and nothing is
|
|
42
|
+
# sent, because curl, urllib and WHATWG parsers disagree about where it goes.
|
|
43
|
+
# Python: egregore_runtime/hosted_api.py. Node: packages/create-egregore/lib/
|
|
44
|
+
# hosted-api.js and the launcher's inline copy. TypeScript: bin/connector-
|
|
45
|
+
# google/src/hosted-api.ts. bin/tests/fixtures/hosted-api-url-vectors.json
|
|
46
|
+
# holds all of them to one rule and one table.
|
|
47
|
+
EGREGORE_HOSTED_API_ORIGIN="https://api.egregore.xyz"
|
|
48
|
+
EGREGORE_RETIRED_API_ORIGIN="https://egregore-production-55f2.up.railway.app"
|
|
49
|
+
EGREGORE_PLAIN_API_URL='^https?://([A-Za-z0-9._-]+)(:[0-9]{1,5})?(/[A-Za-z0-9._~/-]*)?$'
|
|
50
|
+
EGREGORE_PLAIN_API_TARGET='^https?://([A-Za-z0-9._-]+)(:[0-9]{1,5})?([/?#][!-~]*)?$'
|
|
51
|
+
EGREGORE_REFUSED_API_URL_NOTICE="The hosted services address isn't a plain web address, so nothing was sent. Correct api_url in egregore.json; the hosted address is $EGREGORE_HOSTED_API_ORIGIN."
|
|
52
|
+
|
|
53
|
+
# _api_url_trim TEXT — TEXT without surrounding ASCII whitespace.
|
|
54
|
+
_api_url_trim() {
|
|
55
|
+
local LC_ALL=C
|
|
56
|
+
local text="${1:-}"
|
|
57
|
+
text="${text#"${text%%[![:space:]]*}"}"
|
|
58
|
+
text="${text%"${text##*[![:space:]]}"}"
|
|
59
|
+
printf '%s' "$text"
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# _plain_api_url TEXT — succeeds when TEXT is a plain address; sets
|
|
63
|
+
# _PLAIN_API_HOST (the host, compared ignoring case and trailing dots) and
|
|
64
|
+
# _PLAIN_API_PATH. No subshells: this runs on every hosted request.
|
|
65
|
+
_plain_api_url() {
|
|
66
|
+
local LC_ALL=C
|
|
67
|
+
local restore_case=0 retired="${EGREGORE_RETIRED_API_ORIGIN#https://}" host
|
|
68
|
+
_PLAIN_API_HOST=""
|
|
69
|
+
_PLAIN_API_PATH=""
|
|
70
|
+
_PLAIN_API_RETIRED=false
|
|
71
|
+
if shopt -q nocasematch; then shopt -u nocasematch; restore_case=1; fi
|
|
72
|
+
if ! [[ "${1:-}" =~ $EGREGORE_PLAIN_API_URL ]]; then
|
|
73
|
+
[ "$restore_case" = 0 ] || shopt -s nocasematch
|
|
74
|
+
return 1
|
|
75
|
+
fi
|
|
76
|
+
host="${BASH_REMATCH[1]}"
|
|
77
|
+
_PLAIN_API_PATH="${BASH_REMATCH[3]}"
|
|
78
|
+
while [ "${host%.}" != "$host" ]; do host="${host%.}"; done
|
|
79
|
+
_PLAIN_API_HOST="$host"
|
|
80
|
+
shopt -s nocasematch
|
|
81
|
+
[[ "$host" == "$retired" ]] && _PLAIN_API_RETIRED=true
|
|
82
|
+
[ "$restore_case" = 1 ] || shopt -u nocasematch
|
|
83
|
+
return 0
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# _retired_api_url URL — succeeds when URL is a plain address on the retired
|
|
87
|
+
# host. Silent; a refused address is not retired.
|
|
88
|
+
_retired_api_url() {
|
|
89
|
+
local text="${1:-}" LC_ALL=C
|
|
90
|
+
text="${text#"${text%%[![:space:]]*}"}"
|
|
91
|
+
text="${text%"${text##*[![:space:]]}"}"
|
|
92
|
+
_plain_api_url "$text" && [ "$_PLAIN_API_RETIRED" = true ]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
# _hosted_api_url URL — the address to send a request to, trailing slashes
|
|
96
|
+
# trimmed. A plain address on the retired host becomes the hosted API with its
|
|
97
|
+
# path kept; any other plain address keeps its text; empty stays empty. Any
|
|
98
|
+
# other address prints nothing, says why once on stderr (EGREGORE_ADDRESS_NOTICE
|
|
99
|
+
# =shown silences it), and fails: callers send nothing, exactly as when no
|
|
100
|
+
# hosted address is set.
|
|
101
|
+
_hosted_api_url() {
|
|
102
|
+
local url="${1:-}" LC_ALL=C
|
|
103
|
+
url="${url#"${url%%[![:space:]]*}"}"
|
|
104
|
+
url="${url%"${url##*[![:space:]]}"}"
|
|
105
|
+
if [ -z "$url" ]; then
|
|
106
|
+
printf '\n'
|
|
107
|
+
return 0
|
|
108
|
+
fi
|
|
109
|
+
if ! _plain_api_url "$url"; then
|
|
110
|
+
[ "${EGREGORE_ADDRESS_NOTICE:-}" = shown ] || printf '%s\n' "$EGREGORE_REFUSED_API_URL_NOTICE" >&2
|
|
111
|
+
return 1
|
|
112
|
+
fi
|
|
113
|
+
[ "$_PLAIN_API_RETIRED" = false ] || url="$EGREGORE_HOSTED_API_ORIGIN$_PLAIN_API_PATH"
|
|
114
|
+
while [ "${url%/}" != "$url" ]; do url="${url%/}"; done
|
|
115
|
+
printf '%s\n' "$url"
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
# _hosted_api_target URL — a full request URL (a path and query after the
|
|
119
|
+
# origin) to send a credential to. Its origin must be plain, so every
|
|
120
|
+
# transport reads the same host; the rest may be any printable ASCII without
|
|
121
|
+
# spaces (curl callers pass --globoff, so glob characters there stay literal).
|
|
122
|
+
# A plain retired origin becomes the hosted API and keeps the rest. Anything
|
|
123
|
+
# else prints nothing, says why on stderr, and fails.
|
|
124
|
+
_hosted_api_target() {
|
|
125
|
+
local url="${1:-}" LC_ALL=C restore_case=0 rest
|
|
126
|
+
url="${url#"${url%%[![:space:]]*}"}"
|
|
127
|
+
url="${url%"${url##*[![:space:]]}"}"
|
|
128
|
+
if shopt -q nocasematch; then shopt -u nocasematch; restore_case=1; fi
|
|
129
|
+
if ! [[ "$url" =~ $EGREGORE_PLAIN_API_TARGET ]]; then
|
|
130
|
+
[ "$restore_case" = 0 ] || shopt -s nocasematch
|
|
131
|
+
[ "${EGREGORE_ADDRESS_NOTICE:-}" = shown ] || printf '%s\n' "$EGREGORE_REFUSED_API_URL_NOTICE" >&2
|
|
132
|
+
return 1
|
|
133
|
+
fi
|
|
134
|
+
rest="${BASH_REMATCH[3]}"
|
|
135
|
+
[ "$restore_case" = 0 ] || shopt -s nocasematch
|
|
136
|
+
if _retired_api_url "${url%"$rest"}"; then
|
|
137
|
+
url="$EGREGORE_HOSTED_API_ORIGIN$rest"
|
|
138
|
+
fi
|
|
139
|
+
printf '%s\n' "$url"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# _config_api_url — egregore.json's api_url, resolved for a request; fails
|
|
143
|
+
# when it is refused.
|
|
144
|
+
_config_api_url() {
|
|
145
|
+
_hosted_api_url "$(_config_val api_url)"
|
|
146
|
+
}
|
|
147
|
+
|
|
28
148
|
# Get base branch for a repo. Reads base_branch from egregore.json — top-level
|
|
29
149
|
# for the core egregore repo, per-entry under repos[] for managed repos.
|
|
30
150
|
# Defaults to "develop" for backwards compatibility only when a valid config
|
|
@@ -92,12 +212,13 @@ _get_base_branch() {
|
|
|
92
212
|
echo "$base"
|
|
93
213
|
}
|
|
94
214
|
|
|
215
|
+
# The Connected test as a jq filter: not explicitly Local, and an api_url saved.
|
|
216
|
+
EGREGORE_CONNECTED_JQ='(.mode // "") != "local" and ((.api_url // "") | length > 0)'
|
|
217
|
+
|
|
95
218
|
# Detect local vs connected mode
|
|
96
219
|
_detect_mode() {
|
|
97
220
|
local config="${CONFIG:-$SCRIPT_DIR/egregore.json}"
|
|
98
|
-
if [ -f "$config" ] && jq -e
|
|
99
|
-
'(.mode // "") != "local" and ((.api_url // "") | length > 0)' \
|
|
100
|
-
"$config" >/dev/null 2>&1; then
|
|
221
|
+
if [ -f "$config" ] && jq -e "$EGREGORE_CONNECTED_JQ" "$config" >/dev/null 2>&1; then
|
|
101
222
|
echo "connected"
|
|
102
223
|
else
|
|
103
224
|
echo "local"
|
|
@@ -130,3 +251,27 @@ _runtime_mode_badge() {
|
|
|
130
251
|
echo "◇ LOCAL"
|
|
131
252
|
fi
|
|
132
253
|
}
|
|
254
|
+
|
|
255
|
+
# Session record policy readers preserve explicit false values. Missing policy
|
|
256
|
+
# is off; missing detail/model inherit the documented defaults.
|
|
257
|
+
_session_records_val() {
|
|
258
|
+
local key="$1" default="$2" val
|
|
259
|
+
local config="${CONFIG:-$SCRIPT_DIR/egregore.json}"
|
|
260
|
+
val=$(jq -r --arg key "$key" '
|
|
261
|
+
.features.session_records | if type == "object" and has($key)
|
|
262
|
+
then .[$key] | tostring else empty end
|
|
263
|
+
' "$config" 2>/dev/null || true)
|
|
264
|
+
printf '%s\n' "${val:-$default}"
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
_session_records_enabled() {
|
|
268
|
+
[ "$(_session_records_val enabled false)" = "true" ]
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
_session_records_default_detail() {
|
|
272
|
+
_session_records_val default_detail outline
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
_session_records_model() {
|
|
276
|
+
_session_records_val model haiku
|
|
277
|
+
}
|
|
@@ -77,7 +77,8 @@ if [ -n "${CTX_SEED_TAR:-}" ] && [ -f "${CTX_SEED_TAR:-}" ]; then
|
|
|
77
77
|
# (process env → .env → committed api_url).
|
|
78
78
|
_NOW_URL="${EGREGORE_API_URL:-$(grep '^EGREGORE_API_URL=' "${ENV_FILE:-$SCRIPT_DIR/.env}" 2>/dev/null | cut -d'=' -f2- || true)}"
|
|
79
79
|
_NOW_KEY="${EGREGORE_API_KEY:-$(grep '^EGREGORE_API_KEY=' "${ENV_FILE:-$SCRIPT_DIR/.env}" 2>/dev/null | cut -d'=' -f2- || true)}"
|
|
80
|
-
|
|
80
|
+
# A fingerprint only: a refused address counts as none, quietly.
|
|
81
|
+
_NOW_URL="$(_hosted_api_url "${_NOW_URL:-$(jq -r '.api_url // empty' "${CONFIG:-$SCRIPT_DIR/egregore.json}" 2>/dev/null)}" 2>/dev/null)" || _NOW_URL=""
|
|
81
82
|
_NOW_SCOPE=$(echo -n "${_NOW_URL}|${_NOW_KEY}" | cksum | cut -d' ' -f1)
|
|
82
83
|
_SEED_AGE=$(( $(date +%s) - _SEED_TS ))
|
|
83
84
|
if [ -n "$_SEED_AUTHOR" ] && [ "$_SEED_AUTHOR" = "$AUTHOR" ] \
|
|
@@ -267,8 +268,11 @@ fi
|
|
|
267
268
|
done)
|
|
268
269
|
if [ -n "$FP_FILES" ]; then
|
|
269
270
|
FILE_PRESENCE=$(printf '%s\n' "$FP_FILES" | tr '\n' '\0' | xargs -0 awk '
|
|
270
|
-
function flush() { if (a != "") printf "%s|%s\n", a, d }
|
|
271
|
-
FNR == 1 { if (NR != 1) flush(); a=""; d="" }
|
|
271
|
+
function flush() { if (a != "" && !native) printf "%s|%s\n", a, d }
|
|
272
|
+
FNR == 1 { if (NR != 1) flush(); a=""; d=""; native=0; frontmatter=($0 == "---") }
|
|
273
|
+
FNR > 1 && /^---[ \t]*$/ { frontmatter=0 }
|
|
274
|
+
frontmatter && tolower($0) ~ /^[ \t]*["\047]?(producer|producer_principal_id|producer_identity|record_owner_actor_id)["\047]?[ \t]*:/ { native=1 }
|
|
275
|
+
frontmatter && tolower($0) ~ /^[ \t]*["\047]?subject_kind["\047]?[ \t]*:/ && !/^subject_kind:[ \t]*("human-session"|human-session)[ \t]*$/ { native=1 }
|
|
272
276
|
a == "" && /^\*\*Author\*\*:/ { s = $0; sub(/^\*\*Author\*\*:[ \t]*/, "", s); a = s }
|
|
273
277
|
d == "" && /^\*\*Date\*\*:/ { s = $0; sub(/^\*\*Date\*\*:[ \t]*/, "", s); d = s }
|
|
274
278
|
END { flush() }
|
|
@@ -296,8 +300,11 @@ fi
|
|
|
296
300
|
WORK_MAP="{}"
|
|
297
301
|
if [ -n "$WM_FILES" ]; then
|
|
298
302
|
WORK_MAP=$(printf '%s\n' "$WM_FILES" | tr '\n' '\0' | xargs -0 awk '
|
|
299
|
-
function flush() { if (a != "" && t != "") printf "%s\t%s\t%s\n", a, d, t }
|
|
300
|
-
FNR == 1 { if (NR != 1) flush(); a=""; d=""; t="" }
|
|
303
|
+
function flush() { if (a != "" && t != "" && !native) printf "%s\t%s\t%s\n", a, d, t }
|
|
304
|
+
FNR == 1 { if (NR != 1) flush(); a=""; d=""; t=""; native=0; frontmatter=($0 == "---") }
|
|
305
|
+
FNR > 1 && /^---[ \t]*$/ { frontmatter=0 }
|
|
306
|
+
frontmatter && tolower($0) ~ /^[ \t]*["\047]?(producer|producer_principal_id|producer_identity|record_owner_actor_id)["\047]?[ \t]*:/ { native=1 }
|
|
307
|
+
frontmatter && tolower($0) ~ /^[ \t]*["\047]?subject_kind["\047]?[ \t]*:/ && !/^subject_kind:[ \t]*("human-session"|human-session)[ \t]*$/ { native=1 }
|
|
301
308
|
a == "" && /^\*\*Author\*\*:/ { s = $0; sub(/^\*\*Author\*\*:[ \t]*/, "", s); a = s }
|
|
302
309
|
d == "" && /^\*\*Date\*\*:/ { s = $0; sub(/^\*\*Date\*\*:[ \t]*/, "", s); d = s }
|
|
303
310
|
t == "" && /^# / {
|
|
@@ -385,8 +392,6 @@ fi
|
|
|
385
392
|
|
|
386
393
|
# 6. Handoffs addressed to user (background, enriched with author/topic)
|
|
387
394
|
(
|
|
388
|
-
JSON="[]"
|
|
389
|
-
RICH="[]"
|
|
390
395
|
if [ -d "$SCRIPT_DIR/memory/handoffs" ]; then
|
|
391
396
|
# One definition everywhere: Egregore Runtime folds canonical lifecycle
|
|
392
397
|
# state for both Local and Connected instances. Graph is an optional
|
|
@@ -404,72 +409,38 @@ fi
|
|
|
404
409
|
[ -n "$_F" ] && [ -f "$_F" ] && printf '%s\n' "$_F"
|
|
405
410
|
done)
|
|
406
411
|
fi
|
|
407
|
-
# Match github username, display name, github_name first word, and people-file name
|
|
408
|
-
# Handoff files may use "to: name", "**To**: name", or "To: name"
|
|
409
|
-
_DISPLAY=$(jq -r '.display_name // empty' "$STATE_FILE" 2>/dev/null)
|
|
410
|
-
_GH_NAME=$(jq -r '.github_name // empty' "$STATE_FILE" 2>/dev/null)
|
|
411
|
-
_FIRST_NAME=$(echo "$_GH_NAME" | awk '{print $1}')
|
|
412
|
-
# Also check people file: memory/people/{author}.md has "# Name" on first line
|
|
413
|
-
_PEOPLE_NAME=""
|
|
414
|
-
_PEOPLE_FILE="$SCRIPT_DIR/memory/people/$(echo "$AUTHOR" | tr '[:upper:]' '[:lower:]').md"
|
|
415
|
-
[ -f "$_PEOPLE_FILE" ] && _PEOPLE_NAME=$(sed -n 's/^# *//p' "$_PEOPLE_FILE" 2>/dev/null | head -1)
|
|
416
|
-
_GREP_PAT="[Tt]o[*]*: *$AUTHOR\|[Tt]o[*]*:$AUTHOR"
|
|
417
|
-
for _VARIANT in "$_DISPLAY" "$_FIRST_NAME" "$_PEOPLE_NAME"; do
|
|
418
|
-
[ -z "$_VARIANT" ] && continue
|
|
419
|
-
[ "$_VARIANT" = "$AUTHOR" ] && continue
|
|
420
|
-
# Skip if already in pattern (avoid duplicates)
|
|
421
|
-
echo "$_GREP_PAT" | grep -qF "$_VARIANT" && continue
|
|
422
|
-
_GREP_PAT="$_GREP_PAT\|[Tt]o[*]*: *$_VARIANT\|[Tt]o[*]*:$_VARIANT"
|
|
423
|
-
done
|
|
424
412
|
# Compatibility fallback for an unavailable Runtime. It reads canonical
|
|
425
413
|
# Markdown directly and never calls graph or a control-plane retrieval API.
|
|
426
414
|
if [ -z "$ADDRESSED" ]; then
|
|
415
|
+
# Match github username, display name, github_name first word, and people-file name
|
|
416
|
+
# Handoff files may use "to: name", "**To**: name", or "To: name"
|
|
417
|
+
_DISPLAY=$(jq -r '.display_name // empty' "$STATE_FILE" 2>/dev/null)
|
|
418
|
+
_GH_NAME=$(jq -r '.github_name // empty' "$STATE_FILE" 2>/dev/null)
|
|
419
|
+
_FIRST_NAME=$(echo "$_GH_NAME" | awk '{print $1}')
|
|
420
|
+
# Also check people file: memory/people/{author}.md has "# Name" on first line
|
|
421
|
+
_PEOPLE_NAME=""
|
|
422
|
+
_PEOPLE_FILE="$SCRIPT_DIR/memory/people/$(echo "$AUTHOR" | tr '[:upper:]' '[:lower:]').md"
|
|
423
|
+
[ -f "$_PEOPLE_FILE" ] && _PEOPLE_NAME=$(sed -n 's/^# *//p' "$_PEOPLE_FILE" 2>/dev/null | head -1)
|
|
424
|
+
_GREP_PAT="[Tt]o[*]*: *$AUTHOR\|[Tt]o[*]*:$AUTHOR"
|
|
425
|
+
for _VARIANT in "$_DISPLAY" "$_FIRST_NAME" "$_PEOPLE_NAME"; do
|
|
426
|
+
[ -z "$_VARIANT" ] && continue
|
|
427
|
+
[ "$_VARIANT" = "$AUTHOR" ] && continue
|
|
428
|
+
# Skip if already in pattern (avoid duplicates)
|
|
429
|
+
echo "$_GREP_PAT" | grep -qF "$_VARIANT" && continue
|
|
430
|
+
_GREP_PAT="$_GREP_PAT\|[Tt]o[*]*: *$_VARIANT\|[Tt]o[*]*:$_VARIANT"
|
|
431
|
+
done
|
|
427
432
|
ADDRESSED=$(grep -rli "$_GREP_PAT" "$SCRIPT_DIR/memory/handoffs/" 2>/dev/null | sort -r | head -5 || true)
|
|
428
433
|
fi
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
for
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
AF_TOPIC=$(eg_handoff_topic "$AF")
|
|
437
|
-
AF_DATE=$(eg_handoff_date "$AF")
|
|
438
|
-
# Extract repo state table if present
|
|
439
|
-
AF_REPO_STATE="[]"
|
|
440
|
-
AF_REPO_TABLE=$(awk '/^## Repo State/{found=1; next} found && /^#/{exit} found && /^\|[^-]/ && !/^\| Repo/{print}' "$AF" 2>/dev/null || true)
|
|
441
|
-
if [ -n "$AF_REPO_TABLE" ]; then
|
|
442
|
-
AF_REPO_STATE=$(echo "$AF_REPO_TABLE" | while IFS='|' read -r _ R_REPO R_BRANCH R_PR R_BASE _; do
|
|
443
|
-
R_REPO=$(echo "$R_REPO" | xargs 2>/dev/null || true)
|
|
444
|
-
R_BRANCH=$(echo "$R_BRANCH" | xargs 2>/dev/null || true)
|
|
445
|
-
R_PR=$(echo "$R_PR" | xargs 2>/dev/null | sed 's/^#//' | sed 's/—//' || true)
|
|
446
|
-
R_BASE=$(echo "$R_BASE" | xargs 2>/dev/null || true)
|
|
447
|
-
[ -z "$R_REPO" ] && continue
|
|
448
|
-
if [ -n "$R_PR" ] && [ "$R_PR" -eq "$R_PR" ] 2>/dev/null; then
|
|
449
|
-
printf '{"repo":"%s","branch":"%s","pr":%s,"base":"%s"}\n' "$R_REPO" "$R_BRANCH" "$R_PR" "$R_BASE"
|
|
450
|
-
else
|
|
451
|
-
printf '{"repo":"%s","branch":"%s","pr":null,"base":"%s"}\n' "$R_REPO" "$R_BRANCH" "$R_BASE"
|
|
452
|
-
fi
|
|
453
|
-
done | jq -sc '.' 2>/dev/null || echo "[]")
|
|
454
|
-
fi
|
|
455
|
-
$FIRST || JSON="$JSON,"
|
|
456
|
-
$FIRST || RICH="$RICH,"
|
|
457
|
-
JSON="$JSON\"$AF_NAME\""
|
|
458
|
-
AF_ENTRY=$(jq -cn \
|
|
459
|
-
--arg name "$AF_NAME" \
|
|
460
|
-
--arg author "$AF_AUTHOR" \
|
|
461
|
-
--arg topic "$AF_TOPIC" \
|
|
462
|
-
--arg date "$AF_DATE" \
|
|
463
|
-
--argjson repoState "$AF_REPO_STATE" \
|
|
464
|
-
'{name:$name, author:$author, topic:$topic, date:$date, repoState:$repoState}' 2>/dev/null || echo "{}")
|
|
465
|
-
RICH="$RICH$AF_ENTRY"
|
|
466
|
-
FIRST=false
|
|
467
|
-
done
|
|
468
|
-
JSON="$JSON]"
|
|
469
|
-
RICH="$RICH]"
|
|
434
|
+
# One process reads every addressed handoff for its name, author, topic,
|
|
435
|
+
# date and Repo State rows with handoff-meta.sh's semantics; a fork per
|
|
436
|
+
# field made this the gather's slowest job. $ADDRESSED stays unquoted
|
|
437
|
+
# for the word splitting the per-file loop had.
|
|
438
|
+
# shellcheck disable=SC2086
|
|
439
|
+
[ -n "$ADDRESSED" ] && python3 "$SCRIPT_DIR/bin/lib/handoff_meta.py" addressed \
|
|
440
|
+
"$CTX_DIR/addressed" "$CTX_DIR/addressed_rich" $ADDRESSED 2>/dev/null && exit 0
|
|
470
441
|
fi
|
|
471
|
-
echo "
|
|
472
|
-
echo "
|
|
442
|
+
echo "[]" > "$CTX_DIR/addressed"
|
|
443
|
+
echo "[]" > "$CTX_DIR/addressed_rich"
|
|
473
444
|
) &
|
|
474
445
|
|
|
475
446
|
# 6.5. Pending questions addressed to user (background)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Run the interface-taste CLI, or name the Runtime update when it cannot run.
|
|
2
|
+
|
|
3
|
+
This file stays outside egregore_runtime/: /update carries bin/ but never the
|
|
4
|
+
Runtime, so a missing, older or partly updated Runtime fails here, where one
|
|
5
|
+
line can say what to run, instead of in a traceback. That includes the
|
|
6
|
+
package's own initialisation, which runs before any module inside it, and a
|
|
7
|
+
partial update that brought the taste modules without what they call.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import importlib
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
OUTDATED_RUNTIME = (
|
|
14
|
+
"genui: this workspace's Egregore Runtime is too old for interface taste; "
|
|
15
|
+
"to update it, run `egregore`, press s for Settings, then choose Runtime update"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
# What taste calls in Runtime modules it does not ship with.
|
|
19
|
+
REQUIRED = (
|
|
20
|
+
("egregore_runtime.writeback", "CanonicalArtifactWriteback", "create_file"),
|
|
21
|
+
("egregore_runtime.runtime", "EgregoreRuntime", "_writeback"),
|
|
22
|
+
("egregore_runtime.runtime", "EgregoreRuntime", "authorize"),
|
|
23
|
+
("egregore_runtime.runtime", "EgregoreRuntime", "resolve_actor"),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
from egregore_runtime.taste_cli import main
|
|
28
|
+
|
|
29
|
+
for module, owner, capability in REQUIRED:
|
|
30
|
+
if not callable(getattr(getattr(importlib.import_module(module), owner), capability, None)):
|
|
31
|
+
raise AttributeError(f"{owner}.{capability}")
|
|
32
|
+
except (ImportError, SyntaxError, AttributeError):
|
|
33
|
+
print(OUTDATED_RUNTIME, file=sys.stderr)
|
|
34
|
+
raise SystemExit(3)
|
|
35
|
+
|
|
36
|
+
raise SystemExit(main())
|
|
@@ -3,18 +3,37 @@
|
|
|
3
3
|
# Spec: .claude/context/commit-format.md + .claude/context/pr-format.md.
|
|
4
4
|
#
|
|
5
5
|
# Provides:
|
|
6
|
+
# egregore_session_id <hub_dir>
|
|
7
|
+
# Print the calling session's own Egregore session id through
|
|
8
|
+
# bin/session-id.sh: its harness's native session id mapped at session
|
|
9
|
+
# start, else the id in <hub_dir>/.egregore-session-id, which names
|
|
10
|
+
# only the latest session start. Print nothing when neither exists.
|
|
6
11
|
# egregore_session_trailer <hub_dir>
|
|
7
|
-
# Print "Egregore-Session: <id>"
|
|
8
|
-
#
|
|
12
|
+
# Print "Egregore-Session: <id>" for that id; print nothing when
|
|
13
|
+
# there is none. Never fails.
|
|
9
14
|
# egregore_commit <git_dir> <hub_dir> <message> [git-commit flags…]
|
|
10
|
-
# git -C <git_dir> commit with the session trailer
|
|
11
|
-
#
|
|
15
|
+
# git -C <git_dir> commit with the session trailer added through
|
|
16
|
+
# git's own --trailer, so it joins a trailer block the message already
|
|
17
|
+
# ends with (Co-Authored-By, Refs) instead of opening a paragraph of
|
|
18
|
+
# its own that would turn those lines back into body text.
|
|
12
19
|
# egregore_pr_skeleton <what> <why> <verification> <footer>
|
|
13
20
|
# The one source of the skeleton PR body shape.
|
|
14
21
|
|
|
22
|
+
_EGREGORE_SESSION_RESOLVER="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." 2>/dev/null && pwd)/session-id.sh"
|
|
23
|
+
|
|
24
|
+
egregore_session_id() {
|
|
25
|
+
local hub="${1:-.}"
|
|
26
|
+
if [ -f "$_EGREGORE_SESSION_RESOLVER" ]; then
|
|
27
|
+
bash "$_EGREGORE_SESSION_RESOLVER" --root "$hub" 2>/dev/null
|
|
28
|
+
else
|
|
29
|
+
head -n 1 "$hub/.egregore-session-id" 2>/dev/null
|
|
30
|
+
fi
|
|
31
|
+
return 0
|
|
32
|
+
}
|
|
33
|
+
|
|
15
34
|
egregore_session_trailer() {
|
|
16
35
|
local sid
|
|
17
|
-
sid="$(
|
|
36
|
+
sid="$(egregore_session_id "${1:-.}")"
|
|
18
37
|
[ -n "$sid" ] && printf 'Egregore-Session: %s' "$sid"
|
|
19
38
|
return 0
|
|
20
39
|
}
|
|
@@ -25,7 +44,7 @@ egregore_commit() {
|
|
|
25
44
|
local trailer
|
|
26
45
|
trailer="$(egregore_session_trailer "$hub_dir")"
|
|
27
46
|
if [ -n "$trailer" ]; then
|
|
28
|
-
git -C "$git_dir" commit -m "$msg"
|
|
47
|
+
git -C "$git_dir" commit -m "$msg" --trailer "$trailer" "$@"
|
|
29
48
|
else
|
|
30
49
|
git -C "$git_dir" commit -m "$msg" "$@"
|
|
31
50
|
fi
|
|
@@ -22,6 +22,13 @@
|
|
|
22
22
|
# FRAMEWORK_UPDATED, FRAMEWORK_UPDATED_COUNT, FRAMEWORK_UPDATED_FILES,
|
|
23
23
|
# BASE_BRANCH, BASE_BRANCH_READY
|
|
24
24
|
#
|
|
25
|
+
# EGREGORE_GIT_SYNC_LIVE=1 (a shell variable the refresh pass of
|
|
26
|
+
# bin/session-start.sh sets) means a session is already live in this checkout:
|
|
27
|
+
# fetch and update refs only, and leave every working tree as it is (no
|
|
28
|
+
# fast-forward, autosave, push, branch switch or framework update). The quick
|
|
29
|
+
# pass before it fast-forwarded the base branch and the managed repos on their
|
|
30
|
+
# base branch from the last fetch.
|
|
31
|
+
#
|
|
25
32
|
# Health dimensions are independent. HEALTH_GIT is the project checkout (base
|
|
26
33
|
# branch, worktree, managed repos); HEALTH_MEMORY is the canonical memory
|
|
27
34
|
# repository's synchronization; HEALTH_RETRIEVAL is whether recall can answer.
|
|
@@ -300,7 +307,7 @@ setup_develop() {
|
|
|
300
307
|
if [[ "$CURRENT_BRANCH" != "$BASE_BRANCH" ]]; then
|
|
301
308
|
# Safe to force-update when not checked out
|
|
302
309
|
git branch -f "$BASE_BRANCH" "origin/$BASE_BRANCH" 2>/dev/null || true
|
|
303
|
-
|
|
310
|
+
elif [ "${EGREGORE_GIT_SYNC_LIVE:-0}" != "1" ]; then
|
|
304
311
|
# On the base branch — try ff merge, fall back to reset only if no unpushed work
|
|
305
312
|
git merge --ff-only "origin/$BASE_BRANCH" --quiet 2>/dev/null || {
|
|
306
313
|
# Only reset if there are no unpushed commits and no dirty tracked work.
|
|
@@ -323,7 +330,7 @@ setup_develop() {
|
|
|
323
330
|
# safe, but autosave commits, branch pushes, and parking the checkout on
|
|
324
331
|
# the base branch mutate a live repo out from under whatever session owns
|
|
325
332
|
# it.
|
|
326
|
-
if [ "${EGREGORE_GIT_SYNC_READONLY:-0}" = "1" ]; then
|
|
333
|
+
if [ "${EGREGORE_GIT_SYNC_READONLY:-0}" = "1" ] || [ "${EGREGORE_GIT_SYNC_LIVE:-0}" = "1" ]; then
|
|
327
334
|
ACTION="ready"
|
|
328
335
|
SAVED_BRANCH=""
|
|
329
336
|
return 0
|
|
@@ -455,7 +462,8 @@ else
|
|
|
455
462
|
fi
|
|
456
463
|
|
|
457
464
|
# Apply a framework update only after setup verified the configured base branch.
|
|
458
|
-
if [ "$IS_WORKTREE" != "true" ] && [ "$BASE_BRANCH_READY" = "true" ]
|
|
465
|
+
if [ "$IS_WORKTREE" != "true" ] && [ "$BASE_BRANCH_READY" = "true" ] \
|
|
466
|
+
&& [ "${EGREGORE_GIT_SYNC_LIVE:-0}" != "1" ]; then
|
|
459
467
|
_apply_framework_update 2>/dev/null || true
|
|
460
468
|
fi
|
|
461
469
|
|
|
@@ -563,7 +571,7 @@ for REPO in $MANAGED_REPOS; do
|
|
|
563
571
|
R_BRANCH=$(git -C "$REPO_DIR" branch --show-current 2>/dev/null || echo "?")
|
|
564
572
|
if [ "$R_BRANCH" != "$REPO_BASE" ]; then
|
|
565
573
|
git -C "$REPO_DIR" branch -f "$REPO_BASE" "origin/$REPO_BASE" --quiet 2>/dev/null || true
|
|
566
|
-
|
|
574
|
+
elif [ "${EGREGORE_GIT_SYNC_LIVE:-0}" != "1" ]; then
|
|
567
575
|
git -C "$REPO_DIR" merge --ff-only "origin/$REPO_BASE" --quiet 2>/dev/null || true
|
|
568
576
|
fi
|
|
569
577
|
fi
|