Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
8f6710c
feat(widget): add effect atom earn flow
petar-omni Jun 26, 2026
15d72af
refactor(widget): replace xstate stores with effect atoms
petar-omni Jun 26, 2026
3127f0d
fix(widget): stabilize earn option resolution
petar-omni Jul 6, 2026
5dac944
feat: borrow init
petar-omni Jul 7, 2026
2110846
feat: temp
petar-omni Jul 7, 2026
90a2b21
fix(widget): stabilize earn atom subscriptions
petar-omni Jul 9, 2026
b2043f0
feat: schema decoding, query to atoms migration
petar-omni Jul 10, 2026
3c5bfdc
build(typescript): migrate to typescript 7
petar-omni Jul 10, 2026
67eb76f
refactor(widget): migrate runtime state to effect atoms
petar-omni Jul 14, 2026
0d6ed5f
refactor(widget): narrow published type declarations
petar-omni Jul 15, 2026
98e4c72
chore(repo): align workspace tooling configuration
petar-omni Jul 15, 2026
7f4ea37
refactor(widget): reorganize modules by ownership
petar-omni Jul 15, 2026
d00f44e
refactor(widget): simplify borrow wallet state projection
petar-omni Jul 16, 2026
3870423
refactor(widget): unify transaction workflow execution
petar-omni Jul 16, 2026
3dabf4a
fix(widget): stabilize transaction workflow execution
petar-omni Jul 16, 2026
9714f3d
fix(widget): stabilize transaction workflow atom identity
petar-omni Jul 16, 2026
df4abba
test(widget): stabilize asynchronous hook tests
petar-omni Jul 16, 2026
299528b
feat(widget): isolate runtime state by wallet scope
petar-omni Jul 17, 2026
533df27
feat(widget): establish scoped wallet runtime
petar-omni Jul 18, 2026
17b8feb
feat(widget): add scoped headless solana runtime
petar-omni Jul 18, 2026
2771fb0
feat(widget): make wallet service config authoritative
petar-omni Jul 18, 2026
e5a8a8b
feat(widget): own external provider synchronization
petar-omni Jul 18, 2026
835a450
feat(widget): publish canonical wallet state
petar-omni Jul 18, 2026
d1b6eb5
feat(widget): move wallet lifecycle policies
petar-omni Jul 18, 2026
d10d4fb
feat(widget): route commands from wallet state
petar-omni Jul 18, 2026
a77564b
feat(widget): integrate dynamic solana membership
petar-omni Jul 18, 2026
e43ea7d
refactor(widget): remove legacy wallet ownership
petar-omni Jul 18, 2026
16bd0ab
refactor(widget): simplify wallet service bootstrap
petar-omni Jul 19, 2026
9d4d279
refactor(widget): remove internal barrel exports
petar-omni Jul 19, 2026
6858258
feat(widget): enforce single widget instance lifecycle
petar-omni Jul 19, 2026
44726d1
refactor(widget): remove wallet reconnect serialization
petar-omni Jul 19, 2026
14473ae
chore(widget): enforce classic flow architecture
petar-omni Jul 19, 2026
b83fe8b
feat(widget): establish classic transaction flow core
petar-omni Jul 19, 2026
5e76122
feat(widget): add classic flow effect atom facade
petar-omni Jul 19, 2026
da95f91
feat(widget): migrate enter transaction flow
petar-omni Jul 19, 2026
b13cc54
feat(widget): migrate exit and manage transaction flows
petar-omni Jul 19, 2026
1cc25fa
feat(widget): migrate activity resume flow lifetime
petar-omni Jul 19, 2026
d13bc31
refactor(widget): isolate classic workflow handoff
petar-omni Jul 19, 2026
a3d26ae
refactor(widget): complete classic flow cutover
petar-omni Jul 19, 2026
f86f6d7
refactor(widget): deepen classic flow atom boundary
petar-omni Jul 20, 2026
e68f426
refactor(widget): scope classic flow by session
petar-omni Jul 20, 2026
8f8bd72
fix(widget): harden classic flow session boundaries
petar-omni Jul 20, 2026
5ad1c12
fix(widget): key flow lifecycle by route entry
petar-omni Jul 20, 2026
1b7fb13
refactor(widget): align classic flow lifetimes
petar-omni Jul 21, 2026
49c5f22
fix(widget): align action requests and workflow lifetimes
petar-omni Jul 21, 2026
364d5cc
refactor(widget): separate transaction flow ownership
petar-omni Jul 21, 2026
77802a3
refactor(widget): expose workflows through scoped atoms
petar-omni Jul 21, 2026
5ab29a2
refactor(widget): centralize authoritative resources
petar-omni Jul 22, 2026
59beec8
chore(widget): merge main into effect atom branch
petar-omni Jul 22, 2026
4baeb74
feat(widget): resolve earn selection and readiness
petar-omni Jul 23, 2026
768b66c
ci(release): add canary npm publishing
petar-omni Jul 23, 2026
d69dcf9
refactor(widget): adopt effect datetime
petar-omni Jul 23, 2026
f4ab711
refactor(widget): disallow nested ternaries
petar-omni Jul 23, 2026
f41ad22
fix(widget): correct borrow position data
petar-omni Jul 23, 2026
ae0dc50
feat(lint): enforce widget architecture rules
petar-omni Jul 24, 2026
1ac27c3
refactor(widget): move feature logic into atom-owned facades
petar-omni Jul 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 0 additions & 4 deletions .gitattributes

This file was deleted.

116 changes: 116 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ on:
push:
branches:
- main
workflow_dispatch:

concurrency: ${{ github.workflow }}-${{ github.ref }}

jobs:
release:
if: github.event_name == 'push'
name: Release
runs-on: ubuntu-latest
permissions:
Expand Down Expand Up @@ -83,3 +85,117 @@ jobs:
pnpm install --frozen-lockfile
pnpm exec turbo --filter=@stakekit/widget build
npm publish "./$PACKAGE_DIR"

canary:
if: github.event_name == 'workflow_dispatch'
name: Publish canary
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
id-token: write
concurrency:
group: npm-canary-publish
cancel-in-progress: false
env:
PACKAGE_DIR: packages/widget

steps:
# actions/checkout@v6.0.2
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
ref: ${{ github.sha }}
fetch-depth: 0

- name: Install mise
run: |
curl https://mise.run | MISE_VERSION=v2026.5.6 sh

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Agentic Security Review
Severity: HIGH

The canary publish job executes curl https://mise.run | ... sh directly, which runs mutable remote script content in a publish-capable CI path. This creates a trust-boundary break where compromise of the remote script source or transit path can execute arbitrary commands during release.

Impact: An attacker controlling that install script path could tamper with build/publish steps and ship malicious package artifacts under a trusted namespace.

Fix in Cursor Fix in Web

Reviewed by Cursor Security Reviewer for commit ae0dc50. Configure here.

echo "$HOME/.local/bin" >> "$GITHUB_PATH"
echo "$HOME/.local/share/mise/shims" >> "$GITHUB_PATH"
export PATH="$HOME/.local/bin:$HOME/.local/share/mise/shims:$PATH"
mise install

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Read npm release state
id: registry
shell: bash
run: |
package_name=$(node -p "require('./${PACKAGE_DIR}/package.json').name")
latest_version=$(npm view "${package_name}@latest" version)

{
echo "package_name=${package_name}"
echo "latest_version=${latest_version}"
} >> "$GITHUB_OUTPUT"

- name: Prepare canary version
id: canary_version
env:
LATEST_VERSION: ${{ steps.registry.outputs.latest_version }}
run: pnpm exec tsx packages/widget/scripts/prepare-canary-release.ts

- name: Build widget
run: pnpm exec turbo --filter=@stakekit/widget build

- name: Test widget
run: |
pnpm --filter @stakekit/widget test:unit
pnpm --filter @stakekit/widget test:dom

- name: Check canary publish status
id: publish
shell: bash
env:
PACKAGE_NAME: ${{ steps.registry.outputs.package_name }}
VERSION: ${{ steps.canary_version.outputs.version }}
run: |
if npm view "${PACKAGE_NAME}@${VERSION}" version >/dev/null 2>&1; then
echo "${PACKAGE_NAME}@${VERSION} is already published; skipping."
echo "should_publish=false" >> "$GITHUB_OUTPUT"
exit 0
fi

echo "should_publish=true" >> "$GITHUB_OUTPUT"

- name: Inspect package contents
if: steps.publish.outputs.should_publish == 'true'
run: npm pack "./$PACKAGE_DIR" --dry-run

- name: Publish canary to npm
if: steps.publish.outputs.should_publish == 'true'
run: npm publish "./$PACKAGE_DIR" --access public --tag canary

- name: Write release summary
env:
PACKAGE_NAME: ${{ steps.registry.outputs.package_name }}
VERSION: ${{ steps.canary_version.outputs.version }}
SHOULD_PUBLISH: ${{ steps.publish.outputs.should_publish }}
run: |
if [[ "$SHOULD_PUBLISH" == "true" ]]; then
release_status="Published"
else
release_status="Already published"
fi

{
echo "## Widget canary release"
echo
echo "| Field | Value |"
echo "| --- | --- |"
echo "| Status | ${release_status} |"
echo "| Package | ${PACKAGE_NAME} |"
echo "| Version | ${VERSION} |"
echo "| npm tag | canary |"
echo "| Branch | ${{ github.ref_name }} |"
echo "| Commit | ${{ github.sha }} |"
echo
echo "Install the moving canary channel:"
echo
echo " pnpm add ${PACKAGE_NAME}@canary"
echo
echo "Install this exact build:"
echo
echo " pnpm add ${PACKAGE_NAME}@${VERSION}"
} >> "$GITHUB_STEP_SUMMARY"
Loading
Loading