Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
2956193
feat(backend): Strategy 테이블 order 필드 추가 및 reorder API 구현 (PRO-64)
fray-cloud Apr 1, 2026
c1b4056
Merge pull request #69 from fray-cloud/feat/#64
fray-cloud Apr 1, 2026
567d2be
feat(portfolio): add asset card view with toggle, fix backtesting CI …
fray-cloud Apr 1, 2026
50c7cd5
feat: 전략 카드 DnD 순서 변경 (PRO-50)
fray-cloud Apr 1, 2026
4551b48
[PRO-53] 대시보드 위젯 DnD 레이아웃 (#71)
fray-cloud Apr 1, 2026
db5bc2f
docs(qa): add QA strategy, definition of done, and bug tracking docs …
fray-cloud Apr 1, 2026
762c3f5
feat: 플로우 기능 UI 개선 (#77) (#74)
fray-cloud Apr 1, 2026
94dec62
claude: gstack update
fray-cloud Apr 1, 2026
74d0971
claude: update edit
fray-cloud Apr 1, 2026
d299a42
feat: apply select box to condition node enum parameters
fray-cloud Apr 2, 2026
8e0d990
fix: normalize symbol to uppercase before Binance API calls
fray-cloud Apr 2, 2026
a92bea4
Merge fix/#93: 조건 노드 Select Box 적용 [PRO-93]
fray-cloud Apr 2, 2026
975adf0
Merge fix/#92: 백테스트 심볼 대문자 정규화
fray-cloud Apr 2, 2026
c72122b
fix: implement paginated getCandlesByRange for historical backtest data
fray-cloud Apr 2, 2026
ee3c0ec
Merge fix/#75: 백테스트 히스토리 날짜범위 수정 - paginated getCandlesByRange
fray-cloud Apr 2, 2026
72c046d
docs: add branch cleanup policy to CONTRIBUTING.md (PRO-100)
fray-cloud Apr 2, 2026
52749fe
[feat] #80 Multi-Timeframe 서비스 레이어 및 HTF 캔들/조합/추세 전략 추가
fray-cloud Apr 2, 2026
9599144
[fix] #76 백테스트 심볼 슬래시 형식 처리 (BTC/USDT → BTCUSDT 변환)
fray-cloud Apr 2, 2026
8f697fc
feat(web): add demo mode infrastructure (Phase 1)
fray-cloud Apr 6, 2026
0877169
feat(web): landing page, demo UI, exchange public WebSocket (Phase 2-4)
fray-cloud Apr 6, 2026
80d3201
fix(web): replace Github icon with ExternalLink in demo landing
fray-cloud Apr 6, 2026
50b9bc7
fix(web): resolve demo mode issues - WebSocket, icons, mutation blocking
fray-cloud Apr 6, 2026
c55d792
fix(web): use client-side AppShell for demo/app layout switching
fray-cloud Apr 6, 2026
d8d4a13
feat(web): redesign demo landing — voltagent-inspired dark theme
fray-cloud Apr 6, 2026
dfe846e
fix(web): add missing MSW mock data files, fix .gitignore
fray-cloud Apr 6, 2026
c76bb56
fix(web): remove style prop from lucide icon in architecture-flow
fray-cloud Apr 6, 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
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .claude/skills/autoplan
1 change: 1 addition & 0 deletions .claude/skills/benchmark
1 change: 1 addition & 0 deletions .claude/skills/browse
1 change: 1 addition & 0 deletions .claude/skills/canary
1 change: 1 addition & 0 deletions .claude/skills/careful
1 change: 1 addition & 0 deletions .claude/skills/codex
1 change: 1 addition & 0 deletions .claude/skills/connect-chrome
1 change: 1 addition & 0 deletions .claude/skills/cso
1 change: 1 addition & 0 deletions .claude/skills/design-consultation
1 change: 1 addition & 0 deletions .claude/skills/design-html
1 change: 1 addition & 0 deletions .claude/skills/design-review
1 change: 1 addition & 0 deletions .claude/skills/design-shotgun
1 change: 1 addition & 0 deletions .claude/skills/document-release
1 change: 1 addition & 0 deletions .claude/skills/freeze
1 change: 1 addition & 0 deletions .claude/skills/gstack-upgrade
5 changes: 5 additions & 0 deletions .claude/skills/gstack/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Copy to .env and fill in values
# bun auto-loads .env — no dotenv needed

# Required for LLM-as-judge evals (bun run test:eval)
ANTHROPIC_API_KEY=sk-ant-your-key-here
4 changes: 4 additions & 0 deletions .claude/skills/gstack/.github/actionlint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
self-hosted-runner:
labels:
- ubicloud-standard-2
- ubicloud-standard-8
63 changes: 63 additions & 0 deletions .claude/skills/gstack/.github/docker/Dockerfile.ci
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# gstack CI eval runner — pre-baked toolchain + deps
# Rebuild weekly via ci-image.yml, on Dockerfile changes, or on lockfile changes
FROM ubuntu:24.04

ENV DEBIAN_FRONTEND=noninteractive

# System deps
RUN apt-get update && apt-get install -y --no-install-recommends \
git curl unzip ca-certificates jq bc gpg \
&& rm -rf /var/lib/apt/lists/*

# GitHub CLI
RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
| gpg --dearmor -o /usr/share/keyrings/githubcli-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
| tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
&& apt-get update && apt-get install -y --no-install-recommends gh \
&& rm -rf /var/lib/apt/lists/*

# Node.js 22 LTS (needed for claude CLI)
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y --no-install-recommends nodejs \
&& rm -rf /var/lib/apt/lists/*

# Bun (install to /usr/local so non-root users can access it)
ENV BUN_INSTALL="/usr/local"
RUN curl -fsSL https://bun.sh/install | BUN_VERSION=1.3.10 bash

# Claude CLI
RUN npm i -g @anthropic-ai/claude-code

# Playwright system deps (Chromium) — needed for browse E2E tests
RUN npx playwright install-deps chromium

# Pre-install dependencies (cached layer — only rebuilds when package.json changes)
COPY package.json /workspace/
WORKDIR /workspace
RUN bun install && rm -rf /tmp/*

# Install Playwright Chromium to a shared location accessible by all users
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/playwright-browsers
RUN npx playwright install chromium \
&& chmod -R a+rX /opt/playwright-browsers

# Verify everything works
RUN bun --version && node --version && claude --version && jq --version && gh --version \
&& npx playwright --version

# At runtime: checkout overwrites /workspace, but node_modules persists
# if we move it out of the way and symlink back
# Save node_modules + package.json snapshot for cache validation at runtime
RUN mv /workspace/node_modules /opt/node_modules_cache \
&& cp /workspace/package.json /opt/node_modules_cache/.package.json

# Claude CLI refuses --dangerously-skip-permissions as root.
# Create a non-root user for eval runs (GH Actions overrides USER, so
# the workflow must set options.user or use gosu/su-exec at runtime).
RUN useradd -m -s /bin/bash runner \
&& chmod -R a+rX /opt/node_modules_cache \
&& mkdir -p /home/runner/.gstack && chown -R runner:runner /home/runner/.gstack \
&& chmod 1777 /tmp \
&& mkdir -p /home/runner/.bun && chown -R runner:runner /home/runner/.bun \
&& chmod -R 1777 /tmp
8 changes: 8 additions & 0 deletions .claude/skills/gstack/.github/workflows/actionlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
name: Workflow Lint
on: [push, pull_request]
jobs:
actionlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: rhysd/actionlint@v1.7.11
40 changes: 40 additions & 0 deletions .claude/skills/gstack/.github/workflows/ci-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Build CI Image
on:
# Rebuild weekly (Monday 6am UTC) to pick up CLI updates
schedule:
- cron: '0 6 * * 1'
# Rebuild on Dockerfile or lockfile changes
push:
branches: [main]
paths:
- '.github/docker/Dockerfile.ci'
- 'package.json'
# Manual trigger
workflow_dispatch:

jobs:
build:
runs-on: ubicloud-standard-2
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4

# Copy lockfile + package.json into Docker build context
- run: cp package.json .github/docker/

- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- uses: docker/build-push-action@v6
with:
context: .github/docker
file: .github/docker/Dockerfile.ci
push: true
tags: |
ghcr.io/${{ github.repository }}/ci:latest
ghcr.io/${{ github.repository }}/ci:${{ github.sha }}
129 changes: 129 additions & 0 deletions .claude/skills/gstack/.github/workflows/evals-periodic.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
name: Periodic Evals
on:
schedule:
- cron: '0 6 * * 1' # Monday 6 AM UTC
workflow_dispatch:

concurrency:
group: evals-periodic
cancel-in-progress: true

env:
IMAGE: ghcr.io/${{ github.repository }}/ci
EVALS_TIER: periodic
EVALS_ALL: 1 # Ignore diff — run all periodic tests

jobs:
build-image:
runs-on: ubicloud-standard-2
permissions:
contents: read
packages: write
outputs:
image-tag: ${{ steps.meta.outputs.tag }}
steps:
- uses: actions/checkout@v4

- id: meta
run: echo "tag=${{ env.IMAGE }}:${{ hashFiles('.github/docker/Dockerfile.ci', 'package.json') }}" >> "$GITHUB_OUTPUT"

- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Check if image exists
id: check
run: |
if docker manifest inspect ${{ steps.meta.outputs.tag }} > /dev/null 2>&1; then
echo "exists=true" >> "$GITHUB_OUTPUT"
else
echo "exists=false" >> "$GITHUB_OUTPUT"
fi

- if: steps.check.outputs.exists == 'false'
run: cp package.json .github/docker/

- if: steps.check.outputs.exists == 'false'
uses: docker/build-push-action@v6
with:
context: .github/docker
file: .github/docker/Dockerfile.ci
push: true
tags: |
${{ steps.meta.outputs.tag }}
${{ env.IMAGE }}:latest

evals:
runs-on: ubicloud-standard-2
needs: build-image
container:
image: ${{ needs.build-image.outputs.image-tag }}
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
options: --user runner
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
suite:
- name: e2e-plan
file: test/skill-e2e-plan.test.ts
- name: e2e-design
file: test/skill-e2e-design.test.ts
- name: e2e-qa-bugs
file: test/skill-e2e-qa-bugs.test.ts
- name: e2e-qa-workflow
file: test/skill-e2e-qa-workflow.test.ts
- name: e2e-review
file: test/skill-e2e-review.test.ts
- name: e2e-workflow
file: test/skill-e2e-workflow.test.ts
- name: e2e-routing
file: test/skill-routing-e2e.test.ts
- name: e2e-codex
file: test/codex-e2e.test.ts
- name: e2e-gemini
file: test/gemini-e2e.test.ts
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Fix bun temp
run: |
mkdir -p /home/runner/.cache/bun
{
echo "BUN_INSTALL_CACHE_DIR=/home/runner/.cache/bun"
echo "BUN_TMPDIR=/home/runner/.cache/bun"
echo "TMPDIR=/home/runner/.cache"
} >> "$GITHUB_ENV"

- name: Restore deps
run: |
if [ -d /opt/node_modules_cache ] && diff -q /opt/node_modules_cache/.package.json package.json >/dev/null 2>&1; then
ln -s /opt/node_modules_cache node_modules
else
bun install
fi

- run: bun run build

- name: Run ${{ matrix.suite.name }}
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
EVALS_CONCURRENCY: '40'
PLAYWRIGHT_BROWSERS_PATH: /opt/playwright-browsers
run: EVALS=1 bun test --retry 2 --concurrent --max-concurrency 40 ${{ matrix.suite.file }}

- name: Upload eval results
if: always()
uses: actions/upload-artifact@v4
with:
name: eval-periodic-${{ matrix.suite.name }}
path: ~/.gstack-dev/evals/*.json
retention-days: 90
Loading
Loading