diff --git a/.github/workflows/ci-python.yml b/.github/workflows/ci-python.yml index 6d730c98..0743bd25 100644 --- a/.github/workflows/ci-python.yml +++ b/.github/workflows/ci-python.yml @@ -82,7 +82,7 @@ jobs: fail-fast: false matrix: include: - - python-version: "3.9" + - python-version: "3.10" dependency-lane: minimum-supermemory supermemory-version: "3.50.0" expected-supermemory-version: "3.50.0" diff --git a/.github/workflows/claude-auto-fix-ci.yml b/.github/workflows/claude-auto-fix-ci.yml index bb1849a0..e84d78c8 100644 --- a/.github/workflows/claude-auto-fix-ci.yml +++ b/.github/workflows/claude-auto-fix-ci.yml @@ -17,7 +17,9 @@ jobs: auto-fix: if: | github.event.workflow_run.conclusion == 'failure' && - github.event.workflow_run.pull_requests[0] + github.event.workflow_run.pull_requests[0] && + github.event.workflow_run.head_repository.full_name == github.event.workflow_run.repository.full_name && + !endsWith(github.event.workflow_run.actor.login, '[bot]') runs-on: ubuntu-latest timeout-minutes: 30 steps: diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml deleted file mode 100644 index 800b098b..00000000 --- a/.github/workflows/claude-code-review.yml +++ /dev/null @@ -1,121 +0,0 @@ -name: Claude Code Review - -on: - pull_request: - types: [opened, synchronize, ready_for_review, reopened] - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - claude-review: - # Fork PRs run with a read-only token and no secrets/OIDC id-token, so the - # Claude action can never authenticate there and the job always fails. Skip - # it for forks so those PRs report a clean skipped check instead of a red X. - if: | - github.event.pull_request.draft == false && - github.event.pull_request.head.repo.full_name == github.repository && - github.actor != 'graphite-app[bot]' && - github.actor != 'dependabot[bot]' - - runs-on: ubuntu-latest - timeout-minutes: 30 - permissions: - contents: write - pull-requests: write - issues: write - actions: read - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v5 - with: - fetch-depth: 1 - - - name: Run Claude Code Review - uses: anthropics/claude-code-action@v1 - with: - claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - allowed_bots: "vorflux[bot]" - - # Enable progress tracking - track_progress: true - use_sticky_comment: true - include_fix_links: true - bot_name: Supermemory code review - - # Enable inline comments for specific issues - claude_args: | - --model claude-opus-4-5-20251101 - --allowedTools "Read,Write,Edit,Glob,Grep,Bash(*),WebSearch,WebFetch,Task,mcp__github__*" - - prompt: | - You are a senior engineer reviewing a pull request. Your job is to catch real bugs, security issues, and logic errors that a human reviewer might miss. You are NOT a linter — do not comment on style, naming, formatting, or minor nitpicks. - - REPO: ${{ github.repository }} - PR NUMBER: ${{ github.event.pull_request.number }} - PR TITLE: ${{ github.event.pull_request.title }} - - **REVIEW PHILOSOPHY:** - - Think like a Staff Engineer doing a final review before a deploy to production. Ask yourself: - - "Could this cause a production incident?" - - "Is there a subtle bug hiding here that tests won't catch?" - - "Does this introduce a security vulnerability?" - - "Will this break existing functionality or other parts of the system?" - - If the answer to all of these is "no" for a given line, DO NOT comment on it. Silence is a perfectly good review. A PR with 0 inline comments and a clean summary is ideal when the code is solid. - - **WHAT TO COMMENT ON (only these):** - - Bugs: race conditions, off-by-one errors, null/undefined access, logic errors, wrong operator, missing await, incorrect error handling - - Security: SQL injection, XSS, auth bypass, secrets exposure, insecure defaults, CORS misconfiguration - - Data loss: missing transactions, incorrect cascade deletes, silent data corruption - - Breaking changes: API contract changes, removed fields that clients depend on, changed behavior without migration - - Dependency issues: known CVEs, incompatible version combinations, deprecated APIs that will break - - **WHAT TO NEVER COMMENT ON:** - - Code style, formatting, naming conventions (that's what linters are for) - - "Consider using X instead of Y" unless Y is actually broken - - Missing types/docs/tests (unless the missing test hides a specific bug you found) - - Suggestions that are purely preferential - - Praise or affirmation — no "LGTM" or "nice!" comments - - **WORKFLOW:** - - 1. Use `mcp__github__get_pull_request_diff` to get the full diff - 2. Read the diff carefully. For each changed file, understand the INTENT of the change, not just the syntax - 3. For non-trivial changes, use Read/Grep to look at surrounding code that ISN'T in the diff — bugs often hide at the boundary between changed and unchanged code - 4. Search Supermemory for any relevant past patterns, known issues, or architectural decisions related to the changed code - 5. Check for existing review comments with `mcp__github__get_pull_request_review_comments` to avoid duplicates - 6. Create a pending review with `mcp__github__create_pending_pull_request_review` (event: "COMMENT") - 7. Add inline comments ONLY for issues that meet the bar above. For each comment: - - Explain the actual bug/risk concisely - - Show what could go wrong (e.g., "If X happens, this will Y") - - Provide a concrete fix using a code suggestion block when possible - 8. Submit the review with `mcp__github__submit_pending_pull_request_review` - - **REVIEW SUMMARY FORMAT:** - - Keep the summary short and direct. Format: - - **Overview:** One sentence on what this PR does. - - **Issues found:** List only real issues, or "None — this looks good to ship." if clean. - - **Score: X/10** - - Scoring guide: - - 10/10: No bugs, no security issues, clean logic. This is the COMMON case for competent engineers — don't be stingy. - - 8-9/10: Minor issues that won't cause incidents but should be addressed - - 6-7/10: Real bugs or security concerns that need fixing before merge - - Below 6: Critical issues, data loss risk, or security vulnerabilities - - Most PRs from experienced engineers should score 8-10. Reserve low scores for genuinely problematic code. - - **CRITICAL RESTRICTIONS:** - - DO NOT use `gh pr comment` or `gh api` CLI commands — use MCP tools only - - DO NOT leave more than 5 inline comments. If you find more than 5 issues, pick the 5 most critical ones. - - DO NOT comment on things that are correct but could be "slightly better" - - If the PR is a simple config change, dependency bump, or typo fix, just submit a clean summary with no inline comments diff --git a/.github/workflows/publish-openai-sdk-python.yml b/.github/workflows/publish-openai-sdk-python.yml index e6066bcf..d5232e8d 100644 --- a/.github/workflows/publish-openai-sdk-python.yml +++ b/.github/workflows/publish-openai-sdk-python.yml @@ -23,20 +23,22 @@ jobs: working-directory: ./packages/openai-sdk-python steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.12" - name: Install build dependencies - run: pip install hatchling build + run: python -m pip install hatchling build - name: Build package run: python -m build - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 + uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 with: packages-dir: packages/openai-sdk-python/dist/ diff --git a/README.md b/README.md index 17de7dea..e7b92744 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ All of this is in our single memory structure and ontology.
- {description} -
-- Context infrastructure for AI agents. Use it with the API, your tools, your team, or run it yourself. -
- -+ Supermemory gives your agent long-term memory of every user. Paste one prompt into your coding agent and it wires memory into your project. +
+Platform
+Start with the path that fits your app and your team.
+Products
+Browse memory, retrieval, profiles, and connectors.
+
-
[supermemory](https://github.com/supermemoryai/claude-supermemory) is a Claude Code plugin that gives your AI persistent memory across sessions. Your agent remembers what you worked on — across sessions, across projects.
@@ -19,7 +17,7 @@ icon: "/images/claude-code-icon.svg"
**Prefer to keep everything on your machine?** This plugin works with [self-hosted Supermemory](/self-hosting/overview) — run `npx supermemory local`, then set `baseUrl` in project config (or point your install at your local API) and use the API key printed on first boot.
-## Install the Plugin
+## Install the plugin
> **Requires Node.js 18+** on your PATH — the memory hooks run as Node scripts.
@@ -67,7 +65,7 @@ Create a Supermemory API key from the [API Keys](https://console.supermemory.ai/
-## How It Works
+## How it works
Once installed, the plugin runs automatically:
@@ -88,14 +86,14 @@ Once installed, the plugin runs automatically:
## Configuration
-### Environment Variables
+### Environment variables
```bash
SUPERMEMORY_CC_API_KEY=sm_... # Required
SUPERMEMORY_DEBUG=true # Optional: enable debug logging
```
-### Global Settings
+### Global settings
Create `~/.supermemory-claude/settings.json`:
@@ -118,7 +116,7 @@ Create `~/.supermemory-claude/settings.json`:
| `signalTurnsBefore` | Context turns before a signal (default: 3) |
| `includeTools` | Tools to explicitly capture |
-### Project Config
+### Project config
Per-repo overrides in `.claude/.supermemory-claude/config.json`. Run `/supermemory:project-config` or create manually:
@@ -138,14 +136,14 @@ Per-repo overrides in `.claude/.supermemory-claude/config.json`. Run `/supermemo
| `personalContainerTag` | Override personal container |
| `repoContainerTag` | Override team container tag |
-## Next Steps
+## Next steps
+ Maya KapoorPayments engineer
+ + Or add memory to + + + Claude Code + + + + Cursor + + + + Codex + + + + OpenCode + +
+) + +export const CopyPromptButton = ({ prompt, className, label, copiedLabel }) => { + const [copied, setCopied] = useState(false) + const onCopy = async () => { + try { + await navigator.clipboard.writeText(prompt) + setCopied(true) + setTimeout(() => setCopied(false), 1600) + } catch {} + } + return ( + + ) +} + +export const PromptPanel = ({ tabs }) => { + const [active, setActive] = useState(0) + const [copied, setCopied] = useState(false) + const tab = tabs[active] + + const onCopy = async () => { + try { + await navigator.clipboard.writeText(tab.text) + setCopied(true) + setTimeout(() => setCopied(false), 1600) + } catch {} + } + + const promptLine = (line) => { + const h = /^(#{1,6}) (.*)$/.exec(line) + if (h) { + return ( + <> + {h[1]} + {h[2]} + > + ) + } + if (/^\|[-| ]+\|$/.test(line)) + return {line} + const out = [] + let last = 0 + let k = 0 + for (const m of line.matchAll( + /(\|)|(\b(?:GET|POST|PATCH|DELETE) \/[^\s|]+)/g, + )) { + const at = m.index ?? 0 + if (at > last) out.push(line.slice(last, at)) + out.push( + m[1] ? ( + + | + + ) : ( + + {m[2]} + + ), + ) + last = at + m[0].length + } + if (last < line.length) out.push(line.slice(last)) + return out + } + + const codeLine = (line) => { + if (/^\s*(\/\/|#)/.test(line)) + return {line} + const out = [] + let last = 0 + let k = 0 + for (const m of line.matchAll(/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/g)) { + const at = m.index ?? 0 + if (at > last) out.push(line.slice(last, at)) + out.push( + + {m[0]} + , + ) + last = at + m[0].length + } + if (last < line.length) out.push(line.slice(last)) + return out + } + + const render = tab.kind === "prompt" ? promptLine : codeLine + + return ( +
+ {tab.text.split("\n").map((text, i) => (
+
+ {text.length === 0 ? " " : render(text)}
+
+ ))}
+
+
+