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
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
# bash bin/search.sh start
|
|
11
11
|
# bash bin/search.sh stop
|
|
12
12
|
# bash bin/search.sh open memory/path/to/source.md
|
|
13
|
+
# bash bin/search.sh mind publish
|
|
13
14
|
#
|
|
14
15
|
# The shell owns the established user-facing output. Retrieval infrastructure
|
|
15
16
|
# is isolated behind the Egregore Retriever adapter.
|
|
@@ -47,6 +48,28 @@ _elapsed_s() {
|
|
|
47
48
|
awk -v ms="$(( $(_now_ms) - $1 ))" 'BEGIN { printf "%.1f", ms / 1000 }'
|
|
48
49
|
}
|
|
49
50
|
|
|
51
|
+
# Run a Runtime operation as an OpenTelemetry span when the harness traces
|
|
52
|
+
# this process (it exports TRACEPARENT). Untraced calls take the plain path.
|
|
53
|
+
# Usage: _traced <span-name> <original-args-array-name> <command...>
|
|
54
|
+
_traced() {
|
|
55
|
+
local name="$1" argv_ref="$2[@]"; shift 2
|
|
56
|
+
if [ -z "${TRACEPARENT:-}" ]; then "$@"; return $?; fi
|
|
57
|
+
local start out rc results degraded stale
|
|
58
|
+
start=$(_now_ms)
|
|
59
|
+
out=$(mktemp "${TMPDIR:-/tmp}/egregore-span.XXXXXX")
|
|
60
|
+
"$@" | tee "$out"
|
|
61
|
+
rc=${PIPESTATUS[0]}
|
|
62
|
+
results=$(grep -cE '^[0-9]+\. ' "$out" 2>/dev/null)
|
|
63
|
+
degraded=false; grep -q 'Search degraded' "$out" 2>/dev/null && degraded=true
|
|
64
|
+
stale=$(sed -nE 's/^Note: ([0-9]+) eligible document.*/\1/p' "$out" 2>/dev/null | head -1)
|
|
65
|
+
rm -f "$out"
|
|
66
|
+
( python3 "$SCRIPT_DIR/bin/lib/otel_span.py" --name "$name" --start-ms "$start" \
|
|
67
|
+
--end-ms "$(_now_ms)" --rc "$rc" --attr "egregore.search.results=${results:-0}" \
|
|
68
|
+
--attr "egregore.search.degraded=$degraded" --attr "egregore.search.stale_documents=${stale:-}" \
|
|
69
|
+
--argv -- ${!argv_ref+"${!argv_ref}"} >/dev/null 2>&1 & ) 2>/dev/null
|
|
70
|
+
return "$rc"
|
|
71
|
+
}
|
|
72
|
+
|
|
50
73
|
_result_paths() {
|
|
51
74
|
local line path canonical_prefix
|
|
52
75
|
canonical_prefix="**file:** \`memory/"
|
|
@@ -71,7 +94,7 @@ _result_paths() {
|
|
|
71
94
|
# calls there. The dormant graph configuration is preserved untouched for
|
|
72
95
|
# rollback only.
|
|
73
96
|
_upgrade_instance_key() {
|
|
74
|
-
# Mirrors egregore_runtime.
|
|
97
|
+
# Mirrors egregore_runtime.installation.installation_key: stable org identity
|
|
75
98
|
# composed with the main installation path. No org_id → fail closed.
|
|
76
99
|
local org main gitdir
|
|
77
100
|
org=$(jq -r '.org_id // empty' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
|
|
@@ -371,11 +394,12 @@ case "${1:-}" in
|
|
|
371
394
|
for arg in "$@"; do
|
|
372
395
|
if [ "$arg" = --context-packet ]; then FIND_ARGS+=(--private-result); else FIND_ARGS+=("$arg"); fi
|
|
373
396
|
done
|
|
374
|
-
_runtime find "${FIND_ARGS[@]}"
|
|
397
|
+
_traced egregore.search.find FIND_ARGS _runtime find "${FIND_ARGS[@]}"
|
|
375
398
|
;;
|
|
376
399
|
investigate) shift; cmd_investigate "$@" ;;
|
|
377
400
|
start) shift; _runtime start "$@" ;;
|
|
378
401
|
stop) shift; _runtime stop "$@" ;;
|
|
402
|
+
mind) shift; _runtime mind "$@" ;;
|
|
379
403
|
open)
|
|
380
404
|
shift
|
|
381
405
|
OPEN_PACKET=0; OPEN_PATHS=()
|
|
@@ -393,19 +417,21 @@ case "${1:-}" in
|
|
|
393
417
|
[ "$OPEN_PACKET" = 1 ] && OPEN_BINDING+=(--private-result)
|
|
394
418
|
# Older Bash treats an empty array as unset under nounset. Optional flags
|
|
395
419
|
# must expand to zero arguments without requiring an explicit episode ID.
|
|
396
|
-
|
|
420
|
+
OPEN_ARGS=(${OPEN_PATHS[@]+"${OPEN_PATHS[@]}"} ${OPEN_BINDING[@]+"${OPEN_BINDING[@]}"})
|
|
421
|
+
_traced egregore.search.open OPEN_ARGS _runtime open ${OPEN_ARGS[@]+"${OPEN_ARGS[@]}"}
|
|
397
422
|
;;
|
|
398
423
|
help|-h|--help)
|
|
399
424
|
cat <<'USAGE'
|
|
400
|
-
usage: bash bin/search.sh {find|investigate|query|handoffs|reindex|install|start|stop|status|readiness|open}
|
|
425
|
+
usage: bash bin/search.sh {find|investigate|query|handoffs|reindex|install|start|stop|status|readiness|open|mind}
|
|
401
426
|
find "terms" [--kind keyword|semantic|hybrid|filename|literal|dates] [--recent-days N]
|
|
402
427
|
open memory/path.md [memory/other.md ...] [--offset N] [--length N]
|
|
403
428
|
handoffs --mine --status open --order newest --limit 1 --open
|
|
404
429
|
handoffs [--addressed-to NAME|--sent|--sent-by NAME] [--status STATUS] [--order newest|oldest] [--limit N] [--json]
|
|
430
|
+
mind publish
|
|
405
431
|
USAGE
|
|
406
432
|
;;
|
|
407
433
|
*)
|
|
408
|
-
echo "usage: bash bin/search.sh {find|investigate|query|handoffs|reindex|install|start|stop|status|readiness|open}" >&2
|
|
434
|
+
echo "usage: bash bin/search.sh {find|investigate|query|handoffs|reindex|install|start|stop|status|readiness|open|mind}" >&2
|
|
409
435
|
exit 1
|
|
410
436
|
;;
|
|
411
437
|
esac
|
|
@@ -133,9 +133,12 @@ if git -C "$DIR/memory" rev-parse --git-dir >/dev/null 2>&1; then
|
|
|
133
133
|
fi
|
|
134
134
|
if [ -n "$(git -C "$DIR/memory" log origin/main..HEAD --oneline 2>/dev/null)" ]; then
|
|
135
135
|
for _try in 1 2 3; do
|
|
136
|
-
if git -C "$DIR/memory" pull --rebase origin main --quiet 2>/dev/null
|
|
137
|
-
|
|
138
|
-
|
|
136
|
+
if git -C "$DIR/memory" pull --rebase origin main --quiet 2>/dev/null; then
|
|
137
|
+
if bash "$SCRIPT_ROOT/bin/memory-push.sh" --repository "$DIR/memory" --branch main >/dev/null 2>&1; then
|
|
138
|
+
break
|
|
139
|
+
else
|
|
140
|
+
case "$?" in 75) ;; *) break ;; esac
|
|
141
|
+
fi
|
|
139
142
|
fi
|
|
140
143
|
sleep 1
|
|
141
144
|
done
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# session-id.sh — the calling harness session's own Egregore session id.
|
|
3
|
+
#
|
|
4
|
+
# Every session start mints an Egregore session id and writes it to the
|
|
5
|
+
# checkout's .egregore-session-id, which each worktree links to. With several
|
|
6
|
+
# sessions open on one machine, the latest start owns that file, so a commit
|
|
7
|
+
# that reads it can carry another session's Egregore-Session trailer. This
|
|
8
|
+
# script keeps one small map file per harness session and resolves the
|
|
9
|
+
# caller's own id from the native session id its harness exports.
|
|
10
|
+
#
|
|
11
|
+
# session-id.sh [--root DIR]
|
|
12
|
+
# Print the caller's Egregore session id; print nothing and exit 1
|
|
13
|
+
# when there is none. A native id in the environment whose map was
|
|
14
|
+
# recorded for DIR's repository wins; otherwise DIR/.egregore-session-id.
|
|
15
|
+
# session-id.sh record <harness> <native-id> <egregore-id> [--root DIR]
|
|
16
|
+
# Map a starting session (bin/lib/identity.sh), replacing an old map.
|
|
17
|
+
# session-id.sh bind <harness> <native-id> [--root DIR]
|
|
18
|
+
# Map a session first seen after its start (a Codex thread, at its
|
|
19
|
+
# first prompt) to the id it resolves to now. A map this repository
|
|
20
|
+
# can use is kept; one recorded for a moved checkout is replaced.
|
|
21
|
+
#
|
|
22
|
+
# Native ids, in order: EGREGORE_NATIVE_SESSION_ID under
|
|
23
|
+
# EGREGORE_NATIVE_HARNESS (Claude, Pi and Prime tool commands), then
|
|
24
|
+
# CLAUDE_CODE_SESSION_ID, then CODEX_THREAD_ID. A Codex worker started from a
|
|
25
|
+
# Claude or Pi shell inherits that shell's ids and so resolves to the session
|
|
26
|
+
# that started it.
|
|
27
|
+
#
|
|
28
|
+
# Map files: ~/.egregore/sessions/<harness>-<native-id>.id, two lines: the
|
|
29
|
+
# Egregore id and the repository's physical git common dir, so a map never
|
|
30
|
+
# applies to another repository (a test fixture, another instance). Names are
|
|
31
|
+
# checked, never rewritten. Each record prunes maps unused for 30 days; every
|
|
32
|
+
# resolve and bind that uses a map marks it used.
|
|
33
|
+
set -u
|
|
34
|
+
export LC_ALL=C
|
|
35
|
+
|
|
36
|
+
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
37
|
+
MAP_DIR=""
|
|
38
|
+
[ -z "${HOME:-}" ] || MAP_DIR="$HOME/.egregore/sessions"
|
|
39
|
+
SCOPE=""
|
|
40
|
+
|
|
41
|
+
usage() {
|
|
42
|
+
awk 'NR == 1 { next } /^#/ { sub(/^# ?/, ""); print; next } { exit }' "$0"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
valid_harness() {
|
|
46
|
+
case "$1" in ''|*[!a-z0-9]*) return 1 ;; esac
|
|
47
|
+
[ "${#1}" -le 16 ]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
valid_native() {
|
|
51
|
+
case "$1" in ''|.*|*[!A-Za-z0-9._-]*) return 1 ;; esac
|
|
52
|
+
[ "${#1}" -le 128 ]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
valid_session() {
|
|
56
|
+
case "$1" in ''|*[[:cntrl:]]*) return 1 ;; esac
|
|
57
|
+
[ "${#1}" -le 200 ]
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# The repository's git common dir, physical, so worktrees and every spelling
|
|
61
|
+
# of one checkout agree.
|
|
62
|
+
scope_of() {
|
|
63
|
+
local dir
|
|
64
|
+
dir="$(git -C "$1" rev-parse --git-common-dir 2>/dev/null)" || return 1
|
|
65
|
+
case "$dir" in /*) ;; *) dir="$1/$dir" ;; esac
|
|
66
|
+
(cd "$dir" 2>/dev/null && pwd -P)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Print a map's Egregore id when the map belongs to this repository, and mark
|
|
70
|
+
# it used so the age prune spares a session that is still working.
|
|
71
|
+
lookup() {
|
|
72
|
+
local harness="$1" native="$2" file id="" scope=""
|
|
73
|
+
[ -n "$MAP_DIR" ] && valid_harness "$harness" && valid_native "$native" || return 1
|
|
74
|
+
file="$MAP_DIR/$harness-$native.id"
|
|
75
|
+
[ -f "$file" ] || return 1
|
|
76
|
+
{ IFS= read -r id; IFS= read -r scope; } < "$file" 2>/dev/null
|
|
77
|
+
valid_session "$id" && [ -n "$scope" ] || return 1
|
|
78
|
+
[ -n "$SCOPE" ] || SCOPE="$(scope_of "$ROOT_DIR")" || return 1
|
|
79
|
+
[ "$scope" = "$SCOPE" ] || return 1
|
|
80
|
+
touch -c "$file" 2>/dev/null # -c: a map pruned meanwhile stays gone, never empty
|
|
81
|
+
printf '%s\n' "$id"
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
resolve() {
|
|
85
|
+
local id=""
|
|
86
|
+
if [ -n "${EGREGORE_NATIVE_SESSION_ID:-}" ] && [ -n "${EGREGORE_NATIVE_HARNESS:-}" ]; then
|
|
87
|
+
if lookup "$EGREGORE_NATIVE_HARNESS" "$EGREGORE_NATIVE_SESSION_ID"; then return 0; fi
|
|
88
|
+
fi
|
|
89
|
+
if [ -n "${CLAUDE_CODE_SESSION_ID:-}" ]; then
|
|
90
|
+
if lookup claude "$CLAUDE_CODE_SESSION_ID"; then return 0; fi
|
|
91
|
+
fi
|
|
92
|
+
if [ -n "${CODEX_THREAD_ID:-}" ]; then
|
|
93
|
+
if lookup codex "$CODEX_THREAD_ID"; then return 0; fi
|
|
94
|
+
fi
|
|
95
|
+
[ -f "$ROOT_DIR/.egregore-session-id" ] || return 1
|
|
96
|
+
IFS= read -r id < "$ROOT_DIR/.egregore-session-id" 2>/dev/null
|
|
97
|
+
valid_session "$id" || return 1
|
|
98
|
+
printf '%s\n' "$id"
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
record() {
|
|
102
|
+
local harness="$1" native="$2" id="$3" scope tmp
|
|
103
|
+
[ -n "$MAP_DIR" ] && valid_harness "$harness" && valid_native "$native" && valid_session "$id" || return 1
|
|
104
|
+
scope="$(scope_of "$ROOT_DIR")" && [ -n "$scope" ] || return 1
|
|
105
|
+
mkdir -p "$MAP_DIR" 2>/dev/null || return 1
|
|
106
|
+
tmp="$MAP_DIR/.$harness-$native.$$"
|
|
107
|
+
printf '%s\n%s\n' "$id" "$scope" > "$tmp" 2>/dev/null \
|
|
108
|
+
&& mv -f "$tmp" "$MAP_DIR/$harness-$native.id" 2>/dev/null || { rm -f "$tmp"; return 1; }
|
|
109
|
+
find "$MAP_DIR" -maxdepth 1 -type f \( -name '*.id' -o -name '.*' \) -mtime +30 \
|
|
110
|
+
-exec rm -f {} + 2>/dev/null
|
|
111
|
+
return 0
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
bind() {
|
|
115
|
+
local harness="$1" native="$2" id
|
|
116
|
+
[ -n "$MAP_DIR" ] && valid_harness "$harness" && valid_native "$native" || return 1
|
|
117
|
+
# A map this repository can use is kept; one recorded for a checkout that
|
|
118
|
+
# has since moved is replaced rather than left unusable.
|
|
119
|
+
lookup "$harness" "$native" >/dev/null && return 0
|
|
120
|
+
id="$(resolve)" || return 1
|
|
121
|
+
record "$harness" "$native" "$id"
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
ARGS=()
|
|
125
|
+
while [ $# -gt 0 ]; do
|
|
126
|
+
case "$1" in
|
|
127
|
+
--root)
|
|
128
|
+
[ -n "${2:-}" ] || { echo "session-id.sh: --root needs a directory" >&2; exit 2; }
|
|
129
|
+
ROOT_DIR="$2"; shift 2 ;;
|
|
130
|
+
-h|--help) usage; exit 0 ;;
|
|
131
|
+
*) ARGS+=("$1"); shift ;;
|
|
132
|
+
esac
|
|
133
|
+
done
|
|
134
|
+
set -- ${ARGS[@]+"${ARGS[@]}"}
|
|
135
|
+
|
|
136
|
+
case "${1:-resolve}" in
|
|
137
|
+
resolve)
|
|
138
|
+
[ $# -le 1 ] || { usage >&2; exit 2; }
|
|
139
|
+
resolve ;;
|
|
140
|
+
record)
|
|
141
|
+
[ $# -eq 4 ] || { usage >&2; exit 2; }
|
|
142
|
+
record "$2" "$3" "$4" ;;
|
|
143
|
+
bind)
|
|
144
|
+
[ $# -eq 3 ] || { usage >&2; exit 2; }
|
|
145
|
+
bind "$2" "$3" ;;
|
|
146
|
+
*) usage >&2; exit 2 ;;
|
|
147
|
+
esac
|
|
@@ -21,6 +21,25 @@ INPUT=$(cat /dev/stdin 2>/dev/null || echo "{}")
|
|
|
21
21
|
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty' 2>/dev/null || true)
|
|
22
22
|
TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null || true)
|
|
23
23
|
|
|
24
|
+
# Route known native transcript locations before reading their contents.
|
|
25
|
+
RUNTIME=$(printf '%s' "$INPUT" | jq -r '.runtime // empty' 2>/dev/null || true)
|
|
26
|
+
RECORD_TRANSCRIPT=false
|
|
27
|
+
if [ -n "${HOME:-}" ]; then
|
|
28
|
+
if [[ "$TRANSCRIPT_PATH" == "$HOME/.claude/projects/"* ]] && \
|
|
29
|
+
printf '%s' "$INPUT" | jq -e 'has("hook_event_name")' >/dev/null 2>&1; then
|
|
30
|
+
RECORD_TRANSCRIPT=true
|
|
31
|
+
elif { [ "$RUNTIME" = pi ] && [[ "$TRANSCRIPT_PATH" == "$HOME/.pi/agent/sessions/"* ]]; } || \
|
|
32
|
+
{ [ "$RUNTIME" = prime ] && [[ "$TRANSCRIPT_PATH" == "$HOME/.prime/agent/sessions/"* ]]; }; then
|
|
33
|
+
RECORD_TRANSCRIPT=true
|
|
34
|
+
fi
|
|
35
|
+
fi
|
|
36
|
+
if [ "$RECORD_TRANSCRIPT" = true ]; then
|
|
37
|
+
source "$SCRIPT_DIR/bin/lib/config.sh"
|
|
38
|
+
if _session_records_enabled; then
|
|
39
|
+
exec bash "$SCRIPT_DIR/bin/session-record.sh" --mode end <<< "$INPUT"
|
|
40
|
+
fi
|
|
41
|
+
fi
|
|
42
|
+
|
|
24
43
|
if [ -z "$SESSION_ID" ]; then
|
|
25
44
|
exit 0
|
|
26
45
|
fi
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Session-record admission is silent and detached for hooks. Python uses only
|
|
3
|
+
# the standard library. Summarizer flags (all checked against claude --help):
|
|
4
|
+
# Private trails, durable holds, stamps and locks live in $HOME/.egregore/trails.
|
|
5
|
+
# --tools "" --strict-mcp-config --mcp-config '{"mcpServers":{}}'
|
|
6
|
+
# --setting-sources "" --model MODEL --output-format text -p PROMPT
|
|
7
|
+
# Built-in tools, MCP servers, project settings, hooks and plugins are disabled,
|
|
8
|
+
# so the call is a single turn without a separate turn-limit flag.
|
|
9
|
+
# A CLI missing any isolation flag (including the empty --tools allowlist)
|
|
10
|
+
# is never invoked for a build; the record is deterministic instead.
|
|
11
|
+
# Checkpoints only write the record file in the memory working tree. Session
|
|
12
|
+
# end commits and pushes it with this person's earlier uncommitted records.
|
|
13
|
+
# --mode sweep always refreshes local counts in a detached worker. Publication
|
|
14
|
+
# requires an answered offer and enabled recording; only publication is
|
|
15
|
+
# debounced for six hours unless --force is supplied.
|
|
16
|
+
# Publications and hold markers use the same canonical memory lock; holds wait
|
|
17
|
+
# for an active publication, then redact going forward without rewriting history.
|
|
18
|
+
# The one thing a hook prints: at a checkpoint, the session's cost line, once
|
|
19
|
+
# per mark ($200 priced, or ten million Codex input tokens) at the next stop.
|
|
20
|
+
# Descriptor 3 carries the hook's stdout past the silenced streams for it.
|
|
21
|
+
set -uo pipefail
|
|
22
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" || exit 0
|
|
23
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
24
|
+
command -v python3 >/dev/null 2>&1 || exit 0
|
|
25
|
+
[ -n "${HOME:-}" ] || exit 0
|
|
26
|
+
exec python3 "$SCRIPT_DIR/bin/lib/session_record.py" record --root "$SCRIPT_DIR" --notice-fd 3 "$@" 3>&1 >/dev/null 2>&1
|
|
@@ -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 "$@"
|
|
@@ -94,52 +94,22 @@ fi
|
|
|
94
94
|
# egregore.json
|
|
95
95
|
[ -f "$REPO_ROOT/egregore.json" ] && [ ! -f "$WT_PATH/egregore.json" ] && ln -sfn "$REPO_ROOT/egregore.json" "$WT_PATH/egregore.json"
|
|
96
96
|
|
|
97
|
+
# Installed tools (node_modules, .egregore/tools), so tests and the renderer
|
|
98
|
+
# run without an install step. Same helper as worktree.sh setup, loaded from
|
|
99
|
+
# this script's own bin/. Its one diagnostic, a link git cannot be made to
|
|
100
|
+
# ignore, goes to stderr, keeping stdout the worktree path only.
|
|
101
|
+
# shellcheck source=bin/lib/worktree-links.sh
|
|
102
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/worktree-links.sh" && egregore_link_tools "$WT_PATH" "$REPO_ROOT" >&2
|
|
103
|
+
|
|
97
104
|
# --- Compute boundary for worktree (so isolation hook works) ---
|
|
98
|
-
# session-start.sh doesn't re-run for worktrees, so we compute it here
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
#
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
_repos=$(jq -r '(.repos[]? // empty) | if type == "object" then .name else . end' "$WT_PATH/egregore.json" 2>/dev/null || true)
|
|
107
|
-
for _r in $_repos; do
|
|
108
|
-
[[ "$_r" == *".."* ]] && continue
|
|
109
|
-
_resolved=$(realpath "$PARENT_DIR/$_r" 2>/dev/null || true)
|
|
110
|
-
[ -z "$_resolved" ] && continue
|
|
111
|
-
MANAGED_REPOS_JSON="$MANAGED_REPOS_JSON,\"$_resolved\""
|
|
112
|
-
done
|
|
113
|
-
MANAGED_REPOS_JSON="$MANAGED_REPOS_JSON]"
|
|
114
|
-
# Denied paths: shared computation (bin/boundary.sh compute-denied). The main
|
|
115
|
-
# repo is passed as the caller-proven same-instance allowance — this worktree
|
|
116
|
-
# was just created from it and physically shares its git dir — so it stays
|
|
117
|
-
# excluded even on legacy registries whose entries carry no org_id yet.
|
|
118
|
-
DENIED_JSON="[]"
|
|
119
|
-
REGISTRY="$HOME/.egregore/instances.json"
|
|
120
|
-
if [ -f "$REGISTRY" ]; then
|
|
121
|
-
WT_ORG=$(jq -r '.org_id // empty' "$WT_PATH/egregore.json" 2>/dev/null || true)
|
|
122
|
-
DENIED_JSON=$(bash "$REPO_ROOT/bin/boundary.sh" compute-denied \
|
|
123
|
-
"$REGISTRY" "$WT_PATH" "$WT_ORG" "$REPO_ROOT" 2>/dev/null || echo "[]")
|
|
124
|
-
case "$DENIED_JSON" in "["*) ;; *) DENIED_JSON="[]" ;; esac
|
|
125
|
-
fi
|
|
126
|
-
# Inherit posture, locked, and read roots from the main checkout's boundary
|
|
127
|
-
# cache: a worktree that silently dropped them fell back to `standard` and
|
|
128
|
-
# stopped honoring `locked: true` (found in the 6b.3 enforcement audit).
|
|
129
|
-
MAIN_DIGEST=$(printf '%s' "$REPO_ROOT" | md5 2>/dev/null || printf '%s' "$REPO_ROOT" | md5sum | cut -d' ' -f1)
|
|
130
|
-
MAIN_BOUNDARY="/tmp/egregore-boundary-${MAIN_DIGEST}.json"
|
|
131
|
-
POSTURE_JSON='{}'
|
|
132
|
-
if [ -f "$MAIN_BOUNDARY" ]; then
|
|
133
|
-
POSTURE_JSON=$(jq -c '{posture: (.posture // "standard"), locked: (.locked // false), read_roots: (.read_roots // [])}' "$MAIN_BOUNDARY" 2>/dev/null || echo '{}')
|
|
134
|
-
fi
|
|
135
|
-
jq -n \
|
|
136
|
-
--arg project_dir "$WT_PATH" \
|
|
137
|
-
--arg memory_dir "$MEMORY_DIR" \
|
|
138
|
-
--argjson managed_repos "$MANAGED_REPOS_JSON" \
|
|
139
|
-
--argjson denied_paths "$DENIED_JSON" \
|
|
140
|
-
--argjson inherited "$POSTURE_JSON" \
|
|
141
|
-
'{project_dir: $project_dir, memory_dir: $memory_dir, managed_repos: $managed_repos, denied_paths: $denied_paths} + $inherited' \
|
|
142
|
-
> "$BOUNDARY_FILE.tmp" 2>/dev/null && mv "$BOUNDARY_FILE.tmp" "$BOUNDARY_FILE" 2>/dev/null || true
|
|
105
|
+
# session-start.sh doesn't re-run for worktrees, so we compute it here through
|
|
106
|
+
# the shared computation (bin/boundary-guard.cjs write-cache). It recognizes a
|
|
107
|
+
# linked worktree: the main checkout it physically shares a git dir with is the
|
|
108
|
+
# caller-proven same instance (excluded from denied paths even on legacy
|
|
109
|
+
# registries without org_id) and a managed repo, and posture, lock and read
|
|
110
|
+
# roots come from the main checkout's config — a worktree that dropped them
|
|
111
|
+
# fell back to `standard` and stopped honoring `locked: true` (6b.3 audit).
|
|
112
|
+
bash "$REPO_ROOT/bin/node-run.sh" "$REPO_ROOT/bin/boundary-guard.cjs" write-cache "$WT_PATH" >/dev/null 2>&1 || true
|
|
143
113
|
|
|
144
114
|
# --- Session topic on the graph (fire-and-forget, detached) ---
|
|
145
115
|
# CLAUDE.md used to ask the model to run this after EnterWorktree with a
|
|
@@ -57,6 +57,12 @@ case "$CMD" in
|
|
|
57
57
|
ln -sfn "$MAIN_DIR/egregore.json" "$WT_PATH/egregore.json"
|
|
58
58
|
fi
|
|
59
59
|
|
|
60
|
+
# Installed tools (node_modules, .egregore/tools), through the same helper
|
|
61
|
+
# as the WorktreeCreate hook; a link git cannot be made to ignore is
|
|
62
|
+
# reported on stderr.
|
|
63
|
+
# shellcheck source=bin/lib/worktree-links.sh
|
|
64
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/worktree-links.sh" && egregore_link_tools "$WT_PATH" "$MAIN_DIR"
|
|
65
|
+
|
|
60
66
|
# Find terminal TTY for statusline matching
|
|
61
67
|
_pid=$$
|
|
62
68
|
_tty=""
|