Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
e9d2552
chore: bump version to 0.65.0 and introduce HomeHub component
danieldanielecki May 27, 2026
957b6cc
fix: update color classes in WorldMarkets tests and e2e specs
danieldanielecki May 27, 2026
3d74a08
chore: update .gitignore and .prettierignore for test artifacts
danieldanielecki May 27, 2026
a99d2a5
feat: enhance PricingCard component with featured tier support
danieldanielecki May 28, 2026
acc0176
feat: Shared panel primitives (Hallmark)
danieldanielecki May 28, 2026
c8f4f82
feat: polish Navigation (Hallmark)
danieldanielecki May 28, 2026
5492791
feat: Micro-UX quality pass (Hallmark)
danieldanielecki May 28, 2026
d66f7dc
feat: improve Navbar (Hallmark
danieldanielecki May 28, 2026
193541f
feat: distinct layout archetype (Hallmark)
danieldanielecki May 28, 2026
25bb553
fix: formatting & unit tests
danieldanielecki May 30, 2026
229b064
fix: lighthouse
danieldanielecki May 30, 2026
ca9b540
fix: formatting
danieldanielecki May 30, 2026
a94d0e9
fix: minor color alignments across entire application (Hallmark)
danieldanielecki May 30, 2026
b3b71c6
fix: improve contrast
danieldanielecki May 30, 2026
bea4a41
fix: improve trial evaluation mechanism & expand to 60 minutes
danieldanielecki May 31, 2026
4b67387
fix: most of Hallmark findings
danieldanielecki May 31, 2026
7dd96d7
fix: failing Lighthouse
danieldanielecki Jun 1, 2026
6314b92
fix: all Hallmark last fixes
danieldanielecki Jun 1, 2026
01ac9d4
fix: lighthouse failing on pipeline
danieldanielecki Jun 1, 2026
dc0ff8c
fix: improve contrast on leftovers in Light mode
danieldanielecki Jun 1, 2026
a923d08
fix: cve in vitest
danieldanielecki Jun 1, 2026
61e6029
fix: missing secrets for Hosted AI
danieldanielecki Jun 2, 2026
21d954d
fix: another Hallmark non-critical improvements
danieldanielecki Jun 2, 2026
2775e31
fix: another Hallmark non-critical improvements
danieldanielecki Jun 2, 2026
cd4d762
fix: minor improvements
danieldanielecki Jun 2, 2026
8dcd5f6
fix: minor improvements
danieldanielecki Jun 2, 2026
d20a710
fix: (almost) last findings from Hallmark
danieldanielecki Jun 4, 2026
76b9db3
fix: (almost) last findings from Hallmark
danieldanielecki Jun 4, 2026
2355525
fix: (almost) last findings from Hallmark
danieldanielecki Jun 4, 2026
3b0a734
fix: last hallmark improvements
danieldanielecki Jun 4, 2026
b8167de
fix: formatting
danieldanielecki Jun 4, 2026
b4e5463
fix: several poitns from manual testing
danieldanielecki Jun 4, 2026
7607916
fix: try to vibe code fix again
danieldanielecki Jun 4, 2026
e1921e5
fix: auth popup & typography
danieldanielecki Jun 4, 2026
5b3748e
fix: unit tests
danieldanielecki Jun 4, 2026
e715ee8
fix: e2e tests
danieldanielecki Jun 5, 2026
11c8a73
fix: unscrollable app
danieldanielecki Jun 5, 2026
4b10ac3
fix: scrolling & auth popup
danieldanielecki Jun 5, 2026
d8e0178
fix: minor findings from manual testing (spacing, light mode header)
danieldanielecki Jun 5, 2026
dd1b90b
fix: spacing improvements
danieldanielecki Jun 6, 2026
abe3dba
fix: finally spacing on home
danieldanielecki Jun 6, 2026
e55477f
fix: minor contrast improvements
danieldanielecki Jun 6, 2026
7fd71d8
fix: another mini findings
danieldanielecki Jun 6, 2026
2b924a8
fix: hopefully last manual findings before running Hallmark again
danieldanielecki Jun 7, 2026
6e032ea
chore: update snapshots
danieldanielecki Jun 8, 2026
afad0b5
feat: add cursor hooks
danieldanielecki Jun 8, 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
24 changes: 24 additions & 0 deletions .cursor/hooks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"version": 1,
"hooks": {
"afterFileEdit": [
{
"command": ".cursor/hooks/after-file-edit.sh",
"timeout": 180
}
],
"afterTabFileEdit": [
{
"command": ".cursor/hooks/after-file-edit.sh",
"timeout": 180
}
],
"stop": [
{
"command": ".cursor/hooks/stop-quality-check.sh",
"timeout": 600,
"loop_limit": 0
}
]
}
}
52 changes: 52 additions & 0 deletions .cursor/hooks/after-file-edit.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/usr/bin/env bash
# Formats the edited file and runs vitest related tests.
# Full format:check, lint, and test suite run on agent stop (stop-quality-check.sh).

set -euo pipefail

input=$(cat)
file_path=$(
printf '%s' "$input" | python3 -c "import sys, json; print(json.load(sys.stdin).get('file_path', ''))"
)

if [[ -z "$file_path" || ! -f "$file_path" ]]; then
exit 0
fi

case "$file_path" in
*node_modules/* | */.next/* | */dist/* | */test-results/* | */playwright-report/*)
exit 0
;;
esac

project_root="${CURSOR_PROJECT_DIR:-$(cd "$(dirname "$0")/../.." && pwd)}"
cd "$project_root"

log() {
echo "[cursor-hook:afterFileEdit] $*" >&2
}

format_file() {
case "$file_path" in
*.ts | *.tsx | *.js | *.jsx | *.json | *.css | *.md | *.mjs | *.cjs | *.yml | *.yaml)
log "Formatting $file_path"
bunx prettier --write "$file_path"
;;
esac
}

run_related_tests() {
case "$file_path" in
*.ts | *.tsx | *.js | *.jsx)
log "Running related tests for $file_path"
if ! bun run test -- related "$file_path" --run; then
log "Related tests failed for $file_path (see output above)"
fi
;;
esac
}

format_file
run_related_tests

exit 0
39 changes: 39 additions & 0 deletions .cursor/hooks/stop-quality-check.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/usr/bin/env bash
# Full quality gate when the agent finishes a turn: format check, lint, unit tests.

set -euo pipefail

cat >/dev/null

project_root="${CURSOR_PROJECT_DIR:-$(cd "$(dirname "$0")/../.." && pwd)}"
cd "$project_root"

log() {
echo "[cursor-hook:stop] $*" >&2
}

failures=()

log "Running format:check..."
if ! bun run format:check; then
failures+=("format:check")
fi

log "Running lint..."
if ! bun run lint; then
failures+=("lint")
fi

log "Running unit tests..."
if ! bun run test -- --run; then
failures+=("test")
fi

if ((${#failures[@]} > 0)); then
log "Quality gate failed: ${failures[*]}"
# Stop hooks are observational; exit 0 so the session is not blocked.
exit 0
fi

log "Quality gate passed."
exit 0
10 changes: 9 additions & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
{
"extends": ["next/core-web-vitals", "next/typescript"],
"rules": {
"@typescript-eslint/no-explicit-any": "warn"
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-unused-vars": [
"warn",
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"caughtErrorsIgnorePattern": "^_"
}
]
}
}
8 changes: 7 additions & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ jobs:
#
# Environment secrets (GitHub "Production" vs "Preview"): only Appwrite targets differ per env:
# APPWRITE_DATABASE_ID, APPWRITE_COLLECTION_ID_TRIAL_SESSIONS, APPWRITE_COLLECTION_ID_AI_KEYS, APPWRITE_COLLECTION_ID_SUBSCRIPTIONS
# All other deploy secrets stay repository-wide: VERCEL_*, NEXT_PUBLIC_APPWRITE_*, APPWRITE_API_KEY.
# All other deploy secrets stay repository-wide: VERCEL_*, NEXT_PUBLIC_APPWRITE_*, APPWRITE_API_KEY,
# AI_PROVIDER, AI_API_KEY (Hosted AI / Ditectrev AI on server — synced to Vercel below).
# Set GitHub variable NEXT_PUBLIC_SITE_URL (e.g. https://theopenstock.com) for canonical URLs, sitemap, and OG.
# With `environment:` set, GitHub still exposes repository secrets to the job; environment adds/overrides
# only the names defined on that environment (here: Appwrite DB + collection ids).
Expand Down Expand Up @@ -188,6 +189,11 @@ jobs:
vercel env add FINNHUB_BASE_URL $ENV_TYPE "" --value "${{ vars.FINNHUB_BASE_URL }}" --yes --force --token=${{ secrets.VERCEL_TOKEN }}
fi
vercel env add FINNHUB_API_KEY $ENV_TYPE "" --value "${{ secrets.FINNHUB_API_KEY }}" --yes --force --sensitive --token=${{ secrets.VERCEL_TOKEN }}
vercel env add AI_PROVIDER $ENV_TYPE "" --value "${{ secrets.AI_PROVIDER }}" --yes --force --token=${{ secrets.VERCEL_TOKEN }}
vercel env add AI_API_KEY $ENV_TYPE "" --value "${{ secrets.AI_API_KEY }}" --yes --force --sensitive --token=${{ secrets.VERCEL_TOKEN }}
if [ -n "${{ vars.AI_MODEL }}" ]; then
vercel env add AI_MODEL $ENV_TYPE "" --value "${{ vars.AI_MODEL }}" --yes --force --token=${{ secrets.VERCEL_TOKEN }}
fi
if [ -n "${{ vars.YAHOO_FINANCE_API_URL }}" ]; then
vercel env add YAHOO_FINANCE_API_URL $ENV_TYPE "" --value "${{ vars.YAHOO_FINANCE_API_URL }}" --yes --force --token=${{ secrets.VERCEL_TOKEN }}
fi
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ pnpm-lock.yaml
# Testing
/coverage
*.lcov
/playwright-report/
/test-results/
/playwright/.cache/

# Vercel
.vercel
Expand Down
16 changes: 16 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Build & dependencies
.next/
out/
node_modules/
.vercel/

# Test & Playwright artifacts (generated locally / in CI)
coverage/
playwright-report/
test-results/
.lighthouseci/
e2e/**/*.png
**/*-snapshots/**

# Lockfiles Prettier doesn't need to touch
bun.lockb
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,16 @@ If `ollama serve` shows `127.0.0.1:11434: bind: address already in use`, Ollama

Also required for trial features: `APPWRITE_COLLECTION_ID_TRIAL_SESSIONS`.

### Hosted AI (Ditectrev AI tier on production)

Required on Vercel when subscribers use the **Hosted AI** plan. Synced from GitHub Actions on deploy (see `.github/workflows/deploy.yml`).

| Variable | Description | Example |
| ------------- | ------------------------------------------------------------------------------------- | ---------- |
| `AI_PROVIDER` | Server LLM vendor for Hosted AI (`MISTRAL`, `OPENAI`, `GEMINI`, `DEEPSEEK`, `OLLAMA`) | `MISTRAL` |
| `AI_API_KEY` | API key for that provider | _(secret)_ |
| `AI_MODEL` | Optional model override; defaults are used per provider if unset | unset |

### SEO & analytics (recommended for production)

| Variable | Description |
Expand Down
2 changes: 2 additions & 0 deletions __tests__/performance.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,9 @@ describe("Lazy loading behavior (Req 15.2)", () => {
"AdBanner",
"LazySection",
"AIPredictionPanel",
"HomeHub",
"StockOfTheDayPanel",
"ProductShell",
];

for (const imp of staticImports!) {
Expand Down
Loading
Loading