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

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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_tasksobjectName + 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-zhuangand 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

vercelBot commented Jun 15, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 15, 2026 6:55am

Request Review

os-zhuangand 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>
@xuyushun441-sysxuyushun441-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 mainJun 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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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_tasksobjectName + 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-zhuangand 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

vercelBot commented Jun 15, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 15, 2026 6:55am

Request Review

os-zhuangand 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>
@xuyushun441-sysxuyushun441-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 mainJun 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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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_tasksobjectName + 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-zhuangand 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

vercelBot commented Jun 15, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 15, 2026 6:55am

Request Review

os-zhuangand 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>
@xuyushun441-sysxuyushun441-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 mainJun 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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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_tasksobjectName + 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-zhuangand 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

vercelBot commented Jun 15, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 15, 2026 6:55am

Request Review

os-zhuangand 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>
@xuyushun441-sysxuyushun441-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 mainJun 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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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_tasksobjectName + 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-zhuangand 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

vercelBot commented Jun 15, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 15, 2026 6:55am

Request Review

os-zhuangand 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>
@xuyushun441-sysxuyushun441-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 mainJun 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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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_tasksobjectName + 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-zhuangand 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

vercelBot commented Jun 15, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 15, 2026 6:55am

Request Review

os-zhuangand 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>
@xuyushun441-sysxuyushun441-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 mainJun 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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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_tasksobjectName + 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-zhuangand 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

vercelBot commented Jun 15, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 15, 2026 6:55am

Request Review

os-zhuangand 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>
@xuyushun441-sysxuyushun441-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 mainJun 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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

feat(showcase): fill missing designer examples — hooks + AI tools (+ hook designer coverage)#1863
os-zhuang merged 6 commits into
mainfrom
showcase-examples

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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_tasksobjectName + 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-zhuangand 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

vercelBot commented Jun 15, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 15, 2026 6:55am

Request Review

os-zhuangand 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>
@xuyushun441-sysxuyushun441-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 mainJun 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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@os-zhuang