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
|
@@ -3,11 +3,40 @@ set -o pipefail
|
|
|
3
3
|
|
|
4
4
|
# Framework version — bumped on greeting/startup changes.
|
|
5
5
|
# Used for drift detection across team members.
|
|
6
|
-
FRAMEWORK_VERSION="
|
|
6
|
+
FRAMEWORK_VERSION="8"
|
|
7
7
|
|
|
8
8
|
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
9
9
|
cd "$SCRIPT_DIR"
|
|
10
10
|
|
|
11
|
+
# --- Card delivery by contract (bin/lib/card-delivery.sh) ---
|
|
12
|
+
# Inside a Claude Code hook the harness shows the card to the user (hook
|
|
13
|
+
# systemMessage) and the model receives only the context, so the model never
|
|
14
|
+
# retypes it. The launcher-printed card (#1420/#1472) could not do this: Claude
|
|
15
|
+
# Code ≥2.1.89 boots into the alternate screen and hid it (#1493).
|
|
16
|
+
# The startup runs as an inner pass with its stdout captured to a file:
|
|
17
|
+
# anything printed before the greeting (worktree warnings, repo checks,
|
|
18
|
+
# onboarding_needed) stays out of the JSON, and detached jobs inherit the file
|
|
19
|
+
# rather than the hook's pipe. With a fresh saved card the outer pass instead
|
|
20
|
+
# runs a quick pass (per-session work only), shows the saved card, and runs
|
|
21
|
+
# the full startup detached as a refresh pass. Harness mode exists only inside
|
|
22
|
+
# these passes, so a run that cannot capture falls back to the plain greeting
|
|
23
|
+
# and its display instruction.
|
|
24
|
+
source "$SCRIPT_DIR/bin/lib/card-delivery.sh"
|
|
25
|
+
_CARD_PASS=""
|
|
26
|
+
case "${_EGREGORE_CARD_PASS:-}" in
|
|
27
|
+
inner|quick|refresh)
|
|
28
|
+
_CARD_PASS="$_EGREGORE_CARD_PASS"
|
|
29
|
+
EGREGORE_CARD_DELIVERY="harness"
|
|
30
|
+
export -n EGREGORE_CARD_DELIVERY _EGREGORE_CARD_PASS 2>/dev/null || true
|
|
31
|
+
;;
|
|
32
|
+
*)
|
|
33
|
+
if [ "$(egregore_card_delivery_mode)" = "harness" ]; then
|
|
34
|
+
egregore_card_outer_pass "$SCRIPT_DIR" "$FRAMEWORK_VERSION"
|
|
35
|
+
fi
|
|
36
|
+
EGREGORE_CARD_DELIVERY="text"
|
|
37
|
+
;;
|
|
38
|
+
esac
|
|
39
|
+
|
|
11
40
|
# --- Transient development-checkout detection ---
|
|
12
41
|
# Git worktrees have .git as a FILE. The launcher also marks standalone
|
|
13
42
|
# development clones as transient so startup preserves their feature branch
|
|
@@ -30,6 +59,9 @@ if [ -f "$SCRIPT_DIR/bin/lib/worktree-links.sh" ]; then
|
|
|
30
59
|
egregore_link_shared_state "$SCRIPT_DIR" "$MAIN_PROJECT_DIR" >/dev/null 2>/dev/null || true
|
|
31
60
|
fi
|
|
32
61
|
|
|
62
|
+
# A refresh pass runs after the session is live: the quick pass already reset
|
|
63
|
+
# consent, and a grant the user gave since then must survive.
|
|
64
|
+
if [ "$_CARD_PASS" != "refresh" ]; then
|
|
33
65
|
# Clear any branch-guard consent from a previous session — consent to write on
|
|
34
66
|
# a protected branch is asked fresh each session (see CLAUDE.md branch-guard protocol).
|
|
35
67
|
rm -f "$SCRIPT_DIR/.egregore-branch-consent" "$MAIN_PROJECT_DIR/.egregore-branch-consent" 2>/dev/null
|
|
@@ -38,6 +70,7 @@ rm -f "$SCRIPT_DIR/.egregore-branch-consent" "$MAIN_PROJECT_DIR/.egregore-branch
|
|
|
38
70
|
rm -f "$SCRIPT_DIR/.egregore-boundary-consent" "$MAIN_PROJECT_DIR/.egregore-boundary-consent" 2>/dev/null
|
|
39
71
|
# Prune abandoned scratch without blocking startup or fresh sibling work.
|
|
40
72
|
( bash "$SCRIPT_DIR/bin/scratch-sweep.sh" --older-than 60 >/dev/null 2>&1 & ) 2>/dev/null
|
|
73
|
+
fi
|
|
41
74
|
|
|
42
75
|
# --- Health tracking (rendered as dots in greeting) ---
|
|
43
76
|
HEALTH_GITHUB="skip"
|
|
@@ -68,6 +101,22 @@ egregore_trace_mark "libs-loaded" 2>/dev/null || true
|
|
|
68
101
|
# ============================================================
|
|
69
102
|
# 1. Resolve identity
|
|
70
103
|
# ============================================================
|
|
104
|
+
# Claude Code hands this hook its own session id on stdin. identity.sh maps
|
|
105
|
+
# it to the Egregore id it mints (bin/session-id.sh), so this session's
|
|
106
|
+
# commits resolve their own id. Shell variables only: daemons started here
|
|
107
|
+
# outlive the session and must not inherit it. Only a SessionStart hook run
|
|
108
|
+
# (Claude Code sets CLAUDE_ENV_FILE for those alone) reads stdin; every other
|
|
109
|
+
# run, manual or scripted, never waits on it and maps nothing.
|
|
110
|
+
if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ ! -t 0 ] && command -v jq >/dev/null 2>&1; then
|
|
111
|
+
_HOOK_INPUT=""
|
|
112
|
+
IFS= read -r -t 1 -d '' _HOOK_INPUT || true
|
|
113
|
+
_HOOK_SESSION=$(printf '%s' "$_HOOK_INPUT" | jq -r '.session_id // empty' 2>/dev/null || true)
|
|
114
|
+
if [ -n "$_HOOK_SESSION" ]; then
|
|
115
|
+
EGREGORE_NATIVE_SESSION_ID="$_HOOK_SESSION" EGREGORE_NATIVE_HARNESS=claude
|
|
116
|
+
EGREGORE_START_HARNESS=claude
|
|
117
|
+
fi
|
|
118
|
+
unset _HOOK_INPUT _HOOK_SESSION
|
|
119
|
+
fi
|
|
71
120
|
source "$SCRIPT_DIR/bin/lib/identity.sh"
|
|
72
121
|
egregore_trace_mark "identity" 2>/dev/null || true
|
|
73
122
|
|
|
@@ -171,7 +220,7 @@ if [ "$LOCAL_MODE" != "true" ]; then
|
|
|
171
220
|
if [ -n "$EXPECTED_SLUG" ] && [ "$KEY_SLUG" != "$EXPECTED_SLUG" ] \
|
|
172
221
|
&& _graph_projection_enabled; then
|
|
173
222
|
# Slug differs from config — ask the API whether the key actually works
|
|
174
|
-
PROBE_URL=$(
|
|
223
|
+
PROBE_URL=$(_config_api_url) || PROBE_URL=""
|
|
175
224
|
PROBE_CODE="000"
|
|
176
225
|
if [ -n "$PROBE_URL" ]; then
|
|
177
226
|
PROBE_CODE=$(curl -s -o /dev/null -w '%{http_code}' \
|
|
@@ -200,7 +249,7 @@ if [ "$LOCAL_MODE" != "true" ]; then
|
|
|
200
249
|
fi
|
|
201
250
|
fi
|
|
202
251
|
|
|
203
|
-
if [ "$KEY_NEEDS_FIX" = "true" ]; then
|
|
252
|
+
if [ "$KEY_NEEDS_FIX" = "true" ] && [ "$_CARD_PASS" != "quick" ]; then
|
|
204
253
|
# Plain background job, NOT double-forked: git-sync's `wait` must join this
|
|
205
254
|
# before the graph bootstrap runs — a repaired key that lands after boot
|
|
206
255
|
# means that launch already skipped auto-capture with no WAL entry to
|
|
@@ -208,7 +257,7 @@ if [ "$KEY_NEEDS_FIX" = "true" ]; then
|
|
|
208
257
|
# fine, this block never runs) and bounds broken-key boots at curl's 10s cap.
|
|
209
258
|
(
|
|
210
259
|
GITHUB_TOKEN=$(grep '^GITHUB_TOKEN=' "$ENV_FILE" 2>/dev/null | cut -d'=' -f2-)
|
|
211
|
-
API_URL=$(
|
|
260
|
+
API_URL=$(_config_api_url) || API_URL=""
|
|
212
261
|
GITHUB_ORG=$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)
|
|
213
262
|
|
|
214
263
|
if [ -n "$GITHUB_TOKEN" ] && [ -n "$API_URL" ] && [ -n "$GITHUB_ORG" ]; then
|
|
@@ -245,158 +294,48 @@ fi
|
|
|
245
294
|
# 4. Instance registry + boundary
|
|
246
295
|
# ============================================================
|
|
247
296
|
|
|
248
|
-
# ---
|
|
249
|
-
#
|
|
250
|
-
#
|
|
251
|
-
|
|
297
|
+
# --- Instance registry maintenance (bin/lib/instance-registry.sh) ---
|
|
298
|
+
# Prune entries that are runtime state of another instance (a checkout inside
|
|
299
|
+
# its .egregore/, such as an evaluation sandbox), then self-register this
|
|
300
|
+
# checkout (for pre-registry installs). Worktrees should NOT register as
|
|
301
|
+
# separate instances, and neither does runtime state. Wrapped in a subshell —
|
|
302
|
+
# maintenance is optional and must not block session start.
|
|
303
|
+
if [ "$_CARD_PASS" != "quick" ] && command -v jq &>/dev/null && [ -f "$SCRIPT_DIR/bin/lib/instance-registry.sh" ]; then
|
|
252
304
|
( (
|
|
253
305
|
REGISTRY_DIR="$HOME/.egregore"
|
|
254
306
|
REGISTRY="$REGISTRY_DIR/instances.json"
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
if [ -n "$INST_SLUG" ] && [ -n "$INST_NAME" ]; then
|
|
264
|
-
mkdir -p "$REGISTRY_DIR"
|
|
265
|
-
if [ ! -f "$REGISTRY" ]; then echo "[]" > "$REGISTRY"; fi
|
|
266
|
-
|
|
267
|
-
ALREADY=$(jq --arg p "$SCRIPT_DIR" '[.[] | select(.path == $p)] | length' "$REGISTRY")
|
|
268
|
-
if [ "$ALREADY" = "0" ]; then
|
|
269
|
-
# org_id is the stable identity other sessions use to prove this
|
|
270
|
-
# checkout is same-organization rather than foreign
|
|
271
|
-
ENTRY=$(jq -n --arg s "$INST_SLUG" --arg n "$INST_NAME" --arg p "$SCRIPT_DIR" --arg o "$INST_ORG" \
|
|
272
|
-
'{slug: $s, name: $n, path: $p} + (if $o == "" then {} else {org_id: $o} end)')
|
|
273
|
-
jq --argjson e "$ENTRY" '. + [$e]' "$REGISTRY" > "$REGISTRY.tmp" \
|
|
274
|
-
&& mv "$REGISTRY.tmp" "$REGISTRY"
|
|
275
|
-
elif [ -n "$INST_ORG" ]; then
|
|
276
|
-
# Backward compatibility: patch this checkout's own legacy entry with
|
|
277
|
-
# its org_id so other sessions can prove identity instead of failing
|
|
278
|
-
# closed against it
|
|
279
|
-
jq --arg p "$SCRIPT_DIR" --arg o "$INST_ORG" \
|
|
280
|
-
'map(if .path == $p and ((.org_id // "") == "") then . + {org_id: $o} else . end)' \
|
|
281
|
-
"$REGISTRY" > "$REGISTRY.tmp" \
|
|
282
|
-
&& mv "$REGISTRY.tmp" "$REGISTRY"
|
|
283
|
-
fi
|
|
307
|
+
source "$SCRIPT_DIR/bin/lib/instance-registry.sh"
|
|
308
|
+
egregore_registry_prune "$REGISTRY"
|
|
309
|
+
if [ "$IS_WORKTREE" = "false" ] && [ -f "$CONFIG" ]; then
|
|
310
|
+
# Registration needs a slug and org_name in egregore.json; without them it does nothing.
|
|
311
|
+
INST_SLUG=$(jq -r '.slug // empty' "$CONFIG")
|
|
312
|
+
INST_NAME=$(jq -r '.org_name // empty' "$CONFIG")
|
|
313
|
+
INST_ORG=$(jq -r '.org_id // empty' "$CONFIG")
|
|
314
|
+
egregore_registry_register "$REGISTRY" "$SCRIPT_DIR" "$INST_SLUG" "$INST_NAME" "$INST_ORG"
|
|
284
315
|
fi
|
|
285
316
|
) >/dev/null 2>&1 & ) 2>/dev/null || true
|
|
286
317
|
fi
|
|
287
318
|
|
|
288
319
|
# --- Compute session boundary for environment isolation ---
|
|
289
320
|
compute_boundary() {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
local boundary_file="/tmp/egregore-boundary-${hash}.json"
|
|
293
|
-
local project_dir="$SCRIPT_DIR"
|
|
294
|
-
|
|
295
|
-
# Resolve memory directory (follow symlink)
|
|
296
|
-
local memory_dir=""
|
|
297
|
-
if [ -L "$SCRIPT_DIR/memory" ]; then
|
|
298
|
-
memory_dir=$(realpath "$SCRIPT_DIR/memory" 2>/dev/null || echo "")
|
|
299
|
-
fi
|
|
300
|
-
|
|
301
|
-
# Validate and resolve managed repos
|
|
302
|
-
local managed_repos_json="[]"
|
|
303
|
-
local parent_dir
|
|
304
|
-
parent_dir="$(dirname "$SCRIPT_DIR")"
|
|
305
|
-
local repos
|
|
306
|
-
repos=$(jq -r '(.repos[]? // empty) | if type == "object" then .name else . end' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
|
|
307
|
-
if [ -n "$repos" ]; then
|
|
308
|
-
# Validate repos first
|
|
321
|
+
# repos[] traversal warnings stay visible in the greeting.
|
|
322
|
+
if [ -n "$(jq -r '(.repos[]? // empty)' "$SCRIPT_DIR/egregore.json" 2>/dev/null)" ]; then
|
|
309
323
|
bash "$SCRIPT_DIR/bin/boundary.sh" validate-repos 2>/dev/null || true
|
|
310
|
-
managed_repos_json="["
|
|
311
|
-
local first=true
|
|
312
|
-
for repo in $repos; do
|
|
313
|
-
# Skip entries with path traversal or absolute paths
|
|
314
|
-
[[ "$repo" == *".."* ]] && continue
|
|
315
|
-
[[ "$repo" == /* ]] && continue
|
|
316
|
-
local resolved
|
|
317
|
-
resolved=$(realpath "$parent_dir/$repo" 2>/dev/null || echo "")
|
|
318
|
-
[ -z "$resolved" ] && continue
|
|
319
|
-
# Must resolve under parent directory
|
|
320
|
-
[[ "$resolved" != "$parent_dir"/* ]] && continue
|
|
321
|
-
$first || managed_repos_json="$managed_repos_json,"
|
|
322
|
-
managed_repos_json="$managed_repos_json\"$resolved\""
|
|
323
|
-
first=false
|
|
324
|
-
done
|
|
325
|
-
managed_repos_json="$managed_repos_json]"
|
|
326
|
-
fi
|
|
327
|
-
|
|
328
|
-
# Collect denied paths from instance registry. Only checkouts proven to
|
|
329
|
-
# share this instance's stable organization identity (org_id) are excluded;
|
|
330
|
-
# ancestry or a matching slug proves nothing, and entries without org_id
|
|
331
|
-
# stay denied (fail closed). Shared logic: bin/boundary.sh compute-denied.
|
|
332
|
-
local denied_paths_json="[]"
|
|
333
|
-
local registry="$HOME/.egregore/instances.json"
|
|
334
|
-
if [ -f "$registry" ]; then
|
|
335
|
-
local self_org
|
|
336
|
-
self_org=$(jq -r '.org_id // empty' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
|
|
337
|
-
denied_paths_json=$(bash "$SCRIPT_DIR/bin/boundary.sh" compute-denied \
|
|
338
|
-
"$registry" "$project_dir" "$self_org" 2>/dev/null || echo "[]")
|
|
339
|
-
case "$denied_paths_json" in "["*) ;; *) denied_paths_json="[]" ;; esac
|
|
340
|
-
fi
|
|
341
|
-
|
|
342
|
-
# --- Boundary policy: posture + read roots (two-tier consent model) ---
|
|
343
|
-
# Org layer: egregore.json .boundary { posture, read[], locked } — committed.
|
|
344
|
-
# Personal layer: .egregore-boundary.local.json { posture, read[] } — gitignored,
|
|
345
|
-
# ignored entirely when the org layer sets locked: true.
|
|
346
|
-
local posture locked personal_file="$SCRIPT_DIR/.egregore-boundary.local.json"
|
|
347
|
-
posture=$(jq -r '.boundary.posture // "standard"' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
|
|
348
|
-
locked=$(jq -r '.boundary.locked // false' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
|
|
349
|
-
case "$posture" in strict|standard|open) ;; *) posture="standard" ;; esac
|
|
350
|
-
[ "$locked" = "true" ] || locked="false"
|
|
351
|
-
if [ "$locked" != "true" ] && [ -f "$personal_file" ]; then
|
|
352
|
-
local p_posture
|
|
353
|
-
p_posture=$(jq -r '.posture // empty' "$personal_file" 2>/dev/null)
|
|
354
|
-
case "$p_posture" in strict|standard|open) posture="$p_posture" ;; esac
|
|
355
324
|
fi
|
|
356
325
|
|
|
357
|
-
#
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
org_roots=$(jq -r '.boundary.read[]? // empty' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
|
|
365
|
-
[ -n "$org_roots" ] && raw_roots="$raw_roots
|
|
366
|
-
$org_roots"
|
|
367
|
-
if [ "$locked" != "true" ] && [ -f "$personal_file" ]; then
|
|
368
|
-
local personal_roots
|
|
369
|
-
personal_roots=$(jq -r '.read[]? // empty' "$personal_file" 2>/dev/null)
|
|
370
|
-
[ -n "$personal_roots" ] && raw_roots="$raw_roots
|
|
371
|
-
$personal_roots"
|
|
372
|
-
fi
|
|
373
|
-
if [ -n "$raw_roots" ]; then
|
|
374
|
-
read_roots_json=$(printf '%s\n' "$raw_roots" | sed -e '/^$/d' -e "s|^~|$HOME|" | sort -u | jq -R . | jq -s -c .)
|
|
375
|
-
[ -z "$read_roots_json" ] && read_roots_json="[]"
|
|
376
|
-
fi
|
|
326
|
+
# Memory, managed repos, denied instances (only checkouts proven to share
|
|
327
|
+
# this instance's org_id are excluded; ancestry or a slug proves nothing),
|
|
328
|
+
# posture and read roots come from one shared computation — the same one the
|
|
329
|
+
# Codex/Pi/Prime session start, worktree creation, and every pre-action
|
|
330
|
+
# check use. An unreadable registry is recorded, never read as empty.
|
|
331
|
+
local deny_rules settings_local="$SCRIPT_DIR/.claude/settings.local.json"
|
|
332
|
+
bash "$SCRIPT_DIR/bin/node-run.sh" "$SCRIPT_DIR/bin/boundary-guard.cjs" write-cache "$SCRIPT_DIR" >/dev/null 2>&1 || true
|
|
377
333
|
|
|
378
|
-
#
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
--argjson locked "$locked" \
|
|
384
|
-
--argjson read_roots "$read_roots_json" \
|
|
385
|
-
--argjson managed_repos "$managed_repos_json" \
|
|
386
|
-
--argjson denied_paths "$denied_paths_json" \
|
|
387
|
-
'{project_dir: $project_dir, memory_dir: $memory_dir, posture: $posture, locked: $locked, read_roots: $read_roots, managed_repos: $managed_repos, denied_paths: $denied_paths}' \
|
|
388
|
-
> "$boundary_file.tmp" && mv "$boundary_file.tmp" "$boundary_file"
|
|
389
|
-
|
|
390
|
-
# Generate dynamic deny rules in .claude/settings.local.json
|
|
391
|
-
local settings_local="$SCRIPT_DIR/.claude/settings.local.json"
|
|
392
|
-
local deny_rules="[]"
|
|
393
|
-
if [ "$denied_paths_json" != "[]" ]; then
|
|
394
|
-
deny_rules=$(echo "$denied_paths_json" | jq '[.[] | "Read(" + . + "/**)", "Edit(" + . + "/**)"]')
|
|
395
|
-
fi
|
|
396
|
-
# Deny writing to instance registry (reads allowed for multi-instance features).
|
|
397
|
-
# Edit() alone covers Write/NotebookEdit too — Write() rules are never matched by
|
|
398
|
-
# the permission checker and only trigger a startup "not matched" warning if included.
|
|
399
|
-
deny_rules=$(echo "$deny_rules" | jq '. + ["Edit(~/.egregore/instances.json)"]')
|
|
334
|
+
# Claude's native deny rules (a second line of defence behind the hook):
|
|
335
|
+
# generated by the same module, so they carry its self-scope carve-out and
|
|
336
|
+
# registry protection instead of a second copy of the rules.
|
|
337
|
+
deny_rules=$(bash "$SCRIPT_DIR/bin/node-run.sh" "$SCRIPT_DIR/bin/boundary-guard.cjs" native-denials "$SCRIPT_DIR" 2>/dev/null) || return 0
|
|
338
|
+
printf '%s' "$deny_rules" | jq -e 'type == "array"' >/dev/null 2>&1 || return 0
|
|
400
339
|
|
|
401
340
|
# Merge with existing settings.local.json — only touch permissions.deny
|
|
402
341
|
mkdir -p "$SCRIPT_DIR/.claude"
|
|
@@ -409,15 +348,49 @@ $personal_roots"
|
|
|
409
348
|
fi
|
|
410
349
|
}
|
|
411
350
|
|
|
412
|
-
# Run boundary computation (non-blocking, but fast — just file I/O)
|
|
413
|
-
|
|
351
|
+
# Run boundary computation (non-blocking, but fast — just file I/O). The
|
|
352
|
+
# quick pass already wrote it for a refreshing session.
|
|
353
|
+
[ "$_CARD_PASS" != "refresh" ] && { compute_boundary 2>/dev/null || true; }
|
|
354
|
+
|
|
355
|
+
# The quick pass ends here: the per-session work is done and the outer pass
|
|
356
|
+
# shows the saved card, then runs everything below as a detached refresh.
|
|
357
|
+
# That refresh leaves working trees alone under the live session
|
|
358
|
+
# (EGREGORE_GIT_SYNC_LIVE), so the checkout and the managed repos on their
|
|
359
|
+
# base branch catch up to the last fetch here: local, no network. The fast
|
|
360
|
+
# path runs only on the base branch.
|
|
361
|
+
if [ "$_CARD_PASS" = "quick" ]; then
|
|
362
|
+
# No hooks: a post-merge hook must never stall the hook's quick path.
|
|
363
|
+
if [ "$(git branch --show-current 2>/dev/null)" = "$BASE_BRANCH" ]; then
|
|
364
|
+
git -c core.hooksPath=/dev/null merge --ff-only "origin/$BASE_BRANCH" --quiet >/dev/null 2>&1 || true
|
|
365
|
+
fi
|
|
366
|
+
for _REPO in $(jq -r '(.repos[]? // empty) | if type == "object" then .name else . end' "$SCRIPT_DIR/egregore.json" 2>/dev/null); do
|
|
367
|
+
case "$_REPO" in *..*|/*) continue ;; esac # as bin/boundary.sh: siblings only
|
|
368
|
+
_REPO_DIR="$SCRIPT_DIR/../$_REPO"
|
|
369
|
+
[ -d "$_REPO_DIR/.git" ] || continue
|
|
370
|
+
_REPO_BASE=$(_get_base_branch "$_REPO" 2>/dev/null) || continue
|
|
371
|
+
[ "$(git -C "$_REPO_DIR" branch --show-current 2>/dev/null)" = "$_REPO_BASE" ] || continue
|
|
372
|
+
git -C "$_REPO_DIR" -c core.hooksPath=/dev/null merge --ff-only "origin/$_REPO_BASE" --quiet >/dev/null 2>&1 || true
|
|
373
|
+
done
|
|
374
|
+
egregore_trace_end 2>/dev/null || true
|
|
375
|
+
printf 'egregore-quick-ok %s\n' "$EGREGORE_SESSION_ID"
|
|
376
|
+
exit 0
|
|
377
|
+
fi
|
|
378
|
+
[ "$_CARD_PASS" = "refresh" ] && EGREGORE_GIT_SYNC_LIVE=1
|
|
414
379
|
|
|
415
380
|
# ============================================================
|
|
416
381
|
# 5. Git sync
|
|
417
382
|
# ============================================================
|
|
418
383
|
egregore_trace_mark "branch-onboarding-mode-boundary" 2>/dev/null || true
|
|
384
|
+
source "$SCRIPT_DIR/bin/lib/startup-restart.sh"
|
|
385
|
+
_STARTUP_HEAD=$(egregore_startup_head)
|
|
419
386
|
source "$SCRIPT_DIR/bin/lib/git-sync.sh"
|
|
420
387
|
egregore_trace_mark "git-sync" 2>/dev/null || true
|
|
388
|
+
# A sync that pulled a newer startup finishes on it (bin/lib/startup-restart.sh),
|
|
389
|
+
# in the same card pass.
|
|
390
|
+
[ -n "$_CARD_PASS" ] && export _EGREGORE_CARD_PASS="$_CARD_PASS"
|
|
391
|
+
egregore_startup_restart "$_STARTUP_HEAD" "$SCRIPT_DIR/bin/session-start.sh"
|
|
392
|
+
export -n _EGREGORE_CARD_PASS 2>/dev/null || true
|
|
393
|
+
unset _STARTUP_HEAD
|
|
421
394
|
|
|
422
395
|
# Resolve a legacy instance's stable Runtime identity before SessionStart
|
|
423
396
|
# finishes and UserPromptSubmit can invoke Observe. Once persisted this is a
|
|
@@ -689,12 +662,9 @@ if [ "$IS_WORKTREE" != "true" ]; then
|
|
|
689
662
|
|| rm -f "$_CARD_FILE.tmp.$$" 2>/dev/null || true
|
|
690
663
|
fi
|
|
691
664
|
|
|
692
|
-
#
|
|
693
|
-
#
|
|
694
|
-
# was reverted: Claude Code ≥2.1.89 boots into the alternate screen buffer,
|
|
695
|
-
# which hides anything a launcher prints pre-launch (see PR #1493 for the
|
|
696
|
-
# parked re-enable). The card cache write above stays — it is harmless and the
|
|
697
|
-
# re-enable path depends on it.
|
|
665
|
+
# In a Claude Code hook this output is captured by the outer pass at the top
|
|
666
|
+
# of this script, which turns it into the card-delivery envelope.
|
|
698
667
|
cat "$_GREETING_BUF"
|
|
668
|
+
( bash "$SCRIPT_DIR/bin/session-record.sh" --mode sweep >/dev/null 2>&1 & ) 2>/dev/null
|
|
699
669
|
rm -f "$_GREETING_BUF" 2>/dev/null || true
|
|
700
670
|
egregore_trace_end 2>/dev/null || true
|
|
@@ -23,6 +23,8 @@ set -euo pipefail
|
|
|
23
23
|
|
|
24
24
|
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
25
25
|
CONFIG="$SCRIPT_DIR/egregore.json"
|
|
26
|
+
# shellcheck source=bin/lib/config.sh
|
|
27
|
+
source "$SCRIPT_DIR/bin/lib/config.sh"
|
|
26
28
|
|
|
27
29
|
# ── helpers ──────────────────────────────────────────────────────────────
|
|
28
30
|
|
|
@@ -54,7 +56,7 @@ _save() {
|
|
|
54
56
|
# start's settings sync (bin/lib/settings-drift.sh).
|
|
55
57
|
_control_plane_push() {
|
|
56
58
|
local api_url api_key payload actor response revision
|
|
57
|
-
api_url=$(
|
|
59
|
+
api_url=$(_config_api_url) || return 0
|
|
58
60
|
[ -n "$api_url" ] || return 0
|
|
59
61
|
api_key=$(grep '^EGREGORE_API_KEY=' "$SCRIPT_DIR/.env" 2>/dev/null | cut -d'=' -f2- || true)
|
|
60
62
|
[ -n "$api_key" ] || return 0
|
|
@@ -70,10 +72,13 @@ _control_plane_push() {
|
|
|
70
72
|
--data-binary "$payload" 2>/dev/null) || return 0
|
|
71
73
|
revision=$(printf '%s' "$response" | jq -r '.settings_revision // empty' 2>/dev/null)
|
|
72
74
|
if [ -n "$revision" ] && [ -f "$SCRIPT_DIR/.egregore-state.json" ]; then
|
|
73
|
-
local st
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
local st state_file
|
|
76
|
+
# A worktree links the checkout's state file: the rename lands on the
|
|
77
|
+
# file it points to, so the link stays and the installation keeps one state.
|
|
78
|
+
state_file="$(realpath "$SCRIPT_DIR/.egregore-state.json" 2>/dev/null)" || state_file="$SCRIPT_DIR/.egregore-state.json"
|
|
79
|
+
st="$(mktemp "$state_file.XXXXXX")" || return 0
|
|
80
|
+
if jq --arg rev "$revision" '.org_settings_revision = $rev' "$state_file" > "$st" 2>/dev/null && [ -s "$st" ]; then
|
|
81
|
+
mv "$st" "$state_file"
|
|
77
82
|
else
|
|
78
83
|
rm -f "$st"
|
|
79
84
|
fi
|
|
@@ -394,7 +399,7 @@ _people_file() {
|
|
|
394
399
|
fi
|
|
395
400
|
( cd "$SCRIPT_DIR/memory" 2>/dev/null && git add -A people/ 2>/dev/null \
|
|
396
401
|
&& git commit -q -m "chore(settings): $op $user in people" 2>/dev/null \
|
|
397
|
-
&&
|
|
402
|
+
&& bash "$SCRIPT_DIR/bin/memory-push.sh" --repository "$SCRIPT_DIR/memory" --branch main >/dev/null 2>&1 ) || true
|
|
398
403
|
}
|
|
399
404
|
|
|
400
405
|
cmd_people() {
|
|
@@ -469,7 +474,7 @@ set -- "${_args[@]+"${_args[@]}"}"
|
|
|
469
474
|
# ── privacy & access (read snapshot) ─────────────────────────────────────
|
|
470
475
|
# One composed JSON for the Settings Privacy & access panel. Identity,
|
|
471
476
|
# membership, and capability values come from the Runtime authorization
|
|
472
|
-
# backend (access
|
|
477
|
+
# backend (access show --json); this shell layer adds only committed boundary
|
|
473
478
|
# config, the personal boundary-local file, isolation state, and honest
|
|
474
479
|
# constant statements. Never includes secrets, tokens, or internal paths.
|
|
475
480
|
|
|
@@ -499,7 +504,7 @@ cmd_privacy() {
|
|
|
499
504
|
local access posture locked org_reads personal_reads denied digest graph
|
|
500
505
|
access=$(cd "$SCRIPT_DIR" && EGREGORE_ROOT="$SCRIPT_DIR" \
|
|
501
506
|
PYTHONSAFEPATH=1 PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}" \
|
|
502
|
-
python3 -m egregore_runtime.harness_cli access
|
|
507
|
+
python3 -m egregore_runtime.harness_cli access show --json 2>/dev/null) || true
|
|
503
508
|
printf '%s' "$access" | jq -e . >/dev/null 2>&1 || access='{"status":"attention"}'
|
|
504
509
|
posture=$(jq -r '.boundary.posture // "standard"' "$CONFIG" 2>/dev/null || echo standard)
|
|
505
510
|
locked=$(jq -r 'if (.boundary.locked // false) == true then "true" else "false" end' "$CONFIG" 2>/dev/null || echo false)
|
|
@@ -13,7 +13,6 @@ STATE_FILE="$SCRIPT_DIR/.egregore-state.json"
|
|
|
13
13
|
[ -f "$ENV_FILE" ] || exit 0
|
|
14
14
|
|
|
15
15
|
# --- Read config ---
|
|
16
|
-
API_URL=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)
|
|
17
16
|
MODE=$(jq -r '.mode // "local"' "$CONFIG" 2>/dev/null)
|
|
18
17
|
CONFIG_SLUG=$(jq -r '.slug // empty' "$CONFIG" 2>/dev/null)
|
|
19
18
|
ORG_NAME=$(jq -r '.org_name // empty' "$CONFIG" 2>/dev/null)
|
|
@@ -21,6 +20,7 @@ GITHUB_ORG=$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)
|
|
|
21
20
|
|
|
22
21
|
# shellcheck source=bin/lib/config.sh
|
|
23
22
|
source "$SCRIPT_DIR/bin/lib/config.sh"
|
|
23
|
+
API_URL=$(_config_api_url)
|
|
24
24
|
|
|
25
25
|
# Runtime telemetry and diagnostics remain on-device by default. Historical
|
|
26
26
|
# Connected health reporting is retained only as an explicit operator action;
|
|
@@ -7,6 +7,8 @@ set -euo pipefail
|
|
|
7
7
|
umask 077
|
|
8
8
|
|
|
9
9
|
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
10
|
+
# shellcheck source=bin/lib/config.sh
|
|
11
|
+
source "$SCRIPT_DIR/bin/lib/config.sh"
|
|
10
12
|
if [ -n "${EGREGORE_TELEMETRY_DIR:-}" ]; then
|
|
11
13
|
BUFFER_DIR="$EGREGORE_TELEMETRY_DIR"
|
|
12
14
|
else
|
|
@@ -516,12 +518,16 @@ cmd_export() {
|
|
|
516
518
|
_resolve_share_target() {
|
|
517
519
|
local requested_endpoint="$1"
|
|
518
520
|
if [ -n "$requested_endpoint" ]; then
|
|
519
|
-
|
|
520
|
-
|
|
521
|
+
# An explicit endpoint never gets the org key (cmd_share adds it only for
|
|
522
|
+
# the configured sink), so it needs the retired host mapped and nothing
|
|
523
|
+
# more; any other address goes to cmd_share's scheme check as typed.
|
|
524
|
+
_hosted_api_target "$requested_endpoint" 2>/dev/null || printf '%s\n' "$requested_endpoint"
|
|
525
|
+
return 0
|
|
521
526
|
fi
|
|
522
527
|
local api_url="" api_key=""
|
|
523
528
|
if [ -f "$CONFIG" ]; then
|
|
524
|
-
|
|
529
|
+
# A refused saved address names no sink: never fall through to the relay.
|
|
530
|
+
api_url=$(_hosted_api_url "$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null || true)") || return 0
|
|
525
531
|
fi
|
|
526
532
|
if [ -f "$ENV_FILE" ]; then
|
|
527
533
|
api_key=$(grep '^EGREGORE_API_KEY=' "$ENV_FILE" 2>/dev/null | cut -d'=' -f2- || true)
|
|
@@ -691,7 +697,8 @@ cmd_share() {
|
|
|
691
697
|
: > "$share_file"
|
|
692
698
|
fi
|
|
693
699
|
|
|
694
|
-
|
|
700
|
+
# -q first (no ~/.curlrc), --globoff: the endpoint reaches the one host it names.
|
|
701
|
+
local curl_args=(-q --globoff -s -o /dev/null -w '%{http_code}' -X POST "$endpoint"
|
|
695
702
|
-H "Content-Type: application/x-ndjson" --data-binary "@$share_file" --max-time 15)
|
|
696
703
|
local api_key="" configured_endpoint=""
|
|
697
704
|
configured_endpoint=$(_resolve_share_target "")
|
|
@@ -39,6 +39,9 @@ json=false
|
|
|
39
39
|
head_first=false
|
|
40
40
|
strict_head=false
|
|
41
41
|
timeout=""
|
|
42
|
+
# A suite may declare a longer deadline than --timeout, up to 900 seconds,
|
|
43
|
+
# with a line "# test-baseline: timeout=N" in its first 30 lines.
|
|
44
|
+
child_limit=""
|
|
42
45
|
selected=()
|
|
43
46
|
add_suite() {
|
|
44
47
|
local existing
|
|
@@ -147,8 +150,23 @@ run_dir=$(mktemp -d "${TMPDIR:-/tmp}/qa-baseline.XXXXXX") || error "cannot creat
|
|
|
147
150
|
# Use the physical spelling consistently in Git, logs, and failure normalization.
|
|
148
151
|
run_dir=$(cd -P "$run_dir" && pwd)
|
|
149
152
|
mkdir -p "$run_dir/logs/base" "$run_dir/logs/head" || error "cannot create scratch logs"
|
|
150
|
-
|
|
151
|
-
|
|
153
|
+
# A worktree another run is adding at the same moment can make Git read its
|
|
154
|
+
# half-written entry ("failed to read .git/worktrees/<name>/commondir"), so a
|
|
155
|
+
# failed add is tried again before it counts as an environment failure.
|
|
156
|
+
add_base_tree() {
|
|
157
|
+
local attempt
|
|
158
|
+
for attempt in 1 2 3; do
|
|
159
|
+
if git -C "$SCRIPT_DIR" worktree add --detach --quiet "$run_dir/base" "$base_oid" \
|
|
160
|
+
> "$run_dir/worktree.out" 2> "$run_dir/worktree.err"; then
|
|
161
|
+
return 0
|
|
162
|
+
fi
|
|
163
|
+
[ "$attempt" -lt 3 ] || return 1
|
|
164
|
+
git -C "$SCRIPT_DIR" worktree remove --force "$run_dir/base" >/dev/null 2>&1 || true
|
|
165
|
+
rm -rf "$run_dir/base"
|
|
166
|
+
sleep "$attempt"
|
|
167
|
+
done
|
|
168
|
+
}
|
|
169
|
+
if ! add_base_tree; then
|
|
152
170
|
echo 'test-baseline: cannot create the base worktree:' >&2
|
|
153
171
|
cat "$run_dir/worktree.err" >&2
|
|
154
172
|
exit 2
|
|
@@ -169,13 +187,14 @@ run_child() {
|
|
|
169
187
|
set -m
|
|
170
188
|
(cd "$tree" && exec "$@") < /dev/null > "$log" 2>&1 &
|
|
171
189
|
child_pid=$!
|
|
172
|
-
|
|
190
|
+
local limit="${child_limit:-$timeout}"
|
|
191
|
+
if [ -n "$limit" ]; then
|
|
173
192
|
watched_pid=$child_pid
|
|
174
193
|
(
|
|
175
194
|
# This watchdog owns a separate group, including its sleep process, so
|
|
176
195
|
# normal completion and external interruption cancel the whole timer.
|
|
177
196
|
set +m
|
|
178
|
-
if ! sleep "$
|
|
197
|
+
if ! sleep "$limit"; then
|
|
179
198
|
: > "$run_dir/timer-failed"
|
|
180
199
|
fi
|
|
181
200
|
if kill -0 -- "-$watched_pid" 2>/dev/null; then
|
|
@@ -270,6 +289,13 @@ for suite in "${selected[@]}"; do
|
|
|
270
289
|
note=""
|
|
271
290
|
status=""
|
|
272
291
|
runner=""
|
|
292
|
+
suite_limit="$timeout"
|
|
293
|
+
if [ -n "$timeout" ] && [ -f "$SCRIPT_DIR/$suite" ]; then
|
|
294
|
+
declared=$(head -n 30 "$SCRIPT_DIR/$suite" | sed -n 's/^# test-baseline: timeout=\([1-9][0-9]*\)$/\1/p' | head -n 1)
|
|
295
|
+
if [ -n "$declared" ] && [ "$declared" -gt "$timeout" ]; then
|
|
296
|
+
suite_limit=$(( declared > 900 ? 900 : declared ))
|
|
297
|
+
fi
|
|
298
|
+
fi
|
|
273
299
|
printf 'test-baseline: suite %s\n' "$suite" >&2
|
|
274
300
|
case "$suite" in
|
|
275
301
|
*.sh) runner=bash ;;
|
|
@@ -345,7 +371,9 @@ for suite in "${selected[@]}"; do
|
|
|
345
371
|
bats) command_args=(bats) ;;
|
|
346
372
|
esac
|
|
347
373
|
printf 'test-baseline: %s %s starting\n' "$side" "$suite" >&2
|
|
374
|
+
child_limit="$suite_limit"
|
|
348
375
|
run_child "$tree" "$run_dir/logs/$side/$log_name" "${command_args[@]}" "./$suite"
|
|
376
|
+
child_limit=""
|
|
349
377
|
printf 'test-baseline: %s %s exit=%s seconds=%s timed_out=%s\n' \
|
|
350
378
|
"$side" "$suite" "$run_exit" "$run_seconds" "$run_timed_out" >&2
|
|
351
379
|
failure_lines "$run_dir/logs/$side/$log_name" "$run_dir/$side.lines"
|
|
@@ -355,7 +383,7 @@ for suite in "${selected[@]}"; do
|
|
|
355
383
|
head_exit=$run_exit; head_seconds=$run_seconds; head_timed_out=$run_timed_out
|
|
356
384
|
fi
|
|
357
385
|
if $run_timed_out; then
|
|
358
|
-
status=blocked; note="$side timed out after ${
|
|
386
|
+
status=blocked; note="$side timed out after ${suite_limit}s"; break
|
|
359
387
|
fi
|
|
360
388
|
if $head_first && [ "$side" = head ] && [ "$head_exit" -eq 0 ]; then break; fi
|
|
361
389
|
done
|
|
@@ -3,7 +3,7 @@ set -euo pipefail
|
|
|
3
3
|
|
|
4
4
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
5
5
|
export EGREGORE_ROOT="$ROOT"
|
|
6
|
-
export EGREGORE_SESSION_ID="${EGREGORE_SESSION_ID:-$(cat "$ROOT/.egregore-session-id" 2>/dev/null || true)}"
|
|
6
|
+
export EGREGORE_SESSION_ID="${EGREGORE_SESSION_ID:-$(bash "$ROOT/bin/session-id.sh" --root "$ROOT" 2>/dev/null || cat "$ROOT/.egregore-session-id" 2>/dev/null || true)}"
|
|
7
7
|
export PYTHONSAFEPATH=1 PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}"
|
|
8
8
|
|
|
9
9
|
exec python3 -m egregore_runtime.todo_cli "$@"
|