Skip to content

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage) - #1863

Merged
os-zhuang merged 6 commits into
mainfrom
showcase-examples
Jun 15, 2026
Merged

os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sys xuyushun441-sys commented Jun 15, 2026 •

Copy link
Copy Markdown
Collaborator

Found while testing the showcase package's metadata designers in Studio against an isolated showcase backend. Two designers had zero instances (nothing to render), plus a real designer coverage gap.

1. hook examples (0 → 3)

examples/app-showcase/src/hooks/ wired via defineStack({ hooks }):

  • showcase_normalize_task_title — beforeInsert/beforeUpdate, L2 JS body trimming the title (multi-event, mutates ctx.input).
  • showcase_audit_task_completion — afterUpdate gated by a CEL condition, async with a retryPolicy, onError: log, capabilities: [log].
  • showcase_warn_over_budget — afterUpdate on showcase_project.

Bodies use the real After-hook context (ctx.result / ctx.input — there is no ctx.record) and are guarded with typeof ctx.log === 'function' so both a fresh seed and a warm restart boot with 0 hook errors.

2. AI tool examples (0 → 2)

FindProjectTool was defined via defineTool but never imported into the config or passed to defineStack, so the tool designer was empty and the ProjectOps skill's tools: ['showcase_find_project'] reference dangled. Wired via defineStack({ tools }) and added a second object-bound tool (showcase_summarize_project_tasks — objectName + requiresConfirmation) so the designer covers both shapes; the skill now references both.

3. fix(spec) — complete hook designer coverage

The hook form's Execution section exposed async / onError / condition but omitted retryPolicy and the top-level timeout (both real HookSchema props). Added a retryPolicy composite + timeout field.

Verification (browser, isolated showcase backend)

  • Hook list 0 → 3; tool list 0 → 2.
  • Hook designer renders every property incl. the composite body editor (real JS, not [object Object]) and Execution: async / onError / Timeout / condition / Retry Policy → Max Retries / Backoff Ms.
  • Tool designer renders name/label/description/category/objectName/active/builtIn/requiresConfirmation + the parameters JSON schema as an input-params table + example LLM call.
  • Fresh DB seed + warm restart: 0 runtime errors.
  • Also verified the field-zoo object designer renders ~28 distinct field-type widgets; showcase is banner-clean.

Note (out of scope, pre-existing)

The showcase's own pnpm typecheck is already red on main (not in the CI gate): the Field.* builders type predicate params with the output type (z.infer), so the documented string shorthand for requiredWhen / visibleWhen / readonlyWhen fails tsc even though it's valid at runtime. That's a spec type-ergonomics fix (use z.input), best done separately.

🤖 Generated with Claude Code

os-zhuang and others added 3 commits June 15, 2026 09:37
The showcase had zero `hook` examples, so the Studio hook designer had
nothing to render. Add three hooks under src/hooks that together exercise the
hook surface and give Studio real metadata to display:

  • showcase_normalize_task_title — beforeInsert/beforeUpdate, L2 JS body that
    trims the task title (multi-event, mutate ctx.input).
  • showcase_audit_task_completion — afterUpdate gated by a CEL condition,
    async fire-and-forget with a retryPolicy, onError=log, capabilities=[log].
  • showcase_warn_over_budget — afterUpdate on showcase_project, condition +
    async log.

Wired via `defineStack({ hooks })`. Bodies read ctx.result/ctx.input (the real
After-hook context shape — there is no ctx.record) and are guarded so a fresh
seed runs them without throwing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The hook form's Execution section exposed async / onError / condition but not
`retryPolicy` ({ maxRetries, backoffMs }) or the top-level `timeout`, both of
which are real HookSchema properties — so the designer could not show or edit
them. Add a `retryPolicy` composite and a `timeout` number to the Execution
section so the hook designer covers the full schema.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 15, 2026 6:55am

Request Review

os-zhuang and others added 2 commits June 15, 2026 09:53
A persisted-DB restart re-fired the afterUpdate hooks during rollup recompute
and `ctx.log(...)` threw "not a function" — the `log` capability binding is not
reliably callable in the sandbox. Guard with `typeof ctx.log === 'function'`
so the audit / over-budget hooks are no-ops when logging is unavailable instead
of throwing. Verified: fresh seed and warm restart both boot with 0 hook errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…bound tool)

`FindProjectTool` was defined via defineTool but never imported into the config
or passed to defineStack, so the Studio tool designer showed zero instances and
the ProjectOps skill's `tools: ['showcase_find_project']` reference dangled.

Wire the tools via `defineStack({ tools })` and add a second, object-bound tool
(`showcase_summarize_project_tasks`, objectName + requiresConfirmation) so the
tool designer covers both the plain and object-scoped shapes. The skill now
references both.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added size/m and removed size/s labels Jun 15, 2026
@xuyushun441-sys xuyushun441-sys changed the title feat(showcase): hook examples + complete hook designer coverage (retryPolicy/timeout) feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage) Jun 15, 2026
@os-zhuang
os-zhuang merged commit 6b6c065 into main Jun 15, 2026
13 checks passed
@os-zhuang
os-zhuang deleted the showcase-examples branch June 15, 2026 07:01
xuyushun441-sys added a commit that referenced this pull request Jun 21, 2026
…2128)

Exposes the opt-in inline quick-create the objectui record picker supports:
when no match exists, the user creates a record from the typed text via an
optimistic dataSource.create with the display field. Best for simple objects
whose only required field is the display field.

- spec: add `allowCreate` to FieldSchema (flows through Field.lookup via
  FieldInput); classify it live in the liveness ledger (objectui consumer).
- showcase: enable it on showcase_category.parent (Category requires only
  `name`, so quick-create succeeds) to demonstrate the flow end-to-end.
- test: assert allowCreate survives FieldSchema.parse.

Pairs with objectui #1863 (renderer quick-create reads allowCreate ||
allow_create).

Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — 1ba9d143 Deployed Jun 15, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants