create-egregore 0.20.2 → 0.21.0-runtime-mvp.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/egregore-launcher.js +1013 -16
- package/bin/cli.js +11 -0
- package/lib/claude-runtime.js +192 -0
- package/lib/local.js +38 -31
- package/lib/pi-runtime.js +1 -0
- package/lib/prime-runtime.js +1 -0
- package/lib/runtime-identity.js +146 -0
- package/lib/setup.js +116 -17
- package/package.json +10 -6
- package/runtime/claude/.claude/context/commit-format.md +110 -0
- package/runtime/claude/.claude/context/git-language.md +46 -0
- package/runtime/claude/.claude/context/notification-consent.md +66 -0
- package/runtime/claude/.claude/context/pr-format.md +67 -0
- package/runtime/claude/.claude/context/telemetry.md +133 -0
- package/runtime/claude/.claude/hooks/boundary-check.sh +333 -0
- package/runtime/claude/.claude/hooks/branch-guard.sh +231 -0
- package/runtime/claude/.claude/hooks/card-context.sh +38 -0
- package/runtime/claude/.claude/hooks/emissary-detect.sh +53 -0
- package/runtime/claude/.claude/hooks/memory-refresh.sh +67 -0
- package/runtime/claude/.claude/hooks/onboarding-guard.sh +86 -0
- package/runtime/claude/.claude/hooks/retrieval-context.sh +43 -0
- package/runtime/claude/.claude/rules/voice-bedrock.md +73 -0
- package/runtime/claude/.claude/settings.json +131 -0
- package/runtime/claude/.claude/skills/activity/SKILL.md +68 -0
- package/runtime/claude/.claude/skills/announce/SKILL.md +54 -0
- package/runtime/claude/.claude/skills/archive/SKILL.md +71 -0
- package/runtime/claude/.claude/skills/branch/SKILL.md +147 -0
- package/runtime/claude/.claude/skills/checkup/SKILL.md +159 -0
- package/runtime/claude/.claude/skills/commit/SKILL.md +103 -0
- package/runtime/claude/.claude/skills/contribute/SKILL.md +343 -0
- package/runtime/claude/.claude/skills/create-skill/SKILL.md +135 -0
- package/runtime/claude/.claude/skills/dark-mode/SKILL.md +410 -0
- package/runtime/claude/.claude/skills/dashboard/SKILL.md +43 -0
- package/runtime/claude/.claude/skills/deep-reflect/REPORT.md +140 -0
- package/runtime/claude/.claude/skills/deep-reflect/RESEARCH.md +132 -0
- package/runtime/claude/.claude/skills/deep-reflect/ROLES.md +104 -0
- package/runtime/claude/.claude/skills/deep-reflect/SKILL.md +170 -0
- package/runtime/claude/.claude/skills/delete-user/SKILL.md +150 -0
- package/runtime/claude/.claude/skills/emissary/SKILL.md +220 -0
- package/runtime/claude/.claude/skills/handoff/SKILL.md +124 -0
- package/runtime/claude/.claude/skills/harvest/AUDIT.md +546 -0
- package/runtime/claude/.claude/skills/harvest/FORMAT.md +436 -0
- package/runtime/claude/.claude/skills/harvest/PROCESS.md +395 -0
- package/runtime/claude/.claude/skills/harvest/QUESTION_PALETTE.md +76 -0
- package/runtime/claude/.claude/skills/harvest/SKILL.md +100 -0
- package/runtime/claude/.claude/skills/ingest/SKILL.md +112 -0
- package/runtime/claude/.claude/skills/ingest-corpus/SKILL.md +187 -0
- package/runtime/claude/.claude/skills/ingest-notion/SKILL.md +214 -0
- package/runtime/claude/.claude/skills/ingest-user-interview/SKILL.md +65 -0
- package/runtime/claude/.claude/skills/ingest-user-interview/references/analysis-contract.md +125 -0
- package/runtime/claude/.claude/skills/invite/SKILL.md +111 -0
- package/runtime/claude/.claude/skills/issue/SKILL.md +104 -0
- package/runtime/claude/.claude/skills/me/SKILL.md +81 -0
- package/runtime/claude/.claude/skills/meeting/SKILL.md +76 -0
- package/runtime/claude/.claude/skills/meeting/references/analysis-contract.md +102 -0
- package/runtime/claude/.claude/skills/note/SKILL.md +71 -0
- package/runtime/claude/.claude/skills/notion-connect/SKILL.md +124 -0
- package/runtime/claude/.claude/skills/onboarding/SKILL.md +159 -0
- package/runtime/claude/.claude/skills/pr/SKILL.md +85 -0
- package/runtime/claude/.claude/skills/pull/SKILL.md +79 -0
- package/runtime/claude/.claude/skills/push/SKILL.md +47 -0
- package/runtime/claude/.claude/skills/quest/SKILL.md +121 -0
- package/runtime/claude/.claude/skills/reflect/SKILL.md +69 -0
- package/runtime/claude/.claude/skills/review-pr/SKILL.md +276 -0
- package/runtime/claude/.claude/skills/save/SKILL.md +92 -0
- package/runtime/claude/.claude/skills/slack-connect/SKILL.md +148 -0
- package/runtime/claude/.claude/skills/summon/SKILL.md +240 -0
- package/runtime/claude/.claude/skills/sync-repos/SKILL.md +82 -0
- package/runtime/claude/.claude/skills/teams-connect/SKILL.md +216 -0
- package/runtime/claude/.claude/skills/telegram-connect/SKILL.md +110 -0
- package/runtime/claude/.claude/skills/telemetry/SKILL.md +117 -0
- package/runtime/claude/.claude/skills/test/SKILL.md +87 -0
- package/runtime/claude/.claude/skills/the-spiral/SKILL.md +492 -0
- package/runtime/claude/.claude/skills/tui-design/SKILL.md +188 -0
- package/runtime/claude/.claude/skills/tutorial/SKILL.md +100 -0
- package/runtime/claude/.claude/skills/update/SKILL.md +265 -0
- package/runtime/claude/.claude/skills/view/SKILL.md +393 -0
- package/runtime/claude/.claude/skills/view/compose-scaffold.html +221 -0
- package/runtime/claude/.claude/skills/visual-explain/SKILL.md +132 -0
- package/runtime/claude/.claude/skills/wrap/SKILL.md +98 -0
- package/runtime/claude/CLAUDE.md +447 -0
- package/runtime/claude/bin/activity-action.sh +92 -0
- package/runtime/claude/bin/activity-data.sh +17 -0
- package/runtime/claude/bin/agent.sh +783 -0
- package/runtime/claude/bin/artifact-register.sh +164 -0
- package/runtime/claude/bin/artifact-writeback.sh +53 -0
- package/runtime/claude/bin/artifacts.sh +288 -0
- package/runtime/claude/bin/attendant.sh +707 -0
- package/runtime/claude/bin/autosave.sh +112 -0
- package/runtime/claude/bin/boundary.sh +253 -0
- package/runtime/claude/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/claude/bin/capture-reconcile.sh +69 -0
- package/runtime/claude/bin/capture-run.sh +357 -0
- package/runtime/claude/bin/codex-install-skills.sh +78 -0
- package/runtime/claude/bin/codex-render-spec.mjs +462 -0
- package/runtime/claude/bin/codex-session-start.sh +275 -0
- package/runtime/claude/bin/codex-skill-render.mjs +349 -0
- package/runtime/claude/bin/codex-sync-skills.sh +237 -0
- package/runtime/claude/bin/connect-refresh.sh +33 -0
- package/runtime/claude/bin/contribute-guard.sh +79 -0
- package/runtime/claude/bin/corpus_map.py +806 -0
- package/runtime/claude/bin/corpus_survey.py +304 -0
- package/runtime/claude/bin/dashboard-data.sh +18 -0
- package/runtime/claude/bin/github-auth.sh +121 -0
- package/runtime/claude/bin/graph-batch.sh +86 -0
- package/runtime/claude/bin/graph-op.sh +1106 -0
- package/runtime/claude/bin/graph-projection.sh +54 -0
- package/runtime/claude/bin/graph-wal.sh +242 -0
- package/runtime/claude/bin/graph.sh +267 -0
- package/runtime/claude/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/claude/bin/handoff-lifecycle.sh +280 -0
- package/runtime/claude/bin/handoff-pr-backfill.sh +86 -0
- package/runtime/claude/bin/handoff-preview.sh +169 -0
- package/runtime/claude/bin/handoff-run.sh +692 -0
- package/runtime/claude/bin/handoff-save-egregore.sh +224 -0
- package/runtime/claude/bin/index-handoff.sh +322 -0
- package/runtime/claude/bin/ingest-graph.sh +86 -0
- package/runtime/claude/bin/ingest-item.sh +10 -0
- package/runtime/claude/bin/ingest-surface.html +495 -0
- package/runtime/claude/bin/ingest.py +1011 -0
- package/runtime/claude/bin/ingest.sh +308 -0
- package/runtime/claude/bin/ingest_graph.py +856 -0
- package/runtime/claude/bin/ingest_surface.py +544 -0
- package/runtime/claude/bin/invite.sh +6 -0
- package/runtime/claude/bin/issue.sh +10 -0
- package/runtime/claude/bin/knowledge.sh +10 -0
- package/runtime/claude/bin/lib/artifact-id.sh +46 -0
- package/runtime/claude/bin/lib/config.sh +136 -0
- package/runtime/claude/bin/lib/context.sh +642 -0
- package/runtime/claude/bin/lib/dashboard-artifact.sh +242 -0
- package/runtime/claude/bin/lib/ensure-develop.sh +183 -0
- package/runtime/claude/bin/lib/git-message.sh +37 -0
- package/runtime/claude/bin/lib/git-sync.sh +494 -0
- package/runtime/claude/bin/lib/greeting.sh +548 -0
- package/runtime/claude/bin/lib/handoff-meta.sh +97 -0
- package/runtime/claude/bin/lib/hash.sh +13 -0
- package/runtime/claude/bin/lib/identity.sh +213 -0
- package/runtime/claude/bin/lib/metrics.sh +374 -0
- package/runtime/claude/bin/lib/noncode.sh +31 -0
- package/runtime/claude/bin/lib/permissions.sh +106 -0
- package/runtime/claude/bin/lib/time.sh +56 -0
- package/runtime/claude/bin/lib/worktree-links.sh +85 -0
- package/runtime/claude/bin/node-run.sh +42 -0
- package/runtime/claude/bin/notification.sh +6 -0
- package/runtime/claude/bin/notify.sh +636 -0
- package/runtime/claude/bin/observe-context.sh +14 -0
- package/runtime/claude/bin/onboarding.sh +6 -0
- package/runtime/claude/bin/person.py +634 -0
- package/runtime/claude/bin/person.sh +481 -0
- package/runtime/claude/bin/pi-render-spec.mjs +140 -0
- package/runtime/claude/bin/post-update.sh +37 -0
- package/runtime/claude/bin/prime-render-spec.mjs +147 -0
- package/runtime/claude/bin/publish-artifact.sh +324 -0
- package/runtime/claude/bin/publish-references.sh +144 -0
- package/runtime/claude/bin/quest.sh +9 -0
- package/runtime/claude/bin/question.sh +8 -0
- package/runtime/claude/bin/repo-state.sh +96 -0
- package/runtime/claude/bin/research-ingest.sh +7 -0
- package/runtime/claude/bin/restore-owned-skills.sh +67 -0
- package/runtime/claude/bin/retrieval_eval.py +385 -0
- package/runtime/claude/bin/runtime-identity.sh +70 -0
- package/runtime/claude/bin/runtime-upgrade.sh +43 -0
- package/runtime/claude/bin/scroll.sh +9 -0
- package/runtime/claude/bin/search.sh +318 -0
- package/runtime/claude/bin/session-autosave.sh +220 -0
- package/runtime/claude/bin/session-log.sh +199 -0
- package/runtime/claude/bin/session-start.sh +696 -0
- package/runtime/claude/bin/settings.sh +532 -0
- package/runtime/claude/bin/startup-check.sh +136 -0
- package/runtime/claude/bin/statusline.sh +41 -0
- package/runtime/claude/bin/telemetry.sh +666 -0
- package/runtime/claude/bin/test-changes.sh +344 -0
- package/runtime/claude/bin/thread.sh +9 -0
- package/runtime/claude/bin/todo.sh +9 -0
- package/runtime/claude/bin/view-render.sh +126 -0
- package/runtime/claude/bin/worktree-create.sh +145 -0
- package/runtime/claude/bin/worktree-remove.sh +50 -0
- package/runtime/claude/bin/worktree.sh +198 -0
- package/runtime/claude/egregore_runtime/__init__.py +228 -0
- package/runtime/claude/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/claude/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/claude/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/claude/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/claude/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/claude/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/claude/egregore_runtime/admin_gate.py +102 -0
- package/runtime/claude/egregore_runtime/artifacts.py +523 -0
- package/runtime/claude/egregore_runtime/contracts.py +499 -0
- package/runtime/claude/egregore_runtime/entitlements.py +85 -0
- package/runtime/claude/egregore_runtime/errors.py +10 -0
- package/runtime/claude/egregore_runtime/graph.py +356 -0
- package/runtime/claude/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/claude/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/claude/egregore_runtime/identity.py +734 -0
- package/runtime/claude/egregore_runtime/identity_cli.py +91 -0
- package/runtime/claude/egregore_runtime/ingest.py +575 -0
- package/runtime/claude/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/claude/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/claude/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/claude/egregore_runtime/invitations.py +116 -0
- package/runtime/claude/egregore_runtime/issue_cli.py +305 -0
- package/runtime/claude/egregore_runtime/issues.py +359 -0
- package/runtime/claude/egregore_runtime/knowledge.py +376 -0
- package/runtime/claude/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/claude/egregore_runtime/lifecycle.py +888 -0
- package/runtime/claude/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/claude/egregore_runtime/notification_cli.py +125 -0
- package/runtime/claude/egregore_runtime/notifications.py +230 -0
- package/runtime/claude/egregore_runtime/observe.py +342 -0
- package/runtime/claude/egregore_runtime/onboarding.py +290 -0
- package/runtime/claude/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/claude/egregore_runtime/policy.py +144 -0
- package/runtime/claude/egregore_runtime/profile.py +193 -0
- package/runtime/claude/egregore_runtime/quest_cli.py +216 -0
- package/runtime/claude/egregore_runtime/question_cli.py +180 -0
- package/runtime/claude/egregore_runtime/questions.py +304 -0
- package/runtime/claude/egregore_runtime/quests.py +419 -0
- package/runtime/claude/egregore_runtime/readiness.py +379 -0
- package/runtime/claude/egregore_runtime/research_ingest.py +256 -0
- package/runtime/claude/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/claude/egregore_runtime/runtime.py +464 -0
- package/runtime/claude/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/claude/egregore_runtime/scrolls.py +726 -0
- package/runtime/claude/egregore_runtime/status.py +412 -0
- package/runtime/claude/egregore_runtime/status_cli.py +174 -0
- package/runtime/claude/egregore_runtime/sync.py +218 -0
- package/runtime/claude/egregore_runtime/teamsync.py +139 -0
- package/runtime/claude/egregore_runtime/telemetry.py +640 -0
- package/runtime/claude/egregore_runtime/thread_cli.py +173 -0
- package/runtime/claude/egregore_runtime/threads.py +517 -0
- package/runtime/claude/egregore_runtime/todo_cli.py +142 -0
- package/runtime/claude/egregore_runtime/todos.py +244 -0
- package/runtime/claude/egregore_runtime/upgrade.py +770 -0
- package/runtime/claude/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/claude/egregore_runtime/writeback.py +391 -0
- package/runtime/claude/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/claude/manifest.json +284 -0
- package/runtime/codex/.codex/hooks/search-hint.js +21 -52
- package/runtime/codex/.codex/hooks.json +3 -3
- package/runtime/codex/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/codex/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/codex/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/codex/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/codex/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/codex/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/codex/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/codex/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/codex/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/codex/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/codex/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/codex/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/codex/.codex/skills/me/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/codex/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/codex/.codex/skills/note/SKILL.md +30 -25
- package/runtime/codex/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/codex/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/codex/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/codex/.codex/skills/save/SKILL.md +2 -2
- package/runtime/codex/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/test/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/codex/.codex/skills/view/SKILL.md +115 -111
- package/runtime/codex/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/codex/.codex/spec-manifest.json +9 -9
- package/runtime/codex/AGENTS.md +62 -58
- package/runtime/codex/bin/activity-action.sh +92 -0
- package/runtime/codex/bin/activity-data.sh +12 -233
- package/runtime/codex/bin/agent.sh +84 -100
- package/runtime/codex/bin/artifact-register.sh +164 -0
- package/runtime/codex/bin/artifact-writeback.sh +53 -0
- package/runtime/codex/bin/artifacts.sh +288 -0
- package/runtime/codex/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/codex/bin/capture-run.sh +18 -2
- package/runtime/codex/bin/codex-render-spec.mjs +41 -16
- package/runtime/codex/bin/codex-session-start.sh +14 -4
- package/runtime/codex/bin/codex-skill-render.mjs +9 -7
- package/runtime/codex/bin/corpus_map.py +806 -0
- package/runtime/codex/bin/corpus_survey.py +304 -0
- package/runtime/codex/bin/dashboard-data.sh +11 -171
- package/runtime/codex/bin/github-auth.sh +121 -0
- package/runtime/codex/bin/graph-batch.sh +7 -0
- package/runtime/codex/bin/graph-op.sh +4 -0
- package/runtime/codex/bin/graph-projection.sh +54 -0
- package/runtime/codex/bin/graph-wal.sh +13 -0
- package/runtime/codex/bin/graph.sh +44 -0
- package/runtime/codex/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/codex/bin/handoff-lifecycle.sh +280 -0
- package/runtime/codex/bin/handoff-preview.sh +169 -0
- package/runtime/codex/bin/handoff-run.sh +42 -26
- package/runtime/codex/bin/ingest-graph.sh +6 -0
- package/runtime/codex/bin/ingest-item.sh +10 -0
- package/runtime/codex/bin/ingest.sh +59 -30
- package/runtime/codex/bin/invite.sh +6 -0
- package/runtime/codex/bin/issue.sh +10 -0
- package/runtime/codex/bin/knowledge.sh +10 -0
- package/runtime/codex/bin/lib/config.sh +20 -0
- package/runtime/codex/bin/lib/context.sh +46 -25
- package/runtime/codex/bin/lib/git-sync.sh +70 -6
- package/runtime/codex/bin/lib/greeting.sh +34 -5
- package/runtime/codex/bin/lib/handoff-meta.sh +97 -0
- package/runtime/codex/bin/lib/worktree-links.sh +6 -0
- package/runtime/codex/bin/node-run.sh +42 -0
- package/runtime/codex/bin/notification.sh +6 -0
- package/runtime/codex/bin/observe-context.sh +14 -0
- package/runtime/codex/bin/onboarding.sh +6 -0
- package/runtime/codex/bin/person.py +4 -0
- package/runtime/codex/bin/person.sh +43 -10
- package/runtime/codex/bin/pi-render-spec.mjs +140 -0
- package/runtime/codex/bin/post-update.sh +37 -0
- package/runtime/codex/bin/prime-render-spec.mjs +147 -0
- package/runtime/codex/bin/publish-artifact.sh +55 -2
- package/runtime/codex/bin/quest.sh +9 -0
- package/runtime/codex/bin/question.sh +8 -0
- package/runtime/codex/bin/research-ingest.sh +7 -0
- package/runtime/codex/bin/restore-owned-skills.sh +67 -0
- package/runtime/codex/bin/retrieval_eval.py +385 -0
- package/runtime/codex/bin/runtime-identity.sh +70 -0
- package/runtime/codex/bin/runtime-upgrade.sh +43 -0
- package/runtime/codex/bin/scroll.sh +9 -0
- package/runtime/codex/bin/search.sh +231 -195
- package/runtime/codex/bin/settings.sh +174 -5
- package/runtime/codex/bin/startup-check.sh +136 -0
- package/runtime/codex/bin/telemetry.sh +522 -247
- package/runtime/codex/bin/test-changes.sh +344 -0
- package/runtime/codex/bin/thread.sh +9 -0
- package/runtime/codex/bin/todo.sh +9 -0
- package/runtime/codex/bin/view-render.sh +126 -0
- package/runtime/codex/bin/worktree-create.sh +19 -5
- package/runtime/codex/egregore_runtime/__init__.py +228 -0
- package/runtime/codex/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/codex/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/codex/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/codex/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/codex/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/codex/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/codex/egregore_runtime/admin_gate.py +102 -0
- package/runtime/codex/egregore_runtime/artifacts.py +523 -0
- package/runtime/codex/egregore_runtime/contracts.py +499 -0
- package/runtime/codex/egregore_runtime/entitlements.py +85 -0
- package/runtime/codex/egregore_runtime/errors.py +10 -0
- package/runtime/codex/egregore_runtime/graph.py +356 -0
- package/runtime/codex/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/codex/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/codex/egregore_runtime/identity.py +734 -0
- package/runtime/codex/egregore_runtime/identity_cli.py +91 -0
- package/runtime/codex/egregore_runtime/ingest.py +575 -0
- package/runtime/codex/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/codex/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/codex/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/codex/egregore_runtime/invitations.py +116 -0
- package/runtime/codex/egregore_runtime/issue_cli.py +305 -0
- package/runtime/codex/egregore_runtime/issues.py +359 -0
- package/runtime/codex/egregore_runtime/knowledge.py +376 -0
- package/runtime/codex/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/codex/egregore_runtime/lifecycle.py +888 -0
- package/runtime/codex/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/codex/egregore_runtime/notification_cli.py +125 -0
- package/runtime/codex/egregore_runtime/notifications.py +230 -0
- package/runtime/codex/egregore_runtime/observe.py +342 -0
- package/runtime/codex/egregore_runtime/onboarding.py +290 -0
- package/runtime/codex/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/codex/egregore_runtime/policy.py +144 -0
- package/runtime/codex/egregore_runtime/profile.py +193 -0
- package/runtime/codex/egregore_runtime/quest_cli.py +216 -0
- package/runtime/codex/egregore_runtime/question_cli.py +180 -0
- package/runtime/codex/egregore_runtime/questions.py +304 -0
- package/runtime/codex/egregore_runtime/quests.py +419 -0
- package/runtime/codex/egregore_runtime/readiness.py +379 -0
- package/runtime/codex/egregore_runtime/research_ingest.py +256 -0
- package/runtime/codex/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/codex/egregore_runtime/runtime.py +464 -0
- package/runtime/codex/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/codex/egregore_runtime/scrolls.py +726 -0
- package/runtime/codex/egregore_runtime/status.py +412 -0
- package/runtime/codex/egregore_runtime/status_cli.py +174 -0
- package/runtime/codex/egregore_runtime/sync.py +218 -0
- package/runtime/codex/egregore_runtime/teamsync.py +139 -0
- package/runtime/codex/egregore_runtime/telemetry.py +640 -0
- package/runtime/codex/egregore_runtime/thread_cli.py +173 -0
- package/runtime/codex/egregore_runtime/threads.py +517 -0
- package/runtime/codex/egregore_runtime/todo_cli.py +142 -0
- package/runtime/codex/egregore_runtime/todos.py +244 -0
- package/runtime/codex/egregore_runtime/upgrade.py +770 -0
- package/runtime/codex/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/codex/egregore_runtime/writeback.py +391 -0
- package/runtime/codex/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/codex/manifest.json +98 -1
- package/runtime/pi/.codex/hooks/search-hint.js +21 -52
- package/runtime/pi/.codex/hooks.json +3 -3
- package/runtime/pi/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/pi/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/pi/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/pi/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/pi/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/pi/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/pi/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/pi/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/pi/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/pi/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/pi/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/pi/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/pi/.codex/skills/me/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/pi/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/pi/.codex/skills/note/SKILL.md +30 -25
- package/runtime/pi/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/pi/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/pi/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/pi/.codex/skills/save/SKILL.md +2 -2
- package/runtime/pi/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/test/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/pi/.codex/skills/view/SKILL.md +115 -111
- package/runtime/pi/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/pi/.codex/spec-manifest.json +9 -9
- package/runtime/pi/.pi/APPEND_SYSTEM.md +57 -48
- package/runtime/pi/.pi/extensions/egregore.ts +7 -0
- package/runtime/pi/.pi/spec-manifest.json +2 -2
- package/runtime/pi/AGENTS.md +62 -58
- package/runtime/pi/bin/activity-action.sh +92 -0
- package/runtime/pi/bin/activity-data.sh +12 -233
- package/runtime/pi/bin/agent.sh +84 -100
- package/runtime/pi/bin/artifact-register.sh +164 -0
- package/runtime/pi/bin/artifact-writeback.sh +53 -0
- package/runtime/pi/bin/artifacts.sh +288 -0
- package/runtime/pi/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/pi/bin/capture-run.sh +18 -2
- package/runtime/pi/bin/codex-render-spec.mjs +41 -16
- package/runtime/pi/bin/codex-session-start.sh +14 -4
- package/runtime/pi/bin/codex-skill-render.mjs +9 -7
- package/runtime/pi/bin/corpus_map.py +806 -0
- package/runtime/pi/bin/corpus_survey.py +304 -0
- package/runtime/pi/bin/dashboard-data.sh +11 -171
- package/runtime/pi/bin/github-auth.sh +121 -0
- package/runtime/pi/bin/graph-batch.sh +7 -0
- package/runtime/pi/bin/graph-op.sh +4 -0
- package/runtime/pi/bin/graph-projection.sh +54 -0
- package/runtime/pi/bin/graph-wal.sh +13 -0
- package/runtime/pi/bin/graph.sh +44 -0
- package/runtime/pi/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/pi/bin/handoff-lifecycle.sh +280 -0
- package/runtime/pi/bin/handoff-preview.sh +169 -0
- package/runtime/pi/bin/handoff-run.sh +42 -26
- package/runtime/pi/bin/ingest-graph.sh +6 -0
- package/runtime/pi/bin/ingest-item.sh +10 -0
- package/runtime/pi/bin/ingest.sh +59 -30
- package/runtime/pi/bin/invite.sh +6 -0
- package/runtime/pi/bin/issue.sh +10 -0
- package/runtime/pi/bin/knowledge.sh +10 -0
- package/runtime/pi/bin/lib/config.sh +20 -0
- package/runtime/pi/bin/lib/context.sh +46 -25
- package/runtime/pi/bin/lib/git-sync.sh +70 -6
- package/runtime/pi/bin/lib/greeting.sh +34 -5
- package/runtime/pi/bin/lib/handoff-meta.sh +97 -0
- package/runtime/pi/bin/lib/worktree-links.sh +6 -0
- package/runtime/pi/bin/node-run.sh +42 -0
- package/runtime/pi/bin/notification.sh +6 -0
- package/runtime/pi/bin/observe-context.sh +14 -0
- package/runtime/pi/bin/onboarding.sh +6 -0
- package/runtime/pi/bin/person.py +4 -0
- package/runtime/pi/bin/person.sh +43 -10
- package/runtime/pi/bin/pi-observe-context.mjs +93 -0
- package/runtime/pi/bin/pi-product-workflows.mjs +1 -1
- package/runtime/pi/bin/pi-render-spec.mjs +1 -1
- package/runtime/pi/bin/post-update.sh +37 -0
- package/runtime/pi/bin/prime-render-spec.mjs +147 -0
- package/runtime/pi/bin/publish-artifact.sh +55 -2
- package/runtime/pi/bin/quest.sh +9 -0
- package/runtime/pi/bin/question.sh +8 -0
- package/runtime/pi/bin/research-ingest.sh +7 -0
- package/runtime/pi/bin/restore-owned-skills.sh +67 -0
- package/runtime/pi/bin/retrieval_eval.py +385 -0
- package/runtime/pi/bin/runtime-identity.sh +70 -0
- package/runtime/pi/bin/runtime-upgrade.sh +43 -0
- package/runtime/pi/bin/scroll.sh +9 -0
- package/runtime/pi/bin/search.sh +231 -195
- package/runtime/pi/bin/settings.sh +174 -5
- package/runtime/pi/bin/startup-check.sh +136 -0
- package/runtime/pi/bin/telemetry.sh +522 -247
- package/runtime/pi/bin/test-changes.sh +344 -0
- package/runtime/pi/bin/thread.sh +9 -0
- package/runtime/pi/bin/todo.sh +9 -0
- package/runtime/pi/bin/view-render.sh +126 -0
- package/runtime/pi/bin/worktree-create.sh +19 -5
- package/runtime/pi/egregore_runtime/__init__.py +228 -0
- package/runtime/pi/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/pi/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/pi/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/pi/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/pi/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/pi/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/pi/egregore_runtime/admin_gate.py +102 -0
- package/runtime/pi/egregore_runtime/artifacts.py +523 -0
- package/runtime/pi/egregore_runtime/contracts.py +499 -0
- package/runtime/pi/egregore_runtime/entitlements.py +85 -0
- package/runtime/pi/egregore_runtime/errors.py +10 -0
- package/runtime/pi/egregore_runtime/graph.py +356 -0
- package/runtime/pi/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/pi/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/pi/egregore_runtime/identity.py +734 -0
- package/runtime/pi/egregore_runtime/identity_cli.py +91 -0
- package/runtime/pi/egregore_runtime/ingest.py +575 -0
- package/runtime/pi/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/pi/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/pi/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/pi/egregore_runtime/invitations.py +116 -0
- package/runtime/pi/egregore_runtime/issue_cli.py +305 -0
- package/runtime/pi/egregore_runtime/issues.py +359 -0
- package/runtime/pi/egregore_runtime/knowledge.py +376 -0
- package/runtime/pi/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/pi/egregore_runtime/lifecycle.py +888 -0
- package/runtime/pi/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/pi/egregore_runtime/notification_cli.py +125 -0
- package/runtime/pi/egregore_runtime/notifications.py +230 -0
- package/runtime/pi/egregore_runtime/observe.py +342 -0
- package/runtime/pi/egregore_runtime/onboarding.py +290 -0
- package/runtime/pi/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/pi/egregore_runtime/policy.py +144 -0
- package/runtime/pi/egregore_runtime/profile.py +193 -0
- package/runtime/pi/egregore_runtime/quest_cli.py +216 -0
- package/runtime/pi/egregore_runtime/question_cli.py +180 -0
- package/runtime/pi/egregore_runtime/questions.py +304 -0
- package/runtime/pi/egregore_runtime/quests.py +419 -0
- package/runtime/pi/egregore_runtime/readiness.py +379 -0
- package/runtime/pi/egregore_runtime/research_ingest.py +256 -0
- package/runtime/pi/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/pi/egregore_runtime/runtime.py +464 -0
- package/runtime/pi/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/pi/egregore_runtime/scrolls.py +726 -0
- package/runtime/pi/egregore_runtime/status.py +412 -0
- package/runtime/pi/egregore_runtime/status_cli.py +174 -0
- package/runtime/pi/egregore_runtime/sync.py +218 -0
- package/runtime/pi/egregore_runtime/teamsync.py +139 -0
- package/runtime/pi/egregore_runtime/telemetry.py +640 -0
- package/runtime/pi/egregore_runtime/thread_cli.py +173 -0
- package/runtime/pi/egregore_runtime/threads.py +517 -0
- package/runtime/pi/egregore_runtime/todo_cli.py +142 -0
- package/runtime/pi/egregore_runtime/todos.py +244 -0
- package/runtime/pi/egregore_runtime/upgrade.py +770 -0
- package/runtime/pi/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/pi/egregore_runtime/writeback.py +391 -0
- package/runtime/pi/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/pi/manifest.json +98 -1
- package/runtime/prime/.codex/hooks/search-hint.js +21 -52
- package/runtime/prime/.codex/hooks.json +3 -3
- package/runtime/prime/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/prime/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/prime/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/prime/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/prime/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/prime/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/prime/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/prime/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/prime/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/prime/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/prime/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/prime/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/prime/.codex/skills/me/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/prime/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/prime/.codex/skills/note/SKILL.md +30 -25
- package/runtime/prime/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/prime/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/prime/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/prime/.codex/skills/save/SKILL.md +2 -2
- package/runtime/prime/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/test/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/prime/.codex/skills/view/SKILL.md +115 -111
- package/runtime/prime/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/prime/.codex/spec-manifest.json +9 -9
- package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +57 -48
- package/runtime/prime/.prime/agent/extensions/egregore.ts +7 -0
- package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
- package/runtime/prime/AGENTS.md +62 -58
- package/runtime/prime/bin/activity-action.sh +92 -0
- package/runtime/prime/bin/activity-data.sh +12 -233
- package/runtime/prime/bin/agent.sh +84 -100
- package/runtime/prime/bin/artifact-register.sh +164 -0
- package/runtime/prime/bin/artifact-writeback.sh +53 -0
- package/runtime/prime/bin/artifacts.sh +288 -0
- package/runtime/prime/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/prime/bin/capture-run.sh +18 -2
- package/runtime/prime/bin/codex-render-spec.mjs +41 -16
- package/runtime/prime/bin/codex-session-start.sh +14 -4
- package/runtime/prime/bin/codex-skill-render.mjs +9 -7
- package/runtime/prime/bin/corpus_map.py +806 -0
- package/runtime/prime/bin/corpus_survey.py +304 -0
- package/runtime/prime/bin/dashboard-data.sh +11 -171
- package/runtime/prime/bin/github-auth.sh +121 -0
- package/runtime/prime/bin/graph-batch.sh +7 -0
- package/runtime/prime/bin/graph-op.sh +4 -0
- package/runtime/prime/bin/graph-projection.sh +54 -0
- package/runtime/prime/bin/graph-wal.sh +13 -0
- package/runtime/prime/bin/graph.sh +44 -0
- package/runtime/prime/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/prime/bin/handoff-lifecycle.sh +280 -0
- package/runtime/prime/bin/handoff-preview.sh +169 -0
- package/runtime/prime/bin/handoff-run.sh +42 -26
- package/runtime/prime/bin/ingest-graph.sh +6 -0
- package/runtime/prime/bin/ingest-item.sh +10 -0
- package/runtime/prime/bin/ingest.sh +59 -30
- package/runtime/prime/bin/invite.sh +6 -0
- package/runtime/prime/bin/issue.sh +10 -0
- package/runtime/prime/bin/knowledge.sh +10 -0
- package/runtime/prime/bin/lib/config.sh +20 -0
- package/runtime/prime/bin/lib/context.sh +46 -25
- package/runtime/prime/bin/lib/git-sync.sh +70 -6
- package/runtime/prime/bin/lib/greeting.sh +34 -5
- package/runtime/prime/bin/lib/handoff-meta.sh +97 -0
- package/runtime/prime/bin/lib/worktree-links.sh +6 -0
- package/runtime/prime/bin/node-run.sh +42 -0
- package/runtime/prime/bin/notification.sh +6 -0
- package/runtime/prime/bin/observe-context.sh +14 -0
- package/runtime/prime/bin/onboarding.sh +6 -0
- package/runtime/prime/bin/person.py +4 -0
- package/runtime/prime/bin/person.sh +43 -10
- package/runtime/prime/bin/pi-observe-context.mjs +93 -0
- package/runtime/prime/bin/pi-product-workflows.mjs +1 -1
- package/runtime/prime/bin/pi-render-spec.mjs +140 -0
- package/runtime/prime/bin/post-update.sh +37 -0
- package/runtime/prime/bin/prime-render-spec.mjs +1 -1
- package/runtime/prime/bin/publish-artifact.sh +55 -2
- package/runtime/prime/bin/quest.sh +9 -0
- package/runtime/prime/bin/question.sh +8 -0
- package/runtime/prime/bin/research-ingest.sh +7 -0
- package/runtime/prime/bin/restore-owned-skills.sh +67 -0
- package/runtime/prime/bin/retrieval_eval.py +385 -0
- package/runtime/prime/bin/runtime-identity.sh +70 -0
- package/runtime/prime/bin/runtime-upgrade.sh +43 -0
- package/runtime/prime/bin/scroll.sh +9 -0
- package/runtime/prime/bin/search.sh +231 -195
- package/runtime/prime/bin/settings.sh +174 -5
- package/runtime/prime/bin/startup-check.sh +136 -0
- package/runtime/prime/bin/telemetry.sh +522 -247
- package/runtime/prime/bin/test-changes.sh +344 -0
- package/runtime/prime/bin/thread.sh +9 -0
- package/runtime/prime/bin/todo.sh +9 -0
- package/runtime/prime/bin/view-render.sh +126 -0
- package/runtime/prime/bin/worktree-create.sh +19 -5
- package/runtime/prime/egregore_runtime/__init__.py +228 -0
- package/runtime/prime/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/prime/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/prime/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/prime/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/prime/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/prime/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/prime/egregore_runtime/admin_gate.py +102 -0
- package/runtime/prime/egregore_runtime/artifacts.py +523 -0
- package/runtime/prime/egregore_runtime/contracts.py +499 -0
- package/runtime/prime/egregore_runtime/entitlements.py +85 -0
- package/runtime/prime/egregore_runtime/errors.py +10 -0
- package/runtime/prime/egregore_runtime/graph.py +356 -0
- package/runtime/prime/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/prime/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/prime/egregore_runtime/identity.py +734 -0
- package/runtime/prime/egregore_runtime/identity_cli.py +91 -0
- package/runtime/prime/egregore_runtime/ingest.py +575 -0
- package/runtime/prime/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/prime/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/prime/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/prime/egregore_runtime/invitations.py +116 -0
- package/runtime/prime/egregore_runtime/issue_cli.py +305 -0
- package/runtime/prime/egregore_runtime/issues.py +359 -0
- package/runtime/prime/egregore_runtime/knowledge.py +376 -0
- package/runtime/prime/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/prime/egregore_runtime/lifecycle.py +888 -0
- package/runtime/prime/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/prime/egregore_runtime/notification_cli.py +125 -0
- package/runtime/prime/egregore_runtime/notifications.py +230 -0
- package/runtime/prime/egregore_runtime/observe.py +342 -0
- package/runtime/prime/egregore_runtime/onboarding.py +290 -0
- package/runtime/prime/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/prime/egregore_runtime/policy.py +144 -0
- package/runtime/prime/egregore_runtime/profile.py +193 -0
- package/runtime/prime/egregore_runtime/quest_cli.py +216 -0
- package/runtime/prime/egregore_runtime/question_cli.py +180 -0
- package/runtime/prime/egregore_runtime/questions.py +304 -0
- package/runtime/prime/egregore_runtime/quests.py +419 -0
- package/runtime/prime/egregore_runtime/readiness.py +379 -0
- package/runtime/prime/egregore_runtime/research_ingest.py +256 -0
- package/runtime/prime/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/prime/egregore_runtime/runtime.py +464 -0
- package/runtime/prime/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/prime/egregore_runtime/scrolls.py +726 -0
- package/runtime/prime/egregore_runtime/status.py +412 -0
- package/runtime/prime/egregore_runtime/status_cli.py +174 -0
- package/runtime/prime/egregore_runtime/sync.py +218 -0
- package/runtime/prime/egregore_runtime/teamsync.py +139 -0
- package/runtime/prime/egregore_runtime/telemetry.py +640 -0
- package/runtime/prime/egregore_runtime/thread_cli.py +173 -0
- package/runtime/prime/egregore_runtime/threads.py +517 -0
- package/runtime/prime/egregore_runtime/todo_cli.py +142 -0
- package/runtime/prime/egregore_runtime/todos.py +244 -0
- package/runtime/prime/egregore_runtime/upgrade.py +770 -0
- package/runtime/prime/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/prime/egregore_runtime/writeback.py +391 -0
- package/runtime/prime/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/prime/manifest.json +98 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""Runtime-neutral command adapter for the resumable onboarding ritual."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
import os
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
import subprocess
|
|
10
|
+
from uuid import uuid4
|
|
11
|
+
|
|
12
|
+
from .errors import AuthorizationDenied
|
|
13
|
+
from .onboarding import OnboardingService
|
|
14
|
+
from .runtime import local_runtime
|
|
15
|
+
from .sync import LocalGitSyncTransport
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _context():
|
|
19
|
+
root = Path(os.environ.get("EGREGORE_ROOT") or Path.cwd()).resolve()
|
|
20
|
+
runtime = local_runtime(root, push_remote=False)
|
|
21
|
+
marker = root / ".egregore-session-id"
|
|
22
|
+
session_id = os.environ.get("EGREGORE_SESSION_ID", "").strip()
|
|
23
|
+
if not session_id and marker.is_file():
|
|
24
|
+
session_id = marker.read_text(encoding="utf-8").splitlines()[0].strip()
|
|
25
|
+
actor = runtime.resolve_actor(
|
|
26
|
+
session_id=session_id or f"onboarding_{uuid4().hex}",
|
|
27
|
+
harness=os.environ.get("EGREGORE_RUNTIME", "shell"),
|
|
28
|
+
)
|
|
29
|
+
return root, actor, OnboardingService(root, runtime)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _identity(root: Path, command: str, *arguments: str) -> bool:
|
|
33
|
+
result = subprocess.run(
|
|
34
|
+
("bash", str(root / "bin" / "person.sh"), command, *arguments),
|
|
35
|
+
cwd=root,
|
|
36
|
+
capture_output=True,
|
|
37
|
+
text=True,
|
|
38
|
+
check=False,
|
|
39
|
+
timeout=45,
|
|
40
|
+
)
|
|
41
|
+
return result.returncode == 0
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _shell_alias(root: Path) -> str | None:
|
|
45
|
+
result = subprocess.run(
|
|
46
|
+
("bash", str(root / "bin" / "ensure-shell-function.sh")),
|
|
47
|
+
cwd=root,
|
|
48
|
+
capture_output=True,
|
|
49
|
+
text=True,
|
|
50
|
+
check=False,
|
|
51
|
+
timeout=15,
|
|
52
|
+
)
|
|
53
|
+
if result.returncode == 0 and result.stdout.strip():
|
|
54
|
+
return result.stdout.strip().splitlines()[-1]
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def main() -> int:
|
|
59
|
+
parser = argparse.ArgumentParser(prog="egregore-onboarding")
|
|
60
|
+
commands = parser.add_subparsers(dest="command", required=True)
|
|
61
|
+
commands.add_parser("status")
|
|
62
|
+
name = commands.add_parser("set-name")
|
|
63
|
+
name.add_argument("value")
|
|
64
|
+
role = commands.add_parser("set-role")
|
|
65
|
+
role.add_argument("value")
|
|
66
|
+
invite = commands.add_parser("record-invite")
|
|
67
|
+
invite.add_argument("choice", choices=("invited", "skipped"))
|
|
68
|
+
commands.add_parser("complete")
|
|
69
|
+
args = parser.parse_args()
|
|
70
|
+
root, actor, service = _context()
|
|
71
|
+
|
|
72
|
+
if args.command == "status":
|
|
73
|
+
snapshot = service.snapshot(actor)
|
|
74
|
+
result = snapshot.to_dict()
|
|
75
|
+
elif args.command == "set-name":
|
|
76
|
+
snapshot = service.set_name(actor, args.value)
|
|
77
|
+
result = snapshot.to_dict() | {"identity_reconciled": _identity(root, "sync")}
|
|
78
|
+
elif args.command == "set-role":
|
|
79
|
+
snapshot = service.set_role(actor, args.value)
|
|
80
|
+
result = snapshot.to_dict() | {"identity_reconciled": _identity(root, "sync")}
|
|
81
|
+
elif args.command == "record-invite":
|
|
82
|
+
snapshot = service.record_invite(actor, skipped=args.choice == "skipped")
|
|
83
|
+
result = snapshot.to_dict()
|
|
84
|
+
else:
|
|
85
|
+
if not _identity(root, "onboard"):
|
|
86
|
+
raise OSError("canonical person profile could not be reconciled")
|
|
87
|
+
current = service.snapshot(actor)
|
|
88
|
+
state = json.loads((root / ".egregore-state.json").read_text(encoding="utf-8"))
|
|
89
|
+
username = str(state.get("github_username") or "").strip()
|
|
90
|
+
profile = root / "memory" / "people" / f"{username}.md"
|
|
91
|
+
if not current.profile_witness or not profile.is_file():
|
|
92
|
+
raise ValueError("canonical person profile witness is missing")
|
|
93
|
+
sync = LocalGitSyncTransport((root / "memory").resolve(), push_remote=True).push(
|
|
94
|
+
message=f"docs(people): onboard {username}", paths=(str(profile),)
|
|
95
|
+
)
|
|
96
|
+
snapshot = service.complete(actor, profile_witness=current.profile_witness)
|
|
97
|
+
result = snapshot.to_dict() | {
|
|
98
|
+
"sync_warnings": list(sync.warnings),
|
|
99
|
+
"launcher_alias": _shell_alias(root),
|
|
100
|
+
}
|
|
101
|
+
print(json.dumps(result, ensure_ascii=False, sort_keys=True))
|
|
102
|
+
return 0
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if __name__ == "__main__":
|
|
106
|
+
try:
|
|
107
|
+
raise SystemExit(main())
|
|
108
|
+
except (AuthorizationDenied, OSError, ValueError, json.JSONDecodeError) as exc:
|
|
109
|
+
print(f"onboarding: {exc}", file=os.sys.stderr)
|
|
110
|
+
raise SystemExit(1) from exc
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"""Deterministic v1 policy and action-permission implementations."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import Mapping, Sequence
|
|
7
|
+
|
|
8
|
+
from .contracts import (
|
|
9
|
+
ActionAuthorizer,
|
|
10
|
+
ActorContext,
|
|
11
|
+
Permission,
|
|
12
|
+
PolicyDecision,
|
|
13
|
+
RetrievalRequest,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _canonical_parts(path: str) -> tuple[str, ...] | None:
|
|
18
|
+
normalized = path.replace("\\", "/").strip().strip("/")
|
|
19
|
+
parts = tuple(normalized.split("/")) if normalized else ()
|
|
20
|
+
if not parts or any(part in {"", ".", ".."} for part in parts):
|
|
21
|
+
return None
|
|
22
|
+
return parts
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def scope_allows_path(path: str, scopes: Sequence[str]) -> bool:
|
|
26
|
+
"""Return whether a normalized canonical path is inside an ACL scope."""
|
|
27
|
+
|
|
28
|
+
canonical = _canonical_parts(path)
|
|
29
|
+
if canonical is None:
|
|
30
|
+
return False
|
|
31
|
+
for raw_scope in scopes:
|
|
32
|
+
scope = _canonical_parts(raw_scope)
|
|
33
|
+
if scope is not None and canonical[: len(scope)] == scope:
|
|
34
|
+
return True
|
|
35
|
+
return False
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(frozen=True, slots=True)
|
|
39
|
+
class ActorGrant:
|
|
40
|
+
permissions: frozenset[Permission]
|
|
41
|
+
scopes: tuple[str, ...] = ()
|
|
42
|
+
resource_ids: tuple[str, ...] = ()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(slots=True)
|
|
46
|
+
class StaticPolicy(ActionAuthorizer):
|
|
47
|
+
"""Fail-closed policy driven by explicit actor grants.
|
|
48
|
+
|
|
49
|
+
This is deliberately small. It proves that dogfood uses a real policy
|
|
50
|
+
boundary while leaving room for a future ACL-backed policy adapter.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
org_id: str
|
|
54
|
+
policy_epoch: str
|
|
55
|
+
grants: Mapping[str, ActorGrant] = field(default_factory=dict)
|
|
56
|
+
|
|
57
|
+
def _base_reasons(self, actor: ActorContext) -> list[str]:
|
|
58
|
+
reasons: list[str] = []
|
|
59
|
+
if actor.profile.org_id != self.org_id:
|
|
60
|
+
reasons.append("actor profile belongs to a different organization")
|
|
61
|
+
if actor.membership is None:
|
|
62
|
+
reasons.append("actor has no organization membership")
|
|
63
|
+
elif actor.membership.org_id != self.org_id:
|
|
64
|
+
reasons.append("membership belongs to a different organization")
|
|
65
|
+
elif actor.membership.actor_id != actor.actor.actor_id:
|
|
66
|
+
reasons.append("membership belongs to a different actor")
|
|
67
|
+
elif actor.membership.status != "active":
|
|
68
|
+
reasons.append("membership is not active")
|
|
69
|
+
if (
|
|
70
|
+
actor.actor.account_id is not None
|
|
71
|
+
and (actor.account is None or actor.account.account_id != actor.actor.account_id)
|
|
72
|
+
):
|
|
73
|
+
reasons.append("actor account does not match the resolved account")
|
|
74
|
+
return reasons
|
|
75
|
+
|
|
76
|
+
def authorize_observe(
|
|
77
|
+
self, actor: ActorContext, request: RetrievalRequest
|
|
78
|
+
) -> PolicyDecision:
|
|
79
|
+
reasons = self._base_reasons(actor)
|
|
80
|
+
if request.org_id != self.org_id:
|
|
81
|
+
reasons.append("retrieval request belongs to a different organization")
|
|
82
|
+
if request.actor_id != actor.actor.actor_id:
|
|
83
|
+
reasons.append("retrieval request actor does not match the active actor")
|
|
84
|
+
grant = self.grants.get(actor.actor.actor_id)
|
|
85
|
+
if grant is None:
|
|
86
|
+
reasons.append("actor has no policy grant")
|
|
87
|
+
elif not {Permission.DISCOVER, Permission.READ}.issubset(grant.permissions):
|
|
88
|
+
reasons.append("actor lacks discover/read permission")
|
|
89
|
+
|
|
90
|
+
return PolicyDecision(
|
|
91
|
+
allowed=not reasons,
|
|
92
|
+
actor_id=actor.actor.actor_id,
|
|
93
|
+
org_id=self.org_id,
|
|
94
|
+
permission=Permission.READ,
|
|
95
|
+
policy_epoch=self.policy_epoch,
|
|
96
|
+
resource_ids=grant.resource_ids if grant else (),
|
|
97
|
+
scopes=grant.scopes if grant else (),
|
|
98
|
+
reasons=tuple(reasons) if reasons else ("explicit actor grant",),
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
def authorize_action(
|
|
102
|
+
self,
|
|
103
|
+
actor: ActorContext,
|
|
104
|
+
permission: Permission,
|
|
105
|
+
resource_ids: Sequence[str] = (),
|
|
106
|
+
) -> PolicyDecision:
|
|
107
|
+
reasons = self._base_reasons(actor)
|
|
108
|
+
grant = self.grants.get(actor.actor.actor_id)
|
|
109
|
+
if grant is None:
|
|
110
|
+
reasons.append("actor has no policy grant")
|
|
111
|
+
elif permission not in grant.permissions:
|
|
112
|
+
reasons.append(f"actor lacks {permission.value} permission")
|
|
113
|
+
elif grant.resource_ids and any(
|
|
114
|
+
resource_id not in grant.resource_ids for resource_id in resource_ids
|
|
115
|
+
):
|
|
116
|
+
reasons.append("requested resource is outside the actor grant")
|
|
117
|
+
|
|
118
|
+
return PolicyDecision(
|
|
119
|
+
allowed=not reasons,
|
|
120
|
+
actor_id=actor.actor.actor_id,
|
|
121
|
+
org_id=self.org_id,
|
|
122
|
+
permission=permission,
|
|
123
|
+
policy_epoch=self.policy_epoch,
|
|
124
|
+
resource_ids=tuple(resource_ids),
|
|
125
|
+
scopes=grant.scopes if grant else (),
|
|
126
|
+
reasons=tuple(reasons) if reasons else ("explicit actor grant",),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def all_access_dogfood_policy(
|
|
131
|
+
*, org_id: str, actor_id: str, policy_epoch: str = "all-access-v1"
|
|
132
|
+
) -> StaticPolicy:
|
|
133
|
+
"""Return the explicit dogfood policy; never bypass the policy interface."""
|
|
134
|
+
|
|
135
|
+
return StaticPolicy(
|
|
136
|
+
org_id=org_id,
|
|
137
|
+
policy_epoch=policy_epoch,
|
|
138
|
+
grants={
|
|
139
|
+
actor_id: ActorGrant(
|
|
140
|
+
permissions=frozenset(Permission),
|
|
141
|
+
scopes=("memory",),
|
|
142
|
+
)
|
|
143
|
+
},
|
|
144
|
+
)
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"""Versioned organizational profile loading for the Egregore runtime.
|
|
2
|
+
|
|
3
|
+
``egregore.json`` remains a small, committed configuration document. Rich
|
|
4
|
+
organizational identity belongs in referenced Markdown documents; runtime
|
|
5
|
+
caches, secrets, and telemetry never belong here.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any, Mapping
|
|
14
|
+
from datetime import UTC, datetime
|
|
15
|
+
from uuid import uuid4
|
|
16
|
+
|
|
17
|
+
from .contracts import EgregoreProfile
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
CONFIG_SCHEMA = "egregore-config/v1"
|
|
21
|
+
PROFILE_SCHEMA = "egregore-profile/v1"
|
|
22
|
+
DEFAULT_CONTEXT_BUDGET = 8_000
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ProfileConfigError(ValueError):
|
|
26
|
+
"""Raised when committed organization identity configuration is invalid."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def new_org_id() -> str:
|
|
30
|
+
"""Return an opaque organization id with no provider or transport meaning."""
|
|
31
|
+
|
|
32
|
+
return f"org_{uuid4().hex}"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def default_profile_config(*, revision: str = "profile/v1") -> dict[str, Any]:
|
|
36
|
+
"""Return conservative profile defaults for a newly initialized org."""
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
"schema_version": PROFILE_SCHEMA,
|
|
40
|
+
"revision": revision,
|
|
41
|
+
"identity_path": "memory/identity/EGREGORE.md",
|
|
42
|
+
"purpose_path": "memory/identity/EGREGORE.md",
|
|
43
|
+
"principles_path": "memory/identity/EGREGORE.md",
|
|
44
|
+
"conventions_path": "memory/identity/EGREGORE.md",
|
|
45
|
+
"declared_sections": [
|
|
46
|
+
"essence",
|
|
47
|
+
"values",
|
|
48
|
+
"domains",
|
|
49
|
+
"voice",
|
|
50
|
+
"decision-grammar",
|
|
51
|
+
],
|
|
52
|
+
"default_policy": "all-access-v1",
|
|
53
|
+
"default_context_budget": DEFAULT_CONTEXT_BUDGET,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def initialize_org_config(
|
|
58
|
+
config: Mapping[str, Any],
|
|
59
|
+
*,
|
|
60
|
+
org_id: str | None = None,
|
|
61
|
+
) -> dict[str, Any]:
|
|
62
|
+
"""Add runtime identity fields without disturbing existing configuration."""
|
|
63
|
+
|
|
64
|
+
result = dict(config)
|
|
65
|
+
result.setdefault("schema_version", CONFIG_SCHEMA)
|
|
66
|
+
result.setdefault("org_id", org_id or new_org_id())
|
|
67
|
+
profile = default_profile_config()
|
|
68
|
+
profile.update(dict(result.get("profile") or {}))
|
|
69
|
+
result["profile"] = profile
|
|
70
|
+
return result
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def render_identity_document(
|
|
74
|
+
name: str,
|
|
75
|
+
*,
|
|
76
|
+
org_type: str = "team",
|
|
77
|
+
intent: str = "collaborate and accumulate organizational knowledge",
|
|
78
|
+
founded: str | None = None,
|
|
79
|
+
) -> str:
|
|
80
|
+
"""Render declared organizational identity without derived graph claims."""
|
|
81
|
+
|
|
82
|
+
founded_on = founded or datetime.now(UTC).date().isoformat()
|
|
83
|
+
return "\n".join(
|
|
84
|
+
[
|
|
85
|
+
f"# {name}",
|
|
86
|
+
"",
|
|
87
|
+
"## Essence",
|
|
88
|
+
"",
|
|
89
|
+
f"{name} is a {org_type} using Egregore to {intent}.",
|
|
90
|
+
"This declaration is versioned organizational identity; refine it through normal review.",
|
|
91
|
+
"",
|
|
92
|
+
"## Values",
|
|
93
|
+
"",
|
|
94
|
+
"- Preserve provenance and make consequential reasoning inspectable.",
|
|
95
|
+
"- Leave canonical organizational state more useful than you found it.",
|
|
96
|
+
"- Keep human and agent authority explicit.",
|
|
97
|
+
"",
|
|
98
|
+
"## Domains",
|
|
99
|
+
"",
|
|
100
|
+
"- Add the fields this organization works in and the boundaries it respects.",
|
|
101
|
+
"",
|
|
102
|
+
"## Voice",
|
|
103
|
+
"",
|
|
104
|
+
"Direct, specific, and honest about uncertainty.",
|
|
105
|
+
"",
|
|
106
|
+
"## Decision Grammar",
|
|
107
|
+
"",
|
|
108
|
+
"- Record decisions that affect more than one session.",
|
|
109
|
+
"- Bias toward action for reversible choices.",
|
|
110
|
+
"- Seek another perspective before irreversible choices.",
|
|
111
|
+
"",
|
|
112
|
+
"## Lineage",
|
|
113
|
+
"",
|
|
114
|
+
f"Declaration created: {founded_on}",
|
|
115
|
+
"",
|
|
116
|
+
]
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _content_revision(raw: bytes) -> str:
|
|
121
|
+
return f"config-sha256:{hashlib.sha256(raw).hexdigest()}"
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _profile_revision(root: Path, raw: bytes, profile: Mapping[str, Any]) -> str:
|
|
125
|
+
"""Hash committed declarations so context freshness follows identity edits."""
|
|
126
|
+
|
|
127
|
+
digest = hashlib.sha256(raw)
|
|
128
|
+
for field in ("identity_path", "purpose_path", "principles_path", "conventions_path"):
|
|
129
|
+
value = profile.get(field)
|
|
130
|
+
if not isinstance(value, str) or not value.strip():
|
|
131
|
+
continue
|
|
132
|
+
relative = value.strip().replace("\\", "/")
|
|
133
|
+
parts = Path(relative).parts
|
|
134
|
+
if Path(relative).is_absolute() or ".." in parts:
|
|
135
|
+
raise ProfileConfigError(f"profile.{field} must stay inside the Egregore")
|
|
136
|
+
declaration = (root / relative).resolve()
|
|
137
|
+
digest.update(field.encode())
|
|
138
|
+
digest.update(relative.encode())
|
|
139
|
+
try:
|
|
140
|
+
digest.update(declaration.read_bytes())
|
|
141
|
+
except OSError:
|
|
142
|
+
digest.update(b"<missing>")
|
|
143
|
+
return f"profile-sha256:{digest.hexdigest()}"
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def load_profile(config_path: Path | str) -> EgregoreProfile:
|
|
147
|
+
"""Load new or legacy ``egregore.json`` into the stable profile contract.
|
|
148
|
+
|
|
149
|
+
Legacy configs remain readable. Their fallback org id is explicitly
|
|
150
|
+
marked as legacy and should be replaced by ``initialize_org_config`` at
|
|
151
|
+
the next controlled config write.
|
|
152
|
+
"""
|
|
153
|
+
|
|
154
|
+
path = Path(config_path)
|
|
155
|
+
raw = path.read_bytes()
|
|
156
|
+
try:
|
|
157
|
+
config = json.loads(raw)
|
|
158
|
+
except json.JSONDecodeError as exc:
|
|
159
|
+
raise ProfileConfigError(f"invalid JSON in {path}: {exc}") from exc
|
|
160
|
+
if not isinstance(config, dict):
|
|
161
|
+
raise ProfileConfigError(f"{path} must contain a JSON object")
|
|
162
|
+
|
|
163
|
+
slug = str(config.get("slug") or "").strip()
|
|
164
|
+
name = str(config.get("org_name") or config.get("name") or "").strip()
|
|
165
|
+
if not slug or not name:
|
|
166
|
+
raise ProfileConfigError(f"{path} must define slug and org_name")
|
|
167
|
+
|
|
168
|
+
profile = config.get("profile") or {}
|
|
169
|
+
if not isinstance(profile, dict):
|
|
170
|
+
raise ProfileConfigError(f"{path} profile must be an object")
|
|
171
|
+
schema = str(profile.get("schema_version") or PROFILE_SCHEMA)
|
|
172
|
+
if schema != PROFILE_SCHEMA:
|
|
173
|
+
raise ProfileConfigError(f"unsupported profile schema: {schema}")
|
|
174
|
+
|
|
175
|
+
configured_org_id = str(config.get("org_id") or "").strip()
|
|
176
|
+
# Read compatibility only. New setup always writes an opaque org id.
|
|
177
|
+
resolved_org_id = configured_org_id or f"legacy-org:{slug}"
|
|
178
|
+
budget = profile.get("default_context_budget", DEFAULT_CONTEXT_BUDGET)
|
|
179
|
+
if not isinstance(budget, int) or budget <= 0:
|
|
180
|
+
raise ProfileConfigError("profile.default_context_budget must be positive")
|
|
181
|
+
|
|
182
|
+
return EgregoreProfile(
|
|
183
|
+
schema_version=schema,
|
|
184
|
+
org_id=resolved_org_id,
|
|
185
|
+
slug=slug,
|
|
186
|
+
name=name,
|
|
187
|
+
revision=_profile_revision(path.parent, raw, profile),
|
|
188
|
+
purpose_path=profile.get("purpose_path"),
|
|
189
|
+
principles_path=profile.get("principles_path"),
|
|
190
|
+
conventions_path=profile.get("conventions_path"),
|
|
191
|
+
default_policy=str(profile.get("default_policy") or "all-access-v1"),
|
|
192
|
+
default_context_budget=budget,
|
|
193
|
+
)
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""Runtime-neutral CLI for canonical collaborative quests."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
import os
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from uuid import uuid4
|
|
10
|
+
|
|
11
|
+
from .contracts import Permission
|
|
12
|
+
from .policy import scope_allows_path
|
|
13
|
+
from .quests import CanonicalQuestService
|
|
14
|
+
from .runtime import local_runtime
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
PRIORITIES = {"none": 0, "low": 1, "medium": 2, "high": 3}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _context():
|
|
21
|
+
root = Path(os.environ.get("EGREGORE_ROOT") or Path.cwd()).resolve()
|
|
22
|
+
runtime = local_runtime(root, push_remote=os.environ.get("EGREGORE_NO_PUSH") != "1")
|
|
23
|
+
actor = runtime.resolve_actor(
|
|
24
|
+
session_id=os.environ.get("EGREGORE_SESSION_ID", f"session_{uuid4().hex}"),
|
|
25
|
+
harness=os.environ.get("EGREGORE_RUNTIME", "shell"),
|
|
26
|
+
)
|
|
27
|
+
service = CanonicalQuestService(
|
|
28
|
+
memory_root=(root / "memory").resolve(),
|
|
29
|
+
write_document=runtime.write_document,
|
|
30
|
+
)
|
|
31
|
+
return runtime, actor, service
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _require(
|
|
35
|
+
runtime,
|
|
36
|
+
actor,
|
|
37
|
+
permission: Permission,
|
|
38
|
+
resource: str,
|
|
39
|
+
*,
|
|
40
|
+
canonical_path: str | None = None,
|
|
41
|
+
):
|
|
42
|
+
decision = runtime.authorize(actor, permission, (resource,))
|
|
43
|
+
if not decision.allowed:
|
|
44
|
+
raise PermissionError("; ".join(decision.reasons) or f"quest {permission.value} denied")
|
|
45
|
+
if canonical_path and not scope_allows_path(canonical_path, decision.scopes):
|
|
46
|
+
raise PermissionError("quest path is outside the actor's authorized scope")
|
|
47
|
+
return decision
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _row(snapshot, *, detail: bool = False):
|
|
51
|
+
row = {
|
|
52
|
+
"id": snapshot.document.artifact.artifact_id,
|
|
53
|
+
"slug": snapshot.slug,
|
|
54
|
+
"title": snapshot.title,
|
|
55
|
+
"status": snapshot.status,
|
|
56
|
+
"projects": list(snapshot.projects),
|
|
57
|
+
"started": snapshot.started,
|
|
58
|
+
"started_by": snapshot.started_by,
|
|
59
|
+
"priority": snapshot.priority,
|
|
60
|
+
"completed": snapshot.completed,
|
|
61
|
+
"canonical_path": f"memory/quests/{snapshot.slug}.md",
|
|
62
|
+
}
|
|
63
|
+
if detail:
|
|
64
|
+
row["body"] = snapshot.body
|
|
65
|
+
return row
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _list(args):
|
|
69
|
+
runtime, actor, service = _context()
|
|
70
|
+
decision = _require(runtime, actor, Permission.READ, "quests")
|
|
71
|
+
rows = [
|
|
72
|
+
_row(snapshot)
|
|
73
|
+
for snapshot in service.list(
|
|
74
|
+
actor,
|
|
75
|
+
include_completed=args.all,
|
|
76
|
+
authorized_scopes=decision.scopes,
|
|
77
|
+
)
|
|
78
|
+
]
|
|
79
|
+
print(json.dumps({"quests": rows}, ensure_ascii=False))
|
|
80
|
+
return 0
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _show(args):
|
|
84
|
+
runtime, actor, service = _context()
|
|
85
|
+
_require(
|
|
86
|
+
runtime,
|
|
87
|
+
actor,
|
|
88
|
+
Permission.READ,
|
|
89
|
+
f"quest:{args.slug}",
|
|
90
|
+
canonical_path=service.canonical_path(args.slug),
|
|
91
|
+
)
|
|
92
|
+
print(json.dumps({"quest": _row(service.read(actor, args.slug), detail=True)}, ensure_ascii=False))
|
|
93
|
+
return 0
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _write_result(snapshot, receipt):
|
|
97
|
+
print(
|
|
98
|
+
json.dumps(
|
|
99
|
+
{"quest": _row(snapshot), "writeback": receipt.to_dict()},
|
|
100
|
+
ensure_ascii=False,
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
return 0 if receipt.status.value in {"accepted", "partial"} else 1
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _create(args):
|
|
107
|
+
runtime, actor, service = _context()
|
|
108
|
+
resource = f"quest:{args.slug or args.title}"
|
|
109
|
+
_require(
|
|
110
|
+
runtime,
|
|
111
|
+
actor,
|
|
112
|
+
Permission.WRITE,
|
|
113
|
+
resource,
|
|
114
|
+
canonical_path=service.canonical_path(args.slug or args.title),
|
|
115
|
+
)
|
|
116
|
+
snapshot, receipt = service.create(
|
|
117
|
+
actor,
|
|
118
|
+
title=args.title,
|
|
119
|
+
question=args.question,
|
|
120
|
+
slug=args.slug,
|
|
121
|
+
projects=args.project,
|
|
122
|
+
threads=args.thread,
|
|
123
|
+
)
|
|
124
|
+
return _write_result(snapshot, receipt)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _prioritize(args):
|
|
128
|
+
runtime, actor, service = _context()
|
|
129
|
+
_require(
|
|
130
|
+
runtime,
|
|
131
|
+
actor,
|
|
132
|
+
Permission.WRITE,
|
|
133
|
+
f"quest:{args.slug}",
|
|
134
|
+
canonical_path=service.canonical_path(args.slug),
|
|
135
|
+
)
|
|
136
|
+
value = PRIORITIES.get(args.priority, int(args.priority) if args.priority.isdigit() else -1)
|
|
137
|
+
snapshot, receipt = service.prioritize(actor, slug=args.slug, priority=value)
|
|
138
|
+
return _write_result(snapshot, receipt)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _transition(args):
|
|
142
|
+
runtime, actor, service = _context()
|
|
143
|
+
_require(
|
|
144
|
+
runtime,
|
|
145
|
+
actor,
|
|
146
|
+
Permission.WRITE,
|
|
147
|
+
f"quest:{args.slug}",
|
|
148
|
+
canonical_path=service.canonical_path(args.slug),
|
|
149
|
+
)
|
|
150
|
+
snapshot, receipt = service.transition(
|
|
151
|
+
actor,
|
|
152
|
+
slug=args.slug,
|
|
153
|
+
status=args.command,
|
|
154
|
+
outcome=getattr(args, "outcome", None),
|
|
155
|
+
)
|
|
156
|
+
return _write_result(snapshot, receipt)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _contribute(args):
|
|
160
|
+
runtime, actor, service = _context()
|
|
161
|
+
_require(
|
|
162
|
+
runtime,
|
|
163
|
+
actor,
|
|
164
|
+
Permission.WRITE,
|
|
165
|
+
f"quest:{args.slug}",
|
|
166
|
+
canonical_path=service.canonical_path(args.slug),
|
|
167
|
+
)
|
|
168
|
+
snapshot, receipt = service.contribute(actor, slug=args.slug, text=args.text)
|
|
169
|
+
return _write_result(snapshot, receipt)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def _parser():
|
|
173
|
+
parser = argparse.ArgumentParser(prog="egregore-quest")
|
|
174
|
+
commands = parser.add_subparsers(dest="command", required=True)
|
|
175
|
+
listing = commands.add_parser("list")
|
|
176
|
+
listing.add_argument("--all", action="store_true")
|
|
177
|
+
listing.set_defaults(handler=_list)
|
|
178
|
+
show = commands.add_parser("show")
|
|
179
|
+
show.add_argument("slug")
|
|
180
|
+
show.set_defaults(handler=_show)
|
|
181
|
+
create = commands.add_parser("new")
|
|
182
|
+
create.add_argument("--title", required=True)
|
|
183
|
+
create.add_argument("--question", required=True)
|
|
184
|
+
create.add_argument("--slug")
|
|
185
|
+
create.add_argument("--project", action="append", default=[])
|
|
186
|
+
create.add_argument("--thread", action="append", default=[])
|
|
187
|
+
create.set_defaults(handler=_create)
|
|
188
|
+
prioritize = commands.add_parser("prioritize")
|
|
189
|
+
prioritize.add_argument("slug")
|
|
190
|
+
prioritize.add_argument("priority")
|
|
191
|
+
prioritize.set_defaults(handler=_prioritize)
|
|
192
|
+
contribute = commands.add_parser("contribute")
|
|
193
|
+
contribute.add_argument("slug")
|
|
194
|
+
contribute.add_argument("text")
|
|
195
|
+
contribute.set_defaults(handler=_contribute)
|
|
196
|
+
pause = commands.add_parser("pause")
|
|
197
|
+
pause.add_argument("slug")
|
|
198
|
+
pause.set_defaults(handler=_transition)
|
|
199
|
+
complete = commands.add_parser("complete")
|
|
200
|
+
complete.add_argument("slug")
|
|
201
|
+
complete.add_argument("--outcome", required=True)
|
|
202
|
+
complete.set_defaults(handler=_transition)
|
|
203
|
+
return parser
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def main():
|
|
207
|
+
args = _parser().parse_args()
|
|
208
|
+
return args.handler(args)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
if __name__ == "__main__":
|
|
212
|
+
try:
|
|
213
|
+
raise SystemExit(main())
|
|
214
|
+
except (OSError, PermissionError, ValueError) as exc:
|
|
215
|
+
print(f"quest: {exc}", file=os.sys.stderr)
|
|
216
|
+
raise SystemExit(1) from exc
|