memforge-ai 0.1.55__tar.gz
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.
- memforge_ai-0.1.55/.agents/plugins/marketplace.json +20 -0
- memforge_ai-0.1.55/.claude-plugin/marketplace.json +16 -0
- memforge_ai-0.1.55/.dockerignore +19 -0
- memforge_ai-0.1.55/.env.example +33 -0
- memforge_ai-0.1.55/.env.mirrors.example +15 -0
- memforge_ai-0.1.55/.github/ISSUE_TEMPLATE/bug_report.yml +29 -0
- memforge_ai-0.1.55/.github/ISSUE_TEMPLATE/feature_request.yml +24 -0
- memforge_ai-0.1.55/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- memforge_ai-0.1.55/.github/assets/memforge-banner.png +0 -0
- memforge_ai-0.1.55/.github/workflows/ci.yml +40 -0
- memforge_ai-0.1.55/.github/workflows/publish-pypi.yml +44 -0
- memforge_ai-0.1.55/.gitignore +61 -0
- memforge_ai-0.1.55/.pre-commit-config.yaml +12 -0
- memforge_ai-0.1.55/AGENTS.md +73 -0
- memforge_ai-0.1.55/CHANGELOG.md +14 -0
- memforge_ai-0.1.55/CLAUDE.md +11 -0
- memforge_ai-0.1.55/CODE_OF_CONDUCT.md +23 -0
- memforge_ai-0.1.55/CONTEXT.md +106 -0
- memforge_ai-0.1.55/CONTRIBUTING.md +68 -0
- memforge_ai-0.1.55/Dockerfile +68 -0
- memforge_ai-0.1.55/LICENSE +157 -0
- memforge_ai-0.1.55/Makefile +30 -0
- memforge_ai-0.1.55/PKG-INFO +499 -0
- memforge_ai-0.1.55/README.md +291 -0
- memforge_ai-0.1.55/SECURITY.md +32 -0
- memforge_ai-0.1.55/admin-ui/.gitignore +3 -0
- memforge_ai-0.1.55/admin-ui/Dockerfile +25 -0
- memforge_ai-0.1.55/admin-ui/components.json +25 -0
- memforge_ai-0.1.55/admin-ui/eslint.config.js +23 -0
- memforge_ai-0.1.55/admin-ui/index.html +13 -0
- memforge_ai-0.1.55/admin-ui/nginx.conf +20 -0
- memforge_ai-0.1.55/admin-ui/package-lock.json +8837 -0
- memforge_ai-0.1.55/admin-ui/package.json +74 -0
- memforge_ai-0.1.55/admin-ui/public/favicon.svg +7 -0
- memforge_ai-0.1.55/admin-ui/src/App.tsx +94 -0
- memforge_ai-0.1.55/admin-ui/src/api/client.ts +80 -0
- memforge_ai-0.1.55/admin-ui/src/api/localAgentJobs.ts +53 -0
- memforge_ai-0.1.55/admin-ui/src/api/projectKeys.ts +15 -0
- memforge_ai-0.1.55/admin-ui/src/api/types.ts +671 -0
- memforge_ai-0.1.55/admin-ui/src/brand.ts +4 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/AsyncBoundary.tsx +49 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/DataSurface.tsx +10 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/EmptyState.tsx +21 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/FilterSelect.tsx +39 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/PageHeader.tsx +21 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/Pagination.tsx +53 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/SearchInput.tsx +44 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/SourceSyncStatusCard.tsx +88 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/StatusBadge.tsx +39 -0
- memforge_ai-0.1.55/admin-ui/src/components/admin/Toolbar.tsx +10 -0
- memforge_ai-0.1.55/admin-ui/src/components/brand/TaiSealLogo.tsx +19 -0
- memforge_ai-0.1.55/admin-ui/src/components/layout/ActiveProjectChip.tsx +200 -0
- memforge_ai-0.1.55/admin-ui/src/components/layout/AppShell.tsx +27 -0
- memforge_ai-0.1.55/admin-ui/src/components/layout/CommandSearch.tsx +16 -0
- memforge_ai-0.1.55/admin-ui/src/components/layout/CrossProjectBanner.tsx +46 -0
- memforge_ai-0.1.55/admin-ui/src/components/layout/Sidebar.tsx +238 -0
- memforge_ai-0.1.55/admin-ui/src/components/layout/Topbar.tsx +73 -0
- memforge_ai-0.1.55/admin-ui/src/components/memories/MemoryTypeIcon.tsx +36 -0
- memforge_ai-0.1.55/admin-ui/src/components/sources/SourceIcon.tsx +80 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/badge.tsx +52 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/button.tsx +58 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/card.tsx +103 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/dialog.tsx +153 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/input.tsx +20 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/select.tsx +162 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/separator.tsx +23 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/switch.tsx +32 -0
- memforge_ai-0.1.55/admin-ui/src/components/ui/table.tsx +116 -0
- memforge_ai-0.1.55/admin-ui/src/extension.ts +249 -0
- memforge_ai-0.1.55/admin-ui/src/index.css +127 -0
- memforge_ai-0.1.55/admin-ui/src/lib/constants.ts +8 -0
- memforge_ai-0.1.55/admin-ui/src/lib/pagination.ts +32 -0
- memforge_ai-0.1.55/admin-ui/src/lib/utils.ts +6 -0
- memforge_ai-0.1.55/admin-ui/src/lib/workspace.ts +13 -0
- memforge_ai-0.1.55/admin-ui/src/main.tsx +10 -0
- memforge_ai-0.1.55/admin-ui/src/state/activeProject.ts +153 -0
- memforge_ai-0.1.55/admin-ui/src/utils/date.ts +33 -0
- memforge_ai-0.1.55/admin-ui/src/views/entities/EntitiesPage.tsx +136 -0
- memforge_ai-0.1.55/admin-ui/src/views/entities/EntityDetailPage.tsx +277 -0
- memforge_ai-0.1.55/admin-ui/src/views/memories/MemoriesPage.tsx +583 -0
- memforge_ai-0.1.55/admin-ui/src/views/memories/MemoryDetailPage.tsx +295 -0
- memforge_ai-0.1.55/admin-ui/src/views/memories/MemoryFiltersPopover.tsx +217 -0
- memforge_ai-0.1.55/admin-ui/src/views/memories/lifecycle.ts +83 -0
- memforge_ai-0.1.55/admin-ui/src/views/memories/memoryTypeMeta.ts +25 -0
- memforge_ai-0.1.55/admin-ui/src/views/projects/ProjectCreateFields.tsx +103 -0
- memforge_ai-0.1.55/admin-ui/src/views/projects/ProjectDetailPage.tsx +508 -0
- memforge_ai-0.1.55/admin-ui/src/views/projects/ProjectEditDialog.tsx +182 -0
- memforge_ai-0.1.55/admin-ui/src/views/projects/ProjectsPage.tsx +403 -0
- memforge_ai-0.1.55/admin-ui/src/views/projects/projectCreateForm.ts +25 -0
- memforge_ai-0.1.55/admin-ui/src/views/review/ReviewDetailPage.tsx +337 -0
- memforge_ai-0.1.55/admin-ui/src/views/review/ReviewInteraction.test.tsx +305 -0
- memforge_ai-0.1.55/admin-ui/src/views/review/ReviewQueuePage.tsx +211 -0
- memforge_ai-0.1.55/admin-ui/src/views/review/reviewQueueCue.ts +85 -0
- memforge_ai-0.1.55/admin-ui/src/views/schedules/SchedulesPage.tsx +247 -0
- memforge_ai-0.1.55/admin-ui/src/views/settings/SettingsPage.tsx +589 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/GitHubRepoFolderPicker.tsx +514 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/LocalAgentDaemonStatus.tsx +81 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/ProjectBindingFields.tsx +638 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/ProjectGroup.tsx +101 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/SchemaSourceSetup.tsx +1159 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/SourceAccessChangeDialog.tsx +122 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/SourceAccessSection.tsx +98 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/SourceReadinessAlert.tsx +98 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/SourceRow.tsx +581 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/SourceSetupDialog.tsx +108 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/SourceSetupShell.tsx +165 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/SourcesPage.tsx +1699 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/TeamsSourceSetup.tsx +509 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/confluenceConfig.ts +107 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/githubRepoFolderPickerUtils.ts +214 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/localAgentDaemonStatusQuery.ts +17 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/localAgentSources.ts +13 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/managedSources.ts +38 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/projectBinding.ts +28 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/projectGrouping.ts +185 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/sourceAccess.ts +7 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/sourceActions.ts +104 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/sourceBrand.ts +111 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/sourceConnectionPresentation.ts +21 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/sourceListOrganization.ts +85 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/sourceReadiness.ts +34 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/sourceSetupAdapters.ts +336 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/sourceSyncActivity.ts +361 -0
- memforge_ai-0.1.55/admin-ui/src/views/sources/teamsSourceConfig.ts +148 -0
- memforge_ai-0.1.55/admin-ui/tests/api-target.test.ts +84 -0
- memforge_ai-0.1.55/admin-ui/tests/brand.test.ts +8 -0
- memforge_ai-0.1.55/admin-ui/tests/button-interaction.test.ts +35 -0
- memforge_ai-0.1.55/admin-ui/tests/confluence-config.test.ts +40 -0
- memforge_ai-0.1.55/admin-ui/tests/extension.test.ts +175 -0
- memforge_ai-0.1.55/admin-ui/tests/github-repo-folder-picker.test.ts +166 -0
- memforge_ai-0.1.55/admin-ui/tests/lifecycle.test.ts +79 -0
- memforge_ai-0.1.55/admin-ui/tests/local-agent-daemon-status.test.ts +181 -0
- memforge_ai-0.1.55/admin-ui/tests/local-agent-sync-progress.test.ts +367 -0
- memforge_ai-0.1.55/admin-ui/tests/local-markdown-config.test.ts +103 -0
- memforge_ai-0.1.55/admin-ui/tests/managed-sources.test.ts +144 -0
- memforge_ai-0.1.55/admin-ui/tests/memories-project-filter.test.ts +120 -0
- memforge_ai-0.1.55/admin-ui/tests/memory-type-icons.test.ts +22 -0
- memforge_ai-0.1.55/admin-ui/tests/pagination.test.ts +68 -0
- memforge_ai-0.1.55/admin-ui/tests/private-memory-detail.test.ts +25 -0
- memforge_ai-0.1.55/admin-ui/tests/project-binding.test.ts +21 -0
- memforge_ai-0.1.55/admin-ui/tests/review-decision-ux.test.ts +60 -0
- memforge_ai-0.1.55/admin-ui/tests/schedules.test.ts +140 -0
- memforge_ai-0.1.55/admin-ui/tests/sidebar-layout.test.ts +100 -0
- memforge_ai-0.1.55/admin-ui/tests/source-actions.test.ts +551 -0
- memforge_ai-0.1.55/admin-ui/tests/source-icons.test.ts +57 -0
- memforge_ai-0.1.55/admin-ui/tests/source-list-organization.test.ts +81 -0
- memforge_ai-0.1.55/admin-ui/tests/source-readiness.test.ts +65 -0
- memforge_ai-0.1.55/admin-ui/tests/source-setup-adapters.test.ts +94 -0
- memforge_ai-0.1.55/admin-ui/tests/teams-source-setup.test.ts +68 -0
- memforge_ai-0.1.55/admin-ui/tsconfig.app.json +34 -0
- memforge_ai-0.1.55/admin-ui/tsconfig.json +12 -0
- memforge_ai-0.1.55/admin-ui/vite.config.ts +26 -0
- memforge_ai-0.1.55/admin-ui/vitest.config.ts +15 -0
- memforge_ai-0.1.55/compose.yaml +57 -0
- memforge_ai-0.1.55/docs/README.md +17 -0
- memforge_ai-0.1.55/docs/adr/0001-project-source-sync-activity-from-existing-execution-records.md +93 -0
- memforge_ai-0.1.55/docs/adr/0002-renew-teams-access-through-a-dedicated-browser-session.md +7 -0
- memforge_ai-0.1.55/docs/adr/0003-keep-source-list-organization-personal.md +3 -0
- memforge_ai-0.1.55/docs/adr/0004-use-proven-authoritative-snapshots-for-rebaseline.md +119 -0
- memforge_ai-0.1.55/docs/adr/0005-preserve-provider-identity-across-scope-transitions.md +21 -0
- memforge_ai-0.1.55/docs/adr/0006-bound-memory-identity-recall-before-semantic-proof.md +23 -0
- memforge_ai-0.1.55/docs/adr/0007-bind-extracted-evidence-to-the-current-projection.md +164 -0
- memforge_ai-0.1.55/docs/adr/0008-prune-only-proven-disjoint-incumbents.md +28 -0
- memforge_ai-0.1.55/docs/adr/0009-bound-cross-document-relation-discovery.md +115 -0
- memforge_ai-0.1.55/docs/adr/0010-keep-support-provenance-projection-complete.md +124 -0
- memforge_ai-0.1.55/docs/adr/0011-separate-collection-evidence-from-body-materialization.md +191 -0
- memforge_ai-0.1.55/docs/adr/0012-deepen-the-extraction-lifecycle-hot-path.md +531 -0
- memforge_ai-0.1.55/docs/adr/0013-bind-document-artifacts-to-document-identity.md +56 -0
- memforge_ai-0.1.55/docs/adr/0014-model-binary-artifacts-as-revision-pinned-source-evidence.md +356 -0
- memforge_ai-0.1.55/docs/adr/0015-keep-the-oss-public-beta-local-only.md +42 -0
- memforge_ai-0.1.55/docs/adr/0016-keep-manual-memory-creation-independent-of-repository-roots.md +144 -0
- memforge_ai-0.1.55/docs/adr/0017-stage-recoverable-source-unit-derivation-before-lifecycle-commit.md +582 -0
- memforge_ai-0.1.55/docs/adr/0018-settle-mcp-roots-before-workspace-routed-tool-calls.md +144 -0
- memforge_ai-0.1.55/docs/adr/0019-drain-vector-outbox-from-current-relational-truth.md +83 -0
- memforge_ai-0.1.55/docs/adr/0020-list-current-memories-with-a-request-bound-keyset.md +56 -0
- memforge_ai-0.1.55/docs/adr/0021-select-workspaces-at-the-v1-request-boundary.md +104 -0
- memforge_ai-0.1.55/docs/adr/0022-resolve-ranked-search-intent-from-validated-client-hints.md +19 -0
- memforge_ai-0.1.55/docs/adr/0023-keep-review-orchestration-outside-memory-lifecycle.md +15 -0
- memforge_ai-0.1.55/docs/adr/0024-separate-lexical-candidate-eligibility-from-term-rarity.md +152 -0
- memforge_ai-0.1.55/docs/adr/0025-correlate-online-quality-events-with-source-derivation.md +239 -0
- memforge_ai-0.1.55/docs/api.md +31 -0
- memforge_ai-0.1.55/docs/architecture.md +2111 -0
- memforge_ai-0.1.55/docs/design/agent-hook-integration.md +64 -0
- memforge_ai-0.1.55/docs/design/agent-knowledge-bundle.html +270 -0
- memforge_ai-0.1.55/docs/design/agent-knowledge-bundle.md +333 -0
- memforge_ai-0.1.55/docs/design/agent-session-documents.md +48 -0
- memforge_ai-0.1.55/docs/design/agent-session-saas-plugin-flow.md +589 -0
- memforge_ai-0.1.55/docs/design/document-memory-lifecycle.md +198 -0
- memforge_ai-0.1.55/docs/design/gene-standard.md +1238 -0
- memforge_ai-0.1.55/docs/design/github-pages-source.md +157 -0
- memforge_ai-0.1.55/docs/design/github-repository-remote-scope.md +43 -0
- memforge_ai-0.1.55/docs/design/local-source-readiness.md +90 -0
- memforge_ai-0.1.55/docs/design/mcp-memory-search-facets.md +110 -0
- memforge_ai-0.1.55/docs/design/memory-evaluation-mechanism.md +668 -0
- memforge_ai-0.1.55/docs/design/source-agnostic-memory-extraction.md +248 -0
- memforge_ai-0.1.55/docs/design/source-list-organization.md +98 -0
- memforge_ai-0.1.55/docs/integrations/agent-clients.md +215 -0
- memforge_ai-0.1.55/docs/local-repo-sync.md +89 -0
- memforge_ai-0.1.55/docs/quickstart.md +276 -0
- memforge_ai-0.1.55/docs/releasing-python-distribution.md +46 -0
- memforge_ai-0.1.55/docs/research/2026-08-13-agent-runtime-event-storage.md +87 -0
- memforge_ai-0.1.55/docs/research/2026-08-13-langfuse-adoption-gate.md +168 -0
- memforge_ai-0.1.55/docs/research/2026-08-13-online-agent-evaluation-telemetry.md +274 -0
- memforge_ai-0.1.55/docs/research/fixed-slot-structured-output-schema.md +175 -0
- memforge_ai-0.1.55/docs/research/local-daemon-incremental-sync-capability-review.md +163 -0
- memforge_ai-0.1.55/docs/research/mcp-repository-context-routing.md +190 -0
- memforge_ai-0.1.55/docs/research/structured-llm-logical-deadline.md +230 -0
- memforge_ai-0.1.55/docs/superpowers/specs/2026-06-02-memforge-cli-clack-redesign-design.md +210 -0
- memforge_ai-0.1.55/docs/superpowers/specs/2026-06-03-jira-client-side-session-refresh-design.md +164 -0
- memforge_ai-0.1.55/docs/superpowers/specs/2026-07-07-local-agent-source-types-design.md +155 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/.claude-plugin/plugin.json +9 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/README.md +115 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/hooks/hooks.json +53 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_api_target.py +102 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_hook.py +6 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_hook_adapter.py +1732 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_mcp.py +2223 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_plugin_config.py +100 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_repo_identity.py +35 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_repository_context.py +107 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_workspace_bindings.py +301 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/skills/memforge-setup/SKILL.md +60 -0
- memforge_ai-0.1.55/integrations/claude-code/memforge-memory/skills/memforge-setup/scripts/workspace_config.py +280 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/.codex-plugin/plugin.json +26 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/README.md +116 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/hooks/hooks.json +41 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_api_target.py +102 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_hook.py +6 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_hook_adapter.py +1732 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_mcp.py +2223 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_plugin_config.py +100 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_repo_identity.py +35 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_repository_context.py +107 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_workspace_bindings.py +301 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/skills/memforge-setup/SKILL.md +60 -0
- memforge_ai-0.1.55/integrations/codex/memforge-memory/skills/memforge-setup/scripts/workspace_config.py +280 -0
- memforge_ai-0.1.55/pyproject.toml +86 -0
- memforge_ai-0.1.55/scripts/smoke_litellm_source_support.py +62 -0
- memforge_ai-0.1.55/scripts/sync_plugin_mcp_proxy.py +184 -0
- memforge_ai-0.1.55/scripts/verify_release_artifacts.py +105 -0
- memforge_ai-0.1.55/src/memforge/__init__.py +0 -0
- memforge_ai-0.1.55/src/memforge/agent_hooks.py +351 -0
- memforge_ai-0.1.55/src/memforge/agent_knowledge.py +1796 -0
- memforge_ai-0.1.55/src/memforge/agent_knowledge_markdown.py +149 -0
- memforge_ai-0.1.55/src/memforge/agent_session_contract.py +46 -0
- memforge_ai-0.1.55/src/memforge/agent_sessions.py +1291 -0
- memforge_ai-0.1.55/src/memforge/api_target.py +102 -0
- memforge_ai-0.1.55/src/memforge/auth/__init__.py +1 -0
- memforge_ai-0.1.55/src/memforge/auth/browser_session.py +251 -0
- memforge_ai-0.1.55/src/memforge/auth/jira_auth.py +410 -0
- memforge_ai-0.1.55/src/memforge/auth/jira_browser_session.py +302 -0
- memforge_ai-0.1.55/src/memforge/auth/jira_capture.py +247 -0
- memforge_ai-0.1.55/src/memforge/auth/teams_auth.py +209 -0
- memforge_ai-0.1.55/src/memforge/auth/teams_browser_session.py +324 -0
- memforge_ai-0.1.55/src/memforge/config.py +323 -0
- memforge_ai-0.1.55/src/memforge/evals/__init__.py +1 -0
- memforge_ai-0.1.55/src/memforge/evals/agent_evaluation.py +741 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/__init__.py +29 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/__init__.py +1 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/hybrid_fusion.yaml +96 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/intent_resolution.yaml +134 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/manifest.yaml +221 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/metadata_lexical.yaml +178 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/fixtures/__init__.py +1 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/fixtures/corpus.py +144 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/hash_case_set.py +54 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/policy_sweep.py +270 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/runner.py +418 -0
- memforge_ai-0.1.55/src/memforge/evals/retrieval/schema.py +792 -0
- memforge_ai-0.1.55/src/memforge/genes/__init__.py +172 -0
- memforge_ai-0.1.55/src/memforge/genes/agent_session_gene.py +252 -0
- memforge_ai-0.1.55/src/memforge/genes/atlassian_auth.py +349 -0
- memforge_ai-0.1.55/src/memforge/genes/base.py +264 -0
- memforge_ai-0.1.55/src/memforge/genes/confluence_artifacts.py +273 -0
- memforge_ai-0.1.55/src/memforge/genes/confluence_gene.py +878 -0
- memforge_ai-0.1.55/src/memforge/genes/confluence_pdf.py +431 -0
- memforge_ai-0.1.55/src/memforge/genes/github_pages_gene.py +1049 -0
- memforge_ai-0.1.55/src/memforge/genes/github_repo_gene.py +676 -0
- memforge_ai-0.1.55/src/memforge/genes/jira_gene.py +1089 -0
- memforge_ai-0.1.55/src/memforge/genes/local_adapter_packages.py +137 -0
- memforge_ai-0.1.55/src/memforge/genes/local_markdown_gene.py +264 -0
- memforge_ai-0.1.55/src/memforge/genes/teams_gene.py +2180 -0
- memforge_ai-0.1.55/src/memforge/github_repo_utils.py +225 -0
- memforge_ai-0.1.55/src/memforge/hook_adapter.py +1732 -0
- memforge_ai-0.1.55/src/memforge/interactive_cli/index.mjs +557 -0
- memforge_ai-0.1.55/src/memforge/interactive_cli/package-lock.json +54 -0
- memforge_ai-0.1.55/src/memforge/interactive_cli/package.json +22 -0
- memforge_ai-0.1.55/src/memforge/llm/__init__.py +1 -0
- memforge_ai-0.1.55/src/memforge/llm/providers.py +31 -0
- memforge_ai-0.1.55/src/memforge/llm/structured.py +2010 -0
- memforge_ai-0.1.55/src/memforge/llm/structured_images.py +190 -0
- memforge_ai-0.1.55/src/memforge/local_adapter.py +873 -0
- memforge_ai-0.1.55/src/memforge/local_agent/__init__.py +1 -0
- memforge_ai-0.1.55/src/memforge/local_agent/document_identity.py +51 -0
- memforge_ai-0.1.55/src/memforge/local_agent/folder_picker.py +80 -0
- memforge_ai-0.1.55/src/memforge/local_agent/jira_contract.py +92 -0
- memforge_ai-0.1.55/src/memforge/local_agent/readiness.py +24 -0
- memforge_ai-0.1.55/src/memforge/local_agent/replay_adapter.py +405 -0
- memforge_ai-0.1.55/src/memforge/local_agent/runner.py +585 -0
- memforge_ai-0.1.55/src/memforge/local_agent/snapshot_manifest.py +103 -0
- memforge_ai-0.1.55/src/memforge/local_agent/source_contract.py +482 -0
- memforge_ai-0.1.55/src/memforge/local_agent/state.py +204 -0
- memforge_ai-0.1.55/src/memforge/local_agent/teams_audit.py +231 -0
- memforge_ai-0.1.55/src/memforge/local_agent/teams_browse.py +216 -0
- memforge_ai-0.1.55/src/memforge/local_agent/teams_contract.py +171 -0
- memforge_ai-0.1.55/src/memforge/local_agent/teams_ledger.py +518 -0
- memforge_ai-0.1.55/src/memforge/main.py +5374 -0
- memforge_ai-0.1.55/src/memforge/memory/__init__.py +0 -0
- memforge_ai-0.1.55/src/memforge/memory/audit.py +140 -0
- memforge_ai-0.1.55/src/memforge/memory/candidate_ledger.py +493 -0
- memforge_ai-0.1.55/src/memforge/memory/cutover.py +1015 -0
- memforge_ai-0.1.55/src/memforge/memory/engine.py +1231 -0
- memforge_ai-0.1.55/src/memforge/memory/entity_resolver.py +454 -0
- memforge_ai-0.1.55/src/memforge/memory/evidence.py +903 -0
- memforge_ai-0.1.55/src/memforge/memory/health.py +334 -0
- memforge_ai-0.1.55/src/memforge/memory/identity_resolver.py +295 -0
- memforge_ai-0.1.55/src/memforge/memory/index_payloads.py +38 -0
- memforge_ai-0.1.55/src/memforge/memory/lifecycle.py +36 -0
- memforge_ai-0.1.55/src/memforge/memory/lifecycle_plan.py +657 -0
- memforge_ai-0.1.55/src/memforge/memory/lifecycle_planner.py +650 -0
- memforge_ai-0.1.55/src/memforge/memory/lifecycle_review.py +398 -0
- memforge_ai-0.1.55/src/memforge/memory/lifecycle_service.py +361 -0
- memforge_ai-0.1.55/src/memforge/memory/origin.py +25 -0
- memforge_ai-0.1.55/src/memforge/memory/project_resolver.py +66 -0
- memforge_ai-0.1.55/src/memforge/memory/quality.py +147 -0
- memforge_ai-0.1.55/src/memforge/memory/relation_candidate_retrieval.py +482 -0
- memforge_ai-0.1.55/src/memforge/memory/relation_classifier.py +425 -0
- memforge_ai-0.1.55/src/memforge/memory/relation_discovery.py +598 -0
- memforge_ai-0.1.55/src/memforge/memory/relation_discovery_contract.py +151 -0
- memforge_ai-0.1.55/src/memforge/memory/repair.py +248 -0
- memforge_ai-0.1.55/src/memforge/memory/review_contract.py +277 -0
- memforge_ai-0.1.55/src/memforge/memory/review_decision.py +83 -0
- memforge_ai-0.1.55/src/memforge/memory/review_presentation.py +178 -0
- memforge_ai-0.1.55/src/memforge/memory/review_service.py +509 -0
- memforge_ai-0.1.55/src/memforge/memory/store.py +2886 -0
- memforge_ai-0.1.55/src/memforge/models.py +732 -0
- memforge_ai-0.1.55/src/memforge/pipeline/__init__.py +0 -0
- memforge_ai-0.1.55/src/memforge/pipeline/bounded_work.py +48 -0
- memforge_ai-0.1.55/src/memforge/pipeline/claim_evidence.py +134 -0
- memforge_ai-0.1.55/src/memforge/pipeline/document_units.py +486 -0
- memforge_ai-0.1.55/src/memforge/pipeline/document_update.py +211 -0
- memforge_ai-0.1.55/src/memforge/pipeline/entity_filter.py +109 -0
- memforge_ai-0.1.55/src/memforge/pipeline/evidence_catalog.py +396 -0
- memforge_ai-0.1.55/src/memforge/pipeline/extraction_contract.py +31 -0
- memforge_ai-0.1.55/src/memforge/pipeline/memory_extractor.py +795 -0
- memforge_ai-0.1.55/src/memforge/pipeline/normalizer_utils.py +211 -0
- memforge_ai-0.1.55/src/memforge/pipeline/projection_context.py +378 -0
- memforge_ai-0.1.55/src/memforge/pipeline/projection_evidence.py +332 -0
- memforge_ai-0.1.55/src/memforge/pipeline/reconciler.py +913 -0
- memforge_ai-0.1.55/src/memforge/pipeline/retry.py +73 -0
- memforge_ai-0.1.55/src/memforge/pipeline/source_projection_adapters.py +1105 -0
- memforge_ai-0.1.55/src/memforge/pipeline/source_support_detector.py +724 -0
- memforge_ai-0.1.55/src/memforge/pipeline/sync.py +3489 -0
- memforge_ai-0.1.55/src/memforge/pipeline/sync_memory.py +303 -0
- memforge_ai-0.1.55/src/memforge/plugin_config.py +100 -0
- memforge_ai-0.1.55/src/memforge/plugin_mcp_proxy.py +2223 -0
- memforge_ai-0.1.55/src/memforge/provenance.py +184 -0
- memforge_ai-0.1.55/src/memforge/repo_identity.py +35 -0
- memforge_ai-0.1.55/src/memforge/repository_context.py +107 -0
- memforge_ai-0.1.55/src/memforge/retrieval/__init__.py +0 -0
- memforge_ai-0.1.55/src/memforge/retrieval/access_predicate.py +200 -0
- memforge_ai-0.1.55/src/memforge/retrieval/embeddings.py +226 -0
- memforge_ai-0.1.55/src/memforge/retrieval/filters.py +48 -0
- memforge_ai-0.1.55/src/memforge/retrieval/intents.py +114 -0
- memforge_ai-0.1.55/src/memforge/retrieval/metadata_text.py +80 -0
- memforge_ai-0.1.55/src/memforge/retrieval/query_analyzer.py +29 -0
- memforge_ai-0.1.55/src/memforge/retrieval/query_plan.py +243 -0
- memforge_ai-0.1.55/src/memforge/retrieval/rank_fusion.py +107 -0
- memforge_ai-0.1.55/src/memforge/retrieval/search.py +1519 -0
- memforge_ai-0.1.55/src/memforge/retrieval/vector_metadata.py +90 -0
- memforge_ai-0.1.55/src/memforge/runtime.py +1553 -0
- memforge_ai-0.1.55/src/memforge/scheduler.py +210 -0
- memforge_ai-0.1.55/src/memforge/server/__init__.py +0 -0
- memforge_ai-0.1.55/src/memforge/server/admin_api.py +8298 -0
- memforge_ai-0.1.55/src/memforge/server/memory_admin_service.py +51 -0
- memforge_ai-0.1.55/src/memforge/server/principal.py +35 -0
- memforge_ai-0.1.55/src/memforge/server/source_admin_service.py +307 -0
- memforge_ai-0.1.55/src/memforge/source_access.py +156 -0
- memforge_ai-0.1.55/src/memforge/source_access_transition.py +117 -0
- memforge_ai-0.1.55/src/memforge/source_activity.py +28 -0
- memforge_ai-0.1.55/src/memforge/source_artifacts.py +685 -0
- memforge_ai-0.1.55/src/memforge/source_derivation.py +1203 -0
- memforge_ai-0.1.55/src/memforge/source_projection.py +755 -0
- memforge_ai-0.1.55/src/memforge/source_projection_config.py +191 -0
- memforge_ai-0.1.55/src/memforge/source_secrets.py +239 -0
- memforge_ai-0.1.55/src/memforge/storage/__init__.py +0 -0
- memforge_ai-0.1.55/src/memforge/storage/adapters/__init__.py +22 -0
- memforge_ai-0.1.55/src/memforge/storage/adapters/context.py +54 -0
- memforge_ai-0.1.55/src/memforge/storage/adapters/protocols.py +935 -0
- memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/__init__.py +16 -0
- memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/factory.py +44 -0
- memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/keyword.py +702 -0
- memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/relational.py +2115 -0
- memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/vector.py +136 -0
- memforge_ai-0.1.55/src/memforge/storage/admin_memory.py +48 -0
- memforge_ai-0.1.55/src/memforge/storage/admin_source.py +178 -0
- memforge_ai-0.1.55/src/memforge/storage/database.py +18917 -0
- memforge_ai-0.1.55/src/memforge/storage/document_store.py +277 -0
- memforge_ai-0.1.55/src/memforge/storage/source_cleanup.py +62 -0
- memforge_ai-0.1.55/src/memforge/storage/source_sync_manifest.py +36 -0
- memforge_ai-0.1.55/src/memforge/sync_progress.py +206 -0
- memforge_ai-0.1.55/src/memforge/tool_client.py +1091 -0
- memforge_ai-0.1.55/src/memforge/workspace_bindings.py +301 -0
- memforge_ai-0.1.55/tests/__init__.py +0 -0
- memforge_ai-0.1.55/tests/contracts/__init__.py +10 -0
- memforge_ai-0.1.55/tests/contracts/_support.py +190 -0
- memforge_ai-0.1.55/tests/contracts/test_entity_linking_contract.py +83 -0
- memforge_ai-0.1.55/tests/contracts/test_keyword_contract.py +199 -0
- memforge_ai-0.1.55/tests/contracts/test_relational_contract.py +879 -0
- memforge_ai-0.1.55/tests/contracts/test_sqlite_contract.py +96 -0
- memforge_ai-0.1.55/tests/contracts/test_vector_contract.py +145 -0
- memforge_ai-0.1.55/tests/evals/test_intent_policy_sweep.py +101 -0
- memforge_ai-0.1.55/tests/evals/test_online_agent_eval_cli.py +152 -0
- memforge_ai-0.1.55/tests/evals/test_retrieval_case_set.py +679 -0
- memforge_ai-0.1.55/tests/evals/test_retrieval_eval_cli.py +83 -0
- memforge_ai-0.1.55/tests/evals/test_retrieval_runner.py +236 -0
- memforge_ai-0.1.55/tests/test_access_predicate_admin_path.py +190 -0
- memforge_ai-0.1.55/tests/test_access_predicate_by_id_readers.py +149 -0
- memforge_ai-0.1.55/tests/test_access_predicate_channels.py +358 -0
- memforge_ai-0.1.55/tests/test_access_predicate_dedup.py +204 -0
- memforge_ai-0.1.55/tests/test_access_predicate_lifecycle.py +154 -0
- memforge_ai-0.1.55/tests/test_access_predicate_null.py +192 -0
- memforge_ai-0.1.55/tests/test_access_predicate_post_fusion.py +124 -0
- memforge_ai-0.1.55/tests/test_access_predicate_principal_authority.py +155 -0
- memforge_ai-0.1.55/tests/test_access_predicate_sync_uploader.py +562 -0
- memforge_ai-0.1.55/tests/test_access_predicate_unit.py +92 -0
- memforge_ai-0.1.55/tests/test_adapters_context.py +39 -0
- memforge_ai-0.1.55/tests/test_adapters_factory.py +50 -0
- memforge_ai-0.1.55/tests/test_adapters_sqlite_keyword.py +863 -0
- memforge_ai-0.1.55/tests/test_adapters_sqlite_relational.py +1638 -0
- memforge_ai-0.1.55/tests/test_adapters_sqlite_vector.py +139 -0
- memforge_ai-0.1.55/tests/test_admin_entities_adapter_contract.py +164 -0
- memforge_ai-0.1.55/tests/test_admin_memory_storage_neutral.py +164 -0
- memforge_ai-0.1.55/tests/test_admin_source_storage_neutral.py +2440 -0
- memforge_ai-0.1.55/tests/test_agent_evaluation_config.py +28 -0
- memforge_ai-0.1.55/tests/test_agent_hook_context.py +235 -0
- memforge_ai-0.1.55/tests/test_agent_knowledge_bundle.py +1946 -0
- memforge_ai-0.1.55/tests/test_agent_knowledge_markdown.py +124 -0
- memforge_ai-0.1.55/tests/test_agent_runtime_events.py +523 -0
- memforge_ai-0.1.55/tests/test_agent_session_api.py +2866 -0
- memforge_ai-0.1.55/tests/test_agent_session_gene.py +489 -0
- memforge_ai-0.1.55/tests/test_agent_session_repo_identifier.py +113 -0
- memforge_ai-0.1.55/tests/test_agent_session_source_isolation.py +119 -0
- memforge_ai-0.1.55/tests/test_api_target.py +209 -0
- memforge_ai-0.1.55/tests/test_bounded_async_work.py +61 -0
- memforge_ai-0.1.55/tests/test_browser_session.py +168 -0
- memforge_ai-0.1.55/tests/test_candidate_ledger.py +498 -0
- memforge_ai-0.1.55/tests/test_claim_evidence.py +123 -0
- memforge_ai-0.1.55/tests/test_cli_agent_tools.py +3958 -0
- memforge_ai-0.1.55/tests/test_cli_interactive.py +208 -0
- memforge_ai-0.1.55/tests/test_cli_kb_schedule.py +31 -0
- memforge_ai-0.1.55/tests/test_compose_contract.py +83 -0
- memforge_ai-0.1.55/tests/test_compose_defaults.py +12 -0
- memforge_ai-0.1.55/tests/test_confluence_gene.py +1101 -0
- memforge_ai-0.1.55/tests/test_confluence_pdf.py +559 -0
- memforge_ai-0.1.55/tests/test_consolidated_memory_removal.py +72 -0
- memforge_ai-0.1.55/tests/test_cross_source_review_contract.py +626 -0
- memforge_ai-0.1.55/tests/test_database_read_only.py +84 -0
- memforge_ai-0.1.55/tests/test_document_store.py +58 -0
- memforge_ai-0.1.55/tests/test_document_units.py +192 -0
- memforge_ai-0.1.55/tests/test_document_update.py +81 -0
- memforge_ai-0.1.55/tests/test_entity_resolver.py +619 -0
- memforge_ai-0.1.55/tests/test_evidence_catalog.py +207 -0
- memforge_ai-0.1.55/tests/test_evidence_catalog_source_matrix.py +326 -0
- memforge_ai-0.1.55/tests/test_github_pages_gene.py +848 -0
- memforge_ai-0.1.55/tests/test_github_repo_gene.py +730 -0
- memforge_ai-0.1.55/tests/test_github_repo_scope.py +101 -0
- memforge_ai-0.1.55/tests/test_github_repo_tree_browse.py +54 -0
- memforge_ai-0.1.55/tests/test_hook_adapter.py +5898 -0
- memforge_ai-0.1.55/tests/test_identity_resolver.py +594 -0
- memforge_ai-0.1.55/tests/test_jira_auth_sessions.py +698 -0
- memforge_ai-0.1.55/tests/test_jira_browser_session.py +217 -0
- memforge_ai-0.1.55/tests/test_jira_capture.py +186 -0
- memforge_ai-0.1.55/tests/test_jira_discover.py +73 -0
- memforge_ai-0.1.55/tests/test_jira_gene.py +1486 -0
- memforge_ai-0.1.55/tests/test_jira_jql_build.py +60 -0
- memforge_ai-0.1.55/tests/test_jira_origin_history.py +53 -0
- memforge_ai-0.1.55/tests/test_jira_scope_validation.py +30 -0
- memforge_ai-0.1.55/tests/test_jira_session_api.py +121 -0
- memforge_ai-0.1.55/tests/test_jira_watch_tick.py +113 -0
- memforge_ai-0.1.55/tests/test_lexical_query_plan.py +59 -0
- memforge_ai-0.1.55/tests/test_lifecycle_cutover_store.py +3531 -0
- memforge_ai-0.1.55/tests/test_lifecycle_plan_contract.py +193 -0
- memforge_ai-0.1.55/tests/test_lifecycle_planner.py +411 -0
- memforge_ai-0.1.55/tests/test_litellm_provider_runtime.py +241 -0
- memforge_ai-0.1.55/tests/test_local_adapter_api.py +2650 -0
- memforge_ai-0.1.55/tests/test_local_agent_daemon.py +985 -0
- memforge_ai-0.1.55/tests/test_local_agent_daemon_broker.py +119 -0
- memforge_ai-0.1.55/tests/test_local_agent_snapshot_manifest.py +163 -0
- memforge_ai-0.1.55/tests/test_local_agent_source_contract.py +786 -0
- memforge_ai-0.1.55/tests/test_local_source_readiness.py +28 -0
- memforge_ai-0.1.55/tests/test_mcp_workspace_contract.py +221 -0
- memforge_ai-0.1.55/tests/test_memory_audit.py +157 -0
- memforge_ai-0.1.55/tests/test_memory_engine_incumbent_batching.py +122 -0
- memforge_ai-0.1.55/tests/test_memory_engine_lifecycle_contract.py +63 -0
- memforge_ai-0.1.55/tests/test_memory_evidence_contract.py +676 -0
- memforge_ai-0.1.55/tests/test_memory_evidence_schema.py +188 -0
- memforge_ai-0.1.55/tests/test_memory_evidence_store.py +1598 -0
- memforge_ai-0.1.55/tests/test_memory_extractor.py +221 -0
- memforge_ai-0.1.55/tests/test_memory_health.py +314 -0
- memforge_ai-0.1.55/tests/test_memory_index_repair.py +153 -0
- memforge_ai-0.1.55/tests/test_memory_lifecycle.py +604 -0
- memforge_ai-0.1.55/tests/test_memory_lifecycle_service.py +761 -0
- memforge_ai-0.1.55/tests/test_memory_origin.py +8 -0
- memforge_ai-0.1.55/tests/test_memory_quality.py +1711 -0
- memforge_ai-0.1.55/tests/test_memory_reviews.py +1766 -0
- memforge_ai-0.1.55/tests/test_memory_store_adapters.py +181 -0
- memforge_ai-0.1.55/tests/test_memory_store_safe_paths.py +2361 -0
- memforge_ai-0.1.55/tests/test_models.py +137 -0
- memforge_ai-0.1.55/tests/test_origin_source_pairs.py +119 -0
- memforge_ai-0.1.55/tests/test_origin_source_type.py +54 -0
- memforge_ai-0.1.55/tests/test_phase3_corroboration_visibility.py +161 -0
- memforge_ai-0.1.55/tests/test_phase3_dedup_visibility.py +532 -0
- memforge_ai-0.1.55/tests/test_phase3_promotion_guard.py +125 -0
- memforge_ai-0.1.55/tests/test_phase4_affinity_penalty.py +248 -0
- memforge_ai-0.1.55/tests/test_phase4_project_resolver.py +238 -0
- memforge_ai-0.1.55/tests/test_phase4_projects_api.py +534 -0
- memforge_ai-0.1.55/tests/test_phase4_projects_table.py +102 -0
- memforge_ai-0.1.55/tests/test_phase4_search_request.py +237 -0
- memforge_ai-0.1.55/tests/test_plugin_mcp_conflict_context.py +47 -0
- memforge_ai-0.1.55/tests/test_projected_lifecycle_integration.py +6264 -0
- memforge_ai-0.1.55/tests/test_projection_context.py +1067 -0
- memforge_ai-0.1.55/tests/test_projection_evidence.py +741 -0
- memforge_ai-0.1.55/tests/test_rank_fusion.py +75 -0
- memforge_ai-0.1.55/tests/test_reconciliation_policy.py +655 -0
- memforge_ai-0.1.55/tests/test_relation_candidate_retrieval.py +538 -0
- memforge_ai-0.1.55/tests/test_relation_discovery.py +521 -0
- memforge_ai-0.1.55/tests/test_retrieval_intents.py +128 -0
- memforge_ai-0.1.55/tests/test_review_decision.py +92 -0
- memforge_ai-0.1.55/tests/test_review_presentation.py +73 -0
- memforge_ai-0.1.55/tests/test_search_alias_expansion.py +173 -0
- memforge_ai-0.1.55/tests/test_search_engine_adapters.py +1658 -0
- memforge_ai-0.1.55/tests/test_search_lifecycle.py +407 -0
- memforge_ai-0.1.55/tests/test_search_memory_only.py +113 -0
- memforge_ai-0.1.55/tests/test_source_access_migration.py +244 -0
- memforge_ai-0.1.55/tests/test_source_access_policy.py +78 -0
- memforge_ai-0.1.55/tests/test_source_access_transition.py +407 -0
- memforge_ai-0.1.55/tests/test_source_artifacts.py +551 -0
- memforge_ai-0.1.55/tests/test_source_authority_api.py +1658 -0
- memforge_ai-0.1.55/tests/test_source_projection_adapters.py +1773 -0
- memforge_ai-0.1.55/tests/test_source_projection_config.py +139 -0
- memforge_ai-0.1.55/tests/test_source_projection_contract.py +461 -0
- memforge_ai-0.1.55/tests/test_source_projection_store.py +755 -0
- memforge_ai-0.1.55/tests/test_source_secrets.py +164 -0
- memforge_ai-0.1.55/tests/test_source_support_detector.py +1208 -0
- memforge_ai-0.1.55/tests/test_startup_runtime.py +3557 -0
- memforge_ai-0.1.55/tests/test_structured_coercion.py +38 -0
- memforge_ai-0.1.55/tests/test_structured_llm.py +1805 -0
- memforge_ai-0.1.55/tests/test_structured_llm_images.py +89 -0
- memforge_ai-0.1.55/tests/test_sync_bookkeeping.py +12223 -0
- memforge_ai-0.1.55/tests/test_sync_memory_observer.py +170 -0
- memforge_ai-0.1.55/tests/test_sync_plugin_mcp_proxy.py +84 -0
- memforge_ai-0.1.55/tests/test_teams_audit.py +192 -0
- memforge_ai-0.1.55/tests/test_teams_authentication.py +456 -0
- memforge_ai-0.1.55/tests/test_teams_gene.py +1542 -0
- memforge_ai-0.1.55/tests/test_teams_ledger.py +154 -0
- memforge_ai-0.1.55/tests/test_tool_client_jira_session.py +68 -0
- memforge_ai-0.1.55/tests/test_tool_client_sources.py +840 -0
- memforge_ai-0.1.55/tests/test_unit_extraction.py +260 -0
- memforge_ai-0.1.55/tests/test_unprovable_cutover_retirement.py +479 -0
- memforge_ai-0.1.55/tests/test_vector_metadata.py +89 -0
- memforge_ai-0.1.55/tests/test_visibility_invariant.py +126 -0
- memforge_ai-0.1.55/tests/test_visibility_migrations.py +192 -0
- memforge_ai-0.1.55/tests/test_visibility_model.py +19 -0
- memforge_ai-0.1.55/tests/test_visibility_write_threading.py +83 -0
- memforge_ai-0.1.55/tests/test_workspace_bindings.py +312 -0
- memforge_ai-0.1.55/tests/test_workspace_contract.py +95 -0
- memforge_ai-0.1.55/uv.lock +3709 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "memforge",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "MemForge"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "memory",
|
|
9
|
+
"source": {
|
|
10
|
+
"source": "local",
|
|
11
|
+
"path": "./integrations/codex/memforge-memory"
|
|
12
|
+
},
|
|
13
|
+
"policy": {
|
|
14
|
+
"installation": "AVAILABLE",
|
|
15
|
+
"authentication": "ON_INSTALL"
|
|
16
|
+
},
|
|
17
|
+
"category": "Productivity"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "memforge",
|
|
4
|
+
"description": "MemForge plugin marketplace for agent memory integrations.",
|
|
5
|
+
"owner": {
|
|
6
|
+
"name": "MemForge Team"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "memory",
|
|
11
|
+
"description": "MemForge hook and MCP memory integration for Claude Code.",
|
|
12
|
+
"source": "./integrations/claude-code/memforge-memory",
|
|
13
|
+
"category": "productivity"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
.git
|
|
2
|
+
.github
|
|
3
|
+
.pytest_cache
|
|
4
|
+
.ruff_cache
|
|
5
|
+
.venv
|
|
6
|
+
.env
|
|
7
|
+
.memforge
|
|
8
|
+
__pycache__
|
|
9
|
+
*.py[cod]
|
|
10
|
+
*.sqlite
|
|
11
|
+
*.db
|
|
12
|
+
*.log
|
|
13
|
+
|
|
14
|
+
admin-ui/.tmp-test
|
|
15
|
+
admin-ui/dist
|
|
16
|
+
admin-ui/node_modules
|
|
17
|
+
|
|
18
|
+
docs/.vitepress/cache
|
|
19
|
+
docs/.vitepress/dist
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Runtime storage
|
|
2
|
+
# Docker Compose overrides MEMFORGE_BASE_DIR to /data inside the API container.
|
|
3
|
+
MEMFORGE_BASE_DIR=.memforge
|
|
4
|
+
MEMFORGE_ADMIN_API_PORT=8765
|
|
5
|
+
MEMFORGE_CORS_ORIGINS=http://localhost:5174
|
|
6
|
+
|
|
7
|
+
# LLM enrichment
|
|
8
|
+
MEMFORGE_ENRICHMENT_MODEL=claude-sonnet-4-20250514
|
|
9
|
+
MEMFORGE_ENRICHMENT_BASE_URL=https://api.anthropic.com
|
|
10
|
+
MEMFORGE_ENRICHMENT_API_KEY=
|
|
11
|
+
|
|
12
|
+
# Embeddings
|
|
13
|
+
MEMFORGE_EMBEDDING_MODEL=text-embedding-3-small
|
|
14
|
+
MEMFORGE_EMBEDDING_BASE_URL=https://api.openai.com/v1
|
|
15
|
+
MEMFORGE_EMBEDDING_API_KEY=
|
|
16
|
+
|
|
17
|
+
# Optional Docker Hub mirror prefix for restricted networks.
|
|
18
|
+
# Example: MEMFORGE_DOCKERHUB_PREFIX=docker.m.daocloud.io/library/
|
|
19
|
+
MEMFORGE_DOCKERHUB_PREFIX=
|
|
20
|
+
MEMFORGE_DEBIAN_MIRROR=
|
|
21
|
+
MEMFORGE_DEBIAN_SECURITY_MIRROR=
|
|
22
|
+
MEMFORGE_PYPI_INDEX_URL=
|
|
23
|
+
MEMFORGE_NPM_REGISTRY=
|
|
24
|
+
|
|
25
|
+
# Optional host ports when 8765 or 5174 are already in use. The authentication-
|
|
26
|
+
# free OSS beta always publishes them on 127.0.0.1; shared deployment is unsupported.
|
|
27
|
+
MEMFORGE_API_HOST_PORT=8765
|
|
28
|
+
MEMFORGE_ADMIN_UI_HOST_PORT=5174
|
|
29
|
+
|
|
30
|
+
# Agent adapter overrides
|
|
31
|
+
MEMFORGE_API_URL=http://127.0.0.1:8765
|
|
32
|
+
MEMFORGE_API_TOKEN=
|
|
33
|
+
MEMFORGE_AGENT_QUEUE_DB=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Build mirrors for restricted or slow registry networks.
|
|
2
|
+
# Use directly with:
|
|
3
|
+
# docker compose --env-file .env.mirrors.example up --build
|
|
4
|
+
#
|
|
5
|
+
# Or copy to .env if you also want to edit local model/API settings:
|
|
6
|
+
# cp .env.mirrors.example .env
|
|
7
|
+
|
|
8
|
+
MEMFORGE_DOCKERHUB_PREFIX=docker.m.daocloud.io/library/
|
|
9
|
+
MEMFORGE_DEBIAN_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/debian
|
|
10
|
+
MEMFORGE_DEBIAN_SECURITY_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/debian-security
|
|
11
|
+
MEMFORGE_PYPI_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
|
|
12
|
+
MEMFORGE_NPM_REGISTRY=https://registry.npmmirror.com
|
|
13
|
+
|
|
14
|
+
MEMFORGE_API_HOST_PORT=8765
|
|
15
|
+
MEMFORGE_ADMIN_UI_HOST_PORT=5174
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible problem in MemForge
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: summary
|
|
8
|
+
attributes:
|
|
9
|
+
label: Summary
|
|
10
|
+
description: What happened?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: reproduce
|
|
15
|
+
attributes:
|
|
16
|
+
label: Steps to reproduce
|
|
17
|
+
description: Include commands, payload shape, and relevant logs with secrets removed.
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: input
|
|
21
|
+
id: version
|
|
22
|
+
attributes:
|
|
23
|
+
label: Version or commit
|
|
24
|
+
placeholder: 0.1.0 or commit SHA
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: environment
|
|
27
|
+
attributes:
|
|
28
|
+
label: Environment
|
|
29
|
+
placeholder: Python, Node, OS, database/vector settings
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest an improvement for MemForge
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Problem
|
|
10
|
+
description: What workflow is hard today?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: proposal
|
|
15
|
+
attributes:
|
|
16
|
+
label: Proposal
|
|
17
|
+
description: What would a clean solution look like?
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: alternatives
|
|
22
|
+
attributes:
|
|
23
|
+
label: Alternatives considered
|
|
24
|
+
description: Any simpler options or trade-offs?
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
## Verification
|
|
4
|
+
|
|
5
|
+
- [ ] `make lint`
|
|
6
|
+
- [ ] `make test`
|
|
7
|
+
- [ ] `make ui-lint`
|
|
8
|
+
- [ ] `make ui-test`
|
|
9
|
+
- [ ] `make ui-build`
|
|
10
|
+
|
|
11
|
+
## Notes
|
|
12
|
+
|
|
13
|
+
- [ ] Docs updated when behavior or setup changed
|
|
14
|
+
- [ ] No local data, private URLs, credentials, or generated caches included
|
|
Binary file
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
python:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
timeout-minutes: 30
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: astral-sh/setup-uv@v5
|
|
15
|
+
- uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.12"
|
|
18
|
+
- run: uv sync --extra dev
|
|
19
|
+
- run: uv build
|
|
20
|
+
- run: uv run python scripts/verify_release_artifacts.py dist
|
|
21
|
+
- run: uv run python scripts/sync_plugin_mcp_proxy.py --check
|
|
22
|
+
- run: uv run ruff check src tests scripts/sync_plugin_mcp_proxy.py
|
|
23
|
+
- run: uv run pytest -q -n 4 --dist worksteal --durations=25 --durations-min=0.2
|
|
24
|
+
|
|
25
|
+
admin-ui:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
defaults:
|
|
28
|
+
run:
|
|
29
|
+
working-directory: admin-ui
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
- uses: actions/setup-node@v4
|
|
33
|
+
with:
|
|
34
|
+
node-version: "24.15.0"
|
|
35
|
+
cache: npm
|
|
36
|
+
cache-dependency-path: admin-ui/package-lock.json
|
|
37
|
+
- run: npm ci
|
|
38
|
+
- run: npm run lint
|
|
39
|
+
- run: npm test
|
|
40
|
+
- run: npm run build
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Publish Python distribution
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: astral-sh/setup-uv@v5
|
|
15
|
+
- uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.12"
|
|
18
|
+
- name: Build wheel and source distribution
|
|
19
|
+
run: uv build
|
|
20
|
+
- name: Verify distribution metadata and release tag
|
|
21
|
+
run: >-
|
|
22
|
+
python scripts/verify_release_artifacts.py dist
|
|
23
|
+
--release-tag "${{ github.event.release.tag_name }}"
|
|
24
|
+
- uses: actions/upload-artifact@v4
|
|
25
|
+
with:
|
|
26
|
+
name: python-distributions
|
|
27
|
+
path: dist/
|
|
28
|
+
if-no-files-found: error
|
|
29
|
+
|
|
30
|
+
publish:
|
|
31
|
+
needs: build
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
environment:
|
|
34
|
+
name: pypi
|
|
35
|
+
url: https://pypi.org/p/memforge-ai
|
|
36
|
+
permissions:
|
|
37
|
+
id-token: write
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/download-artifact@v4
|
|
40
|
+
with:
|
|
41
|
+
name: python-distributions
|
|
42
|
+
path: dist/
|
|
43
|
+
- name: Publish to PyPI with Trusted Publishing
|
|
44
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
*.egg
|
|
8
|
+
.pytest_cache/
|
|
9
|
+
.ruff_cache/
|
|
10
|
+
.coverage
|
|
11
|
+
htmlcov/
|
|
12
|
+
|
|
13
|
+
# Virtual environments
|
|
14
|
+
.venv/
|
|
15
|
+
venv/
|
|
16
|
+
|
|
17
|
+
# Node / Vite
|
|
18
|
+
node_modules/
|
|
19
|
+
admin-ui/node_modules/
|
|
20
|
+
admin-ui/dist/
|
|
21
|
+
admin-ui/.tmp-test/
|
|
22
|
+
|
|
23
|
+
# Local runtime data and repository workspace configuration
|
|
24
|
+
data/
|
|
25
|
+
*.db
|
|
26
|
+
*.db-wal
|
|
27
|
+
*.db-shm
|
|
28
|
+
*.sqlite
|
|
29
|
+
*.sqlite-wal
|
|
30
|
+
*.sqlite-shm
|
|
31
|
+
.memforge/
|
|
32
|
+
|
|
33
|
+
# Local agent/editor config
|
|
34
|
+
docs/local/
|
|
35
|
+
.codex/
|
|
36
|
+
.claude/
|
|
37
|
+
.superpowers/
|
|
38
|
+
.agents/
|
|
39
|
+
!.agents/
|
|
40
|
+
!.agents/plugins/
|
|
41
|
+
!.agents/plugins/marketplace.json
|
|
42
|
+
.mcp.json
|
|
43
|
+
.mcp.local.json
|
|
44
|
+
AGENTS.local.md
|
|
45
|
+
CLAUDE.local.md
|
|
46
|
+
|
|
47
|
+
# Environment and secrets
|
|
48
|
+
.env
|
|
49
|
+
.env.*
|
|
50
|
+
!.env.example
|
|
51
|
+
!.env.*.example
|
|
52
|
+
*.pem
|
|
53
|
+
*.key
|
|
54
|
+
|
|
55
|
+
# OS / IDE
|
|
56
|
+
.DS_Store
|
|
57
|
+
Thumbs.db
|
|
58
|
+
.idea/
|
|
59
|
+
.vscode/
|
|
60
|
+
*.swp
|
|
61
|
+
*.swo
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.8.6
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
8
|
+
rev: v5.0.0
|
|
9
|
+
hooks:
|
|
10
|
+
- id: check-yaml
|
|
11
|
+
- id: end-of-file-fixer
|
|
12
|
+
- id: trailing-whitespace
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# AGENTS.md — Project conventions for Codex
|
|
2
|
+
|
|
3
|
+
## Code Quality
|
|
4
|
+
|
|
5
|
+
- Code should look like "first-place design", not "bug-fix archaeology." Comments, docstrings, and prompts should read as if the current approach was always the intended design. A new developer reading the code shouldn't see refactoring history.
|
|
6
|
+
- Prefer clean, robust ownership boundaries over fallback workarounds. Do not add DB-only fallback paths for lifecycle operations that also require search/vector cleanup; route those operations through the owning service instead.
|
|
7
|
+
- Do not introduce batching, reduce a batch size, or split a schema merely to bypass a provider limit or failing path. First identify whether the limit exposes a better schema, transport, ownership, or execution-boundary design; present the alternatives and tradeoffs to the user and obtain explicit confirmation before choosing batching as the remediation.
|
|
8
|
+
- When batching is explicitly approved or is already part of the workload contract, keep it a transport/computation detail: it must not create additional business or lifecycle states, weaken complete coverage, or change atomic and fail-closed correctness semantics.
|
|
9
|
+
|
|
10
|
+
## Project
|
|
11
|
+
|
|
12
|
+
- See `README.md` for setup and project orientation.
|
|
13
|
+
- See `docs/architecture.md` for the full system design.
|
|
14
|
+
- See `docs/design/agent-session-saas-plugin-flow.md` for the Codex and Claude Code adapter flow.
|
|
15
|
+
|
|
16
|
+
## Plugin Release Validation
|
|
17
|
+
|
|
18
|
+
- Test MemForge plugin changes through the same remote plugin install/update path that users use. Do not hand-edit files under `~/.codex/plugins/cache`, and do not add a manual MCP server entry as a workaround.
|
|
19
|
+
- For pre-release validation, publish or install a dev/RC plugin artifact from the remote GitHub marketplace source (`shno-labs/mem-forge`), such as `0.1.17-rc.1`, then promote the same commit/tag to the final release after validation.
|
|
20
|
+
- When cutting an MCP plugin version, commit the version bump and integration copies first, push the branch, then create a remote tag that names the plugin version, for example `memforge-memory-v0.1.21-rc.4`. Point Codex at that tag with `codex plugin marketplace add https://github.com/shno-labs/mem-forge.git --ref <tag>` and install with `codex plugin add memory@memforge`.
|
|
21
|
+
- After installing, verify `codex plugin list --json --marketplace memforge --available`, `codex mcp list`, the marketplace checkout commit/tag, and the cache directory under `~/.codex/plugins/cache/memforge/memory/<version>`. Restart Codex and repeat the version and MCP cwd checks; a restart must not fall back to an older cache.
|
|
22
|
+
- Keep the long-lived Claude Code `memforge` marketplace on the unpinned GitHub source `shno-labs/mem-forge` with auto-update enabled. Its user-level source in `~/.claude/settings.json` and `~/.claude/plugins/known_marketplaces.json` must not contain `ref`; otherwise each marketplace refresh remains locked to that branch or tag and cannot discover later plugin versions.
|
|
23
|
+
- Run Claude Code RC, branch, or release-tag installation tests under a disposable `CLAUDE_CONFIG_DIR` (or an equivalently isolated validation profile), never against the long-lived user configuration. Perform the marketplace add/install/update and restart checks inside that isolated profile, discard it after validation, and verify before release closure that the normal user marketplace still has no `ref`. Do not copy the isolated marketplace registry or plugin cache back into `~/.claude`.
|
|
24
|
+
- Keep Codex and Claude Code on the same remote plugin source. Neither client should reference `/Users/i551096/Dev/mem-inception` as a marketplace or plugin source, because local path installs hide packaging and cache drift.
|
|
25
|
+
- If Codex Desktop still falls back after a restart, check for workspace plugin sources such as `.agents/plugins/marketplace.json` in saved workspace roots. A local checkout can silently reinstall `memory@memforge` from its own `integrations/codex/memforge-memory` tree even when the configured marketplace points at the remote tag.
|
|
26
|
+
- Release gates for plugin changes should include unit tests, lint, package/install parity, MCP `initialize` and `tools/list` version/tool checks after restart, SessionStart and Stop/PreCompact hook smoke tests, and at least one harmless read/write MCP smoke in a test workspace when write tools change.
|
|
27
|
+
|
|
28
|
+
## Refactor/Deploy Goal Workflow
|
|
29
|
+
|
|
30
|
+
- Before starting a goal-scoped refactor, pull `main` first in every affected repo, then create a fresh `codex/` branch or isolated worktree from the updated main. Do not keep implementing on an older feature branch just because it is convenient.
|
|
31
|
+
- Before starting any PR merge, check the affected repo for existing open PRs and local/remote `codex/` branches that might be stale, superseded, or still awaiting action. Report the findings and explicitly call out whether any branch or PR should be handled before the merge.
|
|
32
|
+
- Treat the approved design and implementation plan as the completion contract. Audit the current implementation against every design requirement before claiming the design is fully covered.
|
|
33
|
+
- Record every user-approved deferred MemForge feature or optimization as one GitHub Issue in the coordinating repository. The issue must state the problem and evidence, affected repositories, execution trigger, acceptance criteria, explicit non-goals, type/area, `status:candidate` or `status:ready`, and `priority:P0` through `priority:P3`. Do not treat chat, handoff notes, ADR asides, or duplicate cross-repo issues as the execution backlog, and do not prescribe an unreviewed implementation as settled design.
|
|
34
|
+
- When a validated change materially corrects or clarifies the design, update the repo-owned `docs/adr` record in the same goal/PR. Persist the durable decision and consequences, not the debugging chronology.
|
|
35
|
+
- Use online research when making design or technical judgment calls, especially for retrieval, ranking, database search, GraphRAG, deployment, security, or API-contract decisions. Prefer primary sources and current official docs; when useful, inspect relevant open-source project designs or code for implementation insight before settling the approach.
|
|
36
|
+
- When explaining or refining retrieval behavior, lead with the runtime flow: user query, independent retrieval channels, fusion/ranking, and exact source/time/visibility predicates. Distinguish vector search, content BM25, metadata lexical channels, graph expansion, and deterministic source/time listing.
|
|
37
|
+
- Run review incrementally while implementing. When the user asks for two reviewers, use exactly two independent reviewer lanes: one Claude Code reviewer and one Codex reviewer. Do not defer review until a large final diff.
|
|
38
|
+
- Reviewer feedback is evidence to evaluate. For each finding, decide whether it is valid for the design/runtime contract, whether the proposed fix is proportionate, and whether it should be implemented, rejected, or deferred; record that decision in a handoff log outside the repo.
|
|
39
|
+
- Continue the review/fix loop until both reviewers and the implementer approve the result, with no accepted blocker left open.
|
|
40
|
+
- For cloud-impacting changes, CF deploy and detailed smoke testing are required before the goal can be considered complete. Record the deployment target, smoke commands or UI/API steps, and redacted evidence in the handoff log.
|
|
41
|
+
- Open PRs for every repo with committed changes. The goal is not complete until the relevant PRs exist, verification evidence is recorded, and no required repo is left with uncommitted goal work.
|
|
42
|
+
|
|
43
|
+
## OSS Self-Hosted Release Validation
|
|
44
|
+
|
|
45
|
+
- Validate self-hosted releases through the documented newcomer path: a clean Docker Compose project, loopback-only ports unless explicitly testing exposure, the default SQLite-backed data volume, Admin UI/API startup, first-run model configuration, a representative source sync, memory retrieval, and the packaged local MCP path.
|
|
46
|
+
- Use an isolated Compose project and dedicated volume for smoke tests. Never reuse or delete a developer's existing MemForge volume, source data, plugin cache, or external service state merely to obtain a clean result.
|
|
47
|
+
- Prove SQLite persistence by restarting the API or Compose stack against the same isolated data volume and rechecking sources, documents, memories, keyword/vector health, and MCP retrieval.
|
|
48
|
+
- Treat source support as an execution matrix, not a registry count. For each registered source type, state whether server collection, local-agent collection, managed intake, credentials, browser sessions, VPN/internal reachability, or an external provider is required. Classify each type as verified, unsupported by design, blocked by a missing prerequisite, or failed.
|
|
49
|
+
- Exercise local-agent sources through the real server-issued job and daemon path. A direct package injection may diagnose the service boundary, but it does not prove that the documented daemon workflow works.
|
|
50
|
+
- For public-beta readiness, separately assess newcomer reproducibility, first-run UX, error messages, documentation accuracy, default data/privacy boundaries, and obvious exposure or secret-handling footguns. Give a conservative `GO`, `CONDITIONAL GO`, or `NO-GO`, with the smallest required fixes or disclosure language.
|
|
51
|
+
- Do not present fixture-backed LLM/provider behavior as production-provider validation. Record the fixture contract, then distinguish it from real connector credentials and model-provider coverage.
|
|
52
|
+
|
|
53
|
+
## Lifecycle Canary Convergence
|
|
54
|
+
|
|
55
|
+
- Before another retry or canary, review the complete design contract and static call path for the affected state transition: transaction ownership, operation ordering, idempotency, stale guards, retry semantics, and SQLite/Cloud adapter parity.
|
|
56
|
+
- Define a falsifiable hypothesis and the exact confirming or rejecting evidence before changing code or data. Classify historical data, migration residue, and one-off provider/runtime failures separately from reproducible shared-contract violations.
|
|
57
|
+
- Prefer one bounded joint snapshot that correlates durable runs/jobs, Lifecycle Plans and mutations, current and stale Support, Source Projection lineage, Reviews/Findings, vector outbox, and process health. Do not replace it with repeated narrow probes that guess at adjacent causes.
|
|
58
|
+
- Use a bounded convergence sequence: one report-only inventory, one exact dry-run, one controlled apply when authorized, and one strict incremental audit. Stop when the incremental audit is clean and no relevant state changed.
|
|
59
|
+
- Never fabricate Evidence, infer missing provenance from semantic similarity, or silently rewrite lifecycle history to make an audit pass. Preserve historical Plans, Relations, Reviews, Findings, and failed jobs.
|
|
60
|
+
- Report current and historical populations separately. Distinguish active Memories from superseded or retired lifecycle records and classify unexpected growth by lifecycle reason and bounded time cohort.
|
|
61
|
+
|
|
62
|
+
## Architecture Decision Ownership
|
|
63
|
+
|
|
64
|
+
- Record shared Memory lifecycle, retrieval, and storage-contract decisions in an OSS `docs/adr` record as the canonical design source. This includes transaction boundaries and work/outbox semantics that every storage adapter must implement.
|
|
65
|
+
- Do not duplicate shared semantics in a Cloud ADR. Update a Cloud ADR only for a material HANA, Cloud Foundry, or other cloud-only consequence; link the canonical OSS ADR and describe only how Cloud implements or constrains that shared contract.
|
|
66
|
+
|
|
67
|
+
## OSS and Cloud Contract Consistency
|
|
68
|
+
|
|
69
|
+
- Treat OSS storage/service protocols as the source of truth for shared behavior. Cloud adapters must implement the same method names, signatures, visibility semantics, filters, pagination, transaction/work semantics, and error behavior unless a documented cloud-only route applies.
|
|
70
|
+
- Keep caller identity and visibility explicit in contracts, including `include_private`, `owner_user_id`, `AccessScope`, source/status/project filters, limit, and offset.
|
|
71
|
+
- Test shared behavior at the boundary users hit: route/service input, generated store query or adapter call, and returned count/list/detail semantics. A method-existence assertion alone is not contract coverage.
|
|
72
|
+
- For shared routes and services, keep adapter-level contract coverage that proves SQLite/OSS and Cloud interpret the contract consistently. Test fixtures and fake stores must implement current protocol signatures; a permissive or narrower fake is contract drift.
|
|
73
|
+
- Do not add source-type special cases, compatibility bridges, or route-level fallbacks to hide adapter drift. Update the shared protocol and each adapter implementation directly.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 - Unreleased
|
|
4
|
+
|
|
5
|
+
- Initial public repository preparation.
|
|
6
|
+
- Self-hosted MemForge service with FastAPI admin API, SQLite persistence,
|
|
7
|
+
FTS search, Chroma vector search, and MCP tools.
|
|
8
|
+
- React admin UI for memories, entities, sources, review, and settings.
|
|
9
|
+
- Codex and Claude Code integration packages with thin hook adapters and
|
|
10
|
+
service-owned agent-session package generation.
|
|
11
|
+
- Jira browser-session capture now runs in the client CLI and uploads to the
|
|
12
|
+
server over POST /api/auth/jira-session; the server no longer scrapes a
|
|
13
|
+
browser. New `memforge adapter auth jira watch` keeps the session fresh
|
|
14
|
+
proactively. PAT mode is unchanged.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# CLAUDE.md — Project conventions for Claude Code
|
|
2
|
+
|
|
3
|
+
## Code Quality
|
|
4
|
+
|
|
5
|
+
- Code should look like "first-place design", not "bug-fix archaeology." Comments, docstrings, and prompts should read as if the current approach was always the intended design. A new developer reading the code shouldn't see refactoring history.
|
|
6
|
+
|
|
7
|
+
## Project
|
|
8
|
+
|
|
9
|
+
- See `README.md` for setup and project orientation.
|
|
10
|
+
- See `docs/architecture.md` for the full system design.
|
|
11
|
+
- See `docs/design/agent-session-saas-plugin-flow.md` for the Codex and Claude Code adapter flow.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Code Of Conduct
|
|
2
|
+
|
|
3
|
+
MemForge should be a useful place to build and discuss agent memory systems.
|
|
4
|
+
Be direct, kind, and technical. Assume good intent, but do not excuse behavior
|
|
5
|
+
that makes collaboration harder for others.
|
|
6
|
+
|
|
7
|
+
Expected behavior:
|
|
8
|
+
|
|
9
|
+
- welcome newcomers and answer questions with patience
|
|
10
|
+
- critique ideas and code, not people
|
|
11
|
+
- keep discussions relevant to the project
|
|
12
|
+
- respect private data and do not ask people to share secrets or proprietary
|
|
13
|
+
transcripts
|
|
14
|
+
|
|
15
|
+
Unacceptable behavior:
|
|
16
|
+
|
|
17
|
+
- harassment, personal attacks, or discriminatory language
|
|
18
|
+
- publishing another person's private information
|
|
19
|
+
- repeatedly derailing issues or pull requests
|
|
20
|
+
- knowingly submitting credentials, malware, or private data
|
|
21
|
+
|
|
22
|
+
Maintainers may edit, hide, or remove comments and contributions that violate
|
|
23
|
+
this code of conduct.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Domain Context
|
|
2
|
+
|
|
3
|
+
## Workspace selection
|
|
4
|
+
|
|
5
|
+
- **Workspace Directory** — The principal-scoped list of workspaces the caller may know about, including current active/selectable state. Listing it is discovery, not a prerequisite for data-plane requests.
|
|
6
|
+
- **Requested Workspace** — An explicit `workspace_id` supplied on one HTTP or MCP operation. It is validated without revealing inaccessible workspaces.
|
|
7
|
+
- **Local Workspace Binding** — A user-confirmed client-side mapping from a Git repository or ordinary directory to a workspace. It supplies a request selector without sending the local path or granting authority.
|
|
8
|
+
- **Hook Workspace Fallback** — An optional client-local workspace used only by automatic hooks when no project binding or pinned session selection exists. It never scopes an interactive operation.
|
|
9
|
+
- **Authorized Workspace Context** — The single workspace selected, authorized, and bound to one data-plane request. Handlers and durable work consume this context rather than resolving workspace again.
|
|
10
|
+
- **Workspace Selection Source** — The reason the Authorized Workspace Context was chosen: Requested Workspace or the caller's singleton accessible workspace.
|
|
11
|
+
- **Repository Context** — Repository attribution used for provenance and retrieval relevance. It never selects or authorizes a workspace.
|
|
12
|
+
|
|
13
|
+
## Source synchronization
|
|
14
|
+
|
|
15
|
+
- **Source Lifecycle** — Whether a configured source is active or paused. Lifecycle is independent of where collection executes and whether the current device can perform that collection.
|
|
16
|
+
- **Local Execution** — Collection work that must run through the source owner's MemForge daemon on a user-controlled device.
|
|
17
|
+
- **Device Readiness** — Whether the source owner's local daemon is recently connected and able to accept collection work.
|
|
18
|
+
- **Connection Readiness** — Whether a source-specific connection dependency, such as an authenticated browser session, is usable or requires user action.
|
|
19
|
+
- **Local Source Readiness** — The user-facing result derived from Device Readiness and Connection Readiness for a source that uses Local Execution. It never replaces Source Lifecycle.
|
|
20
|
+
- **Source Readiness** — The compact source-row outcome derived from execution location, Device Readiness when collection is local, and Connection Readiness when the connector exposes it.
|
|
21
|
+
- **Source Sync Activity** — The user-visible lifecycle of current or recent work to bring one source up to date. It can cover both collection from the source and processing into memories.
|
|
22
|
+
- **Collection** — Reading source items and, when required, transferring them from the execution device to MemForge.
|
|
23
|
+
- **Collection Manifest** — An attempt-scoped declaration of stable Source Item identities and opaque revisions. It describes discovered membership without carrying every item body.
|
|
24
|
+
- **Collection Coverage** — The proof attached to one collection result: a Complete Snapshot covers the whole configured scope, a Bounded Delta covers only explicit changes since a checkpoint, and Partial coverage proves neither absence nor a safe checkpoint advance.
|
|
25
|
+
- **Candidate Checkpoint** — A provider position proposed by collection but not made current until the corresponding Source Projection and lifecycle transaction succeeds.
|
|
26
|
+
- **Processing** — Turning collected source items into stored documents and memories.
|
|
27
|
+
- **Attachment Inventory** — The current provider entities owned by a source item, whether or not the item's current body references or displays them. Inventory membership alone does not make an attachment current Source Evidence.
|
|
28
|
+
- **Body Artifact Reference** — An authoritative reference from one exact current source-body revision to a provider Artifact. It preserves the provider's reference semantics rather than inferring reachability from filenames, URLs, or attachment ownership.
|
|
29
|
+
- **Effective Source Artifact** — A current provider Artifact reached through a resolved Body Artifact Reference and pinned to its exact provider identity and revision. Only Effective Source Artifacts enter current materialization, Source Projection, and derivation.
|
|
30
|
+
- **Artifact Membership Coverage** — Whether every Artifact-producing construct in one current source-body revision was resolved against authoritative provider inventory. Only Complete coverage makes an omitted prior Artifact an authoritative removal.
|
|
31
|
+
- **Progress Snapshot** — The latest trustworthy statement of an activity's phase and measurable progress. It is a current observation, not a history of progress events.
|
|
32
|
+
- **Determinate Progress** — Progress with a trustworthy total, presented as completed out of total.
|
|
33
|
+
- **Indeterminate Progress** — Progress whose total is not yet knowable, presented without a percentage while still reporting useful counts when available.
|
|
34
|
+
|
|
35
|
+
## Memory provenance
|
|
36
|
+
|
|
37
|
+
- **Memory Origin Kind** — The derived category describing how one provenance source introduced knowledge into MemForge: **Direct User** for an explicit user lifecycle action, **Managed Capture** for a system-managed coding-agent capture, or **Configured Source** for a user-configured ingestion connection. It does not replace Source Type, Client, Repository Context, ownership, or visibility.
|
|
38
|
+
- **Direct User** — Knowledge explicitly confirmed through a user lifecycle action such as creating or correcting a Memory. The submitting coding agent is the Client, and an associated repository is Repository Context; neither becomes the Source.
|
|
39
|
+
- **Managed Capture** — Knowledge produced from a system-created capture Source, such as an Agent Session Source, without requiring the user to configure an ingestion connection.
|
|
40
|
+
- **Configured Source** — Knowledge produced from a user-configured ingestion connection such as Confluence, Jira, Teams, GitHub Repository, or Local Repository.
|
|
41
|
+
|
|
42
|
+
## Memory retrieval
|
|
43
|
+
|
|
44
|
+
- **Requested Retrieval Intent** — An optional query-scoped hint selected by an Agent Client from the user's conversational goal. It may request General Hybrid Retrieval, Known Item Lookup, or Relationship Exploration, but cannot weaken visibility, provenance, or facet constraints.
|
|
45
|
+
- **Resolved Retrieval Intent** — The validated query-scoped purpose that selects ranked retrieval behavior from the user's goal rather than from the query language or an individual retrieval mechanism. The service resolves General Hybrid Retrieval, Known Item Lookup, or Relationship Exploration from a valid Requested Retrieval Intent or a deterministic fallback.
|
|
46
|
+
- **General Hybrid Retrieval** — Ranked retrieval for an open-ended natural-language query, including when the query and relevant Memory use different languages. Semantic, content lexical, metadata lexical, and relationship evidence remain independent contributors rather than mutually exclusive modes. Avoid: _Semantic lookup, lexical lookup_.
|
|
47
|
+
- **Known Item Lookup** — Ranked retrieval for a specifically named or identified item, such as an external identifier, title, or code symbol. An Agent Client keeps the query self-contained and quotes an exact title or name when conversation context supplies one; the service may use that explicit identity for bounded metadata recall while preserving the full query for the other channels. It expresses the user's expected target, not a lexical-only implementation.
|
|
48
|
+
- **Relationship Exploration** — Ranked retrieval whose primary goal is to discover Memories connected through entities or relationships. It does not bypass normal visibility or provenance constraints.
|
|
49
|
+
- **Deterministic Listing** — A separate current-state enumeration constrained by an explicit time window and optional Source facets, without relevance ranking or an invented query. It is not a Resolved Retrieval Intent. Avoid: _Empty search, queryless semantic search_.
|
|
50
|
+
|
|
51
|
+
## Memory lifecycle migration
|
|
52
|
+
|
|
53
|
+
- **Lifecycle Migration Inventory** — A backend scan of every active Configured Source in the datastore, without applying a caller's source-discoverability filter. Agent Session sources are candidates when the Lifecycle Gate is not Enabled or the bidirectional Active Same-Source Support Invariant is violated in either direction. Inventory output contains identifiers and counts, never private source content or owner identity.
|
|
54
|
+
- **Active Same-Source Support Invariant** — Support authority and its source provenance projection are bidirectionally complete for active configured-source Memories: every `memory_sources` edge has active same-source Support, and every active Support has the exact `memory_sources` edge for its Evidence document. An Enabled gate does not override either violation.
|
|
55
|
+
- **Support Provenance Projection** — The `memory_sources` read model used by source facets, source-card counts, timestamps, access filtering, and document provenance. It materializes exact active Support membership but is not lifecycle authority; a cross-document Relation without Support does not create this projection.
|
|
56
|
+
- **Lifecycle Migration Attempt** — One idempotent durable recovery job identified by an explicit attempt label. Unprovable lineage remains a durable open finding and keeps destructive lifecycle gated; semantic similarity cannot close it.
|
|
57
|
+
- **Non-Migrating SQLite Open** — An existing SQLite workspace opened through `Database.connect(run_migrations=False)`. It uses SQLite read-only/query-only mode, does not create the database or parent directories, and does not create schema or run migrations. It is for operator evaluation, never normal serving or repair.
|
|
58
|
+
|
|
59
|
+
## Memory review
|
|
60
|
+
|
|
61
|
+
- **Review** — An auditable request for a human-authorized decision when MemForge cannot safely complete or classify a Memory change on its own. Review status records whether that request is pending or terminal; it is not a Memory lifecycle state.
|
|
62
|
+
- **Review Decision** — One action allowed by a Review's kind and presentation, together with its exact lifecycle postcondition. The same approve or reject storage result can represent different user-facing decisions only when the presentation states those consequences explicitly.
|
|
63
|
+
- **Decision Fingerprint** — A deterministic digest of the Review identity, pinned participants, and proposed decision input. A caller must present the current fingerprint when applying a decision so analysis of an older Review cannot mutate newer state.
|
|
64
|
+
- **Decision Manifest** — A bounded, caller-supplied set of Review Decisions and Decision Fingerprints proposed for validation or confirmed application. It is request data, not a durable workflow, lifecycle state, or all-or-nothing transaction.
|
|
65
|
+
- **Cross-Source Conflict Review** — A Review of a proposed contradiction between two independently supported active Memories. Confirming or dismissing the finding closes the Review but does not select source authority or retire either Memory.
|
|
66
|
+
|
|
67
|
+
## Connector authentication
|
|
68
|
+
|
|
69
|
+
- **Teams Access Token** — A short-lived bearer credential that authorizes one local Teams collection session against a specific Teams service audience.
|
|
70
|
+
- **Teams Browser Session** — A persistent, user-authenticated Teams Web session that can acquire fresh Teams Access Tokens without another visible sign-in while enterprise SSO remains valid.
|
|
71
|
+
- **Silent Session Renewal** — Renewal of a Teams Access Token through the Teams Browser Session without presenting authentication UI to the user.
|
|
72
|
+
- **Interactive Reauthentication** — A visible Teams Web sign-in required when the Teams Browser Session can no longer renew silently because enterprise SSO, MFA, or access policy requires user interaction.
|
|
73
|
+
|
|
74
|
+
## Source organization
|
|
75
|
+
|
|
76
|
+
**Project**:
|
|
77
|
+
A semantic relevance grouping for memories and their sources inside a workspace. A Project is not a personal list organization mechanism or an access boundary.
|
|
78
|
+
_Avoid_: Collection, folder, source group
|
|
79
|
+
|
|
80
|
+
**Source**:
|
|
81
|
+
A configured connection that contributes source items and memories to a workspace.
|
|
82
|
+
_Avoid_: Integration instance, connector row
|
|
83
|
+
|
|
84
|
+
**Source List View**:
|
|
85
|
+
A user's presentation of Sources in one workspace. It may filter, sort, or prioritize Sources without changing their configuration or Project binding.
|
|
86
|
+
_Avoid_: Collection
|
|
87
|
+
|
|
88
|
+
**Pinned Source**:
|
|
89
|
+
A Source prioritized for one user within its existing Project group. Pinning neither moves nor duplicates the Source and has no effect on other users.
|
|
90
|
+
_Avoid_: Favorite collection, promoted source
|
|
91
|
+
|
|
92
|
+
**Source List Sort**:
|
|
93
|
+
A user's ordering preference applied independently inside each Project group after Pinned Sources have been prioritized.
|
|
94
|
+
_Avoid_: Source priority
|
|
95
|
+
|
|
96
|
+
**Source Search**:
|
|
97
|
+
An ephemeral narrowing of the Source List View by Source name, source type, or Project. Searching does not change persisted Source organization.
|
|
98
|
+
_Avoid_: Source query
|
|
99
|
+
|
|
100
|
+
## GitHub Repository scope
|
|
101
|
+
|
|
102
|
+
- **Repository Access** — Where GitHub API access executes. `cloud_pull` uses MemForge Cloud credentials and network access; `local_push` uses the source owner's daemon, local `gh` session, VPN, and network access. It never changes the data origin: both modes read the configured remote GitHub repository. Avoid: _Local clone mode, local repository_.
|
|
103
|
+
- **Repository Base Scope** — The positive boundary of a GitHub Repository source. An empty `include_paths` list means the whole repository; otherwise only the selected remote folders and files are candidates. Avoid: _Local folder selection_.
|
|
104
|
+
- **Repository Exclusion** — A selected remote folder or file removed from the Repository Base Scope. Exclusions win over inclusions and apply to all descendants. A child below an excluded path cannot be re-included. Avoid: _Ignore hint, inferred outdated content_.
|
|
105
|
+
- **Effective Repository Scope** — The deterministic set of remote files remaining after base scope, exclusions, and extension filters are applied. Suggested exclusions require explicit user confirmation and never change this set automatically.
|
|
106
|
+
- **Repository File Identity** — Built-in GitHub Repository collection identifies a file by canonical repository path because Git has no immutable file ID. A path move is a removed file plus a new file unless a future/provider adapter supplies explicit authoritative rename evidence; matching blob SHA alone never proves a move because copy plus delete is ambiguous.
|