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,164 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# artifact-register.sh — record a PUBLISHED (hosted) artifact in the local
|
|
5
|
+
# registry so it's findable by CONTENT, not just name, across all three layers:
|
|
6
|
+
#
|
|
7
|
+
# • Claude Code / Codex (OSS) — grep/ls/read over memory/artifacts/*.md
|
|
8
|
+
# • graph (paid) — upserted here as an Artifact node (connected
|
|
9
|
+
# mode, via graph-op.sh register-artifact) and
|
|
10
|
+
# reconciled by /save's sync-graph.sh; queried
|
|
11
|
+
# back by bin/artifacts.sh for fast, relationship
|
|
12
|
+
# -aware retrieval
|
|
13
|
+
#
|
|
14
|
+
# The filesystem record is the source of truth (works in OSS with nothing but
|
|
15
|
+
# grep); the graph is an index over it. Hosted artifacts join the same pool as
|
|
16
|
+
# /add-ed knowledge artifacts, with a `url:` field linking to the egregore.xyz
|
|
17
|
+
# render.
|
|
18
|
+
#
|
|
19
|
+
# Usage: artifact-register.sh --id <id> --url <url> --type <type> \
|
|
20
|
+
# --title <title> [--author <a>] [--source <file>] [--description <d>]
|
|
21
|
+
#
|
|
22
|
+
# Idempotent: re-registering the same artifact (same date+author+slug) upserts.
|
|
23
|
+
# Non-fatal by design — a registry-write failure must never break a publish.
|
|
24
|
+
|
|
25
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
26
|
+
REG_DIR="$SCRIPT_DIR/memory/artifacts"
|
|
27
|
+
|
|
28
|
+
# Types that already have a canonical filesystem home (or are transient UI) —
|
|
29
|
+
# skip them to keep the registry to findable content artifacts.
|
|
30
|
+
SKIP_TYPES=" handoff board activity network dashboard subgraph "
|
|
31
|
+
|
|
32
|
+
ID="" URL="" TYPE="artifact" TITLE="" AUTHOR="" SOURCE="" DESCRIPTION=""
|
|
33
|
+
while [[ $# -gt 0 ]]; do
|
|
34
|
+
case "$1" in
|
|
35
|
+
--id) ID="$2"; shift 2 ;;
|
|
36
|
+
--url) URL="$2"; shift 2 ;;
|
|
37
|
+
--type) TYPE="$2"; shift 2 ;;
|
|
38
|
+
--title) TITLE="$2"; shift 2 ;;
|
|
39
|
+
--author) AUTHOR="$2"; shift 2 ;;
|
|
40
|
+
--source) SOURCE="$2"; shift 2 ;;
|
|
41
|
+
--description) DESCRIPTION="$2"; shift 2 ;;
|
|
42
|
+
*) shift ;;
|
|
43
|
+
esac
|
|
44
|
+
done
|
|
45
|
+
|
|
46
|
+
# Skip transient / already-homed types.
|
|
47
|
+
case "$SKIP_TYPES" in *" $TYPE "*) exit 0 ;; esac
|
|
48
|
+
|
|
49
|
+
[ -n "$URL" ] || exit 0
|
|
50
|
+
[ -d "$SCRIPT_DIR/memory" ] || exit 0 # memory not linked → nothing to do
|
|
51
|
+
mkdir -p "$REG_DIR" 2>/dev/null || exit 0
|
|
52
|
+
|
|
53
|
+
# --- Derive id from the URL tail if not supplied ---
|
|
54
|
+
[ -n "$ID" ] || ID="$(printf '%s' "$URL" | sed 's#/*$##; s#.*/##')"
|
|
55
|
+
|
|
56
|
+
# --- Title fallback from source filename ---
|
|
57
|
+
if [ -z "$TITLE" ] && [ -n "$SOURCE" ]; then
|
|
58
|
+
TITLE="$(basename "$SOURCE" | sed 's/\.[^.]*$//; s/[-_]/ /g')"
|
|
59
|
+
fi
|
|
60
|
+
[ -n "$TITLE" ] || TITLE="Untitled artifact"
|
|
61
|
+
|
|
62
|
+
DATE="$(date +%Y-%m-%d)"
|
|
63
|
+
AUTH="${AUTHOR:-unknown}"
|
|
64
|
+
|
|
65
|
+
# JSON strings are valid YAML scalars and safely preserve punctuation, quotes,
|
|
66
|
+
# newlines, and values that YAML would otherwise coerce (for example numeric
|
|
67
|
+
# ids or ISO dates). Keep serialization here rather than relying on callers to
|
|
68
|
+
# pre-escape metadata from artifact titles and provider responses.
|
|
69
|
+
yaml_scalar() {
|
|
70
|
+
printf '%s' "$1" | jq -Rs .
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# --- Slug + stable filename (date-author-slug, matching the existing convention) ---
|
|
74
|
+
# Portable (BSD + GNU): lowercase, non-alnum → single '-', trim, cap length.
|
|
75
|
+
slug() { printf '%s' "$1" | LC_ALL=C tr '[:upper:]' '[:lower:]' \
|
|
76
|
+
| LC_ALL=C tr -cs 'a-z0-9' '-' | sed 's/^-//; s/-$//' | cut -c1-60 \
|
|
77
|
+
| sed 's/-$//'; }
|
|
78
|
+
SLUG="$(slug "$TITLE")"; [ -n "$SLUG" ] || SLUG="artifact"
|
|
79
|
+
FILE="$REG_DIR/${DATE}-$(slug "$AUTH")-${SLUG}.md"
|
|
80
|
+
|
|
81
|
+
# --- Topics: derive 2–5 slugs from the title, minus stopwords (grep + graph) ---
|
|
82
|
+
STOP=" the a an is for and or in of to on with our we v0 v1 v2 "
|
|
83
|
+
TOPICS=""
|
|
84
|
+
for w in $(printf '%s' "$TITLE" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' ' '); do
|
|
85
|
+
[ ${#w} -ge 3 ] || continue
|
|
86
|
+
case "$STOP" in *" $w "*) continue ;; esac
|
|
87
|
+
case " $TOPICS " in *" $w "*) continue ;; esac
|
|
88
|
+
TOPICS="${TOPICS:+$TOPICS, }$w"
|
|
89
|
+
[ "$(printf '%s' "$TOPICS" | tr ',' '\n' | wc -l)" -ge 5 ] && break
|
|
90
|
+
done
|
|
91
|
+
|
|
92
|
+
# --- Body: the content that makes it findable by CONTENT, not just name ---
|
|
93
|
+
# • source under memory/ → it's already grep/searchable there; link + excerpt.
|
|
94
|
+
# • ephemeral source (/tmp, raw html) → capture a generous excerpt inline.
|
|
95
|
+
EXCERPT=""
|
|
96
|
+
SRC_REL=""
|
|
97
|
+
if [ -n "$SOURCE" ] && [ -f "$SOURCE" ]; then
|
|
98
|
+
case "$SOURCE" in
|
|
99
|
+
*.md|*.markdown|*.txt)
|
|
100
|
+
EXCERPT="$(sed -e '/^---$/,/^---$/d' "$SOURCE" 2>/dev/null | grep -v '^\s*$' | head -140)"
|
|
101
|
+
;;
|
|
102
|
+
*) EXCERPT="" ;; # html/binary: rely on title + description + topics
|
|
103
|
+
esac
|
|
104
|
+
case "$SOURCE" in "$SCRIPT_DIR"/memory/*) SRC_REL="memory/${SOURCE#"$SCRIPT_DIR"/memory/}" ;; esac
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# --- Write the entry (upsert) ---
|
|
108
|
+
{
|
|
109
|
+
printf -- '---\n'
|
|
110
|
+
printf 'id: %s\n' "$(yaml_scalar "$ID")"
|
|
111
|
+
printf 'title: %s\n' "$(yaml_scalar "$TITLE")"
|
|
112
|
+
printf 'type: %s\n' "$(yaml_scalar "$TYPE")"
|
|
113
|
+
printf 'author: %s\n' "$(yaml_scalar "$AUTH")"
|
|
114
|
+
printf 'date: %s\n' "$(yaml_scalar "$DATE")"
|
|
115
|
+
printf 'topics: [%s]\n' "$TOPICS"
|
|
116
|
+
printf 'url: %s\n' "$(yaml_scalar "$URL")"
|
|
117
|
+
[ -n "$SRC_REL" ] && printf 'source: %s\n' "$(yaml_scalar "$SRC_REL")"
|
|
118
|
+
printf 'published: true\n'
|
|
119
|
+
printf -- '---\n\n'
|
|
120
|
+
printf '# %s\n\n' "$TITLE"
|
|
121
|
+
[ -n "$DESCRIPTION" ] && printf '%s\n\n' "$DESCRIPTION"
|
|
122
|
+
printf '**Hosted artifact:** %s\n' "$URL"
|
|
123
|
+
[ -n "$SRC_REL" ] && printf '**Rendered from:** `%s`\n' "$SRC_REL"
|
|
124
|
+
if [ -n "$EXCERPT" ]; then
|
|
125
|
+
printf '\n---\n\n'
|
|
126
|
+
printf '%s\n' "$EXCERPT"
|
|
127
|
+
fi
|
|
128
|
+
} > "$FILE" 2>/dev/null || exit 0
|
|
129
|
+
|
|
130
|
+
printf '%s\n' "$FILE"
|
|
131
|
+
|
|
132
|
+
# --- Persist across sessions ---
|
|
133
|
+
# A registry entry that never leaves the machine that published is invisible to
|
|
134
|
+
# every other session's finder. Commit JUST this record (pathspec-scoped, so it
|
|
135
|
+
# never sweeps unrelated in-progress memory changes) and push — fire-and-forget
|
|
136
|
+
# and detached, so a slow or racing push can never delay or fail the publish.
|
|
137
|
+
# If a push loses a race the commit still lands locally and rides out on the
|
|
138
|
+
# next push (/save, handoff, or the next registration).
|
|
139
|
+
REL="artifacts/$(basename "$FILE")"
|
|
140
|
+
(
|
|
141
|
+
cd "$SCRIPT_DIR/memory" 2>/dev/null || exit 0
|
|
142
|
+
git add -- "$REL" >/dev/null 2>&1 || exit 0
|
|
143
|
+
git diff --cached --quiet -- "$REL" 2>/dev/null && exit 0
|
|
144
|
+
git commit -m "chore(artifacts): register ${TITLE}" -- "$REL" >/dev/null 2>&1 || exit 0
|
|
145
|
+
for _ in 1 2 3; do
|
|
146
|
+
git pull --rebase --no-edit >/dev/null 2>&1 && git push >/dev/null 2>&1 && break
|
|
147
|
+
sleep 1
|
|
148
|
+
done
|
|
149
|
+
) >/dev/null 2>&1 &
|
|
150
|
+
|
|
151
|
+
# --- Index into the graph (connected mode only) ---
|
|
152
|
+
# In paid mode the graph is the fast, relationship-aware retrieval layer that
|
|
153
|
+
# bin/artifacts.sh queries. Upsert an Artifact node keyed by this record's
|
|
154
|
+
# FILENAME STEM (matching sync-graph.sh, so /save reconciles the same node
|
|
155
|
+
# instead of duplicating it), carrying url + a content excerpt for CONTAINS
|
|
156
|
+
# retrieval. Detached + best-effort: the graph is an index over the filesystem
|
|
157
|
+
# record, never the source of truth — a graph hiccup must not touch the publish.
|
|
158
|
+
if [ "$(jq -r '.mode // "connected"' "$SCRIPT_DIR/egregore.json" 2>/dev/null)" != "local" ]; then
|
|
159
|
+
(
|
|
160
|
+
bash "$SCRIPT_DIR/bin/graph-op.sh" register-artifact \
|
|
161
|
+
"$(basename "$FILE" .md)" "$URL" "$TITLE" "$TYPE" "$AUTH" \
|
|
162
|
+
"$TOPICS" "${DESCRIPTION} ${EXCERPT}" >/dev/null 2>&1 || true
|
|
163
|
+
) &
|
|
164
|
+
fi
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Stable shell adapter for canonical organizational writes. Harness skills call
|
|
5
|
+
# this boundary; QMD, Git, telemetry, graph, and filesystem mechanics remain
|
|
6
|
+
# behind the Egregore Runtime.
|
|
7
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
8
|
+
export EGREGORE_ROOT="$ROOT"
|
|
9
|
+
export PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}"
|
|
10
|
+
export EGREGORE_SESSION_ID="${EGREGORE_SESSION_ID:-$(cat "$ROOT/.egregore-session-id" 2>/dev/null || true)}"
|
|
11
|
+
|
|
12
|
+
case "${1:-}" in
|
|
13
|
+
capture)
|
|
14
|
+
shift
|
|
15
|
+
no_push=0
|
|
16
|
+
for argument in "$@"; do
|
|
17
|
+
[ "$argument" = "--no-push" ] && no_push=1
|
|
18
|
+
done
|
|
19
|
+
python3 -m egregore_runtime.writeback_cli authorize write \
|
|
20
|
+
--resource "canonical-capture" >/dev/null
|
|
21
|
+
# The compatibility worker is composition-only on the Runtime path.
|
|
22
|
+
# Runtime owns the sole canonical Git/index/embed/telemetry transaction;
|
|
23
|
+
# publication and notification are separate explicit effects.
|
|
24
|
+
status=0
|
|
25
|
+
EGREGORE_GRAPH_PROJECTION=0 bash "$ROOT/bin/capture-run.sh" "$@" \
|
|
26
|
+
--no-push --no-publish --no-notify --no-index || status=$?
|
|
27
|
+
if [ "$status" = "0" ]; then
|
|
28
|
+
result_file="${TMPDIR:-/tmp}/capture-run-result.json"
|
|
29
|
+
artifact_path="$(jq -r '.absFile // empty' "$result_file" 2>/dev/null || true)"
|
|
30
|
+
[ -n "$artifact_path" ] || {
|
|
31
|
+
echo "writeback: capture did not return a canonical artifact path" >&2
|
|
32
|
+
exit 1
|
|
33
|
+
}
|
|
34
|
+
adopt_args=(adopt "$artifact_path")
|
|
35
|
+
[ "$no_push" = "1" ] && adopt_args+=(--no-push)
|
|
36
|
+
receipt="$(EGREGORE_ASYNC_REMOTE_PUSH=1 \
|
|
37
|
+
python3 -m egregore_runtime.writeback_cli "${adopt_args[@]}")" || exit $?
|
|
38
|
+
if jq -e . >/dev/null 2>&1 <<<"$receipt"; then
|
|
39
|
+
temporary="${result_file}.writeback.$$"
|
|
40
|
+
jq --argjson writeback "$receipt" '. + {writeback:$writeback}' \
|
|
41
|
+
"$result_file" > "$temporary" && mv "$temporary" "$result_file"
|
|
42
|
+
fi
|
|
43
|
+
fi
|
|
44
|
+
exit "$status"
|
|
45
|
+
;;
|
|
46
|
+
adopt|authorize|create)
|
|
47
|
+
exec python3 -m egregore_runtime.writeback_cli "$@"
|
|
48
|
+
;;
|
|
49
|
+
*)
|
|
50
|
+
echo 'usage: bin/artifact-writeback.sh {capture --mode ...|create --path PATH --input FILE|adopt PATH|authorize PERMISSION}' >&2
|
|
51
|
+
exit 2
|
|
52
|
+
;;
|
|
53
|
+
esac
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Intentionally NOT `set -euo pipefail`: this is a grep-heavy find tool where
|
|
3
|
+
# no-match (grep exit 1) and empty arrays are normal control flow, not errors.
|
|
4
|
+
|
|
5
|
+
# artifacts.sh — find something you generated, by NAME or CONTENT, and get its URL.
|
|
6
|
+
#
|
|
7
|
+
# Every generative surface already records into memory, each in its own home:
|
|
8
|
+
# • hosted artifacts (scroll, /view, /reflect, decision surfaces) → artifacts/
|
|
9
|
+
# • handoffs → handoffs/
|
|
10
|
+
# • emissaries (outbound pointers) → handoffs/outbound/
|
|
11
|
+
# • decisions / findings / patterns (/reflect, /add) → knowledge/
|
|
12
|
+
# The finder searches ALL of them, so anything you made is retrievable by what's
|
|
13
|
+
# IN it, not just the name you gave it. Grep-first, so it works with nothing but
|
|
14
|
+
# Claude Code / Codex file ops (OSS):
|
|
15
|
+
#
|
|
16
|
+
# artifacts find <query...> rank matches (title/topic beat a body mention)
|
|
17
|
+
# artifacts list [N] most recently recorded artifacts
|
|
18
|
+
#
|
|
19
|
+
# In paid mode (search available) `find` also folds in qmd semantic recall, so
|
|
20
|
+
# "the artifact where I laid out our GTM plan" resolves even without the words.
|
|
21
|
+
# The graph is the third layer — query it via bin/graph.sh for relationships.
|
|
22
|
+
|
|
23
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
24
|
+
MEM="$SCRIPT_DIR/memory"
|
|
25
|
+
|
|
26
|
+
# All artifact-bearing memory dirs. index.md files are navigation, not artifacts.
|
|
27
|
+
_corpus() {
|
|
28
|
+
find \
|
|
29
|
+
"$MEM/artifacts" \
|
|
30
|
+
"$MEM/handoffs" \
|
|
31
|
+
"$MEM/knowledge/decisions" "$MEM/knowledge/findings" "$MEM/knowledge/patterns" \
|
|
32
|
+
-type f -name '*.md' 2>/dev/null | grep -vE '/index\.md$'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
_field() { # <file> <key> → frontmatter value
|
|
36
|
+
sed -n "/^---$/,/^---$/p" "$1" 2>/dev/null | grep -i "^$2:" | head -1 | cut -d: -f2- | sed 's/^ *//'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
_title() { # frontmatter title → first "# " heading → filename
|
|
40
|
+
local t; t="$(_field "$1" title)"
|
|
41
|
+
[ -n "$t" ] || t="$(grep -m1 '^# ' "$1" 2>/dev/null | sed 's/^#* *//')"
|
|
42
|
+
[ -n "$t" ] || t="$(basename "$1" .md)"
|
|
43
|
+
printf '%s' "$t"
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
_url() { # frontmatter url → first hosted link in the body
|
|
47
|
+
local u; u="$(_field "$1" url)"
|
|
48
|
+
[ -n "$u" ] || u="$(grep -oE 'https://egregore\.xyz/[^ )>"]+' "$1" 2>/dev/null | head -1)"
|
|
49
|
+
printf '%s' "$u"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
_tag() { # short source label from path (falls back to frontmatter type)
|
|
53
|
+
case "$1" in
|
|
54
|
+
*/handoffs/outbound/*) printf 'emissary' ;;
|
|
55
|
+
*/handoffs/*) printf 'handoff' ;;
|
|
56
|
+
*/knowledge/decisions/*) printf 'decision' ;;
|
|
57
|
+
*/knowledge/findings/*) printf 'finding' ;;
|
|
58
|
+
*/knowledge/patterns/*) printf 'pattern' ;;
|
|
59
|
+
*) local ty; ty="$(_field "$1" type)"; printf '%s' "${ty:-artifact}" ;;
|
|
60
|
+
esac
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
_rel() { printf 'memory/%s' "${1#"$MEM"/}"; }
|
|
64
|
+
|
|
65
|
+
# Tokenize a query into significant lowercase words (drop tiny/stopwords).
|
|
66
|
+
_words() {
|
|
67
|
+
local stop=" the a an is for and or in of to on with our we my me i where " w
|
|
68
|
+
local -a out=()
|
|
69
|
+
for w in $(printf '%s' "$1" | LC_ALL=C tr '[:upper:]' '[:lower:]' | LC_ALL=C tr -c 'a-z0-9' ' '); do
|
|
70
|
+
[ ${#w} -ge 3 ] || continue
|
|
71
|
+
case "$stop" in *" $w "*) continue ;; esac
|
|
72
|
+
out+=("$w")
|
|
73
|
+
done
|
|
74
|
+
[ ${#out[@]} -gt 0 ] || out=("$(printf '%s' "$1" | LC_ALL=C tr '[:upper:]' '[:lower:]')")
|
|
75
|
+
printf '%s\n' "${out[@]}"
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# Date N days before today — portable across BSD (date -v) and GNU (date -d).
|
|
79
|
+
_days_ago() { date -v-"${1}"d +%Y-%m-%d 2>/dev/null || date -d "${1} days ago" +%Y-%m-%d 2>/dev/null; }
|
|
80
|
+
|
|
81
|
+
# Parse a relative-time expression out of a query. Echoes "SINCE|UNTIL|CLEANED":
|
|
82
|
+
# SINCE/UNTIL are YYYY-MM-DD bounds (empty = unbounded); CLEANED is the query
|
|
83
|
+
# with the temporal phrase removed so "yesterday" can't be matched as a keyword.
|
|
84
|
+
# Operates on the lowercased query — the finder lowercases anyway.
|
|
85
|
+
_time_window() {
|
|
86
|
+
local lc since="" until="" cleaned n
|
|
87
|
+
lc="$(printf '%s' "$1" | LC_ALL=C tr '[:upper:]' '[:lower:]')"; cleaned="$lc"
|
|
88
|
+
if [[ "$lc" =~ ([0-9]+)[[:space:]]+(day|days|week|weeks)[[:space:]]+ago ]]; then
|
|
89
|
+
n="${BASH_REMATCH[1]}"; case "${BASH_REMATCH[2]}" in week*) n=$((n * 7)) ;; esac
|
|
90
|
+
since="$(_days_ago "$n")"; cleaned="$(printf '%s' "$lc" | sed -E 's/[0-9]+ +(day|days|week|weeks) +ago//')"
|
|
91
|
+
elif [[ "$lc" =~ (last|past)[[:space:]]+([0-9]+)[[:space:]]+(day|days|week|weeks) ]]; then
|
|
92
|
+
n="${BASH_REMATCH[2]}"; case "${BASH_REMATCH[3]}" in week*) n=$((n * 7)) ;; esac
|
|
93
|
+
since="$(_days_ago "$n")"; cleaned="$(printf '%s' "$lc" | sed -E 's/(last|past) +[0-9]+ +(day|days|week|weeks)//')"
|
|
94
|
+
elif [[ "$lc" == *yesterday* ]]; then
|
|
95
|
+
since="$(_days_ago 1)"; until="$since"; cleaned="${lc//yesterday/}"
|
|
96
|
+
elif [[ "$lc" == *today* ]]; then
|
|
97
|
+
since="$(date +%Y-%m-%d)"; until="$since"; cleaned="${lc//today/}"
|
|
98
|
+
elif [[ "$lc" =~ (this|last|past)[[:space:]]+week ]]; then
|
|
99
|
+
since="$(_days_ago 7)"; cleaned="$(printf '%s' "$lc" | sed -E 's/(this|last|past) +week//')"
|
|
100
|
+
elif [[ "$lc" =~ (this|last|past)[[:space:]]+month ]]; then
|
|
101
|
+
since="$(_days_ago 31)"; cleaned="$(printf '%s' "$lc" | sed -E 's/(this|last|past) +month//')"
|
|
102
|
+
elif [[ "$lc" =~ recent|recently|lately ]]; then
|
|
103
|
+
since="$(_days_ago 14)"; cleaned="$(printf '%s' "$lc" | sed -E 's/recently|recent|lately//')"
|
|
104
|
+
elif [[ "$lc" =~ ([0-9]{4}-[0-9]{2}-[0-9]{2}) ]]; then
|
|
105
|
+
since="${BASH_REMATCH[1]}"; until="$since"; cleaned="${lc//${BASH_REMATCH[1]}/}"
|
|
106
|
+
fi
|
|
107
|
+
printf '%s|%s|%s' "$since" "$until" "$cleaned"
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# Best-effort YYYY-MM-DD for a memory file: filename prefix, handoff dir/day, or
|
|
111
|
+
# frontmatter date:. Lets the grep path honor temporal windows too.
|
|
112
|
+
_file_date() {
|
|
113
|
+
local f="$1" d dir base
|
|
114
|
+
d="$(basename "$f" | grep -oE '^[0-9]{4}-[0-9]{2}-[0-9]{2}' | head -1)"
|
|
115
|
+
[ -n "$d" ] && { printf '%s' "$d"; return; }
|
|
116
|
+
dir="$(basename "$(dirname "$f")")"; base="$(basename "$f")"
|
|
117
|
+
if [[ "$dir" =~ ^[0-9]{4}-[0-9]{2}$ && "$base" =~ ^([0-9]{2})- ]]; then
|
|
118
|
+
printf '%s-%s' "$dir" "${BASH_REMATCH[1]}"; return
|
|
119
|
+
fi
|
|
120
|
+
sed -n '/^---$/,/^---$/p' "$f" 2>/dev/null | grep -i '^date:' | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}' | head -1
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
# Human label for the active window, appended to the result header.
|
|
124
|
+
_window_label() {
|
|
125
|
+
if [ -n "$1" ] && [ "$1" = "$2" ]; then printf ' · on %s' "$1"
|
|
126
|
+
elif [ -n "$1" ] && [ -n "$2" ]; then printf ' · %s..%s' "$1" "$2"
|
|
127
|
+
elif [ -n "$1" ]; then printf ' · since %s' "$1"
|
|
128
|
+
elif [ -n "$2" ]; then printf ' · until %s' "$2"; fi
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
# ── grep path — OSS/local, and the connected-mode fallback ──
|
|
132
|
+
_grep_find() {
|
|
133
|
+
local query="$1" since="${2:-}" until="${3:-}"
|
|
134
|
+
[ -d "$MEM" ] || { echo "(no memory linked)"; return 0; }
|
|
135
|
+
local words=(); while IFS= read -r w; do words+=("$w"); done < <(_words "$query")
|
|
136
|
+
|
|
137
|
+
echo "⌕ artifacts · grep-rank · \"$query\"$(_window_label "$since" "$until")"
|
|
138
|
+
echo
|
|
139
|
+
|
|
140
|
+
# Fast path: ONE grep pass narrows 1000s of files to the handful that match
|
|
141
|
+
# any word — scoring the whole corpus per-word in bash is death by subprocess.
|
|
142
|
+
local pat; pat="$(IFS='|'; printf '%s' "${words[*]}")"
|
|
143
|
+
local -a cands=()
|
|
144
|
+
while IFS= read -r f; do [ -n "$f" ] && cands+=("$f"); done \
|
|
145
|
+
< <(_corpus | tr '\n' '\0' | xargs -0 grep -ilE -- "$pat" 2>/dev/null)
|
|
146
|
+
|
|
147
|
+
# Score only the candidates. A word in the title/topics/filename outweighs a
|
|
148
|
+
# passing body mention (8 vs 1), so the doc that's ABOUT the query beats one
|
|
149
|
+
# that merely name-drops it. Header check is a bash builtin (no subprocess);
|
|
150
|
+
# only fall back to a full-file grep for words not in the header.
|
|
151
|
+
local hdr base score matched w fd
|
|
152
|
+
local -a scored=()
|
|
153
|
+
for f in "${cands[@]}"; do
|
|
154
|
+
fd="$(_file_date "$f")"
|
|
155
|
+
# Temporal window: when set, drop out-of-range (and undated) files.
|
|
156
|
+
if [ -n "$since" ] || [ -n "$until" ]; then
|
|
157
|
+
[ -n "$fd" ] || continue
|
|
158
|
+
[ -n "$since" ] && [[ "$fd" < "$since" ]] && continue
|
|
159
|
+
[ -n "$until" ] && [[ "$fd" > "$until" ]] && continue
|
|
160
|
+
fi
|
|
161
|
+
base="${f##*/}"
|
|
162
|
+
hdr="$(sed -n '1,25p' "$f" 2>/dev/null | grep -iE '^title:|^topics:|^# ' ; printf '%s' "$base")"
|
|
163
|
+
hdr="$(printf '%s' "$hdr" | LC_ALL=C tr '[:upper:]' '[:lower:]')"
|
|
164
|
+
score=0; matched=0
|
|
165
|
+
for w in "${words[@]}"; do
|
|
166
|
+
if [[ "$hdr" == *"$w"* ]]; then
|
|
167
|
+
score=$((score + 8)); matched=$((matched + 1))
|
|
168
|
+
elif grep -qiF -- "$w" "$f" 2>/dev/null; then
|
|
169
|
+
score=$((score + 1)); matched=$((matched + 1))
|
|
170
|
+
fi
|
|
171
|
+
done
|
|
172
|
+
[ "$matched" -gt 0 ] && scored+=("$matched $score ${fd:-0000-00-00} $f")
|
|
173
|
+
done
|
|
174
|
+
|
|
175
|
+
if [ ${#scored[@]} -eq 0 ]; then
|
|
176
|
+
echo " no matches across artifacts / handoffs / knowledge."
|
|
177
|
+
else
|
|
178
|
+
# Rank: words matched, then weighted score, then recency (newest first).
|
|
179
|
+
printf '%s\n' "${scored[@]}" | sort -t" " -k1,1nr -k2,2nr -k3,3r | head -8 | while IFS=" " read -r matched score fd f; do
|
|
180
|
+
local title url rel tag
|
|
181
|
+
title="$(_title "$f")"; url="$(_url "$f")"; rel="$(_rel "$f")"; tag="$(_tag "$f")"
|
|
182
|
+
printf ' ● [%s] %s\n' "$tag" "$title"
|
|
183
|
+
[ -n "$url" ] && printf ' %s\n' "$url"
|
|
184
|
+
printf ' %s (%d/%d matched · %s)\n\n' "$rel" "$matched" "${#words[@]}" "$fd"
|
|
185
|
+
done
|
|
186
|
+
fi
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# ── graph path — paid/connected: relevance + relationships, indexed ──
|
|
190
|
+
# Returns 0 only when it surfaced results; a miss or an offline graph returns 1
|
|
191
|
+
# so cmd_find falls back to grep (which also covers handoffs/emissaries that live
|
|
192
|
+
# as Session nodes, not Artifact nodes).
|
|
193
|
+
_graph_find() {
|
|
194
|
+
local query="$1" since="${2:-}" until="${3:-}"
|
|
195
|
+
local words=(); while IFS= read -r w; do words+=("$w"); done < <(_words "$query")
|
|
196
|
+
local words_json; words_json="$(jq -nc '$ARGS.positional' --args "${words[@]}")"
|
|
197
|
+
|
|
198
|
+
# A word in the title outweighs topics outweighs a passing excerpt mention —
|
|
199
|
+
# same weighting as the grep path, but scored server-side over indexed nodes.
|
|
200
|
+
# The temporal window filters on a.created; ties break by recency (newest first).
|
|
201
|
+
local cypher='MATCH (a:Artifact)
|
|
202
|
+
WHERE any(w IN $words WHERE toLower(a.title) CONTAINS w
|
|
203
|
+
OR toLower(coalesce(a.excerpt,"")) CONTAINS w
|
|
204
|
+
OR any(t IN coalesce(a.topics,[]) WHERE toLower(t) CONTAINS w))
|
|
205
|
+
AND ($since = "" OR (a.created IS NOT NULL AND a.created >= datetime($since)))
|
|
206
|
+
AND ($until = "" OR (a.created IS NOT NULL AND a.created <= datetime($until + "T23:59:59")))
|
|
207
|
+
WITH a, reduce(s=0, w IN $words | s
|
|
208
|
+
+ (CASE WHEN toLower(a.title) CONTAINS w THEN 8 ELSE 0 END)
|
|
209
|
+
+ (CASE WHEN any(t IN coalesce(a.topics,[]) WHERE toLower(t) CONTAINS w) THEN 5 ELSE 0 END)
|
|
210
|
+
+ (CASE WHEN toLower(coalesce(a.excerpt,"")) CONTAINS w THEN 1 ELSE 0 END)) AS score
|
|
211
|
+
OPTIONAL MATCH (a)-[:CONTRIBUTED_BY]->(p:Person)
|
|
212
|
+
OPTIONAL MATCH (a)-[:PART_OF]->(q:Quest)
|
|
213
|
+
RETURN a.title AS title, a.url AS url, a.type AS type, score,
|
|
214
|
+
collect(DISTINCT p.name)[0] AS author, collect(DISTINCT q.title)[0] AS quest,
|
|
215
|
+
CASE WHEN a.created IS NOT NULL THEN toString(date(a.created)) ELSE "" END AS created
|
|
216
|
+
ORDER BY score DESC, created DESC LIMIT 8'
|
|
217
|
+
|
|
218
|
+
local resp; resp="$(bash "$SCRIPT_DIR/bin/graph.sh" query "$cypher" "$(jq -n --argjson words "$words_json" --arg since "$since" --arg until "$until" '{words: $words, since: $since, until: $until}')" 2>/dev/null)"
|
|
219
|
+
local nrows; nrows="$(printf '%s' "$resp" | jq -r '(.values // []) | length' 2>/dev/null || echo 0)"
|
|
220
|
+
[ "${nrows:-0}" -gt 0 ] || return 1
|
|
221
|
+
|
|
222
|
+
echo "⌕ artifacts · graph · \"$query\"$(_window_label "$since" "$until")"
|
|
223
|
+
echo
|
|
224
|
+
# Render each row with jq (null-safe): @tsv + bash read collapses null columns
|
|
225
|
+
# because tab is IFS-whitespace. Cols: 0 title,1 url,2 type,3 score,4 author,5 quest,6 created.
|
|
226
|
+
printf '%s' "$resp" | jq -r '
|
|
227
|
+
.values[] |
|
|
228
|
+
" ● [" + (.[2] // "artifact") + "] " + (.[0] // "(untitled)")
|
|
229
|
+
+ (if (.[1] // "") != "" then "\n " + .[1] else "" end)
|
|
230
|
+
+ "\n graph · score " + (.[3] | tostring)
|
|
231
|
+
+ (if (.[6] // "") != "" then " · " + .[6] else "" end)
|
|
232
|
+
+ (if (.[4] // "") != "" then " · by " + .[4] else "" end)
|
|
233
|
+
+ (if (.[5] // "") != "" then " · " + .[5] else "" end)
|
|
234
|
+
+ "\n"'
|
|
235
|
+
return 0
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
cmd_find() {
|
|
239
|
+
# Explicit date bounds (the agent translates arbitrary phrasing into these).
|
|
240
|
+
local since="" until=""
|
|
241
|
+
local -a rest=()
|
|
242
|
+
while [ $# -gt 0 ]; do
|
|
243
|
+
case "$1" in
|
|
244
|
+
--since) since="${2:-}"; shift 2 ;;
|
|
245
|
+
--until) until="${2:-}"; shift 2 ;;
|
|
246
|
+
--on) since="${2:-}"; until="${2:-}"; shift 2 ;;
|
|
247
|
+
*) rest+=("$1"); shift ;;
|
|
248
|
+
esac
|
|
249
|
+
done
|
|
250
|
+
local query="${rest[*]}"
|
|
251
|
+
[ -n "$query" ] || { echo "usage: artifacts find [--since D|--until D|--on D] <query>" >&2; exit 1; }
|
|
252
|
+
|
|
253
|
+
# No explicit flags → parse a relative-time expression from the query itself
|
|
254
|
+
# ("… from yesterday", "last week", "on 2026-07-10"), stripping it from the
|
|
255
|
+
# keyword match so it doesn't become dead search noise.
|
|
256
|
+
if [ -z "$since" ] && [ -z "$until" ]; then
|
|
257
|
+
local win cleaned; win="$(_time_window "$query")"
|
|
258
|
+
since="${win%%|*}"; win="${win#*|}"; until="${win%%|*}"; cleaned="${win#*|}"
|
|
259
|
+
cleaned="$(printf '%s' "$cleaned" | sed 's/^ *//; s/ *$//')"
|
|
260
|
+
[ -n "$cleaned" ] && query="$cleaned"
|
|
261
|
+
fi
|
|
262
|
+
|
|
263
|
+
# Paid/connected → graph first (relevance + relationships + created, indexed).
|
|
264
|
+
# If the graph is offline or has no match, fall through to grep, which also
|
|
265
|
+
# covers handoffs/emissaries (Session nodes) and is the whole OSS story.
|
|
266
|
+
# EGREGORE_MODE overrides the egregore.json mode (test/OSS-simulation hook).
|
|
267
|
+
local mode; mode="${EGREGORE_MODE:-$(jq -r '.mode // "connected"' "$SCRIPT_DIR/egregore.json" 2>/dev/null)}"
|
|
268
|
+
if [ "$mode" != "local" ]; then
|
|
269
|
+
_graph_find "$query" "$since" "$until" && return 0
|
|
270
|
+
fi
|
|
271
|
+
_grep_find "$query" "$since" "$until"
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
cmd_list() {
|
|
275
|
+
local n="${1:-10}"
|
|
276
|
+
[ -d "$MEM" ] || { echo "(no memory linked)"; return 0; }
|
|
277
|
+
_corpus | xargs ls -t 2>/dev/null | head -"$n" | while read -r f; do
|
|
278
|
+
local title url tag
|
|
279
|
+
title="$(_title "$f")"; url="$(_url "$f")"; tag="$(_tag "$f")"
|
|
280
|
+
printf ' ● [%-8s] %-52s %s\n' "$tag" "${title:0:52}" "$url"
|
|
281
|
+
done
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
case "${1:-find}" in
|
|
285
|
+
find) shift; cmd_find "$@" ;;
|
|
286
|
+
list) shift; cmd_list "$@" ;;
|
|
287
|
+
*) cmd_find "$@" ;;
|
|
288
|
+
esac
|