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.
Files changed (568) hide show
  1. memforge_ai-0.1.55/.agents/plugins/marketplace.json +20 -0
  2. memforge_ai-0.1.55/.claude-plugin/marketplace.json +16 -0
  3. memforge_ai-0.1.55/.dockerignore +19 -0
  4. memforge_ai-0.1.55/.env.example +33 -0
  5. memforge_ai-0.1.55/.env.mirrors.example +15 -0
  6. memforge_ai-0.1.55/.github/ISSUE_TEMPLATE/bug_report.yml +29 -0
  7. memforge_ai-0.1.55/.github/ISSUE_TEMPLATE/feature_request.yml +24 -0
  8. memforge_ai-0.1.55/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. memforge_ai-0.1.55/.github/assets/memforge-banner.png +0 -0
  10. memforge_ai-0.1.55/.github/workflows/ci.yml +40 -0
  11. memforge_ai-0.1.55/.github/workflows/publish-pypi.yml +44 -0
  12. memforge_ai-0.1.55/.gitignore +61 -0
  13. memforge_ai-0.1.55/.pre-commit-config.yaml +12 -0
  14. memforge_ai-0.1.55/AGENTS.md +73 -0
  15. memforge_ai-0.1.55/CHANGELOG.md +14 -0
  16. memforge_ai-0.1.55/CLAUDE.md +11 -0
  17. memforge_ai-0.1.55/CODE_OF_CONDUCT.md +23 -0
  18. memforge_ai-0.1.55/CONTEXT.md +106 -0
  19. memforge_ai-0.1.55/CONTRIBUTING.md +68 -0
  20. memforge_ai-0.1.55/Dockerfile +68 -0
  21. memforge_ai-0.1.55/LICENSE +157 -0
  22. memforge_ai-0.1.55/Makefile +30 -0
  23. memforge_ai-0.1.55/PKG-INFO +499 -0
  24. memforge_ai-0.1.55/README.md +291 -0
  25. memforge_ai-0.1.55/SECURITY.md +32 -0
  26. memforge_ai-0.1.55/admin-ui/.gitignore +3 -0
  27. memforge_ai-0.1.55/admin-ui/Dockerfile +25 -0
  28. memforge_ai-0.1.55/admin-ui/components.json +25 -0
  29. memforge_ai-0.1.55/admin-ui/eslint.config.js +23 -0
  30. memforge_ai-0.1.55/admin-ui/index.html +13 -0
  31. memforge_ai-0.1.55/admin-ui/nginx.conf +20 -0
  32. memforge_ai-0.1.55/admin-ui/package-lock.json +8837 -0
  33. memforge_ai-0.1.55/admin-ui/package.json +74 -0
  34. memforge_ai-0.1.55/admin-ui/public/favicon.svg +7 -0
  35. memforge_ai-0.1.55/admin-ui/src/App.tsx +94 -0
  36. memforge_ai-0.1.55/admin-ui/src/api/client.ts +80 -0
  37. memforge_ai-0.1.55/admin-ui/src/api/localAgentJobs.ts +53 -0
  38. memforge_ai-0.1.55/admin-ui/src/api/projectKeys.ts +15 -0
  39. memforge_ai-0.1.55/admin-ui/src/api/types.ts +671 -0
  40. memforge_ai-0.1.55/admin-ui/src/brand.ts +4 -0
  41. memforge_ai-0.1.55/admin-ui/src/components/admin/AsyncBoundary.tsx +49 -0
  42. memforge_ai-0.1.55/admin-ui/src/components/admin/DataSurface.tsx +10 -0
  43. memforge_ai-0.1.55/admin-ui/src/components/admin/EmptyState.tsx +21 -0
  44. memforge_ai-0.1.55/admin-ui/src/components/admin/FilterSelect.tsx +39 -0
  45. memforge_ai-0.1.55/admin-ui/src/components/admin/PageHeader.tsx +21 -0
  46. memforge_ai-0.1.55/admin-ui/src/components/admin/Pagination.tsx +53 -0
  47. memforge_ai-0.1.55/admin-ui/src/components/admin/SearchInput.tsx +44 -0
  48. memforge_ai-0.1.55/admin-ui/src/components/admin/SourceSyncStatusCard.tsx +88 -0
  49. memforge_ai-0.1.55/admin-ui/src/components/admin/StatusBadge.tsx +39 -0
  50. memforge_ai-0.1.55/admin-ui/src/components/admin/Toolbar.tsx +10 -0
  51. memforge_ai-0.1.55/admin-ui/src/components/brand/TaiSealLogo.tsx +19 -0
  52. memforge_ai-0.1.55/admin-ui/src/components/layout/ActiveProjectChip.tsx +200 -0
  53. memforge_ai-0.1.55/admin-ui/src/components/layout/AppShell.tsx +27 -0
  54. memforge_ai-0.1.55/admin-ui/src/components/layout/CommandSearch.tsx +16 -0
  55. memforge_ai-0.1.55/admin-ui/src/components/layout/CrossProjectBanner.tsx +46 -0
  56. memforge_ai-0.1.55/admin-ui/src/components/layout/Sidebar.tsx +238 -0
  57. memforge_ai-0.1.55/admin-ui/src/components/layout/Topbar.tsx +73 -0
  58. memforge_ai-0.1.55/admin-ui/src/components/memories/MemoryTypeIcon.tsx +36 -0
  59. memforge_ai-0.1.55/admin-ui/src/components/sources/SourceIcon.tsx +80 -0
  60. memforge_ai-0.1.55/admin-ui/src/components/ui/badge.tsx +52 -0
  61. memforge_ai-0.1.55/admin-ui/src/components/ui/button.tsx +58 -0
  62. memforge_ai-0.1.55/admin-ui/src/components/ui/card.tsx +103 -0
  63. memforge_ai-0.1.55/admin-ui/src/components/ui/dialog.tsx +153 -0
  64. memforge_ai-0.1.55/admin-ui/src/components/ui/input.tsx +20 -0
  65. memforge_ai-0.1.55/admin-ui/src/components/ui/select.tsx +162 -0
  66. memforge_ai-0.1.55/admin-ui/src/components/ui/separator.tsx +23 -0
  67. memforge_ai-0.1.55/admin-ui/src/components/ui/switch.tsx +32 -0
  68. memforge_ai-0.1.55/admin-ui/src/components/ui/table.tsx +116 -0
  69. memforge_ai-0.1.55/admin-ui/src/extension.ts +249 -0
  70. memforge_ai-0.1.55/admin-ui/src/index.css +127 -0
  71. memforge_ai-0.1.55/admin-ui/src/lib/constants.ts +8 -0
  72. memforge_ai-0.1.55/admin-ui/src/lib/pagination.ts +32 -0
  73. memforge_ai-0.1.55/admin-ui/src/lib/utils.ts +6 -0
  74. memforge_ai-0.1.55/admin-ui/src/lib/workspace.ts +13 -0
  75. memforge_ai-0.1.55/admin-ui/src/main.tsx +10 -0
  76. memforge_ai-0.1.55/admin-ui/src/state/activeProject.ts +153 -0
  77. memforge_ai-0.1.55/admin-ui/src/utils/date.ts +33 -0
  78. memforge_ai-0.1.55/admin-ui/src/views/entities/EntitiesPage.tsx +136 -0
  79. memforge_ai-0.1.55/admin-ui/src/views/entities/EntityDetailPage.tsx +277 -0
  80. memforge_ai-0.1.55/admin-ui/src/views/memories/MemoriesPage.tsx +583 -0
  81. memforge_ai-0.1.55/admin-ui/src/views/memories/MemoryDetailPage.tsx +295 -0
  82. memforge_ai-0.1.55/admin-ui/src/views/memories/MemoryFiltersPopover.tsx +217 -0
  83. memforge_ai-0.1.55/admin-ui/src/views/memories/lifecycle.ts +83 -0
  84. memforge_ai-0.1.55/admin-ui/src/views/memories/memoryTypeMeta.ts +25 -0
  85. memforge_ai-0.1.55/admin-ui/src/views/projects/ProjectCreateFields.tsx +103 -0
  86. memforge_ai-0.1.55/admin-ui/src/views/projects/ProjectDetailPage.tsx +508 -0
  87. memforge_ai-0.1.55/admin-ui/src/views/projects/ProjectEditDialog.tsx +182 -0
  88. memforge_ai-0.1.55/admin-ui/src/views/projects/ProjectsPage.tsx +403 -0
  89. memforge_ai-0.1.55/admin-ui/src/views/projects/projectCreateForm.ts +25 -0
  90. memforge_ai-0.1.55/admin-ui/src/views/review/ReviewDetailPage.tsx +337 -0
  91. memforge_ai-0.1.55/admin-ui/src/views/review/ReviewInteraction.test.tsx +305 -0
  92. memforge_ai-0.1.55/admin-ui/src/views/review/ReviewQueuePage.tsx +211 -0
  93. memforge_ai-0.1.55/admin-ui/src/views/review/reviewQueueCue.ts +85 -0
  94. memforge_ai-0.1.55/admin-ui/src/views/schedules/SchedulesPage.tsx +247 -0
  95. memforge_ai-0.1.55/admin-ui/src/views/settings/SettingsPage.tsx +589 -0
  96. memforge_ai-0.1.55/admin-ui/src/views/sources/GitHubRepoFolderPicker.tsx +514 -0
  97. memforge_ai-0.1.55/admin-ui/src/views/sources/LocalAgentDaemonStatus.tsx +81 -0
  98. memforge_ai-0.1.55/admin-ui/src/views/sources/ProjectBindingFields.tsx +638 -0
  99. memforge_ai-0.1.55/admin-ui/src/views/sources/ProjectGroup.tsx +101 -0
  100. memforge_ai-0.1.55/admin-ui/src/views/sources/SchemaSourceSetup.tsx +1159 -0
  101. memforge_ai-0.1.55/admin-ui/src/views/sources/SourceAccessChangeDialog.tsx +122 -0
  102. memforge_ai-0.1.55/admin-ui/src/views/sources/SourceAccessSection.tsx +98 -0
  103. memforge_ai-0.1.55/admin-ui/src/views/sources/SourceReadinessAlert.tsx +98 -0
  104. memforge_ai-0.1.55/admin-ui/src/views/sources/SourceRow.tsx +581 -0
  105. memforge_ai-0.1.55/admin-ui/src/views/sources/SourceSetupDialog.tsx +108 -0
  106. memforge_ai-0.1.55/admin-ui/src/views/sources/SourceSetupShell.tsx +165 -0
  107. memforge_ai-0.1.55/admin-ui/src/views/sources/SourcesPage.tsx +1699 -0
  108. memforge_ai-0.1.55/admin-ui/src/views/sources/TeamsSourceSetup.tsx +509 -0
  109. memforge_ai-0.1.55/admin-ui/src/views/sources/confluenceConfig.ts +107 -0
  110. memforge_ai-0.1.55/admin-ui/src/views/sources/githubRepoFolderPickerUtils.ts +214 -0
  111. memforge_ai-0.1.55/admin-ui/src/views/sources/localAgentDaemonStatusQuery.ts +17 -0
  112. memforge_ai-0.1.55/admin-ui/src/views/sources/localAgentSources.ts +13 -0
  113. memforge_ai-0.1.55/admin-ui/src/views/sources/managedSources.ts +38 -0
  114. memforge_ai-0.1.55/admin-ui/src/views/sources/projectBinding.ts +28 -0
  115. memforge_ai-0.1.55/admin-ui/src/views/sources/projectGrouping.ts +185 -0
  116. memforge_ai-0.1.55/admin-ui/src/views/sources/sourceAccess.ts +7 -0
  117. memforge_ai-0.1.55/admin-ui/src/views/sources/sourceActions.ts +104 -0
  118. memforge_ai-0.1.55/admin-ui/src/views/sources/sourceBrand.ts +111 -0
  119. memforge_ai-0.1.55/admin-ui/src/views/sources/sourceConnectionPresentation.ts +21 -0
  120. memforge_ai-0.1.55/admin-ui/src/views/sources/sourceListOrganization.ts +85 -0
  121. memforge_ai-0.1.55/admin-ui/src/views/sources/sourceReadiness.ts +34 -0
  122. memforge_ai-0.1.55/admin-ui/src/views/sources/sourceSetupAdapters.ts +336 -0
  123. memforge_ai-0.1.55/admin-ui/src/views/sources/sourceSyncActivity.ts +361 -0
  124. memforge_ai-0.1.55/admin-ui/src/views/sources/teamsSourceConfig.ts +148 -0
  125. memforge_ai-0.1.55/admin-ui/tests/api-target.test.ts +84 -0
  126. memforge_ai-0.1.55/admin-ui/tests/brand.test.ts +8 -0
  127. memforge_ai-0.1.55/admin-ui/tests/button-interaction.test.ts +35 -0
  128. memforge_ai-0.1.55/admin-ui/tests/confluence-config.test.ts +40 -0
  129. memforge_ai-0.1.55/admin-ui/tests/extension.test.ts +175 -0
  130. memforge_ai-0.1.55/admin-ui/tests/github-repo-folder-picker.test.ts +166 -0
  131. memforge_ai-0.1.55/admin-ui/tests/lifecycle.test.ts +79 -0
  132. memforge_ai-0.1.55/admin-ui/tests/local-agent-daemon-status.test.ts +181 -0
  133. memforge_ai-0.1.55/admin-ui/tests/local-agent-sync-progress.test.ts +367 -0
  134. memforge_ai-0.1.55/admin-ui/tests/local-markdown-config.test.ts +103 -0
  135. memforge_ai-0.1.55/admin-ui/tests/managed-sources.test.ts +144 -0
  136. memforge_ai-0.1.55/admin-ui/tests/memories-project-filter.test.ts +120 -0
  137. memforge_ai-0.1.55/admin-ui/tests/memory-type-icons.test.ts +22 -0
  138. memforge_ai-0.1.55/admin-ui/tests/pagination.test.ts +68 -0
  139. memforge_ai-0.1.55/admin-ui/tests/private-memory-detail.test.ts +25 -0
  140. memforge_ai-0.1.55/admin-ui/tests/project-binding.test.ts +21 -0
  141. memforge_ai-0.1.55/admin-ui/tests/review-decision-ux.test.ts +60 -0
  142. memforge_ai-0.1.55/admin-ui/tests/schedules.test.ts +140 -0
  143. memforge_ai-0.1.55/admin-ui/tests/sidebar-layout.test.ts +100 -0
  144. memforge_ai-0.1.55/admin-ui/tests/source-actions.test.ts +551 -0
  145. memforge_ai-0.1.55/admin-ui/tests/source-icons.test.ts +57 -0
  146. memforge_ai-0.1.55/admin-ui/tests/source-list-organization.test.ts +81 -0
  147. memforge_ai-0.1.55/admin-ui/tests/source-readiness.test.ts +65 -0
  148. memforge_ai-0.1.55/admin-ui/tests/source-setup-adapters.test.ts +94 -0
  149. memforge_ai-0.1.55/admin-ui/tests/teams-source-setup.test.ts +68 -0
  150. memforge_ai-0.1.55/admin-ui/tsconfig.app.json +34 -0
  151. memforge_ai-0.1.55/admin-ui/tsconfig.json +12 -0
  152. memforge_ai-0.1.55/admin-ui/vite.config.ts +26 -0
  153. memforge_ai-0.1.55/admin-ui/vitest.config.ts +15 -0
  154. memforge_ai-0.1.55/compose.yaml +57 -0
  155. memforge_ai-0.1.55/docs/README.md +17 -0
  156. memforge_ai-0.1.55/docs/adr/0001-project-source-sync-activity-from-existing-execution-records.md +93 -0
  157. memforge_ai-0.1.55/docs/adr/0002-renew-teams-access-through-a-dedicated-browser-session.md +7 -0
  158. memforge_ai-0.1.55/docs/adr/0003-keep-source-list-organization-personal.md +3 -0
  159. memforge_ai-0.1.55/docs/adr/0004-use-proven-authoritative-snapshots-for-rebaseline.md +119 -0
  160. memforge_ai-0.1.55/docs/adr/0005-preserve-provider-identity-across-scope-transitions.md +21 -0
  161. memforge_ai-0.1.55/docs/adr/0006-bound-memory-identity-recall-before-semantic-proof.md +23 -0
  162. memforge_ai-0.1.55/docs/adr/0007-bind-extracted-evidence-to-the-current-projection.md +164 -0
  163. memforge_ai-0.1.55/docs/adr/0008-prune-only-proven-disjoint-incumbents.md +28 -0
  164. memforge_ai-0.1.55/docs/adr/0009-bound-cross-document-relation-discovery.md +115 -0
  165. memforge_ai-0.1.55/docs/adr/0010-keep-support-provenance-projection-complete.md +124 -0
  166. memforge_ai-0.1.55/docs/adr/0011-separate-collection-evidence-from-body-materialization.md +191 -0
  167. memforge_ai-0.1.55/docs/adr/0012-deepen-the-extraction-lifecycle-hot-path.md +531 -0
  168. memforge_ai-0.1.55/docs/adr/0013-bind-document-artifacts-to-document-identity.md +56 -0
  169. memforge_ai-0.1.55/docs/adr/0014-model-binary-artifacts-as-revision-pinned-source-evidence.md +356 -0
  170. memforge_ai-0.1.55/docs/adr/0015-keep-the-oss-public-beta-local-only.md +42 -0
  171. memforge_ai-0.1.55/docs/adr/0016-keep-manual-memory-creation-independent-of-repository-roots.md +144 -0
  172. memforge_ai-0.1.55/docs/adr/0017-stage-recoverable-source-unit-derivation-before-lifecycle-commit.md +582 -0
  173. memforge_ai-0.1.55/docs/adr/0018-settle-mcp-roots-before-workspace-routed-tool-calls.md +144 -0
  174. memforge_ai-0.1.55/docs/adr/0019-drain-vector-outbox-from-current-relational-truth.md +83 -0
  175. memforge_ai-0.1.55/docs/adr/0020-list-current-memories-with-a-request-bound-keyset.md +56 -0
  176. memforge_ai-0.1.55/docs/adr/0021-select-workspaces-at-the-v1-request-boundary.md +104 -0
  177. memforge_ai-0.1.55/docs/adr/0022-resolve-ranked-search-intent-from-validated-client-hints.md +19 -0
  178. memforge_ai-0.1.55/docs/adr/0023-keep-review-orchestration-outside-memory-lifecycle.md +15 -0
  179. memforge_ai-0.1.55/docs/adr/0024-separate-lexical-candidate-eligibility-from-term-rarity.md +152 -0
  180. memforge_ai-0.1.55/docs/adr/0025-correlate-online-quality-events-with-source-derivation.md +239 -0
  181. memforge_ai-0.1.55/docs/api.md +31 -0
  182. memforge_ai-0.1.55/docs/architecture.md +2111 -0
  183. memforge_ai-0.1.55/docs/design/agent-hook-integration.md +64 -0
  184. memforge_ai-0.1.55/docs/design/agent-knowledge-bundle.html +270 -0
  185. memforge_ai-0.1.55/docs/design/agent-knowledge-bundle.md +333 -0
  186. memforge_ai-0.1.55/docs/design/agent-session-documents.md +48 -0
  187. memforge_ai-0.1.55/docs/design/agent-session-saas-plugin-flow.md +589 -0
  188. memforge_ai-0.1.55/docs/design/document-memory-lifecycle.md +198 -0
  189. memforge_ai-0.1.55/docs/design/gene-standard.md +1238 -0
  190. memforge_ai-0.1.55/docs/design/github-pages-source.md +157 -0
  191. memforge_ai-0.1.55/docs/design/github-repository-remote-scope.md +43 -0
  192. memforge_ai-0.1.55/docs/design/local-source-readiness.md +90 -0
  193. memforge_ai-0.1.55/docs/design/mcp-memory-search-facets.md +110 -0
  194. memforge_ai-0.1.55/docs/design/memory-evaluation-mechanism.md +668 -0
  195. memforge_ai-0.1.55/docs/design/source-agnostic-memory-extraction.md +248 -0
  196. memforge_ai-0.1.55/docs/design/source-list-organization.md +98 -0
  197. memforge_ai-0.1.55/docs/integrations/agent-clients.md +215 -0
  198. memforge_ai-0.1.55/docs/local-repo-sync.md +89 -0
  199. memforge_ai-0.1.55/docs/quickstart.md +276 -0
  200. memforge_ai-0.1.55/docs/releasing-python-distribution.md +46 -0
  201. memforge_ai-0.1.55/docs/research/2026-08-13-agent-runtime-event-storage.md +87 -0
  202. memforge_ai-0.1.55/docs/research/2026-08-13-langfuse-adoption-gate.md +168 -0
  203. memforge_ai-0.1.55/docs/research/2026-08-13-online-agent-evaluation-telemetry.md +274 -0
  204. memforge_ai-0.1.55/docs/research/fixed-slot-structured-output-schema.md +175 -0
  205. memforge_ai-0.1.55/docs/research/local-daemon-incremental-sync-capability-review.md +163 -0
  206. memforge_ai-0.1.55/docs/research/mcp-repository-context-routing.md +190 -0
  207. memforge_ai-0.1.55/docs/research/structured-llm-logical-deadline.md +230 -0
  208. memforge_ai-0.1.55/docs/superpowers/specs/2026-06-02-memforge-cli-clack-redesign-design.md +210 -0
  209. memforge_ai-0.1.55/docs/superpowers/specs/2026-06-03-jira-client-side-session-refresh-design.md +164 -0
  210. memforge_ai-0.1.55/docs/superpowers/specs/2026-07-07-local-agent-source-types-design.md +155 -0
  211. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/.claude-plugin/plugin.json +9 -0
  212. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/README.md +115 -0
  213. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/hooks/hooks.json +53 -0
  214. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_api_target.py +102 -0
  215. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_hook.py +6 -0
  216. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_hook_adapter.py +1732 -0
  217. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_mcp.py +2223 -0
  218. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_plugin_config.py +100 -0
  219. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_repo_identity.py +35 -0
  220. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_repository_context.py +107 -0
  221. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/scripts/memforge_workspace_bindings.py +301 -0
  222. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/skills/memforge-setup/SKILL.md +60 -0
  223. memforge_ai-0.1.55/integrations/claude-code/memforge-memory/skills/memforge-setup/scripts/workspace_config.py +280 -0
  224. memforge_ai-0.1.55/integrations/codex/memforge-memory/.codex-plugin/plugin.json +26 -0
  225. memforge_ai-0.1.55/integrations/codex/memforge-memory/README.md +116 -0
  226. memforge_ai-0.1.55/integrations/codex/memforge-memory/hooks/hooks.json +41 -0
  227. memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_api_target.py +102 -0
  228. memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_hook.py +6 -0
  229. memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_hook_adapter.py +1732 -0
  230. memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_mcp.py +2223 -0
  231. memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_plugin_config.py +100 -0
  232. memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_repo_identity.py +35 -0
  233. memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_repository_context.py +107 -0
  234. memforge_ai-0.1.55/integrations/codex/memforge-memory/scripts/memforge_workspace_bindings.py +301 -0
  235. memforge_ai-0.1.55/integrations/codex/memforge-memory/skills/memforge-setup/SKILL.md +60 -0
  236. memforge_ai-0.1.55/integrations/codex/memforge-memory/skills/memforge-setup/scripts/workspace_config.py +280 -0
  237. memforge_ai-0.1.55/pyproject.toml +86 -0
  238. memforge_ai-0.1.55/scripts/smoke_litellm_source_support.py +62 -0
  239. memforge_ai-0.1.55/scripts/sync_plugin_mcp_proxy.py +184 -0
  240. memforge_ai-0.1.55/scripts/verify_release_artifacts.py +105 -0
  241. memforge_ai-0.1.55/src/memforge/__init__.py +0 -0
  242. memforge_ai-0.1.55/src/memforge/agent_hooks.py +351 -0
  243. memforge_ai-0.1.55/src/memforge/agent_knowledge.py +1796 -0
  244. memforge_ai-0.1.55/src/memforge/agent_knowledge_markdown.py +149 -0
  245. memforge_ai-0.1.55/src/memforge/agent_session_contract.py +46 -0
  246. memforge_ai-0.1.55/src/memforge/agent_sessions.py +1291 -0
  247. memforge_ai-0.1.55/src/memforge/api_target.py +102 -0
  248. memforge_ai-0.1.55/src/memforge/auth/__init__.py +1 -0
  249. memforge_ai-0.1.55/src/memforge/auth/browser_session.py +251 -0
  250. memforge_ai-0.1.55/src/memforge/auth/jira_auth.py +410 -0
  251. memforge_ai-0.1.55/src/memforge/auth/jira_browser_session.py +302 -0
  252. memforge_ai-0.1.55/src/memforge/auth/jira_capture.py +247 -0
  253. memforge_ai-0.1.55/src/memforge/auth/teams_auth.py +209 -0
  254. memforge_ai-0.1.55/src/memforge/auth/teams_browser_session.py +324 -0
  255. memforge_ai-0.1.55/src/memforge/config.py +323 -0
  256. memforge_ai-0.1.55/src/memforge/evals/__init__.py +1 -0
  257. memforge_ai-0.1.55/src/memforge/evals/agent_evaluation.py +741 -0
  258. memforge_ai-0.1.55/src/memforge/evals/retrieval/__init__.py +29 -0
  259. memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/__init__.py +1 -0
  260. memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/hybrid_fusion.yaml +96 -0
  261. memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/intent_resolution.yaml +134 -0
  262. memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/manifest.yaml +221 -0
  263. memforge_ai-0.1.55/src/memforge/evals/retrieval/cases/metadata_lexical.yaml +178 -0
  264. memforge_ai-0.1.55/src/memforge/evals/retrieval/fixtures/__init__.py +1 -0
  265. memforge_ai-0.1.55/src/memforge/evals/retrieval/fixtures/corpus.py +144 -0
  266. memforge_ai-0.1.55/src/memforge/evals/retrieval/hash_case_set.py +54 -0
  267. memforge_ai-0.1.55/src/memforge/evals/retrieval/policy_sweep.py +270 -0
  268. memforge_ai-0.1.55/src/memforge/evals/retrieval/runner.py +418 -0
  269. memforge_ai-0.1.55/src/memforge/evals/retrieval/schema.py +792 -0
  270. memforge_ai-0.1.55/src/memforge/genes/__init__.py +172 -0
  271. memforge_ai-0.1.55/src/memforge/genes/agent_session_gene.py +252 -0
  272. memforge_ai-0.1.55/src/memforge/genes/atlassian_auth.py +349 -0
  273. memforge_ai-0.1.55/src/memforge/genes/base.py +264 -0
  274. memforge_ai-0.1.55/src/memforge/genes/confluence_artifacts.py +273 -0
  275. memforge_ai-0.1.55/src/memforge/genes/confluence_gene.py +878 -0
  276. memforge_ai-0.1.55/src/memforge/genes/confluence_pdf.py +431 -0
  277. memforge_ai-0.1.55/src/memforge/genes/github_pages_gene.py +1049 -0
  278. memforge_ai-0.1.55/src/memforge/genes/github_repo_gene.py +676 -0
  279. memforge_ai-0.1.55/src/memforge/genes/jira_gene.py +1089 -0
  280. memforge_ai-0.1.55/src/memforge/genes/local_adapter_packages.py +137 -0
  281. memforge_ai-0.1.55/src/memforge/genes/local_markdown_gene.py +264 -0
  282. memforge_ai-0.1.55/src/memforge/genes/teams_gene.py +2180 -0
  283. memforge_ai-0.1.55/src/memforge/github_repo_utils.py +225 -0
  284. memforge_ai-0.1.55/src/memforge/hook_adapter.py +1732 -0
  285. memforge_ai-0.1.55/src/memforge/interactive_cli/index.mjs +557 -0
  286. memforge_ai-0.1.55/src/memforge/interactive_cli/package-lock.json +54 -0
  287. memforge_ai-0.1.55/src/memforge/interactive_cli/package.json +22 -0
  288. memforge_ai-0.1.55/src/memforge/llm/__init__.py +1 -0
  289. memforge_ai-0.1.55/src/memforge/llm/providers.py +31 -0
  290. memforge_ai-0.1.55/src/memforge/llm/structured.py +2010 -0
  291. memforge_ai-0.1.55/src/memforge/llm/structured_images.py +190 -0
  292. memforge_ai-0.1.55/src/memforge/local_adapter.py +873 -0
  293. memforge_ai-0.1.55/src/memforge/local_agent/__init__.py +1 -0
  294. memforge_ai-0.1.55/src/memforge/local_agent/document_identity.py +51 -0
  295. memforge_ai-0.1.55/src/memforge/local_agent/folder_picker.py +80 -0
  296. memforge_ai-0.1.55/src/memforge/local_agent/jira_contract.py +92 -0
  297. memforge_ai-0.1.55/src/memforge/local_agent/readiness.py +24 -0
  298. memforge_ai-0.1.55/src/memforge/local_agent/replay_adapter.py +405 -0
  299. memforge_ai-0.1.55/src/memforge/local_agent/runner.py +585 -0
  300. memforge_ai-0.1.55/src/memforge/local_agent/snapshot_manifest.py +103 -0
  301. memforge_ai-0.1.55/src/memforge/local_agent/source_contract.py +482 -0
  302. memforge_ai-0.1.55/src/memforge/local_agent/state.py +204 -0
  303. memforge_ai-0.1.55/src/memforge/local_agent/teams_audit.py +231 -0
  304. memforge_ai-0.1.55/src/memforge/local_agent/teams_browse.py +216 -0
  305. memforge_ai-0.1.55/src/memforge/local_agent/teams_contract.py +171 -0
  306. memforge_ai-0.1.55/src/memforge/local_agent/teams_ledger.py +518 -0
  307. memforge_ai-0.1.55/src/memforge/main.py +5374 -0
  308. memforge_ai-0.1.55/src/memforge/memory/__init__.py +0 -0
  309. memforge_ai-0.1.55/src/memforge/memory/audit.py +140 -0
  310. memforge_ai-0.1.55/src/memforge/memory/candidate_ledger.py +493 -0
  311. memforge_ai-0.1.55/src/memforge/memory/cutover.py +1015 -0
  312. memforge_ai-0.1.55/src/memforge/memory/engine.py +1231 -0
  313. memforge_ai-0.1.55/src/memforge/memory/entity_resolver.py +454 -0
  314. memforge_ai-0.1.55/src/memforge/memory/evidence.py +903 -0
  315. memforge_ai-0.1.55/src/memforge/memory/health.py +334 -0
  316. memforge_ai-0.1.55/src/memforge/memory/identity_resolver.py +295 -0
  317. memforge_ai-0.1.55/src/memforge/memory/index_payloads.py +38 -0
  318. memforge_ai-0.1.55/src/memforge/memory/lifecycle.py +36 -0
  319. memforge_ai-0.1.55/src/memforge/memory/lifecycle_plan.py +657 -0
  320. memforge_ai-0.1.55/src/memforge/memory/lifecycle_planner.py +650 -0
  321. memforge_ai-0.1.55/src/memforge/memory/lifecycle_review.py +398 -0
  322. memforge_ai-0.1.55/src/memforge/memory/lifecycle_service.py +361 -0
  323. memforge_ai-0.1.55/src/memforge/memory/origin.py +25 -0
  324. memforge_ai-0.1.55/src/memforge/memory/project_resolver.py +66 -0
  325. memforge_ai-0.1.55/src/memforge/memory/quality.py +147 -0
  326. memforge_ai-0.1.55/src/memforge/memory/relation_candidate_retrieval.py +482 -0
  327. memforge_ai-0.1.55/src/memforge/memory/relation_classifier.py +425 -0
  328. memforge_ai-0.1.55/src/memforge/memory/relation_discovery.py +598 -0
  329. memforge_ai-0.1.55/src/memforge/memory/relation_discovery_contract.py +151 -0
  330. memforge_ai-0.1.55/src/memforge/memory/repair.py +248 -0
  331. memforge_ai-0.1.55/src/memforge/memory/review_contract.py +277 -0
  332. memforge_ai-0.1.55/src/memforge/memory/review_decision.py +83 -0
  333. memforge_ai-0.1.55/src/memforge/memory/review_presentation.py +178 -0
  334. memforge_ai-0.1.55/src/memforge/memory/review_service.py +509 -0
  335. memforge_ai-0.1.55/src/memforge/memory/store.py +2886 -0
  336. memforge_ai-0.1.55/src/memforge/models.py +732 -0
  337. memforge_ai-0.1.55/src/memforge/pipeline/__init__.py +0 -0
  338. memforge_ai-0.1.55/src/memforge/pipeline/bounded_work.py +48 -0
  339. memforge_ai-0.1.55/src/memforge/pipeline/claim_evidence.py +134 -0
  340. memforge_ai-0.1.55/src/memforge/pipeline/document_units.py +486 -0
  341. memforge_ai-0.1.55/src/memforge/pipeline/document_update.py +211 -0
  342. memforge_ai-0.1.55/src/memforge/pipeline/entity_filter.py +109 -0
  343. memforge_ai-0.1.55/src/memforge/pipeline/evidence_catalog.py +396 -0
  344. memforge_ai-0.1.55/src/memforge/pipeline/extraction_contract.py +31 -0
  345. memforge_ai-0.1.55/src/memforge/pipeline/memory_extractor.py +795 -0
  346. memforge_ai-0.1.55/src/memforge/pipeline/normalizer_utils.py +211 -0
  347. memforge_ai-0.1.55/src/memforge/pipeline/projection_context.py +378 -0
  348. memforge_ai-0.1.55/src/memforge/pipeline/projection_evidence.py +332 -0
  349. memforge_ai-0.1.55/src/memforge/pipeline/reconciler.py +913 -0
  350. memforge_ai-0.1.55/src/memforge/pipeline/retry.py +73 -0
  351. memforge_ai-0.1.55/src/memforge/pipeline/source_projection_adapters.py +1105 -0
  352. memforge_ai-0.1.55/src/memforge/pipeline/source_support_detector.py +724 -0
  353. memforge_ai-0.1.55/src/memforge/pipeline/sync.py +3489 -0
  354. memforge_ai-0.1.55/src/memforge/pipeline/sync_memory.py +303 -0
  355. memforge_ai-0.1.55/src/memforge/plugin_config.py +100 -0
  356. memforge_ai-0.1.55/src/memforge/plugin_mcp_proxy.py +2223 -0
  357. memforge_ai-0.1.55/src/memforge/provenance.py +184 -0
  358. memforge_ai-0.1.55/src/memforge/repo_identity.py +35 -0
  359. memforge_ai-0.1.55/src/memforge/repository_context.py +107 -0
  360. memforge_ai-0.1.55/src/memforge/retrieval/__init__.py +0 -0
  361. memforge_ai-0.1.55/src/memforge/retrieval/access_predicate.py +200 -0
  362. memforge_ai-0.1.55/src/memforge/retrieval/embeddings.py +226 -0
  363. memforge_ai-0.1.55/src/memforge/retrieval/filters.py +48 -0
  364. memforge_ai-0.1.55/src/memforge/retrieval/intents.py +114 -0
  365. memforge_ai-0.1.55/src/memforge/retrieval/metadata_text.py +80 -0
  366. memforge_ai-0.1.55/src/memforge/retrieval/query_analyzer.py +29 -0
  367. memforge_ai-0.1.55/src/memforge/retrieval/query_plan.py +243 -0
  368. memforge_ai-0.1.55/src/memforge/retrieval/rank_fusion.py +107 -0
  369. memforge_ai-0.1.55/src/memforge/retrieval/search.py +1519 -0
  370. memforge_ai-0.1.55/src/memforge/retrieval/vector_metadata.py +90 -0
  371. memforge_ai-0.1.55/src/memforge/runtime.py +1553 -0
  372. memforge_ai-0.1.55/src/memforge/scheduler.py +210 -0
  373. memforge_ai-0.1.55/src/memforge/server/__init__.py +0 -0
  374. memforge_ai-0.1.55/src/memforge/server/admin_api.py +8298 -0
  375. memforge_ai-0.1.55/src/memforge/server/memory_admin_service.py +51 -0
  376. memforge_ai-0.1.55/src/memforge/server/principal.py +35 -0
  377. memforge_ai-0.1.55/src/memforge/server/source_admin_service.py +307 -0
  378. memforge_ai-0.1.55/src/memforge/source_access.py +156 -0
  379. memforge_ai-0.1.55/src/memforge/source_access_transition.py +117 -0
  380. memforge_ai-0.1.55/src/memforge/source_activity.py +28 -0
  381. memforge_ai-0.1.55/src/memforge/source_artifacts.py +685 -0
  382. memforge_ai-0.1.55/src/memforge/source_derivation.py +1203 -0
  383. memforge_ai-0.1.55/src/memforge/source_projection.py +755 -0
  384. memforge_ai-0.1.55/src/memforge/source_projection_config.py +191 -0
  385. memforge_ai-0.1.55/src/memforge/source_secrets.py +239 -0
  386. memforge_ai-0.1.55/src/memforge/storage/__init__.py +0 -0
  387. memforge_ai-0.1.55/src/memforge/storage/adapters/__init__.py +22 -0
  388. memforge_ai-0.1.55/src/memforge/storage/adapters/context.py +54 -0
  389. memforge_ai-0.1.55/src/memforge/storage/adapters/protocols.py +935 -0
  390. memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/__init__.py +16 -0
  391. memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/factory.py +44 -0
  392. memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/keyword.py +702 -0
  393. memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/relational.py +2115 -0
  394. memforge_ai-0.1.55/src/memforge/storage/adapters/sqlite/vector.py +136 -0
  395. memforge_ai-0.1.55/src/memforge/storage/admin_memory.py +48 -0
  396. memforge_ai-0.1.55/src/memforge/storage/admin_source.py +178 -0
  397. memforge_ai-0.1.55/src/memforge/storage/database.py +18917 -0
  398. memforge_ai-0.1.55/src/memforge/storage/document_store.py +277 -0
  399. memforge_ai-0.1.55/src/memforge/storage/source_cleanup.py +62 -0
  400. memforge_ai-0.1.55/src/memforge/storage/source_sync_manifest.py +36 -0
  401. memforge_ai-0.1.55/src/memforge/sync_progress.py +206 -0
  402. memforge_ai-0.1.55/src/memforge/tool_client.py +1091 -0
  403. memforge_ai-0.1.55/src/memforge/workspace_bindings.py +301 -0
  404. memforge_ai-0.1.55/tests/__init__.py +0 -0
  405. memforge_ai-0.1.55/tests/contracts/__init__.py +10 -0
  406. memforge_ai-0.1.55/tests/contracts/_support.py +190 -0
  407. memforge_ai-0.1.55/tests/contracts/test_entity_linking_contract.py +83 -0
  408. memforge_ai-0.1.55/tests/contracts/test_keyword_contract.py +199 -0
  409. memforge_ai-0.1.55/tests/contracts/test_relational_contract.py +879 -0
  410. memforge_ai-0.1.55/tests/contracts/test_sqlite_contract.py +96 -0
  411. memforge_ai-0.1.55/tests/contracts/test_vector_contract.py +145 -0
  412. memforge_ai-0.1.55/tests/evals/test_intent_policy_sweep.py +101 -0
  413. memforge_ai-0.1.55/tests/evals/test_online_agent_eval_cli.py +152 -0
  414. memforge_ai-0.1.55/tests/evals/test_retrieval_case_set.py +679 -0
  415. memforge_ai-0.1.55/tests/evals/test_retrieval_eval_cli.py +83 -0
  416. memforge_ai-0.1.55/tests/evals/test_retrieval_runner.py +236 -0
  417. memforge_ai-0.1.55/tests/test_access_predicate_admin_path.py +190 -0
  418. memforge_ai-0.1.55/tests/test_access_predicate_by_id_readers.py +149 -0
  419. memforge_ai-0.1.55/tests/test_access_predicate_channels.py +358 -0
  420. memforge_ai-0.1.55/tests/test_access_predicate_dedup.py +204 -0
  421. memforge_ai-0.1.55/tests/test_access_predicate_lifecycle.py +154 -0
  422. memforge_ai-0.1.55/tests/test_access_predicate_null.py +192 -0
  423. memforge_ai-0.1.55/tests/test_access_predicate_post_fusion.py +124 -0
  424. memforge_ai-0.1.55/tests/test_access_predicate_principal_authority.py +155 -0
  425. memforge_ai-0.1.55/tests/test_access_predicate_sync_uploader.py +562 -0
  426. memforge_ai-0.1.55/tests/test_access_predicate_unit.py +92 -0
  427. memforge_ai-0.1.55/tests/test_adapters_context.py +39 -0
  428. memforge_ai-0.1.55/tests/test_adapters_factory.py +50 -0
  429. memforge_ai-0.1.55/tests/test_adapters_sqlite_keyword.py +863 -0
  430. memforge_ai-0.1.55/tests/test_adapters_sqlite_relational.py +1638 -0
  431. memforge_ai-0.1.55/tests/test_adapters_sqlite_vector.py +139 -0
  432. memforge_ai-0.1.55/tests/test_admin_entities_adapter_contract.py +164 -0
  433. memforge_ai-0.1.55/tests/test_admin_memory_storage_neutral.py +164 -0
  434. memforge_ai-0.1.55/tests/test_admin_source_storage_neutral.py +2440 -0
  435. memforge_ai-0.1.55/tests/test_agent_evaluation_config.py +28 -0
  436. memforge_ai-0.1.55/tests/test_agent_hook_context.py +235 -0
  437. memforge_ai-0.1.55/tests/test_agent_knowledge_bundle.py +1946 -0
  438. memforge_ai-0.1.55/tests/test_agent_knowledge_markdown.py +124 -0
  439. memforge_ai-0.1.55/tests/test_agent_runtime_events.py +523 -0
  440. memforge_ai-0.1.55/tests/test_agent_session_api.py +2866 -0
  441. memforge_ai-0.1.55/tests/test_agent_session_gene.py +489 -0
  442. memforge_ai-0.1.55/tests/test_agent_session_repo_identifier.py +113 -0
  443. memforge_ai-0.1.55/tests/test_agent_session_source_isolation.py +119 -0
  444. memforge_ai-0.1.55/tests/test_api_target.py +209 -0
  445. memforge_ai-0.1.55/tests/test_bounded_async_work.py +61 -0
  446. memforge_ai-0.1.55/tests/test_browser_session.py +168 -0
  447. memforge_ai-0.1.55/tests/test_candidate_ledger.py +498 -0
  448. memforge_ai-0.1.55/tests/test_claim_evidence.py +123 -0
  449. memforge_ai-0.1.55/tests/test_cli_agent_tools.py +3958 -0
  450. memforge_ai-0.1.55/tests/test_cli_interactive.py +208 -0
  451. memforge_ai-0.1.55/tests/test_cli_kb_schedule.py +31 -0
  452. memforge_ai-0.1.55/tests/test_compose_contract.py +83 -0
  453. memforge_ai-0.1.55/tests/test_compose_defaults.py +12 -0
  454. memforge_ai-0.1.55/tests/test_confluence_gene.py +1101 -0
  455. memforge_ai-0.1.55/tests/test_confluence_pdf.py +559 -0
  456. memforge_ai-0.1.55/tests/test_consolidated_memory_removal.py +72 -0
  457. memforge_ai-0.1.55/tests/test_cross_source_review_contract.py +626 -0
  458. memforge_ai-0.1.55/tests/test_database_read_only.py +84 -0
  459. memforge_ai-0.1.55/tests/test_document_store.py +58 -0
  460. memforge_ai-0.1.55/tests/test_document_units.py +192 -0
  461. memforge_ai-0.1.55/tests/test_document_update.py +81 -0
  462. memforge_ai-0.1.55/tests/test_entity_resolver.py +619 -0
  463. memforge_ai-0.1.55/tests/test_evidence_catalog.py +207 -0
  464. memforge_ai-0.1.55/tests/test_evidence_catalog_source_matrix.py +326 -0
  465. memforge_ai-0.1.55/tests/test_github_pages_gene.py +848 -0
  466. memforge_ai-0.1.55/tests/test_github_repo_gene.py +730 -0
  467. memforge_ai-0.1.55/tests/test_github_repo_scope.py +101 -0
  468. memforge_ai-0.1.55/tests/test_github_repo_tree_browse.py +54 -0
  469. memforge_ai-0.1.55/tests/test_hook_adapter.py +5898 -0
  470. memforge_ai-0.1.55/tests/test_identity_resolver.py +594 -0
  471. memforge_ai-0.1.55/tests/test_jira_auth_sessions.py +698 -0
  472. memforge_ai-0.1.55/tests/test_jira_browser_session.py +217 -0
  473. memforge_ai-0.1.55/tests/test_jira_capture.py +186 -0
  474. memforge_ai-0.1.55/tests/test_jira_discover.py +73 -0
  475. memforge_ai-0.1.55/tests/test_jira_gene.py +1486 -0
  476. memforge_ai-0.1.55/tests/test_jira_jql_build.py +60 -0
  477. memforge_ai-0.1.55/tests/test_jira_origin_history.py +53 -0
  478. memforge_ai-0.1.55/tests/test_jira_scope_validation.py +30 -0
  479. memforge_ai-0.1.55/tests/test_jira_session_api.py +121 -0
  480. memforge_ai-0.1.55/tests/test_jira_watch_tick.py +113 -0
  481. memforge_ai-0.1.55/tests/test_lexical_query_plan.py +59 -0
  482. memforge_ai-0.1.55/tests/test_lifecycle_cutover_store.py +3531 -0
  483. memforge_ai-0.1.55/tests/test_lifecycle_plan_contract.py +193 -0
  484. memforge_ai-0.1.55/tests/test_lifecycle_planner.py +411 -0
  485. memforge_ai-0.1.55/tests/test_litellm_provider_runtime.py +241 -0
  486. memforge_ai-0.1.55/tests/test_local_adapter_api.py +2650 -0
  487. memforge_ai-0.1.55/tests/test_local_agent_daemon.py +985 -0
  488. memforge_ai-0.1.55/tests/test_local_agent_daemon_broker.py +119 -0
  489. memforge_ai-0.1.55/tests/test_local_agent_snapshot_manifest.py +163 -0
  490. memforge_ai-0.1.55/tests/test_local_agent_source_contract.py +786 -0
  491. memforge_ai-0.1.55/tests/test_local_source_readiness.py +28 -0
  492. memforge_ai-0.1.55/tests/test_mcp_workspace_contract.py +221 -0
  493. memforge_ai-0.1.55/tests/test_memory_audit.py +157 -0
  494. memforge_ai-0.1.55/tests/test_memory_engine_incumbent_batching.py +122 -0
  495. memforge_ai-0.1.55/tests/test_memory_engine_lifecycle_contract.py +63 -0
  496. memforge_ai-0.1.55/tests/test_memory_evidence_contract.py +676 -0
  497. memforge_ai-0.1.55/tests/test_memory_evidence_schema.py +188 -0
  498. memforge_ai-0.1.55/tests/test_memory_evidence_store.py +1598 -0
  499. memforge_ai-0.1.55/tests/test_memory_extractor.py +221 -0
  500. memforge_ai-0.1.55/tests/test_memory_health.py +314 -0
  501. memforge_ai-0.1.55/tests/test_memory_index_repair.py +153 -0
  502. memforge_ai-0.1.55/tests/test_memory_lifecycle.py +604 -0
  503. memforge_ai-0.1.55/tests/test_memory_lifecycle_service.py +761 -0
  504. memforge_ai-0.1.55/tests/test_memory_origin.py +8 -0
  505. memforge_ai-0.1.55/tests/test_memory_quality.py +1711 -0
  506. memforge_ai-0.1.55/tests/test_memory_reviews.py +1766 -0
  507. memforge_ai-0.1.55/tests/test_memory_store_adapters.py +181 -0
  508. memforge_ai-0.1.55/tests/test_memory_store_safe_paths.py +2361 -0
  509. memforge_ai-0.1.55/tests/test_models.py +137 -0
  510. memforge_ai-0.1.55/tests/test_origin_source_pairs.py +119 -0
  511. memforge_ai-0.1.55/tests/test_origin_source_type.py +54 -0
  512. memforge_ai-0.1.55/tests/test_phase3_corroboration_visibility.py +161 -0
  513. memforge_ai-0.1.55/tests/test_phase3_dedup_visibility.py +532 -0
  514. memforge_ai-0.1.55/tests/test_phase3_promotion_guard.py +125 -0
  515. memforge_ai-0.1.55/tests/test_phase4_affinity_penalty.py +248 -0
  516. memforge_ai-0.1.55/tests/test_phase4_project_resolver.py +238 -0
  517. memforge_ai-0.1.55/tests/test_phase4_projects_api.py +534 -0
  518. memforge_ai-0.1.55/tests/test_phase4_projects_table.py +102 -0
  519. memforge_ai-0.1.55/tests/test_phase4_search_request.py +237 -0
  520. memforge_ai-0.1.55/tests/test_plugin_mcp_conflict_context.py +47 -0
  521. memforge_ai-0.1.55/tests/test_projected_lifecycle_integration.py +6264 -0
  522. memforge_ai-0.1.55/tests/test_projection_context.py +1067 -0
  523. memforge_ai-0.1.55/tests/test_projection_evidence.py +741 -0
  524. memforge_ai-0.1.55/tests/test_rank_fusion.py +75 -0
  525. memforge_ai-0.1.55/tests/test_reconciliation_policy.py +655 -0
  526. memforge_ai-0.1.55/tests/test_relation_candidate_retrieval.py +538 -0
  527. memforge_ai-0.1.55/tests/test_relation_discovery.py +521 -0
  528. memforge_ai-0.1.55/tests/test_retrieval_intents.py +128 -0
  529. memforge_ai-0.1.55/tests/test_review_decision.py +92 -0
  530. memforge_ai-0.1.55/tests/test_review_presentation.py +73 -0
  531. memforge_ai-0.1.55/tests/test_search_alias_expansion.py +173 -0
  532. memforge_ai-0.1.55/tests/test_search_engine_adapters.py +1658 -0
  533. memforge_ai-0.1.55/tests/test_search_lifecycle.py +407 -0
  534. memforge_ai-0.1.55/tests/test_search_memory_only.py +113 -0
  535. memforge_ai-0.1.55/tests/test_source_access_migration.py +244 -0
  536. memforge_ai-0.1.55/tests/test_source_access_policy.py +78 -0
  537. memforge_ai-0.1.55/tests/test_source_access_transition.py +407 -0
  538. memforge_ai-0.1.55/tests/test_source_artifacts.py +551 -0
  539. memforge_ai-0.1.55/tests/test_source_authority_api.py +1658 -0
  540. memforge_ai-0.1.55/tests/test_source_projection_adapters.py +1773 -0
  541. memforge_ai-0.1.55/tests/test_source_projection_config.py +139 -0
  542. memforge_ai-0.1.55/tests/test_source_projection_contract.py +461 -0
  543. memforge_ai-0.1.55/tests/test_source_projection_store.py +755 -0
  544. memforge_ai-0.1.55/tests/test_source_secrets.py +164 -0
  545. memforge_ai-0.1.55/tests/test_source_support_detector.py +1208 -0
  546. memforge_ai-0.1.55/tests/test_startup_runtime.py +3557 -0
  547. memforge_ai-0.1.55/tests/test_structured_coercion.py +38 -0
  548. memforge_ai-0.1.55/tests/test_structured_llm.py +1805 -0
  549. memforge_ai-0.1.55/tests/test_structured_llm_images.py +89 -0
  550. memforge_ai-0.1.55/tests/test_sync_bookkeeping.py +12223 -0
  551. memforge_ai-0.1.55/tests/test_sync_memory_observer.py +170 -0
  552. memforge_ai-0.1.55/tests/test_sync_plugin_mcp_proxy.py +84 -0
  553. memforge_ai-0.1.55/tests/test_teams_audit.py +192 -0
  554. memforge_ai-0.1.55/tests/test_teams_authentication.py +456 -0
  555. memforge_ai-0.1.55/tests/test_teams_gene.py +1542 -0
  556. memforge_ai-0.1.55/tests/test_teams_ledger.py +154 -0
  557. memforge_ai-0.1.55/tests/test_tool_client_jira_session.py +68 -0
  558. memforge_ai-0.1.55/tests/test_tool_client_sources.py +840 -0
  559. memforge_ai-0.1.55/tests/test_unit_extraction.py +260 -0
  560. memforge_ai-0.1.55/tests/test_unprovable_cutover_retirement.py +479 -0
  561. memforge_ai-0.1.55/tests/test_vector_metadata.py +89 -0
  562. memforge_ai-0.1.55/tests/test_visibility_invariant.py +126 -0
  563. memforge_ai-0.1.55/tests/test_visibility_migrations.py +192 -0
  564. memforge_ai-0.1.55/tests/test_visibility_model.py +19 -0
  565. memforge_ai-0.1.55/tests/test_visibility_write_threading.py +83 -0
  566. memforge_ai-0.1.55/tests/test_workspace_bindings.py +312 -0
  567. memforge_ai-0.1.55/tests/test_workspace_contract.py +95 -0
  568. 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
@@ -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.