Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
baf4692
chore: remove unused _set_refs helper (#4)
detail-app[bot] Sep 22, 2026
e0c381b
chore: remove unused seed-engine JS functions (encodeConfig, randomSe…
detail-app[bot] Sep 22, 2026
1a4d3f4
chore: remove unused load field from card_fourteen days data (#6)
detail-app[bot] Sep 22, 2026
0d322a8
chore: remove dead charting_components getting-started examples (#7)
detail-app[bot] Sep 22, 2026
c5474e2
chore: remove unused Session dataclass from clientstate_components (#8)
detail-app[bot] Sep 22, 2026
fdd33be
chore(remove): dead theming_components example functions (#12)
detail-app[bot] Sep 22, 2026
c46cdd9
chore: remove dead barchart_v8 component (#11)
detail-app[bot] Sep 22, 2026
2895604
chore: remove unused select_radio_option_row helper (#10)
detail-app[bot] Sep 22, 2026
e54dd57
chore: remove dashboard_components dead snippets (#9)
detail-app[bot] Sep 22, 2026
cf4af2f
fix: add relative positioning to codeblock copy button ancestors (#16)
elviskahoro Oct 2, 2026
8767fd3
Remove duplicate social link input IDs (#17)
elviskahoro Oct 2, 2026
a6205fb
Restore smooth Collapsible panel height animation (#18)
elviskahoro Oct 2, 2026
e190cb8
Preserve terminal icon while copying block commands (#21)
elviskahoro Oct 2, 2026
c600483
Preserve custom styling on context menu shortcuts (#20)
elviskahoro Oct 2, 2026
012ae57
Restore button group separator spacing for orientation attributes (#19)
elviskahoro Oct 2, 2026
93ba1d5
chore: remove dead menu.py constants and type aliases (#13)
detail-app[bot] Oct 3, 2026
c42abe9
Add gtm-linear SDK and Typer-based Linear issue CLI (#14)
elviskahoro Oct 2, 2026
af95b09
fix(collapsible): shield panel height transition from class_name merg…
detail-app[bot] Oct 3, 2026
072857e
Add roborev config: pi agent with GLM-5.3 via Fireworks (#24)
elviskahoro Oct 3, 2026
6f52201
Enable Pullfrog runs from GitHub Actions (#46)
elviskahoro Oct 3, 2026
72f3248
Configure Pullfrog to run on Fireworks GLM 5.3
elviskahoro Oct 3, 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
82 changes: 82 additions & 0 deletions .github/workflows/pullfrog.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# PULLFROG ACTION — DO NOT EDIT EXCEPT WHERE INDICATED
name: Pullfrog
run-name: ${{ inputs.name || github.workflow }}
on:
workflow_dispatch:
inputs:
prompt:
type: string
description: Agent prompt
name:
type: string
description: Run name

permissions:
contents: read

jobs:
pullfrog:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Run agent
uses: pullfrog/pullfrog@v0
with:
prompt: ${{ inputs.prompt }}
# Fireworks GLM 5.3 — same model roborev uses in gtm-sdk
# (.roborev.toml: fireworks/accounts/fireworks/models/glm-5p3).
# Raw models.dev specifier; runs through OpenCode on BYOK.
model: fireworks-ai/accounts/fireworks/models/glm-5p3
env:
# add at least one provider API key
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GOOGLE_GENERATIVE_AI_API_KEY:
${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
MOONSHOT_API_KEY: ${{ secrets.MOONSHOT_API_KEY }}
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}

# for Amazon Bedrock (https://docs.pullfrog.com/bedrock)
# AWS_BEARER_TOKEN_BEDROCK: ${{ secrets.AWS_BEARER_TOKEN_BEDROCK }}
# AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
# AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# AWS_REGION: us-east-1
# BEDROCK_MODEL_ID: <bedrock-model-id>

# for Google Vertex AI (https://docs.pullfrog.com/vertex)
# VERTEX_SERVICE_ACCOUNT_JSON: >-
# ${{ secrets.VERTEX_SERVICE_ACCOUNT_JSON }}
# GOOGLE_CLOUD_PROJECT: my-project
# VERTEX_LOCATION: global
# VERTEX_MODEL_ID: <vertex-model-id>

# for Azure OpenAI (https://docs.pullfrog.com/azure)
# AZURE_RESOURCE_NAME is the <name> in https://<name>.openai.azure.com
# AZURE_DEPLOYMENT is your deployment's name, not the model it serves
# AZURE_RESOURCE_NAME: my-resource
# AZURE_API_KEY: ${{ secrets.AZURE_API_KEY }}
# AZURE_DEPLOYMENT: <deployment-name>
# both limits are required — set them to the real limits of that model
# AZURE_CONTEXT: "400000"
# AZURE_MAX_OUTPUT: "128000"

# for any OpenAI-compatible endpoint — LiteLLM, Cloudflare AI Gateway,
# self-hosted vLLM (https://docs.pullfrog.com/openai-compatible)
# OPENAI_COMPATIBLE_BASE_URL: https://litellm.example.com/v1
# OPENAI_COMPATIBLE_API_KEY: ${{ secrets.OPENAI_COMPATIBLE_API_KEY }}
# OPENAI_COMPATIBLE_MODEL: <model-id>
# both limits are required — set them to the real limits of that model
# OPENAI_COMPATIBLE_CONTEXT: "128000"
# OPENAI_COMPATIBLE_MAX_OUTPUT: "16384"
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,9 @@ wheels/
*.egg-info
codebook.toml

# Local secrets (used by scripts/linear_cli.py via gtm-linear) — never commit
.env
.env.local

# Virtual environments
.venv
8 changes: 8 additions & 0 deletions .roborev.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# roborev review configuration for buridan/ui.
#
# `review_guidelines` is embedded into every review prompt. Use it to encode
# deliberate house decisions so the reviewer stops re-flagging them as findings.

# Use the Pi coding agent with the Fireworks provider for review jobs.
agent = "pi"
model = "fireworks/accounts/fireworks/models/glm-5p3"
11 changes: 0 additions & 11 deletions app/engine/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,17 +165,6 @@ def _sync_sidebar_js() -> str:
return "if (window.__syncSidebar) window.__syncSidebar(config);"


# ── helpers used by multiple actions ─────────────────────────────────────────


def _set_refs(seed_val: str = "newSeed") -> str:
"""Sync ClientStateVars that are still needed for reactive UI."""
return f"""
// Still needed: seed display, copy button, css_output rendering
if (refs['_client_state_setSeed']) refs['_client_state_setSeed']({seed_val});
"""


# ── actions ───────────────────────────────────────────────────────────────────

SHUFFLE_JS = f"""
Expand Down
38 changes: 0 additions & 38 deletions app/engine/seed.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,6 @@ def seed_engine() -> rx.Script:
return out;
}}

function toBase62(n, len) {{
let res = "";
for (let i = 0; i < len; i++) {{
res += CHARS[n % 62];
n = Math.floor(n / 62);
}}
return res;
}}

function fromBase62(s) {{
let n = 0;
for (let i = s.length - 1; i >= 0; i--) {{
Expand All @@ -69,27 +60,6 @@ def seed_engine() -> rx.Script:
return n;
}}

function encodeConfig(theme) {{
const bIdx = BASE_THEMES.findIndex(b => b.id === theme['__base_id']);
const cIdx = theme['__color_id'] ? COLOR_THEMES.findIndex(c => c.id === theme['__color_id']) + 1 : 0;
const chIdx = theme['__chart_id'] ? COLOR_THEMES.findIndex(c => c.id === theme['__chart_id']) + 1 : 0;
const sIdx = STYLE_REGISTRY.findIndex(s => s.id === theme['__style_id']);
const fIdx = FONT_REGISTRY.findIndex(f => f.id === theme['__font_id']);
const rIdx = RADIUS_OPTIONS.findIndex(r => r[1] === theme['--radius']);

if (bIdx === -1 || sIdx === -1 || fIdx === -1 || rIdx === -1) return null;

// Default state special case
if (bIdx === 0 && cIdx === 0 && chIdx === 0 && sIdx === 0 && fIdx === 0 && rIdx === 2) return "b0";

// State space: 6 * 11 * 11 * 5 * 5 * 4 = 72600
let n = (((((bIdx * 11 + cIdx) * 11 + chIdx) * 5 + sIdx) * 5 + fIdx) * 4 + rIdx);

// Encode as 9 chars: [Base62(N, 4)] + [Base62(Checksum(N), 5)]
const checksum = (n * 12345) % 916132832; // 62^5
return toBase62(n, 4) + toBase62(checksum, 5);
}}

function decodeSeed(seed) {{
if (!seed) return null;
if (seed === "b0") {{
Expand Down Expand Up @@ -210,21 +180,13 @@ def seed_engine() -> rx.Script:
return theme;
}}

function randomSeed() {{
const n = Math.floor(Math.random() * 72600);
const checksum = (n * 12345) % 916132832;
return toBase62(n, 4) + toBase62(checksum, 5);
}}

window.__STYLE_REGISTRY = STYLE_REGISTRY;
window.__BASE_THEMES = BASE_THEMES;
window.__COLOR_THEMES = COLOR_THEMES;
window.__FONT_REGISTRY = FONT_REGISTRY;
window.__RADIUS_OPTIONS = RADIUS_OPTIONS;
window.__generateFromSeed = generateFromSeed;
window.__rebuildTheme = rebuildTheme;
window.__randomSeed = randomSeed;
window.__flattenVars = flattenVars;
window.__encodeConfig = encodeConfig;
window.__decodeSeed = decodeSeed;
""")
15 changes: 7 additions & 8 deletions app/examples/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -741,7 +741,6 @@ def card_ten() -> rx.Component:
),
input_group.root(
input_group.input(
id="inline-start-input",
placeholder=field["placeholder"],
),
input_group.addon(
Expand Down Expand Up @@ -1143,13 +1142,13 @@ def checkbox_row(item: dict) -> rx.Component:
@masonry_card(label="Healthcare")
def card_fourteen() -> rx.Component:
days = [
{"label": "M", "calories": 75, "load": 60},
{"label": "T", "calories": 30, "load": 25},
{"label": "W", "calories": 55, "load": 45},
{"label": "T", "calories": 45, "load": 35},
{"label": "F", "calories": 80, "load": 65},
{"label": "S", "calories": 25, "load": 20},
{"label": "S", "calories": 40, "load": 30},
{"label": "M", "calories": 75},
{"label": "T", "calories": 30},
{"label": "W", "calories": 55},
{"label": "T", "calories": 45},
{"label": "F", "calories": 80},
{"label": "S", "calories": 25},
{"label": "S", "calories": 40},
]

def day_bar(day: dict) -> rx.Component:
Expand Down
11 changes: 6 additions & 5 deletions app/examples/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,23 +57,24 @@ def wrapper(*args, **kwargs):
inner_component = func(*args, **kwargs)
cmd = f"uv run buridan add {func.__qualname__}"
btn_id = generate_component_id()
text_id = f"text-{btn_id}"
return rx.el.div(
rx.el.div(
button(
hi("TerminalIcon", class_name="size-4 shrink-0"),
cmd,
rx.el.span(cmd, id=text_id),
variant="outline",
size="sm",
id=btn_id,
on_click=rx.call_script(f"""
const btn = document.getElementById({btn_id!r});
const text = document.getElementById({text_id!r});
navigator.clipboard.writeText({cmd!r});

const original = btn.innerText;
btn.innerText = "Copied!";
const original = text.innerText;
text.innerText = "Copied!";

setTimeout(() => {{
btn.innerText = original;
text.innerText = original;
}}, 1000);
"""),
class_name="min-w-3xs",
Expand Down
43 changes: 0 additions & 43 deletions app/templates/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,49 +41,6 @@
"""


def select_radio_option_row(
title: str, description: str, group_name: str, value: str, default_on: bool = False
) -> rx.Component:
return rx.el.label(
rx.el.div(
rx.el.p(title, class_name="text-foreground font-medium text-sm"),
rx.el.p(
description,
class_name="text-muted-foreground max-w-[24rem] text-xs font-light leading-normal",
),
class_name="flex flex-col gap-y-1",
),
rx.el.div(
rx.el.input(
type="radio",
name=group_name,
value=value,
default_checked=default_on,
class_name="peer sr-only",
),
rx.el.div(
rx.el.span(
"✓",
class_name="text-primary-foreground text-[11px] font-bold hidden",
),
class_name=(
"flex size-4 items-center justify-center rounded-[4px] transition-colors "
"border border-input bg-transparent "
"peer-checked:bg-primary peer-checked:border-primary "
"[&_span]:peer-checked:block"
),
),
class_name="flex items-center",
),
class_name=(
"w-full rounded-2xl px-4 py-2.5 flex flex-row items-center justify-between "
"text-left transition-all cursor-pointer border-1 "
"border-input/90 bg-transparent hover:bg-secondary/20 "
"has-[:checked]:border-primary has-[:checked]:dark:border-input has-[:checked]:bg-secondary/60"
),
)


def select_local_or_reflex_build_option(
title: str,
description: str,
Expand Down
Loading
Loading