Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
e0aaad7
refactor: limit access to config's singleton (#263)
dev-jodee Nov 25, 2025
999747f
chore: update devnet usdc mock (#266)
amilz Dec 1, 2025
3642910
chore: Update audit report to the final version (typos, etc.) (#268)
dev-jodee Dec 1, 2025
6c66e94
fix: sign if create ata ix found (#267)
amilz Dec 1, 2025
faaadf6
fix(rpc): add missing signature field to SignAndSendTransactionRespon…
chauanhtuan185 Dec 17, 2025
2dff0a6
chore: migrate from Makefile to Just for build and development comman…
dev-jodee Dec 17, 2025
a979ba7
fix(usage-limit): resolve race condition in usage tracker (#273)
raushan728 Jan 5, 2026
d0f548b
feat: add prerelease detection for Rust and TypeScript SDK workflows …
dev-jodee Jan 5, 2026
607d6c0
bugfix: version for kora lib to enable release github action
dev-jodee Jan 5, 2026
1a453a0
chore: Idempotent CI fixes
dev-jodee Jan 5, 2026
98337ef
chore: Idempotent CI fixes
dev-jodee Jan 5, 2026
46d6c09
feat: enhance rust-publish workflow with separate publish options for…
dev-jodee Jan 5, 2026
b214692
[CHORE] Fix TS package deploy + justfile for hotfix (#285)
dev-jodee Jan 6, 2026
aa77fa5
feat: Add getVersion RPC method to server and SDK (#284)
amilz Jan 6, 2026
2c5d564
feat: Changed transfer_transaction endpoint to actually return paymen…
dev-jodee Jan 6, 2026
1de58f6
fix: use fresh wallet to exercise ata creation in full demo (#275)
rajgoesout Jan 6, 2026
79ff8d3
chore: Update CLAUDE.md and Justfile for branch workflow guidance (#289)
dev-jodee Jan 6, 2026
99f77be
feat: (PRO-605) Jito bundle support (#291)
dev-jodee Jan 9, 2026
4961878
release: 2.2.0-beta.1 & 0.2.0-beta.1 (#294)
dev-jodee Jan 9, 2026
aa457e4
docs: add jito bundle example code (#295)
amilz Jan 12, 2026
f76ac31
feat: (PRO-638) Estimate fee for Jito bundle endpoint (#296)
dev-jodee Jan 12, 2026
24afe38
hotfix: (PRO-639) Fix big transaction causing error when using v0 tra…
dev-jodee Jan 12, 2026
71958ca
release: 2.2.0-beta.2 (#298)
dev-jodee Jan 12, 2026
dd3a225
feat: add transactions_to_sign parameter to bundle endpoints (#302)
dev-jodee Jan 21, 2026
f39ff1b
PRO-606 feat: implement granular usage tracking with rule-based limit…
dev-jodee Jan 21, 2026
a2254c6
hotfix: (PRO-747) Improved Durable Nonce handling & security (#303)
dev-jodee Jan 21, 2026
651afc4
chore: fixing tests from hotfix from main branch
dev-jodee Jan 21, 2026
fff7d8f
release: v2.2.0-beta.3 (#306)
dev-jodee Jan 21, 2026
81f0218
feat: update solana-keychain to v0.2.1 and add KMS and Fireblocks sig…
dev-jodee Jan 22, 2026
f24f57d
docs: update examples to @solana/kit v5.x and add typechecks (#309)
amilz Jan 22, 2026
b3a21a7
chore: add docker image publishing workflow (#310)
dev-jodee Jan 23, 2026
c9a73e1
feat(sdk): add kit plugin with typed responses (#311)
amilz Jan 23, 2026
91379b0
sdk: update to rc (#312)
amilz Jan 26, 2026
94aa753
feat(rpc): add reCAPTCHA support for protected endpoints (#301)
nasjuice Jan 27, 2026
0a7a677
feat(lighthouse): add fee payer protection for sign endpoints (#315)
dev-jodee Jan 29, 2026
7413e8b
chore: release v2.2.0-beta.4 (#316)
dev-jodee Jan 29, 2026
4d98287
feat(sdk): add reCAPTCHA support to TypeScript client (#317)
amilz Jan 29, 2026
90ec93f
chore: bump ts beta release (#318)
amilz Jan 29, 2026
4282f85
docs: update sdk readme for release (#314)
amilz Jan 28, 2026
6ea8252
chore: rename just commands to match standards (#325)
dev-jodee Feb 3, 2026
2a526c6
Cherry-pick: Hotfix example packages and Jupiter v3 API migration (#326)
dev-jodee Feb 3, 2026
e3ec525
feat: add Claude skill for automated full release workflow (#328)
dev-jodee Feb 3, 2026
8c2bc69
chore: release v2.2.0-beta.5 (rust) + ts-sdk v0.2.0-beta.5 (#332)
dev-jodee Feb 3, 2026
794b4cd
chore/cherry pick main into release 2.2.0 20260210 (#341)
amilz Feb 10, 2026
d7aadae
chore: cherry pick kora skills into release 2.2.0 (#343)
amilz Feb 12, 2026
3605990
chore: bring back commits from main (PR #350, #349 + security fixes) …
dev-jodee Feb 20, 2026
e3af99b
Fmt
dev-jodee Feb 20, 2026
d7cc283
ci: gate fork PRs with manual external live test approval (#357)
dev-jodee Feb 25, 2026
95daff4
fix(ci): grant pull-request write for fork live marker comment (#359)
dev-jodee Feb 25, 2026
8cee2a4
fix(cli): validate pubkey format in config arrays (#352)
raushan728 Feb 25, 2026
5096f8f
refactor(lib): reduce error boilerplate with a from-impl macro (#362)
raushan728 Feb 27, 2026
2ff0898
docs(lib): add comprehensive rustdoc for public RPC types (#356)
raushan728 Mar 2, 2026
f155739
test(lib): add comprehensive unit tests for instruction parsing (Syst…
raushan728 Mar 2, 2026
f8d27f8
feat(lib): cache blockhash in redis (5s TTL) (#361)
raushan728 Mar 3, 2026
041c6b0
test(oracle): add missing retry and price bounds test coverage (#370)
raushan728 Mar 6, 2026
3ec6c97
test(validator): complete FeePayerPolicy unit test matrix (#365)
raushan728 Mar 6, 2026
c14b5e2
fix(config): add context message to ConfigError variant (#368)
raushan728 Mar 6, 2026
fda0342
fix(rpc): preserve RPC errors in transfer_transaction source ATA look…
raushan728 Mar 9, 2026
67d25b3
fix(signer): verify required env vars exist during config validation …
raushan728 Mar 9, 2026
2c9d7f2
fix(config): validate rpc cache redis connection at startup (#375)
raushan728 Mar 9, 2026
2859898
fix(security): harden sig_verify, oracle staleness, transfer fees, an…
dev-jodee Mar 11, 2026
01f28c6
chore: sync main into release/2.2.0 (2026-03-13) (#386)
amilz Mar 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .claude-plugin/kora-keychain-sync/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "kora-keychain-sync",
"version": "0.1.0",
"description": "Sync solana-keychain dependency and generate signer adapters",
"mcpServers": {
"repomix": {
"command": "npx",
"args": ["-y", "repomix-mcp"]
}
}
}
120 changes: 120 additions & 0 deletions .claude-plugin/kora-keychain-sync/commands/sync-keychain.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
---
description: Sync solana-keychain version and generate new signer adapters
allowed-tools: WebFetch, Read, Edit, Grep, Glob, Bash(cargo:*), mcp__repomix__pack_remote_repository, mcp__repomix__grep_repomix_output
---

# Sync solana-keychain Dependency

Execute this workflow to sync solana-keychain and detect new signers:

## Step 1: Fetch Latest Version

Use WebFetch on `https://crates.io/api/v1/crates/solana-keychain`
- Extract `crate.max_version` from JSON response

## Step 2: Check Current Version

Read `crates/lib/Cargo.toml` and find current `solana-keychain` version.

If different: update the version line using Edit tool.

## Step 3: Scan solana-keychain for Signer Types

Use `pack_remote_repository`:
- Remote: `solana-foundation/solana-keychain`
- Include pattern: `**/*.rs`

Then use `grep_repomix_output` to find all signer constructors:
- Pattern: `pub (async )?fn from_\w+`

These `from_*` methods are the available signer backends.

## Step 4: Compare Against Existing Adapters

Read `crates/lib/src/signer/config.rs` and identify existing `SignerTypeConfig` enum variants:
- Memory
- Turnkey
- Privy
- Vault

Identify any NEW signers from Step 3 not in this list.

## Step 5: Generate Scaffolding for New Signers

For each NEW signer:

1. **Analyze the `from_*` method signature** to understand required parameters

2. **Generate config struct** (after line ~91):
```rust
/// [SignerName] signer configuration
#[derive(Clone, Serialize, Deserialize)]
pub struct [SignerName]SignerConfig {
pub param1_env: String,
pub param2_env: String,
}
```

3. **Add enum variant** to `SignerTypeConfig`:
```rust
/// [SignerName] signer configuration
[SignerName] {
#[serde(flatten)]
config: [SignerName]SignerConfig,
},
```

4. **Add build function** (check if async based on `from_*` signature):
```rust
fn build_[signer_name]_signer(
config: &[SignerName]SignerConfig,
signer_name: &str,
) -> Result<Signer, KoraError> {
let param1 = get_env_var_for_signer(&config.param1_env, signer_name)?;
Signer::from_[signer_name](param1).map_err(|e| {
KoraError::SigningError(format!(
"Failed to create [SignerName] signer '{signer_name}': {}",
sanitize_error!(e)
))
})
}
```

5. **Add validation function**:
```rust
fn validate_[signer_name]_config(
config: &[SignerName]SignerConfig,
signer_name: &str,
) -> Result<(), KoraError> {
let env_vars = [
("param1_env", &config.param1_env),
];
for (field_name, env_var) in env_vars {
if env_var.is_empty() {
return Err(KoraError::ValidationError(format!(
"[SignerName] signer '{signer_name}' must specify non-empty {field_name}"
)));
}
}
Ok(())
}
```

6. **Update match arms** in `build_signer_from_config` and `validate_individual_signer_config`

## Step 6: Apply Edits

Use Edit tool to insert code into `crates/lib/src/signer/config.rs`:
- Config structs after existing ones
- Enum variants in SignerTypeConfig
- Build/validate functions in SignerConfig impl
- Update match arms

## Step 7: Verify

Run `cargo check -p kora-lib` to verify compilation.

Report summary:
- Version: [old] -> [new] (or "already latest")
- New signers: [list or "none"]
- Files modified: [list]
14 changes: 14 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "kora-plugins",
"description": "Kora project plugins for Claude Code",
"owner": {
"name": "Kora"
},
"plugins": [
{
"name": "kora-keychain-sync",
"description": "Sync solana-keychain dependency and generate signer adapters",
"source": "./.claude-plugin/kora-keychain-sync"
}
]
}
151 changes: 151 additions & 0 deletions .claude/skills/cherry-pick-sync/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
---
name: cherry-pick-sync
description: >-
Sync commits from main to the active release/* branch via cherry-pick PR.
Use when the user says "sync main to release", "cherry-pick to release",
"sync release branch", "backport to release", "keep release up to date",
or wants to ensure hotfixes/patches on main are reflected in the release branch.
Also use when the user asks to "cherry-pick commits" between branches.
---

# Cherry-Pick Sync: Main to Release Branch

Cherry-pick commits from `main` into the active `release/*` branch and create a PR.
Resolve conflicts automatically when safe; ask the user when ambiguous.

## Workflow

### 1. Identify the release branch

```bash
# Prefer: open PRs from release/* branches (shows active work)
gh pr list --state open --head "release/" --json headRefName --jq '.[].headRefName' 2>/dev/null

# Fallback: most recent remote release branch by commit date
git branch -r --sort=-committerdate | grep 'origin/release/' | head -5
```

- One active `release/*` branch → use it.
- Multiple → ask the user; suggest the most recently committed as the default.
- User specified one → use that.

### 2. Determine commits to cherry-pick

**Find the last sync point first.** Prior cherry-pick syncs are often squash-merged, so `git cherry` and `git log` cannot detect them as equivalent. Instead:

```bash
git fetch origin main <release-branch>

# Find the most recent cherry-pick sync PR on the release branch
git log --oneline origin/<release-branch> | grep -i -E "cherry.pick|sync.*main|bring back commits from main" | head -3
```

Read the PR body of the most recent sync (use `gh pr view <number>`) to identify which main commits it included. The **last main commit referenced** in that PR is your sync baseline.

Then list only commits **after** the sync baseline:

```bash
git log --oneline --reverse <last-synced-sha>..origin/main
```

If no prior sync PR exists, fall back to the full range:

```bash
git log --oneline --reverse origin/<release-branch>..origin/main
```

**Filtering rules:**
- User specified commits (SHAs/keywords) → use only those.
- User said to skip certain commits → exclude them.
- Default → take ALL commits from the log above.
- **Auto-skip** release-only commits: version bumps, CHANGELOG updates, "chore: release v*". Flag these as skipped with reason.
- **Auto-skip** commits already on release: use `git cherry -v origin/<release-branch> origin/main` as a secondary check — lines starting with `-` are already applied.
- Show the final commit list to the user and confirm before proceeding.

### 3. Check preconditions

```bash
# Must have clean working directory
git status --porcelain
```

If dirty, ask the user to commit or stash first.

### 4. Create working branch

Replace `/` with `-` in the release branch name when constructing the working branch:

```bash
git checkout -b chore/cherry-pick-main-into-$(echo <release-branch> | tr '/' '-')-YYYYMMDD origin/<release-branch>
```

Example: `release/2.2.0` → `chore/cherry-pick-main-into-release-2.2.0-20260313`.

### 5. Cherry-pick commits

Cherry-pick one at a time to isolate conflicts:

```bash
git cherry-pick <sha>
```

**On conflict:**
1. Inspect the conflict markers.
2. **Auto-resolve** if obvious and low-risk: import ordering, trivial merge context, whitespace.
3. **Ask the user** if: logic changes, behavioral differences, unclear intent, or risk of breaking something.
4. After resolving: `git add .` then `git cherry-pick --continue`.
5. If a commit cannot be applied and user agrees → `git cherry-pick --skip`.

Track all skipped and conflict-resolved commits for the PR body.

**Abort/rollback:** If the user wants to cancel the entire operation:
```bash
git cherry-pick --abort
git checkout -
git branch -D <working-branch>
```
Inform the user the repo has been restored to its original state.

**Already applied:** If cherry-pick says "already applied" or produces an empty commit, skip silently.

### 6. Push and create PR

```bash
git push -u origin HEAD

gh pr create \
--base <release-branch> \
--title "chore: sync main into <release-branch> (YYYY-MM-DD)" \
--body "<see template below>"
```

**PR body template:**

```markdown
## Summary

Cherry-pick commits from `main` into `<release-branch>` to keep the release branch in sync with hotfixes and patches.

### Commits included

- `abc1234` fix: description (#123)
- `def5678` feat: description (#456)

### Commits skipped

- `ghi9012` chore: release v2.0.5 (release-only)
- _None_ (if empty)

### Conflicts resolved

- `path/to/file.rs`: brief explanation of resolution
- _None_ (if empty)
```

### 7. Return the PR URL

## Edge Cases

- **No new commits** → tell user branches are in sync. Do not create empty PR.
- **User on wrong branch** → always create working branch from `origin/<release-branch>` regardless of current branch.
- **Multiple release branches** → ask which one; suggest the most recently committed as default.
Loading
Loading