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
|
@@ -30,6 +30,41 @@ function stripQuotedSegments(command) {
|
|
|
30
30
|
return out;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
// Heredoc bodies are stdin, not shell commands: a Markdown body's blockquote
|
|
34
|
+
// (`> quote`), arrow (`A -> B`) or tag (`<br>`) is no redirect. Each opener
|
|
35
|
+
// line stays, so its real output redirects are still checked. Same rule as
|
|
36
|
+
// bin/branch-guard.cjs withoutHeredocBodies (Codex), so the runtimes agree.
|
|
37
|
+
function withoutHeredocBodies(command) {
|
|
38
|
+
const pending = [];
|
|
39
|
+
const visible = [];
|
|
40
|
+
let quote = null;
|
|
41
|
+
for (const line of String(command).split("\n")) {
|
|
42
|
+
if (pending.length) {
|
|
43
|
+
const { delimiter, tabs } = pending[0];
|
|
44
|
+
if ((tabs ? line.replace(/^\t+/, "") : line) === delimiter) pending.shift();
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
visible.push(line);
|
|
48
|
+
for (let i = 0; i < line.length; i++) {
|
|
49
|
+
const ch = line[i];
|
|
50
|
+
if (ch === "\\" && quote !== "'") { i++; continue; }
|
|
51
|
+
if (quote) {
|
|
52
|
+
if (ch === quote) quote = null;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (ch === "'" || ch === '"') { quote = ch; continue; }
|
|
56
|
+
if (line.slice(i, i + 3) === "<<<") { i += 2; continue; }
|
|
57
|
+
if (line.slice(i, i + 2) !== "<<") continue;
|
|
58
|
+
const match = line.slice(i).match(/^<<(-)?[ \t]*(?:'([^']+)'|"([^"]+)"|([^\s;&|<>]+))/);
|
|
59
|
+
if (match) {
|
|
60
|
+
pending.push({ delimiter: match[2] || match[3] || match[4], tabs: Boolean(match[1]) });
|
|
61
|
+
i += match[0].length - 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return visible.join("\n");
|
|
66
|
+
}
|
|
67
|
+
|
|
33
68
|
function maskQuotedOperators(command) {
|
|
34
69
|
let out = "";
|
|
35
70
|
let quote = null;
|
|
@@ -124,6 +159,7 @@ export function isRuntimeStatePath(target, projectDir) {
|
|
|
124
159
|
|
|
125
160
|
export function mutatesOnlyRuntimeState(command, projectDir) {
|
|
126
161
|
if (!isMutatingBash(command)) return false;
|
|
162
|
+
command = withoutHeredocBodies(command);
|
|
127
163
|
const visible = stripQuotedSegments(String(command));
|
|
128
164
|
if (MUTATING_GIT.test(visible) || MUTATING_PACKAGES.test(visible) ||
|
|
129
165
|
/\bsed\s+[^\n]*\s-i(?:\s|$)/.test(visible)) return false;
|
|
@@ -183,6 +219,7 @@ export function isConsentCommand(command, branch) {
|
|
|
183
219
|
|
|
184
220
|
export function isMutatingBash(command) {
|
|
185
221
|
if (!command) return false;
|
|
222
|
+
command = withoutHeredocBodies(command);
|
|
186
223
|
const meaningfulRedirects = stripQuotedSegments(String(command))
|
|
187
224
|
.replace(/(?:^|\s)\d*>>?\s*\/dev\/null\b/g, " ")
|
|
188
225
|
.replace(/(?:^|\s)\d*>\s*&\d+\b/g, " ");
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
import { join } from "node:path";
|
|
2
|
+
import { dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
3
3
|
import { createHash, randomUUID } from "node:crypto";
|
|
4
|
+
import { closeSync, constants, fchmodSync, fstatSync, lstatSync, mkdirSync, openSync, readSync, realpathSync, rmdirSync, writeSync } from "node:fs";
|
|
4
5
|
|
|
5
6
|
const DEFAULT_TIMEOUT_MS = 45_000;
|
|
6
7
|
|
|
@@ -70,11 +71,103 @@ export function compileObserveContext({ root, harness, prompt, sessionId, prompt
|
|
|
70
71
|
});
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
const ALIAS_LIMIT = 1024 * 1024;
|
|
75
|
+
|
|
76
|
+
function boundedFirstLine(path) {
|
|
77
|
+
let descriptor;
|
|
78
|
+
try {
|
|
79
|
+
descriptor = openSync(path, constants.O_RDONLY | constants.O_NONBLOCK | constants.O_NOFOLLOW);
|
|
80
|
+
if (!fstatSync(descriptor).isFile()) return;
|
|
81
|
+
const buffer = Buffer.alloc(ALIAS_LIMIT + 1);
|
|
82
|
+
let size = 0;
|
|
83
|
+
while (size <= ALIAS_LIMIT) {
|
|
84
|
+
const count = readSync(descriptor, buffer, size, Math.min(4096, buffer.length - size), null);
|
|
85
|
+
if (!count) return buffer.subarray(0, size).toString("utf8");
|
|
86
|
+
const newline = buffer.indexOf(10, size);
|
|
87
|
+
size += count;
|
|
88
|
+
if (newline >= 0 && newline < size) return buffer.subarray(0, newline).toString("utf8");
|
|
89
|
+
}
|
|
90
|
+
} finally {
|
|
91
|
+
if (descriptor !== undefined) closeSync(descriptor);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function instanceRoot(root) {
|
|
96
|
+
const physical = realpathSync(root || process.cwd());
|
|
97
|
+
try {
|
|
98
|
+
const line = boundedFirstLine(join(physical, ".git"));
|
|
99
|
+
if (line?.startsWith("gitdir: ")) {
|
|
100
|
+
const target = realpathSync(resolve(physical, line.slice(8).trim()));
|
|
101
|
+
const marker = `${sep}.git${sep}worktrees${sep}`;
|
|
102
|
+
const index = target.indexOf(marker);
|
|
103
|
+
if (index >= 0) return target.slice(0, index);
|
|
104
|
+
}
|
|
105
|
+
} catch {}
|
|
106
|
+
return physical;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Preserve the producer's spelling as well as the header id. A later sweep can
|
|
110
|
+
// then recognize a hold even when it discovers the session by a physical path.
|
|
111
|
+
function rememberSessionAlias(root, harness, path, hash) {
|
|
112
|
+
let descriptor;
|
|
113
|
+
let lock;
|
|
114
|
+
try {
|
|
115
|
+
if (!path || !process.env.HOME || !["pi", "prime"].includes(harness)) return;
|
|
116
|
+
const header = JSON.parse(boundedFirstLine(path));
|
|
117
|
+
if (header?.type !== "session" || !Number.isInteger(header.version)
|
|
118
|
+
|| typeof header.id !== "string" || !/^[A-Za-z0-9_-]{1,128}$/.test(header.id)
|
|
119
|
+
|| typeof header.cwd !== "string" || !isAbsolute(header.cwd)) return;
|
|
120
|
+
const project = instanceRoot(root);
|
|
121
|
+
const cwd = realpathSync(header.cwd);
|
|
122
|
+
if (cwd !== project && !cwd.startsWith(project + sep)) return;
|
|
123
|
+
const trails = join(process.env.HOME, ".egregore", "trails");
|
|
124
|
+
mkdirSync(trails, { recursive: true, mode: 0o700 });
|
|
125
|
+
const folder = join(trails, project.replace(/[/.]/g, "-") + `--${harness}`);
|
|
126
|
+
try { mkdirSync(folder, { mode: 0o700 }); } catch (error) { if (error.code !== "EEXIST") throw error; }
|
|
127
|
+
if (!lstatSync(folder).isDirectory() || dirname(realpathSync(folder)) !== realpathSync(trails)) return;
|
|
128
|
+
const lockPath = join(folder, ".aliases.lock");
|
|
129
|
+
try {
|
|
130
|
+
mkdirSync(lockPath, { mode: 0o700 });
|
|
131
|
+
} catch (error) {
|
|
132
|
+
if (error.code !== "EEXIST") return;
|
|
133
|
+
const info = lstatSync(lockPath);
|
|
134
|
+
if (!info.isDirectory() || Date.now() - info.mtimeMs <= 60_000) return;
|
|
135
|
+
// A crashed writer must not block future bindings. Remove only an empty
|
|
136
|
+
// stale directory and retry acquisition once; a fresh owner wins.
|
|
137
|
+
try {
|
|
138
|
+
rmdirSync(lockPath);
|
|
139
|
+
mkdirSync(lockPath, { mode: 0o700 });
|
|
140
|
+
} catch { return; }
|
|
141
|
+
}
|
|
142
|
+
lock = lockPath;
|
|
143
|
+
descriptor = openSync(join(folder, "aliases.jsonl"),
|
|
144
|
+
constants.O_CREAT | constants.O_RDWR | constants.O_APPEND | constants.O_NOFOLLOW | constants.O_NONBLOCK, 0o600);
|
|
145
|
+
const info = fstatSync(descriptor);
|
|
146
|
+
if (!info.isFile() || info.size > ALIAS_LIMIT) return;
|
|
147
|
+
const content = Buffer.alloc(info.size);
|
|
148
|
+
readSync(descriptor, content, 0, info.size, 0);
|
|
149
|
+
if (content.toString("utf8").split("\n").some(line => {
|
|
150
|
+
try { return JSON.parse(line).hash === hash; } catch { return false; }
|
|
151
|
+
})) return;
|
|
152
|
+
const entry = JSON.stringify({ hash, path: String(path), session: header.id }) + "\n";
|
|
153
|
+
if (info.size + Buffer.byteLength(entry) > ALIAS_LIMIT) return;
|
|
154
|
+
fchmodSync(descriptor, 0o600);
|
|
155
|
+
writeSync(descriptor, entry);
|
|
156
|
+
} catch {
|
|
157
|
+
// Recording an identity alias must never interrupt the Observe boundary.
|
|
158
|
+
} finally {
|
|
159
|
+
if (descriptor !== undefined) try { closeSync(descriptor); } catch {}
|
|
160
|
+
if (lock) try { rmdirSync(lock); } catch {}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Put the session's own id in the environment of every command it runs. */
|
|
165
|
+
export function bindNativeSession(ctx, harness, root) {
|
|
74
166
|
const session = sessionIdentity(ctx);
|
|
75
167
|
if (session) {
|
|
76
168
|
process.env.EGREGORE_NATIVE_SESSION_ID = session;
|
|
77
169
|
process.env.EGREGORE_NATIVE_HARNESS = String(harness || "pi");
|
|
170
|
+
rememberSessionAlias(root, String(harness || "pi"), ctx?.sessionManager?.getSessionFile?.(), session);
|
|
78
171
|
} else {
|
|
79
172
|
delete process.env.EGREGORE_NATIVE_SESSION_ID;
|
|
80
173
|
delete process.env.EGREGORE_NATIVE_HARNESS;
|
|
@@ -95,7 +188,7 @@ export function registerUserCommand(pi, { root, harness }, name, command) {
|
|
|
95
188
|
// Native commands bypass before_agent_start's Observe hook while their
|
|
96
189
|
// workflow is active. Reset at the actual user entry, before dispatch;
|
|
97
190
|
// generated workflow turns must not reset same-prompt limits.
|
|
98
|
-
const context = await compileObserveContext({ root, harness, prompt: "", sessionId: bindNativeSession(ctx, harness), signal: ctx?.signal });
|
|
191
|
+
const context = await compileObserveContext({ root, harness, prompt: "", sessionId: bindNativeSession(ctx, harness, root), signal: ctx?.signal });
|
|
99
192
|
if (context) pi.sendMessage?.({ customType: "egregore-org-context", content: context, display: false });
|
|
100
193
|
return command.handler(args, ctx);
|
|
101
194
|
},
|
|
@@ -110,7 +203,7 @@ export function registerObserveHook(pi, { root, harness, shouldObserve } = {}) {
|
|
|
110
203
|
root,
|
|
111
204
|
harness,
|
|
112
205
|
prompt: event.prompt,
|
|
113
|
-
sessionId: bindNativeSession(ctx, harness),
|
|
206
|
+
sessionId: bindNativeSession(ctx, harness, root),
|
|
114
207
|
signal: ctx?.signal,
|
|
115
208
|
});
|
|
116
209
|
if (!context) return;
|
|
@@ -75,7 +75,6 @@ function adapt(sourceSpec) {
|
|
|
75
75
|
["Egregore on Codex", "Egregore on Pi"],
|
|
76
76
|
["Codex-native", "Pi-native"],
|
|
77
77
|
["Codex sessions", "Pi sessions"],
|
|
78
|
-
["On Codex", "On Pi"],
|
|
79
78
|
["bin/codex-session-start.sh", "bin/pi-session-start.sh"],
|
|
80
79
|
[".codex/hooks/branch-guard.js", ".pi/extensions/egregore.ts"],
|
|
81
80
|
["PreToolUse hook (launcher `--enable hooks`)", "`tool_call` gate (loaded after Pi project trust)"],
|
|
@@ -7,7 +7,10 @@ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
|
7
7
|
|
|
8
8
|
case "${1:---card}" in
|
|
9
9
|
--card|card)
|
|
10
|
-
|
|
10
|
+
# The extension binds Pi's own session id first; identity.sh maps it to
|
|
11
|
+
# the Egregore id this start mints (bin/session-id.sh).
|
|
12
|
+
EGREGORE_START_HARNESS=pi EGREGORE_HARNESS="${EGREGORE_HARNESS:-pi}" \
|
|
13
|
+
exec bash "$SCRIPT_DIR/bin/codex-session-start.sh" --card
|
|
11
14
|
;;
|
|
12
15
|
--prompt|prompt)
|
|
13
16
|
cat <<'EOF'
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Pi and Prime share this thin adapter; the reader owns all evidence semantics.
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export function registerSpiritDiscovery(pi, { root, runtime, Type }) {
|
|
4
|
+
if (!['pi', 'prime'].includes(runtime)) throw new Error('invalid discovery adapter');
|
|
5
|
+
pi.registerTool({
|
|
6
|
+
name: 'egregore_discover_capabilities', label: 'Egregore capabilities',
|
|
7
|
+
description: 'Inspect local installed-file evidence and separately authenticated spirit capabilities. Read-only; does not grant or execute work.',
|
|
8
|
+
parameters: Type.Object({ operation: Type.Union(['capabilities.list','capabilities.find','capabilities.describe','capabilities.explain','system.explain'].map(Type.Literal)),
|
|
9
|
+
query: Type.Optional(Type.String({ maxLength: 200 })), id: Type.Optional(Type.String({ maxLength: 160 })) }, { additionalProperties: false }),
|
|
10
|
+
async execute(_id, params) {
|
|
11
|
+
// JSON is argv data; the fixed adapter never accepts a root or runtime selector.
|
|
12
|
+
if (!params || typeof params !== 'object' || Array.isArray(params)
|
|
13
|
+
|| !['capabilities.list','capabilities.find','capabilities.describe','capabilities.explain','system.explain'].includes(params.operation)) throw new Error('invalid discovery query');
|
|
14
|
+
const args = [join(root, 'bin', `spirit-discovery-${runtime}.sh`), params.operation];
|
|
15
|
+
const allowed = params.operation === 'capabilities.find' ? ['operation','query']
|
|
16
|
+
: ['capabilities.describe','capabilities.explain'].includes(params.operation) ? ['operation','id']
|
|
17
|
+
: params.operation === 'system.explain' && Object.hasOwn(params,'id') ? ['operation','id'] : ['operation'];
|
|
18
|
+
if (Object.keys(params).sort().join() !== allowed.sort().join()) throw new Error('invalid discovery query');
|
|
19
|
+
for (const [field, limit] of [['query', 200], ['id', 160]]) {
|
|
20
|
+
if (Object.hasOwn(params, field) && (typeof params[field] !== 'string' || !params[field].trim()
|
|
21
|
+
|| Buffer.from(params[field], 'utf8').toString('utf8') !== params[field]
|
|
22
|
+
|| Buffer.byteLength(params[field]) > limit || /[\x00-\x1f\x7f]/.test(params[field]))) throw new Error('invalid discovery query');
|
|
23
|
+
}
|
|
24
|
+
if (Object.hasOwn(params,'query')) args.push(params.query);
|
|
25
|
+
if (Object.hasOwn(params,'id')) args.push(params.id);
|
|
26
|
+
const response = await pi.exec('bash', args, { timeout: 15000 });
|
|
27
|
+
if (Number(response.code ?? response.status ?? 0) !== 0) throw new Error('discovery is unavailable');
|
|
28
|
+
let value;
|
|
29
|
+
try { value = JSON.parse(response.stdout); } catch { throw new Error('discovery is unavailable'); }
|
|
30
|
+
if (value.schema !== 'egregore.capability-query/v1') throw new Error('discovery is unavailable');
|
|
31
|
+
return { content: [{ type: 'text', text: JSON.stringify(value) }], details: value };
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
@@ -43,6 +43,187 @@ if [ ! -e "$SCRIPT_DIR/egregore_runtime" ] && \
|
|
|
43
43
|
MIGRATED=1
|
|
44
44
|
fi
|
|
45
45
|
|
|
46
|
+
# --- Migration: saved hosted address after the October 2026 security reset ---
|
|
47
|
+
# Connected setups before 22 Oct 2026 saved the hosted API's old Railway origin
|
|
48
|
+
# in egregore.json. That origin is retired; requests already resolve it to the
|
|
49
|
+
# hosted API (bin/lib/config.sh), and this rewrites the saved value once so the
|
|
50
|
+
# committed file says where requests go. Only that origin, without a path,
|
|
51
|
+
# changes; other keys, custom origins and Local configs are left alone.
|
|
52
|
+
#
|
|
53
|
+
# The working file and the index copy are handled separately, so /update
|
|
54
|
+
# commits this change and never an unrelated edit someone left in the file.
|
|
55
|
+
# Only the api_url string itself is replaced, byte for byte: formatting, key
|
|
56
|
+
# order, line endings, a byte-order mark and the file mode all stay as they
|
|
57
|
+
# were. An api_url written any other way (escaped, repeated) is left for the
|
|
58
|
+
# person to change by hand. Nothing is rewritten when either copy is Local,
|
|
59
|
+
# when egregore.json is a link (its target may belong to something else; the
|
|
60
|
+
# warning says to change it there), or when the working file is missing or
|
|
61
|
+
# unreadable. Nothing is staged for an untracked, sparse or assume-unchanged
|
|
62
|
+
# file. The index copy is staged first and the working file written second; a
|
|
63
|
+
# failed write restores the index, so the two never disagree about the
|
|
64
|
+
# address. A skip warns on stderr and never stops /update: the resolver
|
|
65
|
+
# already sends every request to the hosted API. Never at session start, where
|
|
66
|
+
# a modified tracked file would stop the startup sync. A source instance
|
|
67
|
+
# (upstream_url "none") skips the update commit, so it is left to the
|
|
68
|
+
# resolver.
|
|
69
|
+
# shellcheck source=bin/lib/config.sh
|
|
70
|
+
source "$SCRIPT_DIR/bin/lib/config.sh"
|
|
71
|
+
address_warn() { echo " ! $*" >&2; }
|
|
72
|
+
# saved_api_url TEXT — the api_url string jq reads from TEXT, if any.
|
|
73
|
+
saved_api_url() { jq -r '.api_url | strings' 2>/dev/null <<< "$1" || true; }
|
|
74
|
+
# other_keys TEXT — everything jq reads from TEXT apart from api_url.
|
|
75
|
+
other_keys() { jq -cS 'del(.api_url)' 2>/dev/null <<< "$1"; }
|
|
76
|
+
# address_state TEXT — "retired" for a Connected config (the _detect_mode
|
|
77
|
+
# test) whose saved address is the retired origin, "local" for a Local one,
|
|
78
|
+
# "keep" for anything else, including text that is not a JSON object.
|
|
79
|
+
address_state() {
|
|
80
|
+
local text="$1" saved
|
|
81
|
+
if ! jq -e 'type == "object"' >/dev/null 2>&1 <<< "$text"; then echo keep; return 0; fi
|
|
82
|
+
if ! jq -e "$EGREGORE_CONNECTED_JQ" >/dev/null 2>&1 <<< "$text"; then echo local; return 0; fi
|
|
83
|
+
saved="$(saved_api_url "$text")"
|
|
84
|
+
if [ "$(jq -r '.upstream_url | strings' 2>/dev/null <<< "$text" || true)" != none ] \
|
|
85
|
+
&& _retired_api_url "$saved" \
|
|
86
|
+
&& [ "$(_hosted_api_url "$saved" 2>/dev/null || true)" = "$EGREGORE_HOSTED_API_ORIGIN" ]; then
|
|
87
|
+
echo retired
|
|
88
|
+
else
|
|
89
|
+
echo keep
|
|
90
|
+
fi
|
|
91
|
+
}
|
|
92
|
+
# hosted_address_text TEXT — sets ADDRESS_TEXT to TEXT with only its api_url
|
|
93
|
+
# string replaced by the hosted address. Fails, leaving it empty, unless TEXT
|
|
94
|
+
# holds "api_url" exactly once, as a string without escapes that is the value
|
|
95
|
+
# jq reads, and the replacement changes nothing else jq can see.
|
|
96
|
+
hosted_address_text() {
|
|
97
|
+
local LC_ALL=C
|
|
98
|
+
local text="$1" key='"api_url"' value_re='^([[:space:]]*:[[:space:]]*")([^"\\]*)"' after updated before_keys after_keys
|
|
99
|
+
ADDRESS_TEXT=""
|
|
100
|
+
case "$text" in *"$key"*) ;; *) return 1 ;; esac
|
|
101
|
+
after="${text#*"$key"}"
|
|
102
|
+
case "$after" in *"$key"*) return 1 ;; esac
|
|
103
|
+
[[ "$after" =~ $value_re ]] || return 1
|
|
104
|
+
[ "${BASH_REMATCH[2]}" = "$(saved_api_url "$text")" ] || return 1
|
|
105
|
+
updated="${text%%"$key"*}$key${BASH_REMATCH[1]}$EGREGORE_HOSTED_API_ORIGIN\"${after#"${BASH_REMATCH[0]}"}"
|
|
106
|
+
[ "$(saved_api_url "$updated")" = "$EGREGORE_HOSTED_API_ORIGIN" ] || return 1
|
|
107
|
+
before_keys="$(other_keys "$text")" && after_keys="$(other_keys "$updated")" \
|
|
108
|
+
&& [ "$before_keys" = "$after_keys" ] || return 1
|
|
109
|
+
ADDRESS_TEXT="$updated"
|
|
110
|
+
}
|
|
111
|
+
# read_exact FILE — sets EXACT_TEXT to FILE's bytes, trailing newlines kept.
|
|
112
|
+
read_exact() {
|
|
113
|
+
local text
|
|
114
|
+
text="$(cat -- "$1" 2>/dev/null && printf .)" || return 1
|
|
115
|
+
EXACT_TEXT="${text%.}"
|
|
116
|
+
}
|
|
117
|
+
config_path="$SCRIPT_DIR/egregore.json"
|
|
118
|
+
worktree_state=absent
|
|
119
|
+
worktree_text=""
|
|
120
|
+
if [ -L "$config_path" ]; then
|
|
121
|
+
worktree_state=link
|
|
122
|
+
elif [ -f "$config_path" ]; then
|
|
123
|
+
if [ -r "$config_path" ] && read_exact "$config_path"; then
|
|
124
|
+
worktree_text="$EXACT_TEXT"
|
|
125
|
+
worktree_state="$(address_state "$worktree_text")"
|
|
126
|
+
else
|
|
127
|
+
worktree_state=unreadable
|
|
128
|
+
fi
|
|
129
|
+
fi
|
|
130
|
+
index_state=untracked
|
|
131
|
+
index_stageable=false
|
|
132
|
+
index_entry="$(git -C "$SCRIPT_DIR" ls-files -s -- egregore.json 2>/dev/null || true)"
|
|
133
|
+
index_mode="${index_entry%% *}"
|
|
134
|
+
index_sha="${index_entry#* }"
|
|
135
|
+
index_sha="${index_sha%% *}"
|
|
136
|
+
index_text=""
|
|
137
|
+
case "$index_entry" in
|
|
138
|
+
100644\ *\ 0$'\t'egregore.json|100755\ *\ 0$'\t'egregore.json)
|
|
139
|
+
index_text="$(git -C "$SCRIPT_DIR" cat-file blob "$index_sha" 2>/dev/null && printf .)" || index_text=""
|
|
140
|
+
if [ -n "$index_text" ]; then
|
|
141
|
+
index_text="${index_text%.}"
|
|
142
|
+
index_state="$(address_state "$index_text")"
|
|
143
|
+
# Only a normal entry ("H"): skip-worktree and assume-unchanged files
|
|
144
|
+
# are set aside from this checkout, so their commits are not ours to make.
|
|
145
|
+
index_tag="$(git -C "$SCRIPT_DIR" ls-files -v -- egregore.json 2>/dev/null || true)"
|
|
146
|
+
[ "${index_tag%% *}" = H ] && index_stageable=true
|
|
147
|
+
else
|
|
148
|
+
index_state=other
|
|
149
|
+
fi
|
|
150
|
+
;;
|
|
151
|
+
'') ;;
|
|
152
|
+
*) index_state=other ;;
|
|
153
|
+
esac
|
|
154
|
+
address_updated=false
|
|
155
|
+
by_hand="set api_url to $EGREGORE_HOSTED_API_ORIGIN by hand"
|
|
156
|
+
if [ "$worktree_state" = link ]; then
|
|
157
|
+
if read_exact "$config_path" && [ "$(address_state "$EXACT_TEXT")" = retired ]; then
|
|
158
|
+
address_warn "egregore.json is a link, so its saved hosted address was left as is; requests still use $EGREGORE_HOSTED_API_ORIGIN. Set api_url to it in the file the link points to."
|
|
159
|
+
fi
|
|
160
|
+
elif [ "$worktree_state" = unreadable ]; then
|
|
161
|
+
address_warn "egregore.json can't be read, so its saved hosted address wasn't checked. If it names the retired address, $by_hand."
|
|
162
|
+
elif [ "$worktree_state" = local ] || [ "$index_state" = local ]; then
|
|
163
|
+
if [ "$worktree_state" = retired ] || [ "$index_state" = retired ]; then
|
|
164
|
+
address_warn "egregore.json is Local in one copy and Connected in the other, so its saved hosted address was left as is; requests still use $EGREGORE_HOSTED_API_ORIGIN."
|
|
165
|
+
fi
|
|
166
|
+
else
|
|
167
|
+
stage_index=false
|
|
168
|
+
write_worktree=false
|
|
169
|
+
if [ "$index_state" = retired ]; then
|
|
170
|
+
if [ "$worktree_state" = absent ]; then
|
|
171
|
+
address_warn "egregore.json is missing from this checkout, so its committed hosted address was left as is."
|
|
172
|
+
elif [ "$index_stageable" != true ]; then
|
|
173
|
+
address_warn "egregore.json is set aside from this checkout (sparse or assume-unchanged), so its committed hosted address was left as is."
|
|
174
|
+
else
|
|
175
|
+
stage_index=true
|
|
176
|
+
fi
|
|
177
|
+
fi
|
|
178
|
+
[ "$worktree_state" != retired ] || write_worktree=true
|
|
179
|
+
index_new=""
|
|
180
|
+
worktree_new=""
|
|
181
|
+
plan_ok=true
|
|
182
|
+
if [ "$stage_index" = true ]; then
|
|
183
|
+
if hosted_address_text "$index_text"; then index_new="$ADDRESS_TEXT"; else plan_ok=false; fi
|
|
184
|
+
fi
|
|
185
|
+
if [ "$write_worktree" = true ]; then
|
|
186
|
+
if hosted_address_text "$worktree_text"; then worktree_new="$ADDRESS_TEXT"; else plan_ok=false; fi
|
|
187
|
+
fi
|
|
188
|
+
if [ "$plan_ok" != true ]; then
|
|
189
|
+
address_warn "egregore.json's api_url is written in a way this update can't change safely, so it was left as is; requests still use $EGREGORE_HOSTED_API_ORIGIN. Please $by_hand."
|
|
190
|
+
elif [ "$stage_index" = true ] || [ "$write_worktree" = true ]; then
|
|
191
|
+
landed=true
|
|
192
|
+
index_staged=false
|
|
193
|
+
if [ "$stage_index" = true ]; then
|
|
194
|
+
if index_blob="$(printf '%s' "$index_new" | git -C "$SCRIPT_DIR" hash-object -w --no-filters --stdin 2>/dev/null)" \
|
|
195
|
+
&& git -C "$SCRIPT_DIR" update-index --cacheinfo "$index_mode,$index_blob,egregore.json" 2>/dev/null; then
|
|
196
|
+
index_staged=true
|
|
197
|
+
else
|
|
198
|
+
landed=false
|
|
199
|
+
address_warn "Could not stage the hosted services address, so egregore.json was left as is; requests still use $EGREGORE_HOSTED_API_ORIGIN. Run /update again, or $by_hand."
|
|
200
|
+
fi
|
|
201
|
+
fi
|
|
202
|
+
if [ "$landed" = true ] && [ "$write_worktree" = true ]; then
|
|
203
|
+
config_mode="$(stat -c '%a' "$config_path" 2>/dev/null || stat -f '%Lp' "$config_path" 2>/dev/null || echo 644)"
|
|
204
|
+
config_tmp="$(mktemp "$config_path.XXXXXX" 2>/dev/null || true)"
|
|
205
|
+
if [ -n "$config_tmp" ] && printf '%s' "$worktree_new" > "$config_tmp" \
|
|
206
|
+
&& chmod "$config_mode" "$config_tmp" && mv -f "$config_tmp" "$config_path"; then
|
|
207
|
+
:
|
|
208
|
+
else
|
|
209
|
+
landed=false
|
|
210
|
+
[ -z "$config_tmp" ] || rm -f "$config_tmp"
|
|
211
|
+
if [ "$index_staged" = true ] \
|
|
212
|
+
&& ! git -C "$SCRIPT_DIR" update-index --cacheinfo "$index_mode,$index_sha,egregore.json" 2>/dev/null; then
|
|
213
|
+
address_warn "Could not update the hosted services address in egregore.json, and its staged copy could not be put back; run git restore --staged egregore.json, then $by_hand."
|
|
214
|
+
else
|
|
215
|
+
address_warn "Could not update the hosted services address in egregore.json; it is unchanged, and requests still use $EGREGORE_HOSTED_API_ORIGIN."
|
|
216
|
+
fi
|
|
217
|
+
fi
|
|
218
|
+
fi
|
|
219
|
+
[ "$landed" != true ] || address_updated=true
|
|
220
|
+
fi
|
|
221
|
+
fi
|
|
222
|
+
if [ "$address_updated" = true ]; then
|
|
223
|
+
echo " ✓ Hosted services address updated after the October security reset"
|
|
224
|
+
MIGRATED=1
|
|
225
|
+
fi
|
|
226
|
+
|
|
46
227
|
# --- Future migrations go here ---
|
|
47
228
|
# Each migration should:
|
|
48
229
|
# 1. Check if it needs to run (idempotent guard)
|
|
@@ -74,7 +74,6 @@ function adapt(sourceSpec) {
|
|
|
74
74
|
["Egregore on Codex", "Egregore on Prime Agent"],
|
|
75
75
|
["Codex-native", "Prime-native"],
|
|
76
76
|
["Codex sessions", "Prime Agent sessions"],
|
|
77
|
-
["On Codex", "On Prime Agent"],
|
|
78
77
|
["bin/codex-session-start.sh", "bin/prime-session-start.sh"],
|
|
79
78
|
[".codex/hooks/branch-guard.js", ".prime/agent/extensions/egregore.ts"],
|
|
80
79
|
["PreToolUse hook (launcher `--enable hooks`)", "`tool_call` gate (loaded from the project-local extension)"],
|