@vpxa/aikit 0.1.169 → 0.1.171

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vpxa/aikit",
3
- "version": "0.1.169",
3
+ "version": "0.1.171",
4
4
  "type": "module",
5
5
  "description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
6
6
  "license": "MIT",
@@ -22,7 +22,7 @@ ${h}
22
22
  }
23
23
  `,Re=/^(#{1,6})\s+(.+)$/,ze=/^(?:(?:-\s*){3,}|(?:\*\s*){3,}|(?:_\s*){3,})$/;function Be(e){return e.length?`<p>${e.map(e=>s(e)).join(`<br>`)}</p>`:``}function Ve(e,t){let r=String(e.value??``);if(r.trimStart().startsWith(`<`))return`<div class="bk-markdown">${r}</div>`;let i=[],a=[],o=!1,s=[],c=``,l=()=>{let e=Be(a);e&&(i.push(e),a.length=0)};for(let e of r.split(/\r?\n/)){let t=e.trim();if(t.startsWith("```")){if(!o)l(),o=!0,c=t.slice(3).trim(),s=[];else{let e=c?` class="${n(c)}"`:``;i.push(`<pre class="bk-code"><code${e}>${n(s.join(`
24
24
  `))}</code></pre>`),o=!1,s=[],c=``}continue}if(o){s.push(e);continue}if(!t){l();continue}let r=t.match(Re);if(r){l();let[,e,t]=r,a=e.length;i.push(`<h${a} class="bk-heading bk-heading--${a}">${n(t)}</h${a}>`);continue}if(ze.test(t)){l(),i.push(`<hr>`);continue}a.push(e)}if(l(),o&&s.length>0){let e=c?` class="${n(c)}"`:``;i.push(`<pre class="bk-code"><code${e}>${n(s.join(`
25
- `))}</code></pre>`)}return`<div class="bk-markdown">${i.join(``)}</div>`}function He(e,t){return`<pre class="bk-mermaid mermaid">${n(String(e.value??``))}</pre>`}function Ue(e){if(e==null||e===``)return``;let t=a(e),r=Number(String(e).replace(/[^0-9.-]/g,``));return`<span class="bk-metric-trend">${Number.isNaN(r)?``:r>0?`↑ `:r<0?`↓ `:`→ `}${n(t)}</span>`}function We(e,t){return`<div class="bk-metrics">${f(e).map(e=>`<article class="bk-metric" data-tone="${u(e.status)}"><div class="bk-metric-label">${n(e.label)}</div><div class="bk-metric-value">${n(a(e.value))}</div>${Ue(e.trend)}</article>`).join(``)}</div>`}function Ge(e,t){return`<p class="bk-paragraph">${n(String(e.value??e.text??``))}</p>`}function Ke(e){let t=o(e);if(Array.isArray(t))return t;if(t&&typeof t==`object`){if(Array.isArray(t.items))return t.items;if(`value`in t)return[t]}return[]}function qe(e,t){return`<div class="bk-progress">${Ke(e.value).map(e=>{let t=Math.max(1,Number(e.max)||100),r=Math.max(0,Number(e.value)||0),i=Math.round(Math.min(r/t*100,100)),a=u(e.color);return`<div class="bk-progress-item"><div class="bk-progress-meta"><span>${n(e.label)}</span><span>${i}%</span></div><div class="bk-progress-track"><span class="bk-progress-bar" style="width:${i}%;background:var(--dt-${a}-emphasis);box-shadow:0 0 16px var(--dt-glow-${a});"></span></div></div>`}).join(``)}</div>`}function Je(e){if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e??``)}}function Ye(e,t){return`<pre class="bk-prompt">${n(Je(e.value))}</pre>`}function Xe(e,t){return`<hr class="bk-separator">`}function Ze(e){let t=o(e);return Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.items)?t.items:[]}function Qe(e,t){return`<div class="bk-status-board">${Ze(e.value).map(e=>{let t=e.items.map(e=>{let t=u(e.status),r=e.description?`<div class="bk-status-description">${n(e.description)}</div>`:``;return`<div class="bk-status-item"><span class="bk-status-pill" style="background:var(--dt-${t}-subtle);color:var(--dt-${t}-fg);">${n(e.status??`pending`)}</span><div class="bk-status-copy"><div class="bk-status-label">${n(e.label??e.name??``)}</div>${r}</div></div>`}).join(``);return`<section class="bk-status-category"><div class="bk-status-category-title">${n(e.category)}</div><div class="bk-status-items">${t}</div></section>`}).join(``)}</div>`}function $e(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function _(e){let t=(e??[]).map(e=>{if($e(e)){let t=typeof e.key==`string`?e.key:String(e.label??``);return{key:t,label:typeof e.label==`string`?e.label:t}}let t=String(e);return{key:t,label:t}});return{headers:t.map(e=>e.label),keys:t.map(e=>e.key)}}function et(e){if(Array.isArray(e.columns)){let{headers:t,keys:n}=_(e.columns),r=Array.isArray(e.rows)?e.rows:[];return r.length>0&&Array.isArray(r[0])?{headers:t,keys:n,rows:r.map(e=>Object.fromEntries(n.map((t,n)=>[t,e[n]??``])))}:r.length>0&&typeof r[0]==`object`&&r[0]!==null?{headers:t,keys:n,rows:r}:{headers:t,keys:n,rows:[]}}let t=o(e.value);if(Array.isArray(t)){if(t.length>0&&typeof t[0]==`object`&&t[0]!==null&&!Array.isArray(t[0])){let n=t,r=Array.isArray(e.headers)?e.headers.map(String):Object.keys(n[0]??{});return{headers:r,keys:r,rows:n}}if(t.length>0&&Array.isArray(t[0])){let[n,...r]=t,i=Array.isArray(e.headers)?e.headers.map(String):n.map(String);return{headers:i,keys:i,rows:r.map(e=>Object.fromEntries(i.map((t,n)=>[t,e[n]])))}}}if(t&&typeof t==`object`){let n=Array.isArray(e.headers)?e.headers.map(String):Array.isArray(t.headers)?t.headers.map(String):[],r=Array.isArray(t.rows)?t.rows:[];if(r.length>0&&Array.isArray(r[0]))return{headers:n,keys:n,rows:r.map(e=>Object.fromEntries(n.map((t,n)=>[t,e[n]])))};if(r.length>0&&typeof r[0]==`object`&&r[0]!==null)return{headers:n,keys:n,rows:r}}if(Array.isArray(e.headers)){let t=e.headers.map(String);return{headers:t,keys:t,rows:[]}}if(Array.isArray(e.columns)){let{headers:t,keys:n}=_(e.columns);return{headers:t,keys:n,rows:[]}}return{headers:[],keys:[],rows:[]}}function tt(e,t){let{headers:r,keys:i,rows:o}=et(e);return r.length===0?`<div class="bk-table-wrap"><table class="bk-table"><tbody></tbody></table></div>`:`<div class="bk-table-wrap"><table class="bk-table">${`<thead><tr>${r.map(e=>`<th>${n(e)}</th>`).join(``)}</tr></thead>`}<tbody>${o.map(e=>`<tr>${i.map(t=>`<td>${n(a(e[t]))}</td>`).join(``)}</tr>`).join(``)}</tbody></table></div>`}function nt(e){let t=o(e);return Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.items)?t.items:[]}function rt(e,t){return`<div class="bk-tags">${nt(e.value).map(e=>{let t=typeof e==`string`?e:String(e.text??e.label??``),r=u(typeof e==`string`?void 0:e.status??e.tone??e.color);return`<span class="bk-tag" style="background:var(--dt-${r}-subtle);color:var(--dt-${r}-fg);">${n(t)}</span>`}).join(``)}</div>`}function it(e,t){return`<div class="bk-text">${s(String(e.value??``)).replace(/\n/g,`<br>`)}</div>`}function at(e,t){return`<div class="bk-timeline">${f(e).map(e=>{let t=u(e.status),r=e.description?`<div class="bk-timeline-description">${n(e.description)}</div>`:``,i=e.timestamp?`<div class="bk-timeline-timestamp">${n(e.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${t}"><span class="bk-timeline-dot" style="background:${`var(--dt-${t}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${t});"></span><div class="bk-timeline-title">${n(e.title)}</div>${r}${i}</article>`}).join(``)}</div>`}function v(e,t){if(Array.isArray(e)){let r=e.map(e=>v(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${n(t)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}if(e&&typeof e==`object`){let r=e;if(typeof r.name==`string`)return v(r.children??[],r.name);let i=Object.entries(r).map(([e,t])=>v(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${n(t)}</summary><div class="bk-tree-children">${i}</div></details>`:`<div class="bk-tree-children">${i}</div>`}let r=n(a(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${n(t)}</span><span class="bk-tree-value">${r}</span></div>`:`<div class="bk-tree-leaf">${r}</div>`}function ot(e,t){return`<div class="bk-tree">${v(o(e.value))}</div>`}const y={"--dt-bg-primary":`#ffffff`,"--dt-bg-secondary":`#f6f8fa`,"--dt-bg-tertiary":`#eaeef2`,"--dt-bg-canvas":`#f0f0f0`,"--dt-text-primary":`#1f2328`,"--dt-text-secondary":`#656d76`,"--dt-text-tertiary":`#8b949e`,"--dt-border-default":`#d0d7de`,"--dt-border-muted":`#d8dee4`,"--dt-border-subtle":`#eaeef2`,"--dt-accent-fg":`#0969da`,"--dt-accent-emphasis":`#0550ae`,"--dt-accent-muted":`rgba(9, 105, 218, 0.4)`,"--dt-accent-subtle":`rgba(9, 105, 218, 0.1)`,"--dt-success-fg":`#1a7f37`,"--dt-success-emphasis":`#116329`,"--dt-success-muted":`rgba(26, 127, 55, 0.4)`,"--dt-success-subtle":`rgba(26, 127, 55, 0.1)`,"--dt-danger-fg":`#cf222e`,"--dt-danger-emphasis":`#a40e26`,"--dt-danger-muted":`rgba(207, 34, 46, 0.4)`,"--dt-danger-subtle":`rgba(207, 34, 46, 0.1)`,"--dt-warning-fg":`#9a6700`,"--dt-warning-emphasis":`#7d4e00`,"--dt-warning-muted":`rgba(154, 103, 0, 0.4)`,"--dt-warning-subtle":`rgba(154, 103, 0, 0.1)`,"--dt-purple-fg":`#8250df`,"--dt-purple-emphasis":`#6639ba`,"--dt-purple-muted":`rgba(130, 80, 223, 0.4)`,"--dt-purple-subtle":`rgba(130, 80, 223, 0.1)`,"--dt-font-sans":`'Segoe UI', system-ui, -apple-system, sans-serif`,"--dt-font-mono":`'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace`,"--dt-font-size-xs":`0.75rem`,"--dt-font-size-sm":`0.8125rem`,"--dt-font-size-base":`0.875rem`,"--dt-font-size-lg":`1rem`,"--dt-font-size-xl":`1.25rem`,"--dt-font-size-2xl":`1.5rem`,"--dt-font-size-3xl":`2rem`,"--dt-space-1":`0.25rem`,"--dt-space-2":`0.5rem`,"--dt-space-3":`0.75rem`,"--dt-space-4":`1rem`,"--dt-space-6":`1.5rem`,"--dt-space-8":`2rem`,"--dt-space-12":`3rem`,"--dt-space-16":`4rem`,"--dt-radius-sm":`6px`,"--dt-radius-md":`8px`,"--dt-radius-lg":`12px`,"--dt-radius-xl":`16px`,"--dt-shadow-sm":`0 1px 2px rgba(0, 0, 0, 0.07)`,"--dt-shadow-md":`0 3px 6px rgba(0, 0, 0, 0.1)`,"--dt-shadow-lg":`0 8px 24px rgba(0, 0, 0, 0.12)`,"--dt-glow-accent":`rgba(9, 105, 218, 0.08)`,"--dt-glow-success":`rgba(26, 127, 55, 0.08)`,"--dt-glow-danger":`rgba(207, 34, 46, 0.08)`,"--dt-glow-warning":`rgba(154, 103, 0, 0.08)`,"--dt-glow-purple":`rgba(130, 80, 223, 0.08)`,"--dt-transition-fast":`150ms ease`,"--dt-transition-normal":`200ms ease`},b={"--dt-bg-primary":`#0d1117`,"--dt-bg-secondary":`#161b22`,"--dt-bg-tertiary":`#21262d`,"--dt-bg-canvas":`#010409`,"--dt-text-primary":`#f0f6fc`,"--dt-text-secondary":`#9198a1`,"--dt-text-tertiary":`#656d76`,"--dt-border-default":`#30363d`,"--dt-border-muted":`#21262d`,"--dt-border-subtle":`#1f242d`,"--dt-accent-fg":`#58a6ff`,"--dt-accent-emphasis":`#1f6feb`,"--dt-accent-muted":`rgba(56, 139, 253, 0.4)`,"--dt-accent-subtle":`rgba(56, 139, 253, 0.15)`,"--dt-success-fg":`#3fb950`,"--dt-success-emphasis":`#238636`,"--dt-success-muted":`rgba(63, 185, 80, 0.4)`,"--dt-success-subtle":`rgba(63, 185, 80, 0.15)`,"--dt-danger-fg":`#f85149`,"--dt-danger-emphasis":`#da3633`,"--dt-danger-muted":`rgba(248, 81, 73, 0.4)`,"--dt-danger-subtle":`rgba(248, 81, 73, 0.15)`,"--dt-warning-fg":`#d29922`,"--dt-warning-emphasis":`#bb8009`,"--dt-warning-muted":`rgba(210, 153, 34, 0.4)`,"--dt-warning-subtle":`rgba(210, 153, 34, 0.15)`,"--dt-purple-fg":`#bc8cff`,"--dt-purple-emphasis":`#a371f7`,"--dt-purple-muted":`rgba(188, 140, 255, 0.4)`,"--dt-purple-subtle":`rgba(188, 140, 255, 0.15)`,"--dt-shadow-sm":`0 1px 2px rgba(1, 4, 9, 0.35)`,"--dt-shadow-md":`0 3px 6px rgba(1, 4, 9, 0.4)`,"--dt-shadow-lg":`0 8px 24px rgba(1, 4, 9, 0.45)`,"--dt-glow-accent":`rgba(56, 139, 253, 0.14)`,"--dt-glow-success":`rgba(63, 185, 80, 0.14)`,"--dt-glow-danger":`rgba(248, 81, 73, 0.14)`,"--dt-glow-warning":`rgba(210, 153, 34, 0.14)`,"--dt-glow-purple":`rgba(188, 140, 255, 0.14)`},st=`--dt-bg-primary.--dt-bg-secondary.--dt-bg-tertiary.--dt-bg-canvas.--dt-text-primary.--dt-text-secondary.--dt-text-tertiary.--dt-border-default.--dt-border-muted.--dt-border-subtle.--dt-accent-fg.--dt-accent-emphasis.--dt-accent-muted.--dt-accent-subtle.--dt-success-fg.--dt-success-emphasis.--dt-success-muted.--dt-success-subtle.--dt-danger-fg.--dt-danger-emphasis.--dt-danger-muted.--dt-danger-subtle.--dt-warning-fg.--dt-warning-emphasis.--dt-warning-muted.--dt-warning-subtle.--dt-purple-fg.--dt-purple-emphasis.--dt-purple-muted.--dt-purple-subtle.--dt-font-sans.--dt-font-mono.--dt-font-size-xs.--dt-font-size-sm.--dt-font-size-base.--dt-font-size-lg.--dt-font-size-xl.--dt-font-size-2xl.--dt-font-size-3xl.--dt-space-1.--dt-space-2.--dt-space-3.--dt-space-4.--dt-space-6.--dt-space-8.--dt-space-12.--dt-space-16.--dt-radius-sm.--dt-radius-md.--dt-radius-lg.--dt-radius-xl.--dt-shadow-sm.--dt-shadow-md.--dt-shadow-lg.--dt-glow-accent.--dt-glow-success.--dt-glow-danger.--dt-glow-warning.--dt-glow-purple.--dt-transition-fast.--dt-transition-normal`.split(`.`),ct=`--dt-bg-primary.--dt-bg-secondary.--dt-bg-tertiary.--dt-bg-canvas.--dt-text-primary.--dt-text-secondary.--dt-text-tertiary.--dt-border-default.--dt-border-muted.--dt-border-subtle.--dt-accent-fg.--dt-accent-emphasis.--dt-accent-muted.--dt-accent-subtle.--dt-success-fg.--dt-success-emphasis.--dt-success-muted.--dt-success-subtle.--dt-danger-fg.--dt-danger-emphasis.--dt-danger-muted.--dt-danger-subtle.--dt-warning-fg.--dt-warning-emphasis.--dt-warning-muted.--dt-warning-subtle.--dt-purple-fg.--dt-purple-emphasis.--dt-purple-muted.--dt-purple-subtle.--dt-shadow-sm.--dt-shadow-md.--dt-shadow-lg.--dt-glow-accent.--dt-glow-success.--dt-glow-danger.--dt-glow-warning.--dt-glow-purple`.split(`.`),x={actions:`
25
+ `))}</code></pre>`)}return`<div class="bk-markdown">${i.join(``)}</div>`}function He(e,t){return`<pre class="bk-mermaid mermaid">${n(String(e.value??``))}</pre>`}function Ue(e){if(e==null||e===``)return``;let t=a(e),r=Number(String(e).replace(/[^0-9.-]/g,``));return`<span class="bk-metric-trend">${Number.isNaN(r)?``:r>0?`↑ `:r<0?`↓ `:`→ `}${n(t)}</span>`}function We(e,t){return`<div class="bk-metrics">${f(e).map(e=>`<article class="bk-metric" data-tone="${u(e.status)}"><div class="bk-metric-label">${n(e.label)}</div><div class="bk-metric-value">${n(a(e.value))}</div>${Ue(e.trend)}</article>`).join(``)}</div>`}function Ge(e,t){return`<p class="bk-paragraph">${n(String(e.value??e.text??``))}</p>`}function Ke(e){let t=o(e);if(Array.isArray(t))return t;if(t&&typeof t==`object`){if(Array.isArray(t.items))return t.items;if(`value`in t)return[t]}return[]}function qe(e,t){return`<div class="bk-progress">${Ke(e.value).map(e=>{let t=Math.max(1,Number(e.max)||100),r=Math.max(0,Number(e.value)||0),i=Math.round(Math.min(r/t*100,100)),a=u(e.color);return`<div class="bk-progress-item"><div class="bk-progress-meta"><span>${n(e.label)}</span><span>${i}%</span></div><div class="bk-progress-track"><span class="bk-progress-bar" style="width:${i}%;background:var(--dt-${a}-emphasis);box-shadow:0 0 16px var(--dt-glow-${a});"></span></div></div>`}).join(``)}</div>`}function Je(e){if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e??``)}}function Ye(e,t){return`<pre class="bk-prompt">${n(Je(e.value))}</pre>`}function Xe(e,t){return`<hr class="bk-separator">`}function Ze(e){let t=o(e);return Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.items)?t.items:[]}function Qe(e,t){return`<div class="bk-status-board">${Ze(e.value).map(e=>{let t=e.items.map(e=>{let t=u(e.status),r=e.description?`<div class="bk-status-description">${n(e.description)}</div>`:``;return`<div class="bk-status-item"><span class="bk-status-pill" style="background:var(--dt-${t}-subtle);color:var(--dt-${t}-fg);">${n(e.status??`pending`)}</span><div class="bk-status-copy"><div class="bk-status-label">${n(e.label??e.name??``)}</div>${r}</div></div>`}).join(``);return`<section class="bk-status-category"><div class="bk-status-category-title">${n(e.category)}</div><div class="bk-status-items">${t}</div></section>`}).join(``)}</div>`}function $e(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function _(e){let t=(e??[]).map(e=>{if($e(e)){let t=typeof e.key==`string`?e.key:String(e.label??``);return{key:t,label:typeof e.label==`string`?e.label:t}}let t=String(e);return{key:t,label:t}});return{headers:t.map(e=>e.label),keys:t.map(e=>e.key)}}function et(e){if(Array.isArray(e.columns)){let{headers:t,keys:n}=_(e.columns),r=Array.isArray(e.rows)?e.rows:[];return r.length>0&&Array.isArray(r[0])?{headers:t,keys:n,rows:r.map(e=>Object.fromEntries(n.map((t,n)=>[t,e[n]??``])))}:r.length>0&&typeof r[0]==`object`&&r[0]!==null?{headers:t,keys:n,rows:r}:{headers:t,keys:n,rows:[]}}let t=o(e.value);if(Array.isArray(t)){if(t.length>0&&typeof t[0]==`object`&&t[0]!==null&&!Array.isArray(t[0])){let n=t,r=Array.isArray(e.headers)?e.headers.map(String):Object.keys(n[0]??{});return{headers:r,keys:r,rows:n}}if(t.length>0&&Array.isArray(t[0])){let[n,...r]=t,i=Array.isArray(e.headers)?e.headers.map(String):n.map(String);return{headers:i,keys:i,rows:r.map(e=>Object.fromEntries(i.map((t,n)=>[t,e[n]])))}}}if(t&&typeof t==`object`){let n=Array.isArray(e.headers)?e.headers.map(String):Array.isArray(t.headers)?t.headers.map(String):[],r=Array.isArray(t.rows)?t.rows:[];if(r.length>0&&Array.isArray(r[0]))return{headers:n,keys:n,rows:r.map(e=>Object.fromEntries(n.map((t,n)=>[t,e[n]])))};if(r.length>0&&typeof r[0]==`object`&&r[0]!==null)return{headers:n,keys:n,rows:r}}if(Array.isArray(e.headers)){let t=e.headers.map(String);return{headers:t,keys:t,rows:[]}}if(Array.isArray(e.columns)){let{headers:t,keys:n}=_(e.columns);return{headers:t,keys:n,rows:[]}}return{headers:[],keys:[],rows:[]}}function tt(e,t){let{headers:r,keys:i,rows:o}=et(e);return r.length===0?`<div class="bk-table-wrap"><table class="bk-table"><tbody></tbody></table></div>`:`<div class="bk-table-wrap"><table class="bk-table">${`<thead><tr>${r.map(e=>`<th>${n(e)}</th>`).join(``)}</tr></thead>`}<tbody>${o.map(e=>`<tr>${i.map(t=>`<td>${n(a(e[t]))}</td>`).join(``)}</tr>`).join(``)}</tbody></table></div>`}function nt(e){let t=o(e);return Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.items)?t.items:[]}function rt(e,t){return`<div class="bk-tags">${nt(e.value).map(e=>{let t=typeof e==`string`?e:String(e.text??e.label??``),r=u(typeof e==`string`?void 0:e.status??e.tone??e.color);return`<span class="bk-tag" style="background:var(--dt-${r}-subtle);color:var(--dt-${r}-fg);">${n(t)}</span>`}).join(``)}</div>`}function it(e,t){return`<div class="bk-text">${s(String(e.value??``)).replace(/\n/g,`<br>`)}</div>`}function at(e,t){return`<div class="bk-timeline">${f(e).map(e=>{let t=u(e.status),r=e.description?`<div class="bk-timeline-description">${n(e.description)}</div>`:``,i=e.timestamp?`<div class="bk-timeline-timestamp">${n(e.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${t}"><span class="bk-timeline-dot" style="background:${`var(--dt-${t}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${t});"></span><div class="bk-timeline-title">${n(e.title)}</div>${r}${i}</article>`}).join(``)}</div>`}function v(e,t){if(Array.isArray(e)){let r=e.map(e=>v(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${n(t)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}if(e&&typeof e==`object`){let r=e,i=typeof r.name==`string`?r.name:typeof r.label==`string`?r.label:typeof r.title==`string`?r.title:void 0;if(i!==void 0)return v(r.children??[],i);let a=Object.entries(r).map(([e,t])=>v(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${n(t)}</summary><div class="bk-tree-children">${a}</div></details>`:`<div class="bk-tree-children">${a}</div>`}let r=n(a(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${n(t)}</span><span class="bk-tree-value">${r}</span></div>`:`<div class="bk-tree-leaf">${r}</div>`}function ot(e,t){return`<div class="bk-tree">${v(o(e.value))}</div>`}const y={"--dt-bg-primary":`#ffffff`,"--dt-bg-secondary":`#f6f8fa`,"--dt-bg-tertiary":`#eaeef2`,"--dt-bg-canvas":`#f0f0f0`,"--dt-text-primary":`#1f2328`,"--dt-text-secondary":`#656d76`,"--dt-text-tertiary":`#8b949e`,"--dt-border-default":`#d0d7de`,"--dt-border-muted":`#d8dee4`,"--dt-border-subtle":`#eaeef2`,"--dt-accent-fg":`#0969da`,"--dt-accent-emphasis":`#0550ae`,"--dt-accent-muted":`rgba(9, 105, 218, 0.4)`,"--dt-accent-subtle":`rgba(9, 105, 218, 0.1)`,"--dt-success-fg":`#1a7f37`,"--dt-success-emphasis":`#116329`,"--dt-success-muted":`rgba(26, 127, 55, 0.4)`,"--dt-success-subtle":`rgba(26, 127, 55, 0.1)`,"--dt-danger-fg":`#cf222e`,"--dt-danger-emphasis":`#a40e26`,"--dt-danger-muted":`rgba(207, 34, 46, 0.4)`,"--dt-danger-subtle":`rgba(207, 34, 46, 0.1)`,"--dt-warning-fg":`#9a6700`,"--dt-warning-emphasis":`#7d4e00`,"--dt-warning-muted":`rgba(154, 103, 0, 0.4)`,"--dt-warning-subtle":`rgba(154, 103, 0, 0.1)`,"--dt-purple-fg":`#8250df`,"--dt-purple-emphasis":`#6639ba`,"--dt-purple-muted":`rgba(130, 80, 223, 0.4)`,"--dt-purple-subtle":`rgba(130, 80, 223, 0.1)`,"--dt-font-sans":`'Segoe UI', system-ui, -apple-system, sans-serif`,"--dt-font-mono":`'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace`,"--dt-font-size-xs":`0.75rem`,"--dt-font-size-sm":`0.8125rem`,"--dt-font-size-base":`0.875rem`,"--dt-font-size-lg":`1rem`,"--dt-font-size-xl":`1.25rem`,"--dt-font-size-2xl":`1.5rem`,"--dt-font-size-3xl":`2rem`,"--dt-space-1":`0.25rem`,"--dt-space-2":`0.5rem`,"--dt-space-3":`0.75rem`,"--dt-space-4":`1rem`,"--dt-space-6":`1.5rem`,"--dt-space-8":`2rem`,"--dt-space-12":`3rem`,"--dt-space-16":`4rem`,"--dt-radius-sm":`6px`,"--dt-radius-md":`8px`,"--dt-radius-lg":`12px`,"--dt-radius-xl":`16px`,"--dt-shadow-sm":`0 1px 2px rgba(0, 0, 0, 0.07)`,"--dt-shadow-md":`0 3px 6px rgba(0, 0, 0, 0.1)`,"--dt-shadow-lg":`0 8px 24px rgba(0, 0, 0, 0.12)`,"--dt-glow-accent":`rgba(9, 105, 218, 0.08)`,"--dt-glow-success":`rgba(26, 127, 55, 0.08)`,"--dt-glow-danger":`rgba(207, 34, 46, 0.08)`,"--dt-glow-warning":`rgba(154, 103, 0, 0.08)`,"--dt-glow-purple":`rgba(130, 80, 223, 0.08)`,"--dt-transition-fast":`150ms ease`,"--dt-transition-normal":`200ms ease`},b={"--dt-bg-primary":`#0d1117`,"--dt-bg-secondary":`#161b22`,"--dt-bg-tertiary":`#21262d`,"--dt-bg-canvas":`#010409`,"--dt-text-primary":`#f0f6fc`,"--dt-text-secondary":`#9198a1`,"--dt-text-tertiary":`#656d76`,"--dt-border-default":`#30363d`,"--dt-border-muted":`#21262d`,"--dt-border-subtle":`#1f242d`,"--dt-accent-fg":`#58a6ff`,"--dt-accent-emphasis":`#1f6feb`,"--dt-accent-muted":`rgba(56, 139, 253, 0.4)`,"--dt-accent-subtle":`rgba(56, 139, 253, 0.15)`,"--dt-success-fg":`#3fb950`,"--dt-success-emphasis":`#238636`,"--dt-success-muted":`rgba(63, 185, 80, 0.4)`,"--dt-success-subtle":`rgba(63, 185, 80, 0.15)`,"--dt-danger-fg":`#f85149`,"--dt-danger-emphasis":`#da3633`,"--dt-danger-muted":`rgba(248, 81, 73, 0.4)`,"--dt-danger-subtle":`rgba(248, 81, 73, 0.15)`,"--dt-warning-fg":`#d29922`,"--dt-warning-emphasis":`#bb8009`,"--dt-warning-muted":`rgba(210, 153, 34, 0.4)`,"--dt-warning-subtle":`rgba(210, 153, 34, 0.15)`,"--dt-purple-fg":`#bc8cff`,"--dt-purple-emphasis":`#a371f7`,"--dt-purple-muted":`rgba(188, 140, 255, 0.4)`,"--dt-purple-subtle":`rgba(188, 140, 255, 0.15)`,"--dt-shadow-sm":`0 1px 2px rgba(1, 4, 9, 0.35)`,"--dt-shadow-md":`0 3px 6px rgba(1, 4, 9, 0.4)`,"--dt-shadow-lg":`0 8px 24px rgba(1, 4, 9, 0.45)`,"--dt-glow-accent":`rgba(56, 139, 253, 0.14)`,"--dt-glow-success":`rgba(63, 185, 80, 0.14)`,"--dt-glow-danger":`rgba(248, 81, 73, 0.14)`,"--dt-glow-warning":`rgba(210, 153, 34, 0.14)`,"--dt-glow-purple":`rgba(188, 140, 255, 0.14)`},st=`--dt-bg-primary.--dt-bg-secondary.--dt-bg-tertiary.--dt-bg-canvas.--dt-text-primary.--dt-text-secondary.--dt-text-tertiary.--dt-border-default.--dt-border-muted.--dt-border-subtle.--dt-accent-fg.--dt-accent-emphasis.--dt-accent-muted.--dt-accent-subtle.--dt-success-fg.--dt-success-emphasis.--dt-success-muted.--dt-success-subtle.--dt-danger-fg.--dt-danger-emphasis.--dt-danger-muted.--dt-danger-subtle.--dt-warning-fg.--dt-warning-emphasis.--dt-warning-muted.--dt-warning-subtle.--dt-purple-fg.--dt-purple-emphasis.--dt-purple-muted.--dt-purple-subtle.--dt-font-sans.--dt-font-mono.--dt-font-size-xs.--dt-font-size-sm.--dt-font-size-base.--dt-font-size-lg.--dt-font-size-xl.--dt-font-size-2xl.--dt-font-size-3xl.--dt-space-1.--dt-space-2.--dt-space-3.--dt-space-4.--dt-space-6.--dt-space-8.--dt-space-12.--dt-space-16.--dt-radius-sm.--dt-radius-md.--dt-radius-lg.--dt-radius-xl.--dt-shadow-sm.--dt-shadow-md.--dt-shadow-lg.--dt-glow-accent.--dt-glow-success.--dt-glow-danger.--dt-glow-warning.--dt-glow-purple.--dt-transition-fast.--dt-transition-normal`.split(`.`),ct=`--dt-bg-primary.--dt-bg-secondary.--dt-bg-tertiary.--dt-bg-canvas.--dt-text-primary.--dt-text-secondary.--dt-text-tertiary.--dt-border-default.--dt-border-muted.--dt-border-subtle.--dt-accent-fg.--dt-accent-emphasis.--dt-accent-muted.--dt-accent-subtle.--dt-success-fg.--dt-success-emphasis.--dt-success-muted.--dt-success-subtle.--dt-danger-fg.--dt-danger-emphasis.--dt-danger-muted.--dt-danger-subtle.--dt-warning-fg.--dt-warning-emphasis.--dt-warning-muted.--dt-warning-subtle.--dt-purple-fg.--dt-purple-emphasis.--dt-purple-muted.--dt-purple-subtle.--dt-shadow-sm.--dt-shadow-md.--dt-shadow-lg.--dt-glow-accent.--dt-glow-success.--dt-glow-danger.--dt-glow-warning.--dt-glow-purple`.split(`.`),x={actions:`
26
26
  .bk-actions {
27
27
  display: flex;
28
28
  flex-wrap: wrap;
@@ -1540,7 +1540,7 @@ ${Ue}
1540
1540
  .bk-timeline-timestamp {
1541
1541
  color: var(--dt-text-secondary);
1542
1542
  }
1543
- `;function Bt(e,t){return`<div class="bk-timeline">${ee(e).map(e=>{let t=f(e.status),n=e.description?`<div class="bk-timeline-description">${i(e.description)}</div>`:``,r=e.timestamp?`<div class="bk-timeline-timestamp">${i(e.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${t}"><span class="bk-timeline-dot" style="background:${`var(--dt-${t}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${t});"></span><div class="bk-timeline-title">${i(e.title)}</div>${n}${r}</article>`}).join(``)}</div>`}function Vt(e,t){if(Array.isArray(e)){let n=e.map(e=>Vt(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${i(t)}</summary><div class="bk-tree-children">${n}</div></details>`:`<div class="bk-tree-children">${n}</div>`}if(e&&typeof e==`object`){let n=e;if(typeof n.name==`string`)return Vt(n.children??[],n.name);let r=Object.entries(n).map(([e,t])=>Vt(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${i(t)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}let n=i(s(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${i(t)}</span><span class="bk-tree-value">${n}</span></div>`:`<div class="bk-tree-leaf">${n}</div>`}var Ht=`
1543
+ `;function Bt(e,t){return`<div class="bk-timeline">${ee(e).map(e=>{let t=f(e.status),n=e.description?`<div class="bk-timeline-description">${i(e.description)}</div>`:``,r=e.timestamp?`<div class="bk-timeline-timestamp">${i(e.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${t}"><span class="bk-timeline-dot" style="background:${`var(--dt-${t}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${t});"></span><div class="bk-timeline-title">${i(e.title)}</div>${n}${r}</article>`}).join(``)}</div>`}function Vt(e,t){if(Array.isArray(e)){let n=e.map(e=>Vt(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${i(t)}</summary><div class="bk-tree-children">${n}</div></details>`:`<div class="bk-tree-children">${n}</div>`}if(e&&typeof e==`object`){let n=e,r=typeof n.name==`string`?n.name:typeof n.label==`string`?n.label:typeof n.title==`string`?n.title:void 0;if(r!==void 0)return Vt(n.children??[],r);let a=Object.entries(n).map(([e,t])=>Vt(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${i(t)}</summary><div class="bk-tree-children">${a}</div></details>`:`<div class="bk-tree-children">${a}</div>`}let n=i(s(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${i(t)}</span><span class="bk-tree-value">${n}</span></div>`:`<div class="bk-tree-leaf">${n}</div>`}var Ht=`
1544
1544
  .bk-tree {
1545
1545
  display: grid;
1546
1546
  gap: var(--dt-space-2);
@@ -1218,7 +1218,7 @@ ${Sh}
1218
1218
  .bk-timeline-timestamp {
1219
1219
  color: var(--dt-text-secondary);
1220
1220
  }
1221
- `}));function Kh(e,t){if(Array.isArray(e)){let n=e.map(e=>Kh(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${ph(t)}</summary><div class="bk-tree-children">${n}</div></details>`:`<div class="bk-tree-children">${n}</div>`}if(e&&typeof e==`object`){let n=e;if(typeof n.name==`string`)return Kh(n.children??[],n.name);let r=Object.entries(n).map(([e,t])=>Kh(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${ph(t)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}let n=ph(gh(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${ph(t)}</span><span class="bk-tree-value">${n}</span></div>`:`<div class="bk-tree-leaf">${n}</div>`}function Dne(e,t){return`<div class="bk-tree">${Kh(_h(e.value))}</div>`}var qh,Jh=o((()=>{xh(),qh=`
1221
+ `}));function Kh(e,t){if(Array.isArray(e)){let n=e.map(e=>Kh(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${ph(t)}</summary><div class="bk-tree-children">${n}</div></details>`:`<div class="bk-tree-children">${n}</div>`}if(e&&typeof e==`object`){let n=e,r=typeof n.name==`string`?n.name:typeof n.label==`string`?n.label:typeof n.title==`string`?n.title:void 0;if(r!==void 0)return Kh(n.children??[],r);let i=Object.entries(n).map(([e,t])=>Kh(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${ph(t)}</summary><div class="bk-tree-children">${i}</div></details>`:`<div class="bk-tree-children">${i}</div>`}let n=ph(gh(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${ph(t)}</span><span class="bk-tree-value">${n}</span></div>`:`<div class="bk-tree-leaf">${n}</div>`}function Dne(e,t){return`<div class="bk-tree">${Kh(_h(e.value))}</div>`}var qh,Jh=o((()=>{xh(),qh=`
1222
1222
  .bk-tree {
1223
1223
  display: grid;
1224
1224
  gap: var(--dt-space-2);
@@ -1152,7 +1152,7 @@ ${Ne}
1152
1152
  .bk-timeline-timestamp {
1153
1153
  color: var(--dt-text-secondary);
1154
1154
  }
1155
- `;function Et(t,n){return`<div class="bk-timeline">${l(t).map(t=>{let n=c(t.status),r=t.description?`<div class="bk-timeline-description">${e(t.description)}</div>`:``,i=t.timestamp?`<div class="bk-timeline-timestamp">${e(t.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${n}"><span class="bk-timeline-dot" style="background:${`var(--dt-${n}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${n});"></span><div class="bk-timeline-title">${e(t.title)}</div>${r}${i}</article>`}).join(``)}</div>`}function C(t,n){if(Array.isArray(t)){let r=t.map(e=>C(e)).join(``);return n?`<details class="bk-tree-node" open><summary>${e(n)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}if(t&&typeof t==`object`){let r=t;if(typeof r.name==`string`)return C(r.children??[],r.name);let i=Object.entries(r).map(([e,t])=>C(t,e)).join(``);return n?`<details class="bk-tree-node" open><summary>${e(n)}</summary><div class="bk-tree-children">${i}</div></details>`:`<div class="bk-tree-children">${i}</div>`}let i=e(r(t));return n?`<div class="bk-tree-leaf"><span class="bk-tree-key">${e(n)}</span><span class="bk-tree-value">${i}</span></div>`:`<div class="bk-tree-leaf">${i}</div>`}var Dt=`
1155
+ `;function Et(t,n){return`<div class="bk-timeline">${l(t).map(t=>{let n=c(t.status),r=t.description?`<div class="bk-timeline-description">${e(t.description)}</div>`:``,i=t.timestamp?`<div class="bk-timeline-timestamp">${e(t.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${n}"><span class="bk-timeline-dot" style="background:${`var(--dt-${n}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${n});"></span><div class="bk-timeline-title">${e(t.title)}</div>${r}${i}</article>`}).join(``)}</div>`}function C(t,n){if(Array.isArray(t)){let r=t.map(e=>C(e)).join(``);return n?`<details class="bk-tree-node" open><summary>${e(n)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}if(t&&typeof t==`object`){let r=t,i=typeof r.name==`string`?r.name:typeof r.label==`string`?r.label:typeof r.title==`string`?r.title:void 0;if(i!==void 0)return C(r.children??[],i);let a=Object.entries(r).map(([e,t])=>C(t,e)).join(``);return n?`<details class="bk-tree-node" open><summary>${e(n)}</summary><div class="bk-tree-children">${a}</div></details>`:`<div class="bk-tree-children">${a}</div>`}let i=e(r(t));return n?`<div class="bk-tree-leaf"><span class="bk-tree-key">${e(n)}</span><span class="bk-tree-value">${i}</span></div>`:`<div class="bk-tree-leaf">${i}</div>`}var Dt=`
1156
1156
  .bk-tree {
1157
1157
  display: grid;
1158
1158
  gap: var(--dt-space-2);
@@ -1163,7 +1163,7 @@ ${Me}
1163
1163
  .bk-timeline-timestamp {
1164
1164
  color: var(--dt-text-secondary);
1165
1165
  }
1166
- `;function kt(e,t){return`<div class="bk-timeline">${E(e).map(e=>{let t=T(e.status),n=e.description?`<div class="bk-timeline-description">${_(e.description)}</div>`:``,r=e.timestamp?`<div class="bk-timeline-timestamp">${_(e.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${t}"><span class="bk-timeline-dot" style="background:${`var(--dt-${t}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${t});"></span><div class="bk-timeline-title">${_(e.title)}</div>${n}${r}</article>`}).join(``)}</div>`}function At(e,t){if(Array.isArray(e)){let n=e.map(e=>At(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${_(t)}</summary><div class="bk-tree-children">${n}</div></details>`:`<div class="bk-tree-children">${n}</div>`}if(e&&typeof e==`object`){let n=e;if(typeof n.name==`string`)return At(n.children??[],n.name);let r=Object.entries(n).map(([e,t])=>At(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${_(t)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}let n=_(b(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${_(t)}</span><span class="bk-tree-value">${n}</span></div>`:`<div class="bk-tree-leaf">${n}</div>`}var jt=`
1166
+ `;function kt(e,t){return`<div class="bk-timeline">${E(e).map(e=>{let t=T(e.status),n=e.description?`<div class="bk-timeline-description">${_(e.description)}</div>`:``,r=e.timestamp?`<div class="bk-timeline-timestamp">${_(e.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${t}"><span class="bk-timeline-dot" style="background:${`var(--dt-${t}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${t});"></span><div class="bk-timeline-title">${_(e.title)}</div>${n}${r}</article>`}).join(``)}</div>`}function At(e,t){if(Array.isArray(e)){let n=e.map(e=>At(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${_(t)}</summary><div class="bk-tree-children">${n}</div></details>`:`<div class="bk-tree-children">${n}</div>`}if(e&&typeof e==`object`){let n=e,r=typeof n.name==`string`?n.name:typeof n.label==`string`?n.label:typeof n.title==`string`?n.title:void 0;if(r!==void 0)return At(n.children??[],r);let i=Object.entries(n).map(([e,t])=>At(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${_(t)}</summary><div class="bk-tree-children">${i}</div></details>`:`<div class="bk-tree-children">${i}</div>`}let n=_(b(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${_(t)}</span><span class="bk-tree-value">${n}</span></div>`:`<div class="bk-tree-leaf">${n}</div>`}var jt=`
1167
1167
  .bk-tree {
1168
1168
  display: grid;
1169
1169
  gap: var(--dt-space-2);
@@ -238,7 +238,7 @@ When technical decisions need resolution, follow the **3-phase multi-model decis
238
238
  - Researcher-Delta (Executor): Feasibility, performance, fastest implementation path
239
239
  3. **Phase 2 — Peer Review** — Anonymize outputs as Perspective A/B/C/D, launch 4 reviewers in parallel asking: strongest argument, biggest blind spot, consensus gap, verdict
240
240
  4. **Phase 3 — Structured Verdict** — Synthesize into: Where Agrees / Where Clashes / Blind Spots Caught / Recommendation (with confidence) / First Step
241
- 5. **Present & Record** — Render verdict with \`present\`, produce ADR via \`adr-skill\`
241
+ 5. **Present & Record** — Render verdict with \`present({ schemaVersion: 1, title: "Decision Verdict", blocks: [...] })\`; use \`table\` for multi-perspective comparisons, \`list\` for blind spots and recommendations, and \`kv\` for verdict metadata. NEVER \`code\` blocks for structured data. Produce ADR via \`adr-skill\`
242
242
 
243
243
  **Floor tier shortcut**: Skip Phase 2 (peer review), go straight from research to verdict.
244
244
 
@@ -293,12 +293,14 @@ Run \`forge_ground({ task, files: [<relevant files>], root_path: "." })\` to:
293
293
 
294
294
  ### 7. Present to User
295
295
 
296
- Use \`present({ format: "html" })\` (or \`format: "browser"\` in CLI mode) to show:
296
+ Use \`present({ schemaVersion: 1, title: "Design Review", blocks: [...] })\` to show:
297
297
  - Design decisions summary
298
298
  - FORGE tier and rationale
299
299
  - Key trade-offs
300
300
  - Open questions requiring user input
301
301
 
302
+ Use \`kv\` for FORGE tier and rationale, \`list\` for trade-offs and open questions, \`table\` for decision comparisons, and \`markdown\` for narrative summary. NEVER \`code\` blocks for structured data. Add \`actions\` only when you need browser transport for user choices.
303
+
302
304
  **🛑 MANDATORY STOP** — Wait for user approval of design decisions before proceeding.
303
305
 
304
306
  ### 8. Report to Orchestrator
@@ -340,9 +342,11 @@ Load these skills BEFORE executing this step:
340
342
 
341
343
  ### Presentation Rules
342
344
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
343
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
345
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
346
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
344
347
  - Tables, charts, progress tracking, code review findings → always present
345
- - Artifact content and summaries present with structured layout
348
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
349
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
346
350
  - Only use plain text for brief confirmations and simple questions
347
351
 
348
352
  ## Completion Criteria
@@ -476,9 +480,11 @@ Load these skills BEFORE executing this step:
476
480
 
477
481
  ### Presentation Rules
478
482
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
479
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
483
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
484
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
480
485
  - Tables, charts, progress tracking, code review findings → always present
481
- - Artifact content and summaries present with structured layout
486
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
487
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
482
488
  - Only use plain text for brief confirmations and simple questions
483
489
 
484
490
  ### Orchestrator Dispatch Protocol
@@ -629,9 +635,11 @@ Load these skills BEFORE executing this step:
629
635
 
630
636
  ### Presentation Rules
631
637
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
632
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
638
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
639
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
633
640
  - Tables, charts, progress tracking, code review findings → always present
634
- - Artifact content and summaries present with structured layout
641
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
642
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
635
643
  - Only use plain text for brief confirmations and simple questions
636
644
 
637
645
  ## Completion Criteria
@@ -787,9 +795,11 @@ Load these skills BEFORE executing this step:
787
795
 
788
796
  ### Presentation Rules
789
797
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
790
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
798
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
799
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
791
800
  - Tables, charts, progress tracking, code review findings → always present
792
- - Artifact content and summaries present with structured layout
801
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
802
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
793
803
  - Only use plain text for brief confirmations and simple questions
794
804
 
795
805
  ## Completion Criteria
@@ -896,6 +906,8 @@ present({ schemaVersion: 1, title: "Task Plan: <feature>", template: "task-plan@
896
906
 
897
907
  This renders an interactive dependency graph showing phases, parallel batches, and agent assignments. The user can visualize the execution order before approving.
898
908
 
909
+ Use the template-driven graph for the dependency view; if you add supporting summary content, use \`kv\` for approval metadata, \`list\` for task notes, and NEVER \`code\` blocks for structured data.
910
+
899
911
  ## Agents
900
912
 
901
913
  | Agent | Role |
@@ -918,9 +930,11 @@ Load these skills BEFORE executing this step:
918
930
 
919
931
  ### Presentation Rules
920
932
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
921
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
933
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
934
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
922
935
  - Tables, charts, progress tracking, code review findings → always present
923
- - Artifact content and summaries present with structured layout
936
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
937
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
924
938
  - Only use plain text for brief confirmations and simple questions
925
939
 
926
940
  ## Completion Criteria
@@ -1063,9 +1077,11 @@ Load these skills BEFORE executing this step:
1063
1077
 
1064
1078
  ### Presentation Rules
1065
1079
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
1066
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
1080
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
1081
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
1067
1082
  - Tables, charts, progress tracking, code review findings → always present
1068
- - Artifact content and summaries present with structured layout
1083
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
1084
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
1069
1085
  - Only use plain text for brief confirmations and simple questions
1070
1086
 
1071
1087
  ### FORGE Quality Gate
@@ -1192,9 +1208,11 @@ Load these skills BEFORE executing this step:
1192
1208
 
1193
1209
  ### Presentation Rules
1194
1210
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
1195
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
1211
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
1212
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
1196
1213
  - Tables, charts, progress tracking, code review findings → always present
1197
- - Artifact content and summaries present with structured layout
1214
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
1215
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
1198
1216
  - Only use plain text for brief confirmations and simple questions
1199
1217
 
1200
1218
  ## Completion Criteria
@@ -1266,7 +1284,7 @@ For small features that need minimal design:
1266
1284
  - **Phase 1**: Launch ALL 4 Researcher variants in parallel (Alpha/Beta/Gamma/Delta)
1267
1285
  - **Phase 2**: Anonymize outputs as A/B/C/D, run peer review round (4 reviewers in parallel)
1268
1286
  - **Phase 3**: Synthesize into structured verdict (Agrees / Clashes / Blind Spots / Recommendation / First Step)
1269
- - Present verdict visually using \`present\`, produce ADR for Standard+ tiers
1287
+ - Present verdict visually using \`present({ schemaVersion: 1, title: "Decision Verdict", blocks: [...] })\`; use \`table\` for multi-approach comparisons, \`list\` for recommendations and blind spots, and \`kv\` for verdict metadata. NEVER \`code\` blocks for structured data. Produce ADR for Standard+ tiers
1270
1288
  4. **Write \`{{artifacts_path}}/design-decisions.md\`** to disk:
1271
1289
 
1272
1290
  \`\`\`markdown
@@ -1321,9 +1339,11 @@ Load these skills BEFORE executing this step:
1321
1339
 
1322
1340
  ### Presentation Rules
1323
1341
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
1324
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
1342
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
1343
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
1325
1344
  - Tables, charts, progress tracking, code review findings → always present
1326
- - Artifact content and summaries present with structured layout
1345
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
1346
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
1327
1347
  - Only use plain text for brief confirmations and simple questions
1328
1348
 
1329
1349
  ## Completion Criteria
@@ -1443,9 +1463,11 @@ Load these skills BEFORE executing this step:
1443
1463
 
1444
1464
  ### Presentation Rules
1445
1465
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
1446
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
1466
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
1467
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
1447
1468
  - Tables, charts, progress tracking, code review findings → always present
1448
- - Artifact content and summaries present with structured layout
1469
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
1470
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
1449
1471
  - Only use plain text for brief confirmations and simple questions
1450
1472
 
1451
1473
  ### Orchestrator Dispatch Protocol
@@ -1578,9 +1600,11 @@ Load these skills BEFORE executing this step:
1578
1600
 
1579
1601
  ### Presentation Rules
1580
1602
  - Use \`present\` for **any output** that benefits from rich rendering — not limited to dashboards
1581
- - Assessments, reports, comparisons, reviews, status boards → \`present({ format: "html" })\`
1603
+ - Assessments, reports, comparisons, reviews, status boards → \`present({ schemaVersion: 1, title: "Assessment", blocks: [...] })\`
1604
+ - Use \`table\` blocks for comparisons, \`kv\` for status/scores, \`list\` for findings, and \`metrics\` for numeric health indicators. NEVER \`code\` blocks for structured data.
1582
1605
  - Tables, charts, progress tracking, code review findings → always present
1583
- - Artifact content and summaries present with structured layout
1606
+ - Use \`metrics\` for numeric indicators, \`checklist\` for task status, \`kv\` for summary, and \`table\` for review findings. NEVER \`code\` blocks for structured data.
1607
+ - Artifact content and summaries → present with structured layout; use \`markdown\` for prose sections.
1584
1608
  - Only use plain text for brief confirmations and simple questions
1585
1609
 
1586
1610
  ### FORGE Quality Gate
@@ -801,7 +801,12 @@ The Orchestrator synthesizes BOTH layers (original research + peer reviews) into
801
801
  \`\`\`
802
802
 
803
803
  Then:
804
- 1. **Present** the verdict using \`present(format: "html" )\` with comparison blocks
804
+ 1. **Present** the verdict using \`present\` with browser transport. MANDATORY block types:
805
+ - "Where They Agree" -> \`{ "type": "list", "value": ["point 1", "point 2"] }\` — NEVER code block with JSON array
806
+ - "Where They Clash" -> \`{ "type": "table", "value": { "headers": ["Dimension", "Alpha", "Delta"], "rows": [...] } }\`
807
+ - "Blind Spots" -> \`{ "type": "markdown", "value": "..." }\` with **bold** key insight
808
+ - "Recommendation" -> \`{ "type": "kv", "title": "Verdict", "value": { "Approach": "...", "Confidence": "...", "Rationale": "...", "First Step": "..." } }\` — NEVER code block with JSON object
809
+ - Always include \`actions\` with approve + alternative buttons
805
810
  2. **Produce an ADR** via the \`adr-skill\`
806
811
  3. **\`knowledge({ action: "remember", ... })\`** the decision for future recall
807
812
 
@@ -112,9 +112,9 @@ digraph brainstorming_simple {
112
112
 
113
113
  1. **Explore project context** — check files, docs, recent commits
114
114
  2. **Assess scope** — if multiple independent subsystems, decompose before detailing (see below)
115
- 3. **Offer visual presentation support** (if topic will involve visual questions) — this is its own message, not combined with a clarifying question. Use \`present({ format: "html" })\` to display brainstorming results as a rich visual dashboard.
115
+ 3. **Offer visual presentation support** (if topic will involve visual questions) — this is its own message, not combined with a clarifying question. Use \`present({ schemaVersion: 1, title: "Brainstorming", blocks: [...] })\` to display brainstorming results. Use \`list\` for idea sets, \`table\` for evaluation matrices, \`kv\` for the selected approach, and \`metrics\` for requirement scores. NEVER \`code\` blocks for structured data.
116
116
  4. **Ask clarifying questions** — one at a time, understand purpose/constraints/success criteria
117
- 5. **Propose 2-3 approaches via Decision Protocol** — run the full 3-phase multi-model decision protocol: Phase 1 (4 Researchers in parallel), Phase 2 (peer review with anonymized outputs), Phase 3 (structured verdict). Present the verdict visually using \`present\`. *(See "Decision Protocol Integration" below.)*
117
+ 5. **Propose 2-3 approaches via Decision Protocol** — run the full 3-phase multi-model decision protocol: Phase 1 (4 Researchers in parallel), Phase 2 (peer review with anonymized outputs), Phase 3 (structured verdict). Present the verdict visually using \`present({ schemaVersion: 1, title: "Approach Verdict", blocks: [...] })\` with \`table\` for approach comparisons, \`list\` for recommendations, and \`kv\` for verdict metadata. NEVER \`code\` blocks for structured data. *(See "Decision Protocol Integration" below.)*
118
118
  6. **Present design** — in sections scaled to their complexity, get user approval after each section
119
119
  7. **Write design doc** — save to \`docs/plans/YYYY-MM-DD-<topic>-design.md\` and commit
120
120
  8. **Spec review loop** — review the spec for completeness, consistency, clarity, scope, and YAGNI. Fix issues. Max 3 iterations, then surface to user.
@@ -144,7 +144,7 @@ When Advanced Mode reaches step 5 ("Propose approaches"), invoke the **full 3-ph
144
144
  **Phase 3 — Structured Verdict:**
145
145
  5. Synthesize BOTH layers into the structured verdict format:
146
146
  - **Where Agrees** / **Where Clashes** / **Blind Spots Caught** / **Recommendation** (with confidence) / **First Step**
147
- 6. Present verdict visually using \`present({ format: "html" })\`
147
+ 6. Present verdict visually using \`present({ schemaVersion: 1, title: "Approach Verdict", blocks: [...] })\` with \`table\` for approach comparisons, \`list\` for recommendations, and \`kv\` for verdict metadata. NEVER \`code\` blocks for structured data.
148
148
  7. If a decision produces an ADR, write it to \`docs/decisions/\`
149
149
 
150
150
  **Floor-tier shortcut**: Skip Phase 2 (peer review), synthesize directly from Phase 1.
@@ -326,13 +326,13 @@ During the brainstorming session, when design decisions clarify existing ambigui
326
326
  Use the \`present\` MCP tool for showing mockups, diagrams, and visual options during brainstorming. It is available as a tool, not a separate mode. Choosing this means you can present rich visual output when it helps; it does NOT mean every question should become visual.
327
327
 
328
328
  **Offering visual presentation:** When you anticipate that upcoming questions will involve visual content (mockups, layouts, diagrams), offer it once for consent:
329
- > "Some of what we're working on might be easier to explain visually. I can use \`present({ format: \\"html\\" })\` to show mockups, diagrams, comparisons, and other visuals as we go. Want me to use that when helpful?"
329
+ > "Some of what we're working on might be easier to explain visually. I can use \`present({ schemaVersion: 1, title: \\"Working Session Visuals\\", blocks: [...] })\` to show mockups, diagrams, comparisons, and other visuals as we go, using \`list\`, \`table\`, \`kv\`, and \`metrics\` blocks as appropriate. I never use \`code\` blocks for structured data. Want me to use that when helpful?"
330
330
 
331
331
  **This offer MUST be its own message.** Do not combine it with clarifying questions, context summaries, or any other content. Wait for the user's response before continuing. If they decline, proceed with text-only brainstorming.
332
332
 
333
333
  **Per-question decision:** Even after the user accepts, decide FOR EACH QUESTION whether to use visual output or plain chat. The test: **would the user understand this better by seeing it than reading it?**
334
334
 
335
- - **Use \`present({ format: "html" })\`** for visual content — mockups, wireframes, layout comparisons, architecture diagrams, side-by-side visual designs
335
+ - **Use \`present({ schemaVersion: 1, title: "Visual Option", blocks: [...] })\`** for visual content — mockups, wireframes, layout comparisons, architecture diagrams, side-by-side visual designs. Use \`list\` for idea options, \`table\` for side-by-side evaluations, \`kv\` for selected approach metadata, and \`metrics\` for numeric scoring. NEVER \`code\` blocks for structured data.
336
336
  - **Use regular chat** for text content — requirements questions, conceptual choices, tradeoff lists, A/B/C/D text options, scope decisions
337
337
  `},{file:`spec-document-reviewer-prompt.md`,content:`# Spec Document Reviewer Prompt Template
338
338