@kb-labs/quality-entry 2.94.0 → 2.96.0
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/dist/cli/commands/build-order.d.ts +5 -12
- package/dist/cli/commands/build-order.js +45 -97
- package/dist/cli/commands/build-order.js.map +1 -1
- package/dist/cli/commands/check-layers.d.ts +9 -0
- package/dist/cli/commands/check-layers.js +48 -0
- package/dist/cli/commands/check-layers.js.map +1 -0
- package/dist/cli/commands/context.d.ts +9 -0
- package/dist/cli/commands/context.js +94 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/coupling.d.ts +9 -0
- package/dist/cli/commands/coupling.js +35 -0
- package/dist/cli/commands/coupling.js.map +1 -0
- package/dist/cli/commands/dead-code.d.ts +4 -5
- package/dist/cli/commands/dead-code.js +41 -197
- package/dist/cli/commands/dead-code.js.map +1 -1
- package/dist/cli/commands/fix-deps.d.ts +2 -5
- package/dist/cli/commands/fix-deps.js +74 -83
- package/dist/cli/commands/fix-deps.js.map +1 -1
- package/dist/cli/commands/flags.d.ts +115 -1
- package/dist/cli/commands/flags.js +46 -1
- package/dist/cli/commands/flags.js.map +1 -1
- package/dist/cli/commands/gate.d.ts +9 -0
- package/dist/cli/commands/gate.js +59 -0
- package/dist/cli/commands/gate.js.map +1 -0
- package/dist/cli/commands/health.d.ts +4 -5
- package/dist/cli/commands/health.js +42 -191
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history.d.ts +9 -0
- package/dist/cli/commands/history.js +55 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/index.d.ts +6 -2
- package/dist/cli/commands/index.js +411 -828
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/snapshot.d.ts +9 -0
- package/dist/cli/commands/snapshot.js +91 -0
- package/dist/cli/commands/snapshot.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +4 -5
- package/dist/cli/commands/stats.js +17 -265
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +198 -306
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +95 -82
- package/dist/manifest.js +198 -306
- package/dist/manifest.js.map +1 -1
- package/dist/rest/handlers/build-order-handler.d.ts +5 -13
- package/dist/rest/handlers/build-order-handler.js +14 -17
- package/dist/rest/handlers/build-order-handler.js.map +1 -1
- package/dist/rest/handlers/builds-handler.js +10 -6
- package/dist/rest/handlers/builds-handler.js.map +1 -1
- package/dist/rest/handlers/coupling-handler.d.ts +8 -0
- package/dist/rest/handlers/coupling-handler.js +28 -0
- package/dist/rest/handlers/coupling-handler.js.map +1 -0
- package/dist/rest/handlers/cycles-handler.js +16 -12
- package/dist/rest/handlers/cycles-handler.js.map +1 -1
- package/dist/rest/handlers/dependencies-handler.js +12 -8
- package/dist/rest/handlers/dependencies-handler.js.map +1 -1
- package/dist/rest/handlers/graph-handler.js +77 -73
- package/dist/rest/handlers/graph-handler.js.map +1 -1
- package/dist/rest/handlers/health-handler.d.ts +4 -11
- package/dist/rest/handlers/health-handler.js +35 -9
- package/dist/rest/handlers/health-handler.js.map +1 -1
- package/dist/rest/handlers/history-handler.d.ts +7 -0
- package/dist/rest/handlers/history-handler.js +21 -0
- package/dist/rest/handlers/history-handler.js.map +1 -0
- package/dist/rest/handlers/knip-handler.d.ts +8 -0
- package/dist/rest/handlers/knip-handler.js +31 -0
- package/dist/rest/handlers/knip-handler.js.map +1 -0
- package/dist/rest/handlers/layers-handler.d.ts +8 -0
- package/dist/rest/handlers/layers-handler.js +28 -0
- package/dist/rest/handlers/layers-handler.js.map +1 -0
- package/dist/rest/handlers/snapshot-handler.d.ts +7 -0
- package/dist/rest/handlers/snapshot-handler.js +67 -0
- package/dist/rest/handlers/snapshot-handler.js.map +1 -0
- package/dist/rest/handlers/stale-handler.js +13 -9
- package/dist/rest/handlers/stale-handler.js.map +1 -1
- package/dist/rest/handlers/stats-handler.d.ts +4 -9
- package/dist/rest/handlers/stats-handler.js +22 -18
- package/dist/rest/handlers/stats-handler.js.map +1 -1
- package/dist/rest/handlers/tests-handler.js +12 -8
- package/dist/rest/handlers/tests-handler.js.map +1 -1
- package/dist/rest/handlers/types-handler.js +10 -6
- package/dist/rest/handlers/types-handler.js.map +1 -1
- package/dist/widgets/117.js +24 -1
- package/dist/widgets/117.js.map +1 -1
- package/dist/widgets/370.js +1 -1
- package/dist/widgets/370.js.map +1 -1
- package/dist/widgets/62.js +97 -0
- package/dist/widgets/62.js.map +1 -0
- package/dist/widgets/__federation_expose_QualityOverview.js +1 -1
- package/dist/widgets/__federation_expose_QualityOverview.js.map +1 -1
- package/dist/widgets/mf-manifest.json +27 -27
- package/dist/widgets/mf-stats.json +27 -27
- package/dist/widgets/remoteEntry.js +2 -2
- package/dist/widgets/remoteEntry.js.map +1 -1
- package/package.json +9 -8
- package/dist/widgets/418.js +0 -39
- package/dist/widgets/418.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_kb_labs_quality_entry=self.webpackChunk_kb_labs_quality_entry||[]).push([["15"],{6026(e,t){var n=Symbol.for("react.transitional.element");function a(e,t,a){var r=null;if(void 0!==a&&(r=""+a),void 0!==t.key&&(r=""+t.key),"key"in t)for(var i in a={},t)"key"!==i&&(a[i]=t[i]);else a=t;return{$$typeof:n,type:e,key:r,ref:void 0!==(t=a.ref)?t:null,props:a}}t.Fragment=Symbol.for("react.fragment"),t.jsx=a,t.jsxs=a},4552(e,t,n){e.exports=n(6026)},9569(e,t,n){n.r(t),n.d(t,{default:()=>f});var a=n(4552),r=n(2913),i=n(1349),l=n(2383);function s(){var e,t,n,r,s,o,c,d,u=(0,l.useData)("/v1/plugins/quality/stats?includeHealth=true"),g=u.data,p=u.isLoading,h=(0,l.useData)("/v1/plugins/quality/health?detailed=true"),x=h.data,f=h.isLoading,m=(0,l.useData)("/v1/plugins/quality/stale?detailed=true"),y=m.data,j=m.isLoading;if(p||f)return(0,a.jsx)("div",{style:{textAlign:"center",padding:"40px"},children:(0,a.jsx)(i.UISpin,{size:"large"})});var v=function(e){return e>=3?"error":e>=2?"warning":"info"};return(0,a.jsxs)("div",{children:[!j&&y&&y.totalStale>0&&(0,a.jsx)(i.UIAlert,{variant:"error",showIcon:!0,icon:(0,a.jsx)(i.UIIcon,{name:"ClockCircleOutlined"}),message:"".concat(y.totalStale," stale package").concat(y.totalStale>1?"s":""," detected"),description:(0,a.jsxs)("div",{children:[(0,a.jsxs)("p",{style:{marginBottom:8},children:["Some packages need rebuilding. This affects ",y.totalAffected," downstream package",y.totalAffected>1?"s":"","."]}),y.criticalChains&&y.criticalChains.length>0&&(0,a.jsxs)("div",{style:{marginBottom:12},children:[(0,a.jsx)("strong",{children:"Critical chains:"}),(0,a.jsx)("ul",{style:{marginTop:4,marginBottom:0},children:y.criticalChains.slice(0,3).map(function(e,t){return(0,a.jsxs)("li",{children:[(0,a.jsx)("code",{children:e.root})," affects ",e.affected.length," packages"]},t)})})]}),(0,a.jsxs)(i.UISpace,{children:[(0,a.jsx)(i.UIButton,{variant:"primary",danger:!0,icon:(0,a.jsx)(i.UIIcon,{name:"ThunderboltOutlined"}),size:"small",children:"Rebuild All Stale"}),(0,a.jsx)(i.UIButton,{size:"small",children:"View Details"})]})]}),style:{marginBottom:24}}),(0,a.jsx)(i.UICard,{title:"Health Score",style:{marginBottom:24},children:(0,a.jsxs)(i.UIRow,{gutter:24,children:[(0,a.jsx)(i.UICol,{span:12,children:(0,a.jsxs)("div",{style:{textAlign:"center"},children:[(0,a.jsx)(i.UIProgress,{type:"circle",percent:null!=(t=null==x?void 0:x.score)?t:0,size:180,status:(e=null==x?void 0:x.score)?e>=80?"success":e<60?"exception":"normal":"normal",strokeColor:{"0%":(null==x?void 0:x.score)&&x.score>=80?"#52c41a":"#ff4d4f","100%":(null==x?void 0:x.score)&&x.score>=80?"#73d13d":"#ff7a45"}}),(0,a.jsx)("div",{style:{marginTop:16},children:(0,a.jsxs)(i.UITag,{color:function(e){switch(e){case"A":return"green";case"B":return"blue";case"C":return"orange";case"D":return"red";case"F":return"volcano";default:return"default"}}(null==x?void 0:x.grade),style:{fontSize:16},children:["Grade ",null==x?void 0:x.grade]})})]})}),(0,a.jsxs)(i.UICol,{span:12,children:[(0,a.jsx)(i.UIStatistic,{title:"Packages",value:null!=(n=null==g?void 0:g.packages)?n:0,prefix:(0,a.jsx)(i.UIIcon,{name:"DatabaseOutlined"})}),(0,a.jsx)(i.UIStatistic,{title:"Lines of Code",value:null!=(r=null==g?void 0:g.loc)?r:0,prefix:(0,a.jsx)(i.UIIcon,{name:"CodeOutlined"}),style:{marginTop:16}}),(0,a.jsx)(i.UIStatistic,{title:"Total Size",value:null!=(s=null==g?void 0:g.size)?s:"N/A",prefix:(0,a.jsx)(i.UIIcon,{name:"FileTextOutlined"}),style:{marginTop:16}})]})]})}),(null==x?void 0:x.issues)&&x.issues.length>0&&(0,a.jsx)(i.UICard,{title:"Health Issues",style:{marginBottom:24},children:(0,a.jsx)(i.UIRow,{gutter:16,children:x.issues.map(function(e,t){return(0,a.jsx)(i.UICol,{span:24,style:{marginBottom:12},children:(0,a.jsx)(i.UIAlert,{message:(0,a.jsxs)(i.UISpace,{children:[(0,a.jsx)("span",{children:e.description}),(0,a.jsxs)(i.UITag,{color:"error"===v(e.severity)?"red":"orange",children:["severity: ",e.severity]}),void 0!==e.count&&(0,a.jsxs)(i.UITag,{children:[e.count," affected"]})]}),variant:v(e.severity),showIcon:!0,icon:"error"===v(e.severity)?(0,a.jsx)(i.UIIcon,{name:"WarningOutlined"}):(0,a.jsx)(i.UIIcon,{name:"CheckCircleOutlined"})})},t)})})}),(0,a.jsxs)(i.UIRow,{gutter:16,children:[(0,a.jsx)(i.UICol,{span:8,children:(0,a.jsx)(i.UICard,{children:(0,a.jsx)(i.UIStatistic,{title:"Packages",value:null!=(o=null==g?void 0:g.packages)?o:0,prefix:(0,a.jsx)(i.UIIcon,{name:"DatabaseOutlined"})})})}),(0,a.jsx)(i.UICol,{span:8,children:(0,a.jsx)(i.UICard,{children:(0,a.jsx)(i.UIStatistic,{title:"Lines of Code",value:null!=(c=null==g?void 0:g.loc)?c:0,prefix:(0,a.jsx)(i.UIIcon,{name:"CodeOutlined"})})})}),(0,a.jsx)(i.UICol,{span:8,children:(0,a.jsx)(i.UICard,{children:(0,a.jsx)(i.UIStatistic,{title:"Total Size",value:null!=(d=null==g?void 0:g.size)?d:"N/A",prefix:(0,a.jsx)(i.UIIcon,{name:"FileTextOutlined"})})})})]})]})}function o(){var e,t,n,r,s,o,c,d,u,g=(0,l.useData)("/v1/plugins/quality/dependencies"),p=g.data,h=g.isLoading,x=g.isError;if(h)return(0,a.jsx)("div",{style:{textAlign:"center",padding:"40px"},children:(0,a.jsx)(i.UISpin,{size:"large"})});if(x)return(0,a.jsx)(i.UIAlert,{message:"Failed to load dependencies",variant:"error",showIcon:!0});var f=[{title:"Dependency",dataIndex:"name",key:"name",sorter:function(e,t){return e.name.localeCompare(t.name)}},{title:"Versions",dataIndex:"versions",key:"versions",render:function(e){return(0,a.jsx)(a.Fragment,{children:e.map(function(e){return(0,a.jsxs)(i.UITag,{color:"orange",children:[e.version," (",e.count,")"]},e.version)})})}},{title:"Total Packages",dataIndex:"totalPackages",key:"totalPackages",sorter:function(e,t){return e.totalPackages-t.totalPackages}}],m=[{title:"Dependency",dataIndex:"name",key:"name",sorter:function(e,t){return e.name.localeCompare(t.name)}},{title:"Packages",dataIndex:"packages",key:"packages",render:function(e){return e.join(", ")}}],y=[{title:"Dependency",dataIndex:"name",key:"name",sorter:function(e,t){return e.name.localeCompare(t.name)}},{title:"Packages",dataIndex:"packages",key:"packages",render:function(e){return e.join(", ")}},{title:"Imported In",dataIndex:"importedIn",key:"importedIn",render:function(e){return e.join(", ")}}];return(0,a.jsxs)("div",{children:[p&&0===p.totalIssues&&(0,a.jsx)(i.UIAlert,{message:"No dependency issues found!",description:"Your monorepo has no duplicate, unused, or missing dependencies.",variant:"success",showIcon:!0,style:{marginBottom:24}}),(0,a.jsx)(i.UICard,{title:"Duplicate Dependencies (".concat(null!=(e=null==p||null==(c=p.duplicates)?void 0:c.length)?e:0,")"),style:{marginBottom:24},children:(0,a.jsx)(i.UITable,{dataSource:null!=(t=null==p?void 0:p.duplicates)?t:[],columns:f,rowKey:"name",pagination:{pageSize:10}})}),(0,a.jsx)(i.UICard,{title:"Unused Dependencies (".concat(null!=(n=null==p||null==(d=p.unused)?void 0:d.length)?n:0,")"),style:{marginBottom:24},children:(0,a.jsx)(i.UITable,{dataSource:null!=(r=null==p?void 0:p.unused)?r:[],columns:m,rowKey:"name",pagination:{pageSize:10}})}),(0,a.jsx)(i.UICard,{title:"Missing Dependencies (".concat(null!=(s=null==p||null==(u=p.missing)?void 0:u.length)?s:0,")"),children:(0,a.jsx)(i.UITable,{dataSource:null!=(o=null==p?void 0:p.missing)?o:[],columns:y,rowKey:"name",pagination:{pageSize:10}})})]})}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function d(){var e,t,n,s,o=function(e){if(Array.isArray(e))return e}(e=r.useState())||function(e){var t,n,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r=[],i=!0,l=!1;try{for(a=a.call(e);!(i=(t=a.next()).done)&&(r.push(t.value),2!==r.length);i=!0);}catch(e){l=!0,n=e}finally{try{i||null==a.return||a.return()}finally{if(l)throw n}}return r}}(e)||function(e){if(e){if("string"==typeof e)return c(e,2);var t=Object.prototype.toString.call(e).slice(8,-1);if("Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t)return Array.from(t);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return c(e,2)}}(e)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),d=o[0],u=o[1],g=d?"/v1/plugins/quality/build-order?package=".concat(encodeURIComponent(d)):"/v1/plugins/quality/build-order",p=(0,l.useData)(g),h=p.data,x=p.isLoading,f=p.isError;if((0,l.useData)("/v1/plugins/quality/cycles").data,x)return(0,a.jsx)("div",{style:{textAlign:"center",padding:"40px"},children:(0,a.jsx)(i.UISpin,{size:"large"})});if(f)return(0,a.jsx)(i.UIAlert,{message:"Failed to load build order",variant:"error",showIcon:!0});var m=[{title:"Layer",dataIndex:"layer",key:"layer",width:100,render:function(e){return(0,a.jsxs)(i.UITag,{color:"blue",children:["Layer ",e]})}},{title:"Packages (can build in parallel)",dataIndex:"packages",key:"packages",render:function(e){return(0,a.jsx)(i.UISpace,{wrap:!0,children:e.map(function(e){return(0,a.jsx)(i.UITag,{children:e},e)})})}}],y=null==h?void 0:h.layers.map(function(e,t){return{layer:t+1,packages:e,key:t}});return(0,a.jsxs)("div",{children:[(null==h?void 0:h.hasCircular)&&(0,a.jsx)(i.UIAlert,{message:"Circular Dependencies Detected!",description:"Found ".concat(h.circular.length," circular dependency cycles. Build order may not be correct."),variant:"error",showIcon:!0,style:{marginBottom:24}}),(0,a.jsx)(i.UICard,{title:"Filter",style:{marginBottom:24},children:(0,a.jsx)(i.UISelect,{style:{width:400},placeholder:"Select package to see its build dependencies",value:d,onChange:function(e){return u(e)},allowClear:!0,showSearch:!0,options:null!=(t=null==h?void 0:h.sorted.map(function(e){return{label:e,value:e}}))?t:[]})}),(0,a.jsx)(i.UICard,{title:"Build Layers (".concat(null!=(n=null==h?void 0:h.layerCount)?n:0," layers, ").concat(null!=(s=null==h?void 0:h.packageCount)?s:0," packages)"),style:{marginBottom:24},children:(0,a.jsx)(i.UITable,{dataSource:null!=y?y:[],columns:m,pagination:!1,expandable:{expandedRowRender:function(e){return(0,a.jsxs)("div",{style:{padding:"8px 0"},children:[(0,a.jsx)("strong",{children:"Packages in this layer:"}),(0,a.jsx)("div",{style:{marginTop:8},children:e.packages.map(function(e){return(0,a.jsx)(i.UITag,{style:{marginBottom:4},children:e},e)})})]})}}})}),(null==h?void 0:h.hasCircular)&&(0,a.jsx)(i.UICard,{title:"Circular Dependencies (".concat(h.circular.length,")"),children:h.circular.map(function(e,t){return(0,a.jsx)(i.UIAlert,{message:"Cycle ".concat(t+1),description:e.join(" → "),variant:"warning",showIcon:!0,style:{marginBottom:12}},t)})})]})}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function g(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,a,r=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var i=[],l=!0,s=!1;try{for(r=r.call(e);!(l=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);l=!0);}catch(e){s=!0,a=e}finally{try{l||null==r.return||r.return()}finally{if(s)throw a}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return u(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(){var e,t,n=g(r.useState("stats"),2),s=n[0],o=n[1],c=g(r.useState(),2),d=c[0],u=c[1],p=(0,l.useData)("/v1/plugins/quality/build-order").data;r.useEffect(function(){var e;("reverse"===s||"impact"===s)&&!d&&(null==p||null==(e=p.sorted)?void 0:e[0])&&u(p.sorted[0])},[s,d,p]);var h=d?"/v1/plugins/quality/graph?mode=".concat(s,"&package=").concat(encodeURIComponent(d)):"/v1/plugins/quality/graph?mode=".concat(s),x=(0,l.useData)(h),f=x.data,m=x.isLoading,y=x.isError;if(m)return(0,a.jsx)("div",{style:{textAlign:"center",padding:"40px"},children:(0,a.jsx)(i.UISpin,{size:"large"})});if(y)return(0,a.jsx)(i.UIAlert,{message:"Failed to load graph",variant:"error",showIcon:!0});var j=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",a=n?"".concat(n,"/").concat(e.name):e.name;return{title:e.name,key:a,children:null==(t=e.children)?void 0:t.map(function(e){return j(e,a)})}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(i.UICard,{title:"Visualization Options",style:{marginBottom:24},children:(0,a.jsxs)(i.UIRow,{gutter:16,children:[(0,a.jsxs)(i.UICol,{span:12,children:[(0,a.jsx)("label",{children:"Mode:"}),(0,a.jsx)(i.UISelect,{style:{width:"100%",marginTop:8},value:s,onChange:function(e){return o(e)},options:[{label:"Dependency Tree",value:"tree"},{label:"Reverse Dependencies",value:"reverse"},{label:"Impact Analysis",value:"impact"},{label:"Statistics",value:"stats"}]})]}),"stats"!==s&&(0,a.jsxs)(i.UICol,{span:12,children:[(0,a.jsxs)("label",{children:["Package","tree"===s?" (optional)":"",":"]}),(0,a.jsx)(i.UISelect,{style:{width:"100%",marginTop:8},placeholder:"tree"===s?"All packages":"Select a package",value:d,onChange:function(e){return u(e)},allowClear:!0,showSearch:!0,options:null!=(e=null==p||null==(t=p.sorted)?void 0:t.map(function(e){return{label:e,value:e}}))?e:[]})]})]})}),(0,a.jsxs)(i.UICard,{title:"".concat(s.charAt(0).toUpperCase()+s.slice(1)," View"),children:["tree"===s&&((null==f?void 0:f.tree)?(0,a.jsx)(i.UITree,{treeData:[j(f.tree)],showLine:!0,defaultExpandedKeys:[f.tree.name]}):(0,a.jsx)(i.UIAlert,{message:"No tree data available",variant:"info"})),("reverse"===s||"impact"===s)&&((null==f?void 0:f.packages)&&0!==f.packages.length?(0,a.jsx)("ul",{children:f.packages.map(function(e){return(0,a.jsx)("li",{children:e},e)})}):(0,a.jsx)(i.UIAlert,{message:"No packages found",variant:"info"})),"stats"===s&&((null==f?void 0:f.stats)?(0,a.jsxs)("div",{children:[(0,a.jsxs)(i.UIRow,{gutter:16,style:{marginBottom:24},children:[(0,a.jsx)(i.UICol,{span:8,children:(0,a.jsx)(i.UICard,{children:(0,a.jsx)(i.UIStatistic,{title:"Total Packages",value:f.stats.totalPackages})})}),(0,a.jsx)(i.UICol,{span:8,children:(0,a.jsx)(i.UICard,{children:(0,a.jsx)(i.UIStatistic,{title:"Max Depth",value:f.stats.maxDepth})})}),(0,a.jsx)(i.UICol,{span:8,children:(0,a.jsx)(i.UICard,{children:(0,a.jsx)(i.UIStatistic,{title:"Avg Dependencies",value:f.stats.avgDependencies,precision:1})})})]}),f.stats.mostDepended&&f.stats.mostDepended.length>0&&(0,a.jsx)(i.UICard,{title:"Most Depended On",children:(0,a.jsx)("ul",{children:f.stats.mostDepended.map(function(e){return(0,a.jsxs)("li",{children:[(0,a.jsx)("strong",{children:e.name})," - ",e.count," packages depend on it"]},e.name)})})})]}):(0,a.jsx)(i.UIAlert,{message:"No stats available",variant:"info"}))]})]})}var h=i.UITypographyText;function x(){var e,t=(0,l.useData)("/v1/plugins/quality/stale?detailed=true"),n=t.data,r=t.isLoading,s=t.isError;if(r)return(0,a.jsx)("div",{style:{textAlign:"center",padding:"40px"},children:(0,a.jsx)(i.UISpin,{size:"large"})});if(s)return(0,a.jsx)(i.UIAlert,{message:"Failed to load stale packages",variant:"error",showIcon:!0});var o=function(e){switch(e){case"critical":return"red";case"high":return"orange";case"medium":return"gold";case"low":return"blue";default:return"default"}},c=function(e){switch(e){case"source-newer":return"Source Modified";case"dependency-rebuilt":return"Dependency Rebuilt";case"missing-dist":return"Missing Build";default:return e}},d=function(e){switch(e){case"source-newer":return"orange";case"dependency-rebuilt":return"blue";case"missing-dist":return"red";default:return"default"}},u=[{title:"Package",dataIndex:"name",key:"name",sorter:function(e,t){return e.name.localeCompare(t.name)},render:function(e){return(0,a.jsx)("code",{children:e})}},{title:"Reason",dataIndex:"reason",key:"reason",filters:[{text:"Source Modified",value:"source-newer"},{text:"Dependency Rebuilt",value:"dependency-rebuilt"},{text:"Missing Build",value:"missing-dist"}],onFilter:function(e,t){return t.reason===e},render:function(e){return(0,a.jsx)(i.UITag,{color:d(e),children:c(e)})}},{title:"Severity",dataIndex:"severity",key:"severity",sorter:function(e,t){var n=["critical","high","medium","low"];return n.indexOf(e.severity)-n.indexOf(t.severity)},filters:[{text:"Critical",value:"critical"},{text:"High",value:"high"},{text:"Medium",value:"medium"},{text:"Low",value:"low"}],onFilter:function(e,t){return t.severity===e},render:function(e){return(0,a.jsx)(i.UITag,{color:o(e),children:e.toUpperCase()})}},{title:"Affected",dataIndex:"affectedCount",key:"affectedCount",sorter:function(e,t){return e.affectedCount-t.affectedCount},render:function(e){return(0,a.jsxs)(h,{type:e>10?"danger":e>5?"warning":"secondary",children:[e," package",1!==e?"s":""]})}},{title:"Modified",key:"modified",render:function(e,t){return t.sourceModified?(0,a.jsxs)(i.UISpace,{direction:"vertical",size:0,children:[(0,a.jsxs)(h,{type:"secondary",style:{fontSize:12},children:["Source: ",new Date(t.sourceModified).toLocaleString()]}),t.distModified&&(0,a.jsxs)(h,{type:"secondary",style:{fontSize:12},children:["Dist: ",new Date(t.distModified).toLocaleString()]})]}):(0,a.jsx)(h,{type:"secondary",children:"-"})}}],g=[{title:"Root Package",dataIndex:"root",key:"root",render:function(e){return(0,a.jsx)("code",{children:e})}},{title:"Depth",dataIndex:"depth",key:"depth",sorter:function(e,t){return e.depth-t.depth},render:function(e){return(0,a.jsxs)(i.UITag,{color:e>5?"red":e>3?"orange":"blue",children:[e," levels"]})}},{title:"Affected Packages",dataIndex:"affected",key:"affected",sorter:function(e,t){return e.affected.length-t.affected.length},render:function(e){return(0,a.jsxs)(h,{type:e.length>20?"danger":"secondary",children:[e.length," package",1!==e.length?"s":""]})}}];return(0,a.jsxs)("div",{children:[n&&n.totalStale>0?(0,a.jsx)(i.UIAlert,{variant:"error",showIcon:!0,icon:(0,a.jsx)(i.UIIcon,{name:"ClockCircleOutlined"}),message:(0,a.jsxs)(i.UISpace,{children:[(0,a.jsxs)("strong",{children:[n.totalStale," stale package",n.totalStale>1?"s":""," detected"]}),(0,a.jsxs)(h,{type:"secondary",children:["affecting ",n.totalAffected," downstream package",n.totalAffected>1?"s":""]})]}),action:(0,a.jsxs)(i.UISpace,{children:[(0,a.jsx)(i.UIButton,{variant:"primary",danger:!0,icon:(0,a.jsx)(i.UIIcon,{name:"ThunderboltOutlined"}),size:"small",children:"Rebuild All"}),(0,a.jsx)(i.UIButton,{size:"small",children:"Export Report"})]}),style:{marginBottom:24}}):(0,a.jsx)(i.UIAlert,{variant:"success",showIcon:!0,message:"All packages are up to date",description:"No stale packages detected. Your monorepo build state is healthy.",style:{marginBottom:24}}),(null==n?void 0:n.criticalChains)&&n.criticalChains.length>0&&(0,a.jsxs)(i.UICard,{title:(0,a.jsxs)(i.UISpace,{children:[(0,a.jsx)(i.UIIcon,{name:"WarningOutlined",style:{color:"#ff4d4f"}}),"Critical Rebuild Chains"]}),style:{marginBottom:24},children:[(0,a.jsx)(i.UIAlert,{variant:"warning",showIcon:!0,message:"High-impact stale packages",description:"These packages affect many downstream packages. Rebuilding them will trigger cascading rebuilds.",style:{marginBottom:16}}),(0,a.jsx)(i.UITable,{dataSource:n.criticalChains,columns:g,rowKey:"root",pagination:{pageSize:5}})]}),(0,a.jsx)(i.UICard,{title:(0,a.jsxs)(i.UISpace,{children:[(0,a.jsx)(i.UIIcon,{name:"FileOutlined"}),"Stale Packages"]}),children:(0,a.jsx)(i.UITable,{dataSource:null!=(e=null==n?void 0:n.stalePackages)?e:[],columns:u,rowKey:"name",pagination:{pageSize:20},expandable:{expandedRowRender:function(e){return(0,a.jsx)("div",{style:{padding:"8px 16px"},children:(0,a.jsxs)(i.UISpace,{direction:"vertical",size:8,style:{width:"100%"},children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(h,{strong:!0,children:"Path: "}),(0,a.jsx)(h,{type:"secondary",code:!0,children:e.path})]}),e.affectedPackages&&e.affectedPackages.length>0&&(0,a.jsxs)("div",{children:[(0,a.jsxs)(h,{strong:!0,children:["Affected Packages (",e.affectedPackages.length,"):"]}),(0,a.jsxs)("div",{style:{marginTop:8},children:[e.affectedPackages.slice(0,10).map(function(e){return(0,a.jsx)(i.UITag,{style:{marginBottom:4},children:e},e)}),e.affectedPackages.length>10&&(0,a.jsxs)(i.UITag,{children:["+",e.affectedPackages.length-10," more"]})]})]})]})})}}})})]})}function f(){var e=(0,a.jsx)(i.UITabs,{syncUrl:"search",items:[{key:"overview",label:"Overview",children:(0,a.jsx)(s,{})},{key:"dependencies",label:"Dependencies",children:(0,a.jsx)(o,{})},{key:"build-order",label:"Build Order",children:(0,a.jsx)(d,{})},{key:"graph",label:"Dependency Graph",children:(0,a.jsx)(p,{})},{key:"stale",label:"Stale Packages",children:(0,a.jsx)(x,{})}]});return(0,a.jsx)(i.UIPage,{children:(0,a.jsx)(i.UIPageHeader,{title:"Quality",description:"Monorepo health metrics, dependency analysis, and build order visualization",tabs:e})})}}}]);
|
|
1
|
+
"use strict";(self.webpackChunk_kb_labs_quality_entry=self.webpackChunk_kb_labs_quality_entry||[]).push([["15"],{6026(e,n){var t=Symbol.for("react.transitional.element");function l(e,n,l){var i=null;if(void 0!==l&&(i=""+l),void 0!==n.key&&(i=""+n.key),"key"in n)for(var r in l={},n)"key"!==r&&(l[r]=n[r]);else l=n;return{$$typeof:t,type:e,key:i,ref:void 0!==(n=l.ref)?n:null,props:l}}n.Fragment=Symbol.for("react.fragment"),n.jsx=l,n.jsxs=l},4552(e,n,t){e.exports=t(6026)},8371(e,n,t){t.r(n),t.d(n,{default:()=>S});var l=t(4552),i=t(2913),r=t(1030),a=t(3218);function s(e){switch(e){case"A":return"green";case"B":return"blue";case"C":return"orange";case"D":return"red";case"F":return"volcano";default:return"default"}}function o(e){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return 0===e?null:(0,l.jsxs)("span",{style:{color:(n?e<0:e>0)?"#52c41a":"#ff4d4f",fontSize:12,marginLeft:4},children:[e>0?"▲":"▼"," ",Math.abs(e)]})}var c=[{key:"architecture",label:"Architecture",icon:"ApartmentOutlined"},{key:"typescript",label:"TypeScript",icon:"CodeOutlined"},{key:"deadCode",label:"Dead Code",icon:"DeleteOutlined"},{key:"depHygiene",label:"Dep Hygiene",icon:"NodeIndexOutlined"},{key:"testCoverage",label:"Test Coverage",icon:"CheckCircleOutlined"}];function d(){var e,n,t,i,d,u,h,p,x=(0,a.useData)("/v1/plugins/quality/stats"),g=x.data,y=x.isLoading,f=(0,a.useData)("/v1/plugins/quality/health"),I=f.data,j=f.isLoading,m=(0,a.useData)("/v1/plugins/quality/history"),v=m.data,U=m.isLoading;if(y||j||U)return(0,l.jsx)(r.UISkeleton,{active:!0,lines:8,style:{padding:"24px 0"}});var k=null==v?void 0:v.delta,S=null!=(n=null==v||null==(p=v.latest)?void 0:p.dimensions)?n:null==I?void 0:I.dimensions;return(0,l.jsxs)("div",{children:[(0,l.jsx)(r.UICard,{title:"Health Score",style:{marginBottom:24},children:(0,l.jsxs)(r.UIRow,{gutter:32,align:"middle",children:[(0,l.jsxs)(r.UICol,{span:8,style:{textAlign:"center"},children:[(0,l.jsx)(r.UIProgress,{type:"circle",percent:null!=(t=null==I?void 0:I.score)?t:0,size:160,status:(e=null==I?void 0:I.score)?e>=80?"success":e<60?"exception":"normal":"normal"}),(0,l.jsxs)("div",{style:{marginTop:12},children:[(0,l.jsxs)(r.UITag,{color:s(null==I?void 0:I.grade),style:{fontSize:16,padding:"4px 12px"},children:["Grade ",null!=(i=null==I?void 0:I.grade)?i:"—"]}),k&&(0,l.jsxs)("div",{style:{marginTop:8,color:"#8c8c8c",fontSize:13},children:[o(k.score)," vs previous snapshot"]})]})]}),(0,l.jsx)(r.UICol,{span:16,children:(0,l.jsx)(r.UIRow,{gutter:[16,16],children:c.map(function(e){var n,t,i,a,o,c=e.key,d=e.label,u=e.icon,h=S?S[c]:void 0;return(0,l.jsx)(r.UICol,{span:12,children:(0,l.jsxs)(r.UICard,{size:"small",style:{borderRadius:8},children:[(0,l.jsxs)(r.UISpace,{children:[(0,l.jsx)(r.UIIcon,{name:u}),(0,l.jsx)("span",{style:{fontWeight:500},children:d}),(0,l.jsx)(r.UITag,{color:s(null==h?void 0:h.grade),children:null!=(n=null==h?void 0:h.grade)?n:"—"})]}),(0,l.jsx)(r.UIProgress,{percent:null!=(t=null==h?void 0:h.score)?t:0,size:"small",showInfo:!1,strokeColor:(null!=(i=null==h?void 0:h.score)?i:0)>=80?"#52c41a":(null!=(a=null==h?void 0:h.score)?a:0)>=60?"#faad14":"#ff4d4f",style:{marginTop:8}}),(0,l.jsxs)("div",{style:{fontSize:12,color:"#8c8c8c",marginTop:4},children:[null!=(o=null==h?void 0:h.score)?o:0,"/100"]})]})},c)})})})]})}),k&&(0,l.jsx)(r.UIAlert,{variant:"info",showIcon:!0,icon:(0,l.jsx)(r.UIIcon,{name:"LineChartOutlined"}),message:"Changes since last snapshot",description:(0,l.jsx)(r.UIRow,{gutter:16,style:{marginTop:8},children:[{label:"Layering violations",value:-k.layeringViolations,invert:!0},{label:"Any count",value:-k.anyCount,invert:!0},{label:"Unused files",value:-k.unusedFiles,invert:!0},{label:"Unused deps",value:-k.unusedDeps,invert:!0},{label:"Avg instability",value:-k.avgInstability,invert:!0}].map(function(e){var n=e.label,t=e.value,i=e.invert;return(0,l.jsxs)(r.UICol,{children:[(0,l.jsxs)("span",{style:{color:"#8c8c8c"},children:[n,": "]}),o(t,i),0===t&&(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"—"})]},n)})}),style:{marginBottom:24}}),(0,l.jsxs)(r.UIRow,{gutter:16,children:[(0,l.jsx)(r.UICol,{span:8,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Packages",value:null!=(d=null==g?void 0:g.packages)?d:0,prefix:(0,l.jsx)(r.UIIcon,{name:"DatabaseOutlined"})})})}),(0,l.jsx)(r.UICol,{span:8,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Lines of Code",value:null!=(u=null==g?void 0:g.loc)?u:0,prefix:(0,l.jsx)(r.UIIcon,{name:"CodeOutlined"})})})}),(0,l.jsx)(r.UICol,{span:8,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Total Size",value:null!=(h=null==g?void 0:g.size)?h:"N/A",prefix:(0,l.jsx)(r.UIIcon,{name:"FileTextOutlined"})})})})]})]})}var u=[{title:"Package",dataIndex:"name",key:"name",render:function(e){return(0,l.jsx)("code",{style:{fontSize:12},children:e})},ellipsis:!0},{title:"Ca (afferent)",dataIndex:"afferent",key:"afferent",width:110,sorter:function(e,n){return e.afferent-n.afferent}},{title:"Ce (efferent)",dataIndex:"efferent",key:"efferent",width:110,sorter:function(e,n){return e.efferent-n.efferent}},{title:"Instability",dataIndex:"instability",key:"instability",width:110,defaultSortOrder:"descend",sorter:function(e,n){return e.instability-n.instability},render:function(e){return(0,l.jsx)(r.UITag,{color:e>=.8?"#ff4d4f":e>=.6?"#faad14":e>=.4?"#1677ff":"#52c41a",children:e.toFixed(2)})}}],h=[{title:"File",dataIndex:"file",key:"file",ellipsis:!0,render:function(e){return(0,l.jsx)("code",{style:{fontSize:11},children:e.replace(/^.*\/src\//,"src/")})}},{title:"From",key:"from",width:180,render:function(e,n){return(0,l.jsxs)(r.UISpace,{size:4,children:[(0,l.jsx)(r.UITag,{children:n.fromPackage}),(0,l.jsxs)("span",{style:{color:"#8c8c8c",fontSize:11},children:["L",n.fromLayer]})]})}},{title:"To",key:"to",width:180,render:function(e,n){return(0,l.jsxs)(r.UISpace,{size:4,children:[(0,l.jsx)(r.UITag,{color:"red",children:n.toPackage}),(0,l.jsxs)("span",{style:{color:"#8c8c8c",fontSize:11},children:["L",n.toLayer]})]})}},{title:"Import",dataIndex:"importSpecifier",key:"importSpecifier",ellipsis:!0,render:function(e){return(0,l.jsx)("code",{style:{fontSize:11},children:e})}}];function p(){var e,n,t,i,s,o,c,d=(0,a.useData)("/v1/plugins/quality/coupling"),p=d.data,x=d.isLoading,g=(0,a.useData)("/v1/plugins/quality/layers"),y=g.data,f=g.isLoading;if(x||f)return(0,l.jsx)(r.UISkeleton,{active:!0,lines:10,style:{padding:"24px 0"}});var I=(null!=(e=null==y?void 0:y.totalViolations)?e:0)>0;return(0,l.jsxs)("div",{children:[(0,l.jsxs)(r.UIRow,{gutter:16,style:{marginBottom:24},children:[(0,l.jsx)(r.UICol,{span:8,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Layering Violations",value:null!=(n=null==y?void 0:y.totalViolations)?n:0,valueStyle:{color:I?"#ff4d4f":"#52c41a"},prefix:(0,l.jsx)(r.UIIcon,{name:I?"WarningOutlined":"CheckCircleOutlined"})})})}),(0,l.jsx)(r.UICol,{span:8,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Avg Instability",value:(null!=(t=null==p?void 0:p.avgInstability)?t:0).toFixed(2),prefix:(0,l.jsx)(r.UIIcon,{name:"NodeIndexOutlined"})})})}),(0,l.jsx)(r.UICol,{span:8,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Affected Packages",value:null!=(i=null==y||null==(c=y.affectedPackages)?void 0:c.length)?i:0,prefix:(0,l.jsx)(r.UIIcon,{name:"ApartmentOutlined"})})})})]}),I&&(0,l.jsx)(r.UIAlert,{variant:"error",showIcon:!0,icon:(0,l.jsx)(r.UIIcon,{name:"WarningOutlined"}),message:"".concat(y.totalViolations," layering violation").concat(y.totalViolations>1?"s":""," detected"),description:"Lower-layer packages are importing from higher-layer packages, breaking the dependency rules.",style:{marginBottom:16}}),(0,l.jsx)(r.UICard,{title:"Layering Violations",style:{marginBottom:24},children:I?(0,l.jsx)(r.UITable,{dataSource:null!=(s=null==y?void 0:y.violations)?s:[],columns:h,rowKey:function(e){return"".concat(e.file,":").concat(e.importSpecifier)},size:"small",pagination:{pageSize:20}}):(0,l.jsx)(r.UIAlert,{variant:"success",showIcon:!0,icon:(0,l.jsx)(r.UIIcon,{name:"CheckCircleOutlined"}),message:"No layering violations — architecture is clean"})}),(0,l.jsx)(r.UICard,{title:"Package Coupling (Ca/Ce/Instability)",children:(0,l.jsx)(r.UITable,{dataSource:null!=(o=null==p?void 0:p.packages)?o:[],columns:u,rowKey:"name",size:"small",pagination:{pageSize:30}})})]})}var x=[{title:"File",dataIndex:"file",key:"file",ellipsis:!0,render:function(e){return(0,l.jsx)("code",{style:{fontSize:12},children:e})}}],g=[{title:"File",dataIndex:"file",key:"file",ellipsis:!0,render:function(e){return(0,l.jsx)("code",{style:{fontSize:12},children:e})}},{title:"Symbol",dataIndex:"symbol",key:"symbol",width:200,render:function(e){return(0,l.jsx)(r.UITag,{children:(0,l.jsx)("code",{children:e})})}}],y=[{title:"Package",dataIndex:"package",key:"package",render:function(e){return(0,l.jsx)("code",{style:{fontSize:12},children:e})}},{title:"Workspace",dataIndex:"workspace",key:"workspace",width:220,render:function(e){return(0,l.jsx)(r.UITag,{children:e})}}];function f(){var e,n,t,i,s,o,c,d,u,h,p,f,I,j,m=(0,a.useData)("/v1/plugins/quality/dead-code"),v=m.data,U=m.isLoading,k=(0,a.useData)("/v1/plugins/quality/health"),S=k.data,C=k.isLoading;if(U||C)return(0,l.jsx)(r.UISkeleton,{active:!0,lines:8,style:{padding:"24px 0"}});var b=null!=(n=null==S||null==(h=S.dimensions)||null==(u=h.typescript)?void 0:u.details)?n:[],w=null!=(t=null==S||null==(f=S.dimensions)||null==(p=f.typescript)?void 0:p.score)?t:100,z=null!=(i=null==S||null==(j=S.dimensions)||null==(I=j.typescript)?void 0:I.grade)?i:"A",T=(null!=(s=null==v?void 0:v.unusedFiles)?s:[]).map(function(e){return{key:e,file:e}}),A=(null!=(o=null==v?void 0:v.unusedExports)?o:[]).map(function(e){return{key:"".concat(e.file,":").concat(e.symbol),file:e.file,symbol:e.symbol}}),D=(null!=(c=null==v?void 0:v.unusedDependencies)?c:[]).map(function(e){return{key:"".concat(e.workspace,":").concat(e.package),package:e.package,workspace:e.workspace}}),O=(null!=(d=null==v?void 0:v.unlistedDependencies)?d:[]).map(function(e){return{key:"".concat(e.workspace,":").concat(e.package),package:e.package,workspace:e.workspace}});return(0,l.jsxs)("div",{children:[(0,l.jsxs)(r.UIRow,{gutter:16,style:{marginBottom:24},children:[(0,l.jsx)(r.UICol,{span:6,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"TypeScript Score",value:"".concat(w,"/100"),prefix:(0,l.jsx)(r.UITag,{color:null!=(e=({A:"green",B:"blue",C:"orange",D:"red",F:"volcano"})[z])?e:"default",children:z})})})}),(0,l.jsx)(r.UICol,{span:6,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Unused Files",value:T.length,valueStyle:{color:T.length>0?"#ff4d4f":"#52c41a"},prefix:(0,l.jsx)(r.UIIcon,{name:"FileUnknownOutlined"})})})}),(0,l.jsx)(r.UICol,{span:6,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Unused Exports",value:A.length,valueStyle:{color:A.length>0?"#faad14":"#52c41a"},prefix:(0,l.jsx)(r.UIIcon,{name:"ExportOutlined"})})})}),(0,l.jsx)(r.UICol,{span:6,children:(0,l.jsx)(r.UICard,{children:(0,l.jsx)(r.UIStatistic,{title:"Dep Issues",value:D.length+O.length,valueStyle:{color:D.length+O.length>0?"#faad14":"#52c41a"},prefix:(0,l.jsx)(r.UIIcon,{name:"NodeIndexOutlined"})})})})]}),b.length>0&&(0,l.jsx)(r.UICard,{title:"TypeScript Health",style:{marginBottom:24},children:b.map(function(e,n){return(0,l.jsx)(r.UIAlert,{variant:w<60?"error":w<80?"warning":"info",showIcon:!0,message:e,style:{marginBottom:8}},n)})}),T.length>0&&(0,l.jsx)(r.UICard,{title:(0,l.jsxs)(r.UISpace,{children:[(0,l.jsx)(r.UIIcon,{name:"FileUnknownOutlined"}),(0,l.jsx)("span",{children:"Unused Files"}),(0,l.jsx)(r.UITag,{color:"red",children:T.length})]}),style:{marginBottom:16},children:(0,l.jsx)(r.UITable,{dataSource:T,columns:x,size:"small",pagination:{pageSize:20}})}),A.length>0&&(0,l.jsx)(r.UICard,{title:(0,l.jsxs)(r.UISpace,{children:[(0,l.jsx)(r.UIIcon,{name:"ExportOutlined"}),(0,l.jsx)("span",{children:"Unused Exports"}),(0,l.jsx)(r.UITag,{color:"orange",children:A.length})]}),style:{marginBottom:16},children:(0,l.jsx)(r.UITable,{dataSource:A,columns:g,size:"small",pagination:{pageSize:20}})}),D.length>0&&(0,l.jsx)(r.UICard,{title:(0,l.jsxs)(r.UISpace,{children:[(0,l.jsx)(r.UIIcon,{name:"NodeCollapseOutlined"}),(0,l.jsx)("span",{children:"Unused Dependencies"}),(0,l.jsx)(r.UITag,{color:"orange",children:D.length})]}),style:{marginBottom:16},children:(0,l.jsx)(r.UITable,{dataSource:D,columns:y,size:"small",pagination:{pageSize:20}})}),O.length>0&&(0,l.jsx)(r.UICard,{title:(0,l.jsxs)(r.UISpace,{children:[(0,l.jsx)(r.UIIcon,{name:"WarningOutlined"}),(0,l.jsx)("span",{children:"Unlisted Dependencies"}),(0,l.jsx)(r.UITag,{color:"red",children:O.length})]}),children:(0,l.jsx)(r.UITable,{dataSource:O,columns:y,size:"small",pagination:{pageSize:20}})}),0===T.length&&0===A.length&&0===D.length&&0===O.length&&(0,l.jsx)(r.UIAlert,{variant:"success",showIcon:!0,icon:(0,l.jsx)(r.UIIcon,{name:"CheckCircleOutlined"}),message:"No dead code detected — codebase is clean"})]})}function I(e){var n;return null!=(n=({A:"green",B:"blue",C:"orange",D:"red",F:"volcano"})[null!=e?e:""])?n:"default"}function j(e){var n=!(arguments.length>1)||void 0===arguments[1]||arguments[1];return 0===e?(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"—"}):(0,l.jsxs)("span",{style:{color:(n?e<0:e>0)?"#52c41a":"#ff4d4f"},children:[e>0?"▲":"▼"," ",Math.abs(e)]})}var m=[{title:"Date",dataIndex:"timestamp",key:"timestamp",width:170,render:function(e){return new Date(e).toLocaleString()}},{title:"Score",dataIndex:"score",key:"score",width:80,sorter:function(e,n){return e.score-n.score}},{title:"Grade",dataIndex:"grade",key:"grade",width:70,render:function(e){return(0,l.jsx)(r.UITag,{color:I(e),children:e})}},{title:"Architecture",key:"arch",width:110,render:function(e,n){return(0,l.jsxs)(r.UISpace,{size:4,children:[(0,l.jsx)(r.UITag,{color:I(n.dimensions.architecture.grade),style:{fontSize:11},children:n.dimensions.architecture.grade}),(0,l.jsx)("span",{style:{fontSize:11,color:"#8c8c8c"},children:n.dimensions.architecture.score})]})}},{title:"TypeScript",key:"ts",width:110,render:function(e,n){return(0,l.jsxs)(r.UISpace,{size:4,children:[(0,l.jsx)(r.UITag,{color:I(n.dimensions.typescript.grade),style:{fontSize:11},children:n.dimensions.typescript.grade}),(0,l.jsx)("span",{style:{fontSize:11,color:"#8c8c8c"},children:n.dimensions.typescript.score})]})}},{title:"Dead Code",key:"dc",width:110,render:function(e,n){return(0,l.jsxs)(r.UISpace,{size:4,children:[(0,l.jsx)(r.UITag,{color:I(n.dimensions.deadCode.grade),style:{fontSize:11},children:n.dimensions.deadCode.grade}),(0,l.jsx)("span",{style:{fontSize:11,color:"#8c8c8c"},children:n.dimensions.deadCode.score})]})}},{title:"Violations",key:"violations",width:95,render:function(e,n){return(0,l.jsx)("span",{style:{color:n.counters.layeringViolations>0?"#ff4d4f":"#52c41a"},children:n.counters.layeringViolations})}},{title:"Any",key:"any",width:70,render:function(e,n){return n.counters.anyCount}},{title:"Unused",key:"unused",width:80,render:function(e,n){return n.counters.unusedFiles}},{title:"Branch",key:"branch",width:120,ellipsis:!0,render:function(e,n){return(0,l.jsx)("code",{style:{fontSize:11},children:n.git.branch||"—"})}},{title:"Commit",key:"commit",width:90,render:function(e,n){return(0,l.jsx)("code",{style:{fontSize:11},children:n.git.commit?n.git.commit.slice(0,7):"—"})}}];function v(){var e,n=(0,a.useData)("/v1/plugins/quality/history"),t=n.data,i=n.isLoading,s=n.refetch,o=(0,a.useMutateData)("/v1/plugins/quality/snapshot"),c=(0,a.useNotification)();if(i)return(0,l.jsx)(r.UISkeleton,{active:!0,lines:8,style:{padding:"24px 0"}});var d=null!=(e=null==t?void 0:t.snapshots)?e:[],u=null==t?void 0:t.delta,h=u&&Object.values(u).some(function(e){return 0!==e});return(0,l.jsxs)("div",{children:[u&&(0,l.jsx)(r.UICard,{title:"Changes since last snapshot",style:{marginBottom:24},children:h?(0,l.jsxs)("div",{style:{display:"flex",gap:32,flexWrap:"wrap"},children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"Score "}),j(u.score,!1)]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"Violations "}),j(u.layeringViolations)]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"Any count "}),j(u.anyCount)]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"Ts-ignore "}),j(u.tsIgnoreCount)]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"Unused files "}),j(u.unusedFiles)]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"Unused deps "}),j(u.unusedDeps)]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{style:{color:"#8c8c8c"},children:"Avg instability "}),j(parseFloat(u.avgInstability.toFixed(2)))]})]}):(0,l.jsx)("span",{style:{color:"#8c8c8c",fontSize:13},children:"No changes since last snapshot"})}),(0,l.jsx)(r.UICard,{title:"Snapshot History (".concat(d.length,")"),extra:(0,l.jsx)(r.UIButton,{size:"small",icon:(0,l.jsx)(r.UIIcon,{name:"CameraOutlined"}),loading:o.isLoading,onClick:function(){o.mutate({},{onSuccess:function(){c.success("Snapshot saved"),s()},onError:function(e){var n;c.error("Failed: ".concat((null!=(n=Error)&&"u">typeof Symbol&&n[Symbol.hasInstance]?!!n[Symbol.hasInstance](e):e instanceof n)?e.message:String(e)))}})},children:"Save Snapshot"}),children:0===d.length?(0,l.jsx)(r.UIAlert,{variant:"info",showIcon:!0,icon:(0,l.jsx)(r.UIIcon,{name:"InfoCircleOutlined"}),message:"No snapshots yet",description:'Run "kb quality snapshot" or click "Save Snapshot" to start tracking trends.'}):(0,l.jsx)(r.UITable,{dataSource:d.slice().reverse(),columns:m,rowKey:"id",size:"small",pagination:{pageSize:20},scroll:{x:1200}})})]})}function U(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,l=Array(n);t<n;t++)l[t]=e[t];return l}function k(){var e,n,t,s,o=function(e){if(Array.isArray(e))return e}(e=i.useState())||function(e){var n,t,l=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var i=[],r=!0,a=!1;try{for(l=l.call(e);!(r=(n=l.next()).done)&&(i.push(n.value),2!==i.length);r=!0);}catch(e){a=!0,t=e}finally{try{r||null==l.return||l.return()}finally{if(a)throw t}}return i}}(e)||function(e){if(e){if("string"==typeof e)return U(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return U(e,2)}}(e)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),c=o[0],d=o[1],u=c?"/v1/plugins/quality/build-order?package=".concat(encodeURIComponent(c)):"/v1/plugins/quality/build-order",h=(0,a.useData)(u),p=h.data,x=h.isLoading,g=h.isError;if((0,a.useData)("/v1/plugins/quality/cycles").data,x)return(0,l.jsx)(r.UISkeleton,{active:!0,lines:6,style:{padding:"24px 0"}});if(g)return(0,l.jsx)(r.UIAlert,{message:"Failed to load build order",variant:"error",showIcon:!0});var y=[{title:"Layer",dataIndex:"layer",key:"layer",width:100,render:function(e){return(0,l.jsxs)(r.UITag,{color:"blue",children:["Layer ",e]})}},{title:"Packages (can build in parallel)",dataIndex:"packages",key:"packages",render:function(e){return(0,l.jsx)(r.UISpace,{wrap:!0,children:e.map(function(e){return(0,l.jsx)(r.UITag,{children:e},e)})})}}],f=null==p?void 0:p.layers.map(function(e,n){return{layer:n+1,packages:e,key:n}});return(0,l.jsxs)("div",{children:[(null==p?void 0:p.hasCircular)&&(0,l.jsx)(r.UIAlert,{message:"Circular Dependencies Detected!",description:"Found ".concat(p.circular.length," circular dependency cycles. Build order may not be correct."),variant:"error",showIcon:!0,style:{marginBottom:24}}),(0,l.jsx)(r.UICard,{title:"Filter",style:{marginBottom:24},children:(0,l.jsx)(r.UISelect,{style:{width:400},placeholder:"Select package to see its build dependencies",value:c,onChange:function(e){return d(e)},allowClear:!0,showSearch:!0,options:null!=(n=null==p?void 0:p.sorted.map(function(e){return{label:e,value:e}}))?n:[]})}),(0,l.jsx)(r.UICard,{title:"Build Layers (".concat(null!=(t=null==p?void 0:p.layerCount)?t:0," layers, ").concat(null!=(s=null==p?void 0:p.packageCount)?s:0," packages)"),style:{marginBottom:24},children:(0,l.jsx)(r.UITable,{dataSource:null!=f?f:[],columns:y,pagination:!1,expandable:{expandedRowRender:function(e){return(0,l.jsxs)("div",{style:{padding:"8px 0"},children:[(0,l.jsx)("strong",{children:"Packages in this layer:"}),(0,l.jsx)("div",{style:{marginTop:8},children:e.packages.map(function(e){return(0,l.jsx)(r.UITag,{style:{marginBottom:4},children:e},e)})})]})}}})}),(null==p?void 0:p.hasCircular)&&(0,l.jsx)(r.UICard,{title:"Circular Dependencies (".concat(p.circular.length,")"),children:p.circular.map(function(e,n){return(0,l.jsx)(r.UIAlert,{message:"Cycle ".concat(n+1),description:e.join(" → "),variant:"warning",showIcon:!0,style:{marginBottom:12}},n)})})]})}function S(){var e=(0,l.jsx)(r.UITabs,{syncUrl:"search",items:[{key:"overview",label:"Overview",children:(0,l.jsx)(d,{})},{key:"architecture",label:"Architecture",children:(0,l.jsx)(p,{})},{key:"debt",label:"Debt",children:(0,l.jsx)(f,{})},{key:"history",label:"History",children:(0,l.jsx)(v,{})},{key:"build-order",label:"Build Order",children:(0,l.jsx)(k,{})}]});return(0,l.jsx)(r.UIPage,{children:(0,l.jsx)(r.UIPageHeader,{title:"Quality",description:"Code health, architecture analysis, and trend tracking",tabs:e})})}}}]);
|
|
2
2
|
//# sourceMappingURL=__federation_expose_QualityOverview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"__federation_expose_QualityOverview.js","sources":["webpack://@kb-labs/quality-entry/../../../node_modules/.pnpm/react@19.2.5/node_modules/react/cjs/react-jsx-runtime.production.js","webpack://@kb-labs/quality-entry/../../../node_modules/.pnpm/react@19.2.5/node_modules/react/jsx-runtime.js","webpack://@kb-labs/quality-entry/./src/studio/components/OverviewTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/components/DependenciesTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/components/BuildOrderTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/components/GraphTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/components/StaleTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/pages/QualityOverview.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * Overview tab - shows health score, stats, and key metrics\n */\n\nimport * as React from 'react';\nimport { useData, UIRow, UICol, UICard, UIStatistic, UIProgress, UITag, UIAlert, UISpin, UIButton, UISpace, UIIcon } from '@kb-labs/sdk/studio';\nimport type { StatsResponse, HealthResponse, StaleResponse } from '@kb-labs/quality-contracts';\n\nexport function OverviewTab() {\n const { data: statsData, isLoading: statsLoading } = useData<StatsResponse>(\n '/v1/plugins/quality/stats?includeHealth=true',\n );\n const { data: healthData, isLoading: healthLoading } = useData<HealthResponse>(\n '/v1/plugins/quality/health?detailed=true',\n );\n const { data: staleData, isLoading: staleLoading } = useData<StaleResponse>(\n '/v1/plugins/quality/stale?detailed=true',\n );\n\n const isLoading = statsLoading || healthLoading;\n\n if (isLoading) {\n return (\n <div style={{ textAlign: 'center', padding: '40px' }}>\n <UISpin size=\"large\" />\n </div>\n );\n }\n\n const getGradeColor = (grade?: string): string => {\n switch (grade) {\n case 'A': return 'green';\n case 'B': return 'blue';\n case 'C': return 'orange';\n case 'D': return 'red';\n case 'F': return 'volcano';\n default: return 'default';\n }\n };\n\n const getHealthStatus = (score?: number): 'success' | 'exception' | 'normal' => {\n if (!score) {return 'normal';}\n if (score >= 80) {return 'success';}\n if (score < 60) {return 'exception';}\n return 'normal';\n };\n\n const getSeverityVariant = (severity: number): 'error' | 'warning' | 'info' => {\n if (severity >= 3) {return 'error';}\n if (severity >= 2) {return 'warning';}\n return 'info';\n };\n\n return (\n <div>\n {/* Stale Packages Alert */}\n {!staleLoading && staleData && staleData.totalStale > 0 && (\n <UIAlert\n variant=\"error\"\n showIcon\n icon={<UIIcon name=\"ClockCircleOutlined\" />}\n message={`${staleData.totalStale} stale package${staleData.totalStale > 1 ? 's' : ''} detected`}\n description={\n <div>\n <p style={{ marginBottom: 8 }}>\n Some packages need rebuilding. This affects {staleData.totalAffected} downstream\n package{staleData.totalAffected > 1 ? 's' : ''}.\n </p>\n {staleData.criticalChains && staleData.criticalChains.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <strong>Critical chains:</strong>\n <ul style={{ marginTop: 4, marginBottom: 0 }}>\n {staleData.criticalChains.slice(0, 3).map((chain, idx) => (\n <li key={idx}>\n <code>{chain.root}</code> affects {chain.affected.length} packages\n </li>\n ))}\n </ul>\n </div>\n )}\n <UISpace>\n <UIButton variant=\"primary\" danger icon={<UIIcon name=\"ThunderboltOutlined\" />} size=\"small\">\n Rebuild All Stale\n </UIButton>\n <UIButton size=\"small\">View Details</UIButton>\n </UISpace>\n </div>\n }\n style={{ marginBottom: 24 }}\n />\n )}\n\n {/* Health Score Card */}\n <UICard title=\"Health Score\" style={{ marginBottom: 24 }}>\n <UIRow gutter={24}>\n <UICol span={12}>\n <div style={{ textAlign: 'center' }}>\n <UIProgress\n type=\"circle\"\n percent={healthData?.score ?? 0}\n size={180}\n status={getHealthStatus(healthData?.score)}\n strokeColor={{\n '0%': healthData?.score && healthData.score >= 80 ? '#52c41a' : '#ff4d4f',\n '100%': healthData?.score && healthData.score >= 80 ? '#73d13d' : '#ff7a45',\n }}\n />\n <div style={{ marginTop: 16 }}>\n <UITag color={getGradeColor(healthData?.grade)} style={{ fontSize: 16 }}>\n Grade {healthData?.grade}\n </UITag>\n </div>\n </div>\n </UICol>\n <UICol span={12}>\n <UIStatistic\n title=\"Packages\"\n value={statsData?.packages ?? 0}\n prefix={<UIIcon name=\"DatabaseOutlined\" />}\n />\n <UIStatistic\n title=\"Lines of Code\"\n value={statsData?.loc ?? 0}\n prefix={<UIIcon name=\"CodeOutlined\" />}\n style={{ marginTop: 16 }}\n />\n <UIStatistic\n title=\"Total Size\"\n value={statsData?.size ?? 'N/A'}\n prefix={<UIIcon name=\"FileTextOutlined\" />}\n style={{ marginTop: 16 }}\n />\n </UICol>\n </UIRow>\n </UICard>\n\n {/* Issues Breakdown */}\n {healthData?.issues && healthData.issues.length > 0 && (\n <UICard title=\"Health Issues\" style={{ marginBottom: 24 }}>\n <UIRow gutter={16}>\n {healthData.issues.map((issue, idx) => (\n <UICol span={24} key={idx} style={{ marginBottom: 12 }}>\n <UIAlert\n message={\n <UISpace>\n <span>{issue.description}</span>\n <UITag color={getSeverityVariant(issue.severity) === 'error' ? 'red' : 'orange'}>\n severity: {issue.severity}\n </UITag>\n {issue.count !== undefined && <UITag>{issue.count} affected</UITag>}\n </UISpace>\n }\n variant={getSeverityVariant(issue.severity)}\n showIcon\n icon={\n getSeverityVariant(issue.severity) === 'error' ? (\n <UIIcon name=\"WarningOutlined\" />\n ) : (\n <UIIcon name=\"CheckCircleOutlined\" />\n )\n }\n />\n </UICol>\n ))}\n </UIRow>\n </UICard>\n )}\n\n {/* Quick Stats */}\n <UIRow gutter={16}>\n <UICol span={8}>\n <UICard>\n <UIStatistic\n title=\"Packages\"\n value={statsData?.packages ?? 0}\n prefix={<UIIcon name=\"DatabaseOutlined\" />}\n />\n </UICard>\n </UICol>\n <UICol span={8}>\n <UICard>\n <UIStatistic\n title=\"Lines of Code\"\n value={statsData?.loc ?? 0}\n prefix={<UIIcon name=\"CodeOutlined\" />}\n />\n </UICard>\n </UICol>\n <UICol span={8}>\n <UICard>\n <UIStatistic\n title=\"Total Size\"\n value={statsData?.size ?? 'N/A'}\n prefix={<UIIcon name=\"FileTextOutlined\" />}\n />\n </UICard>\n </UICol>\n </UIRow>\n </div>\n );\n}\n","/**\n * Dependencies tab - shows duplicates, unused, and missing dependencies\n */\n\nimport * as React from 'react';\nimport { useData, UICard, UITable, UITag, UISpin, UIAlert } from '@kb-labs/sdk/studio';\nimport type { UITableColumn } from '@kb-labs/sdk/studio';\nimport type {\n DependenciesResponse,\n DuplicateDependency,\n VersionInfo,\n UnusedDependency,\n MissingDependency,\n} from '@kb-labs/quality-contracts';\n\nexport function DependenciesTab() {\n const { data, isLoading, isError } = useData<DependenciesResponse>(\n '/v1/plugins/quality/dependencies',\n );\n\n if (isLoading) {\n return (\n <div style={{ textAlign: 'center', padding: '40px' }}>\n <UISpin size=\"large\" />\n </div>\n );\n }\n\n if (isError) {\n return <UIAlert message=\"Failed to load dependencies\" variant=\"error\" showIcon />;\n }\n\n const duplicatesColumns: UITableColumn<DuplicateDependency>[] = [\n {\n title: 'Dependency',\n dataIndex: 'name',\n key: 'name',\n sorter: (a, b) => a.name.localeCompare(b.name),\n },\n {\n title: 'Versions',\n dataIndex: 'versions',\n key: 'versions',\n render: (versions: VersionInfo[]) => (\n <>\n {versions.map((v) => (\n <UITag key={v.version} color=\"orange\">\n {v.version} ({v.count})\n </UITag>\n ))}\n </>\n ),\n },\n {\n title: 'Total Packages',\n dataIndex: 'totalPackages',\n key: 'totalPackages',\n sorter: (a, b) => a.totalPackages - b.totalPackages,\n },\n ];\n\n const unusedColumns: UITableColumn<UnusedDependency>[] = [\n {\n title: 'Dependency',\n dataIndex: 'name',\n key: 'name',\n sorter: (a, b) => a.name.localeCompare(b.name),\n },\n {\n title: 'Packages',\n dataIndex: 'packages',\n key: 'packages',\n render: (packages: string[]) => packages.join(', '),\n },\n ];\n\n const missingColumns: UITableColumn<MissingDependency>[] = [\n {\n title: 'Dependency',\n dataIndex: 'name',\n key: 'name',\n sorter: (a, b) => a.name.localeCompare(b.name),\n },\n {\n title: 'Packages',\n dataIndex: 'packages',\n key: 'packages',\n render: (packages: string[]) => packages.join(', '),\n },\n {\n title: 'Imported In',\n dataIndex: 'importedIn',\n key: 'importedIn',\n render: (files: string[]) => files.join(', '),\n },\n ];\n\n return (\n <div>\n {data && data.totalIssues === 0 && (\n <UIAlert\n message=\"No dependency issues found!\"\n description=\"Your monorepo has no duplicate, unused, or missing dependencies.\"\n variant=\"success\"\n showIcon\n style={{ marginBottom: 24 }}\n />\n )}\n\n {/* Duplicates */}\n <UICard\n title={`Duplicate Dependencies (${data?.duplicates?.length ?? 0})`}\n style={{ marginBottom: 24 }}\n >\n <UITable\n dataSource={data?.duplicates ?? []}\n columns={duplicatesColumns}\n rowKey=\"name\"\n pagination={{ pageSize: 10 }}\n />\n </UICard>\n\n {/* Unused */}\n <UICard\n title={`Unused Dependencies (${data?.unused?.length ?? 0})`}\n style={{ marginBottom: 24 }}\n >\n <UITable\n dataSource={data?.unused ?? []}\n columns={unusedColumns}\n rowKey=\"name\"\n pagination={{ pageSize: 10 }}\n />\n </UICard>\n\n {/* Missing */}\n <UICard title={`Missing Dependencies (${data?.missing?.length ?? 0})`}>\n <UITable\n dataSource={data?.missing ?? []}\n columns={missingColumns}\n rowKey=\"name\"\n pagination={{ pageSize: 10 }}\n />\n </UICard>\n </div>\n );\n}\n","/**\n * Build Order tab - shows parallel build layers and sequential order\n */\n\nimport * as React from 'react';\nimport { useData, UICard, UITable, UITag, UISpin, UIAlert, UISelect, UISpace } from '@kb-labs/sdk/studio';\nimport type { UITableColumn } from '@kb-labs/sdk/studio';\nimport type { BuildOrderResponse, CyclesResponse } from '@kb-labs/quality-contracts';\n\nexport function BuildOrderTab() {\n const [selectedPackage, setSelectedPackage] = React.useState<string | undefined>();\n\n const buildOrderUrl = selectedPackage\n ? `/v1/plugins/quality/build-order?package=${encodeURIComponent(selectedPackage)}`\n : '/v1/plugins/quality/build-order';\n\n const { data, isLoading, isError } = useData<BuildOrderResponse>(buildOrderUrl);\n const { data: cyclesData } = useData<CyclesResponse>('/v1/plugins/quality/cycles');\n\n if (isLoading) {\n return (\n <div style={{ textAlign: 'center', padding: '40px' }}>\n <UISpin size=\"large\" />\n </div>\n );\n }\n\n if (isError) {\n return <UIAlert message=\"Failed to load build order\" variant=\"error\" showIcon />;\n }\n\n const layersColumns: UITableColumn<{ layer: number; packages: string[]; key: number }>[] = [\n {\n title: 'Layer',\n dataIndex: 'layer',\n key: 'layer',\n width: 100,\n render: (layer: number) => <UITag color=\"blue\">Layer {layer}</UITag>,\n },\n {\n title: 'Packages (can build in parallel)',\n dataIndex: 'packages',\n key: 'packages',\n render: (packages: string[]) => (\n <UISpace wrap>\n {packages.map((pkg) => (\n <UITag key={pkg}>{pkg}</UITag>\n ))}\n </UISpace>\n ),\n },\n ];\n\n const layersData = data?.layers.map((layer, idx) => ({\n layer: idx + 1,\n packages: layer,\n key: idx,\n }));\n\n return (\n <div>\n {/* Circular Dependencies Warning */}\n {data?.hasCircular && (\n <UIAlert\n message=\"Circular Dependencies Detected!\"\n description={`Found ${data.circular.length} circular dependency cycles. Build order may not be correct.`}\n variant=\"error\"\n showIcon\n style={{ marginBottom: 24 }}\n />\n )}\n\n {/* Package Filter */}\n <UICard title=\"Filter\" style={{ marginBottom: 24 }}>\n <UISelect\n style={{ width: 400 }}\n placeholder=\"Select package to see its build dependencies\"\n value={selectedPackage}\n onChange={(val) => setSelectedPackage(val as string | undefined)}\n allowClear\n showSearch\n options={data?.sorted.map((pkg) => ({\n label: pkg,\n value: pkg,\n })) ?? []}\n />\n </UICard>\n\n {/* Build Layers */}\n <UICard\n title={`Build Layers (${data?.layerCount ?? 0} layers, ${data?.packageCount ?? 0} packages)`}\n style={{ marginBottom: 24 }}\n >\n <UITable\n dataSource={layersData ?? []}\n columns={layersColumns}\n pagination={false}\n expandable={{\n expandedRowRender: (record) => (\n <div style={{ padding: '8px 0' }}>\n <strong>Packages in this layer:</strong>\n <div style={{ marginTop: 8 }}>\n {record.packages.map((pkg) => (\n <UITag key={pkg} style={{ marginBottom: 4 }}>\n {pkg}\n </UITag>\n ))}\n </div>\n </div>\n ),\n }}\n />\n </UICard>\n\n {/* Circular Dependencies */}\n {data?.hasCircular && (\n <UICard title={`Circular Dependencies (${data.circular.length})`}>\n {data.circular.map((cycle, idx) => (\n <UIAlert\n key={idx}\n message={`Cycle ${idx + 1}`}\n description={cycle.join(' → ')}\n variant=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n />\n ))}\n </UICard>\n )}\n </div>\n );\n}\n","/**\n * Dependency Graph tab - visualizes package dependencies\n */\n\nimport * as React from 'react';\nimport type { DataNode } from 'antd/es/tree';\nimport { useData, UICard, UISelect, UISpin, UIAlert, UITree, UIRow, UICol, UIStatistic } from '@kb-labs/sdk/studio';\nimport type { GraphResponse, BuildOrderResponse, GraphMode, GraphNode } from '@kb-labs/quality-contracts';\n\nexport function GraphTab() {\n const [mode, setMode] = React.useState<GraphMode>('stats');\n const [selectedPackage, setSelectedPackage] = React.useState<string | undefined>();\n\n const { data: buildOrderData } = useData<BuildOrderResponse>('/v1/plugins/quality/build-order');\n\n // Auto-select first package when switching to modes that require packageName\n React.useEffect(() => {\n if ((mode === 'reverse' || mode === 'impact') && !selectedPackage && buildOrderData?.sorted?.[0]) {\n setSelectedPackage(buildOrderData.sorted[0]);\n }\n }, [mode, selectedPackage, buildOrderData]);\n\n const graphUrl = selectedPackage\n ? `/v1/plugins/quality/graph?mode=${mode}&package=${encodeURIComponent(selectedPackage)}`\n : `/v1/plugins/quality/graph?mode=${mode}`;\n\n const { data, isLoading, isError } = useData<GraphResponse>(graphUrl);\n\n if (isLoading) {\n return (\n <div style={{ textAlign: 'center', padding: '40px' }}>\n <UISpin size=\"large\" />\n </div>\n );\n }\n\n if (isError) {\n return <UIAlert message=\"Failed to load graph\" variant=\"error\" showIcon />;\n }\n\n const convertToTreeData = (node: GraphNode, path: string = ''): DataNode => {\n const key = path ? `${path}/${node.name}` : node.name;\n return {\n title: node.name,\n key,\n children: node.children?.map((child) => convertToTreeData(child, key)),\n };\n };\n\n const renderTreeMode = () => {\n if (!data?.tree) {\n return <UIAlert message=\"No tree data available\" variant=\"info\" />;\n }\n return (\n <UITree\n treeData={[convertToTreeData(data.tree)]}\n showLine\n defaultExpandedKeys={[data.tree.name]}\n />\n );\n };\n\n const renderPackagesMode = () => {\n if (!data?.packages || data.packages.length === 0) {\n return <UIAlert message=\"No packages found\" variant=\"info\" />;\n }\n return (\n <ul>\n {data.packages.map((pkg) => (\n <li key={pkg}>{pkg}</li>\n ))}\n </ul>\n );\n };\n\n const renderStatsMode = () => {\n if (!data?.stats) {\n return <UIAlert message=\"No stats available\" variant=\"info\" />;\n }\n return (\n <div>\n <UIRow gutter={16} style={{ marginBottom: 24 }}>\n <UICol span={8}>\n <UICard>\n <UIStatistic title=\"Total Packages\" value={data.stats.totalPackages} />\n </UICard>\n </UICol>\n <UICol span={8}>\n <UICard>\n <UIStatistic title=\"Max Depth\" value={data.stats.maxDepth} />\n </UICard>\n </UICol>\n <UICol span={8}>\n <UICard>\n <UIStatistic\n title=\"Avg Dependencies\"\n value={data.stats.avgDependencies}\n precision={1}\n />\n </UICard>\n </UICol>\n </UIRow>\n {data.stats.mostDepended && data.stats.mostDepended.length > 0 && (\n <UICard title=\"Most Depended On\">\n <ul>\n {data.stats.mostDepended.map((item) => (\n <li key={item.name}>\n <strong>{item.name}</strong> - {item.count} packages depend on it\n </li>\n ))}\n </ul>\n </UICard>\n )}\n </div>\n );\n };\n\n return (\n <div>\n {/* Controls */}\n <UICard title=\"Visualization Options\" style={{ marginBottom: 24 }}>\n <UIRow gutter={16}>\n <UICol span={12}>\n <label>Mode:</label>\n <UISelect\n style={{ width: '100%', marginTop: 8 }}\n value={mode}\n onChange={(val) => setMode(val as GraphMode)}\n options={[\n { label: 'Dependency Tree', value: 'tree' },\n { label: 'Reverse Dependencies', value: 'reverse' },\n { label: 'Impact Analysis', value: 'impact' },\n { label: 'Statistics', value: 'stats' },\n ]}\n />\n </UICol>\n {mode !== 'stats' && (\n <UICol span={12}>\n <label>Package{mode === 'tree' ? ' (optional)' : ''}:</label>\n <UISelect\n style={{ width: '100%', marginTop: 8 }}\n placeholder={mode === 'tree' ? 'All packages' : 'Select a package'}\n value={selectedPackage}\n onChange={(val) => setSelectedPackage(val as string | undefined)}\n allowClear\n showSearch\n options={buildOrderData?.sorted?.map((pkg) => ({ label: pkg, value: pkg })) ?? []}\n />\n </UICol>\n )}\n </UIRow>\n </UICard>\n\n {/* Visualization */}\n <UICard title={`${mode.charAt(0).toUpperCase() + mode.slice(1)} View`}>\n {mode === 'tree' && renderTreeMode()}\n {(mode === 'reverse' || mode === 'impact') && renderPackagesMode()}\n {mode === 'stats' && renderStatsMode()}\n </UICard>\n </div>\n );\n}\n","/**\n * Stale Packages tab - shows packages that need rebuilding\n */\n\nimport * as React from 'react';\nimport { useData, UICard, UITable, UITag, UISpin, UIAlert, UISpace, UIButton, UITypographyText, UIIcon } from '@kb-labs/sdk/studio';\nimport type { UITableColumn } from '@kb-labs/sdk/studio';\nimport type { StaleResponse, StalePackage, StaleChain } from '@kb-labs/quality-contracts';\n\nconst Text = UITypographyText;\n\nexport function StaleTab() {\n const { data, isLoading, isError } = useData<StaleResponse>(\n '/v1/plugins/quality/stale?detailed=true',\n );\n\n if (isLoading) {\n return (\n <div style={{ textAlign: 'center', padding: '40px' }}>\n <UISpin size=\"large\" />\n </div>\n );\n }\n\n if (isError) {\n return <UIAlert message=\"Failed to load stale packages\" variant=\"error\" showIcon />;\n }\n\n const getSeverityColor = (severity: string): string => {\n switch (severity) {\n case 'critical': return 'red';\n case 'high': return 'orange';\n case 'medium': return 'gold';\n case 'low': return 'blue';\n default: return 'default';\n }\n };\n\n const getReasonText = (reason: string): string => {\n switch (reason) {\n case 'source-newer': return 'Source Modified';\n case 'dependency-rebuilt': return 'Dependency Rebuilt';\n case 'missing-dist': return 'Missing Build';\n default: return reason;\n }\n };\n\n const getReasonColor = (reason: string): string => {\n switch (reason) {\n case 'source-newer': return 'orange';\n case 'dependency-rebuilt': return 'blue';\n case 'missing-dist': return 'red';\n default: return 'default';\n }\n };\n\n const staleColumns: UITableColumn<StalePackage>[] = [\n {\n title: 'Package',\n dataIndex: 'name',\n key: 'name',\n sorter: (a, b) => a.name.localeCompare(b.name),\n render: (name: string) => <code>{name}</code>,\n },\n {\n title: 'Reason',\n dataIndex: 'reason',\n key: 'reason',\n filters: [\n { text: 'Source Modified', value: 'source-newer' },\n { text: 'Dependency Rebuilt', value: 'dependency-rebuilt' },\n { text: 'Missing Build', value: 'missing-dist' },\n ],\n onFilter: (value, record) => record.reason === value,\n render: (reason: string) => (\n <UITag color={getReasonColor(reason)}>{getReasonText(reason)}</UITag>\n ),\n },\n {\n title: 'Severity',\n dataIndex: 'severity',\n key: 'severity',\n sorter: (a, b) => {\n const order = ['critical', 'high', 'medium', 'low'];\n return order.indexOf(a.severity) - order.indexOf(b.severity);\n },\n filters: [\n { text: 'Critical', value: 'critical' },\n { text: 'High', value: 'high' },\n { text: 'Medium', value: 'medium' },\n { text: 'Low', value: 'low' },\n ],\n onFilter: (value, record) => record.severity === value,\n render: (severity: string) => (\n <UITag color={getSeverityColor(severity)}>{severity.toUpperCase()}</UITag>\n ),\n },\n {\n title: 'Affected',\n dataIndex: 'affectedCount',\n key: 'affectedCount',\n sorter: (a, b) => a.affectedCount - b.affectedCount,\n render: (count: number) => (\n <Text type={count > 10 ? 'danger' : count > 5 ? 'warning' : 'secondary'}>\n {count} package{count !== 1 ? 's' : ''}\n </Text>\n ),\n },\n {\n title: 'Modified',\n key: 'modified',\n render: (_, record) => {\n if (record.sourceModified) {\n return (\n <UISpace direction=\"vertical\" size={0}>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n Source: {new Date(record.sourceModified).toLocaleString()}\n </Text>\n {record.distModified && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n Dist: {new Date(record.distModified).toLocaleString()}\n </Text>\n )}\n </UISpace>\n );\n }\n return <Text type=\"secondary\">-</Text>;\n },\n },\n ];\n\n const chainColumns: UITableColumn<StaleChain>[] = [\n {\n title: 'Root Package',\n dataIndex: 'root',\n key: 'root',\n render: (root: string) => <code>{root}</code>,\n },\n {\n title: 'Depth',\n dataIndex: 'depth',\n key: 'depth',\n sorter: (a, b) => a.depth - b.depth,\n render: (depth: number) => (\n <UITag color={depth > 5 ? 'red' : depth > 3 ? 'orange' : 'blue'}>{depth} levels</UITag>\n ),\n },\n {\n title: 'Affected Packages',\n dataIndex: 'affected',\n key: 'affected',\n sorter: (a, b) => a.affected.length - b.affected.length,\n render: (affected: string[]) => (\n <Text type={affected.length > 20 ? 'danger' : 'secondary'}>\n {affected.length} package{affected.length !== 1 ? 's' : ''}\n </Text>\n ),\n },\n ];\n\n return (\n <div>\n {/* Summary Alert */}\n {data && data.totalStale > 0 ? (\n <UIAlert\n variant=\"error\"\n showIcon\n icon={<UIIcon name=\"ClockCircleOutlined\" />}\n message={\n <UISpace>\n <strong>\n {data.totalStale} stale package{data.totalStale > 1 ? 's' : ''} detected\n </strong>\n <Text type=\"secondary\">\n affecting {data.totalAffected} downstream package{data.totalAffected > 1 ? 's' : ''}\n </Text>\n </UISpace>\n }\n action={\n <UISpace>\n <UIButton variant=\"primary\" danger icon={<UIIcon name=\"ThunderboltOutlined\" />} size=\"small\">\n Rebuild All\n </UIButton>\n <UIButton size=\"small\">Export Report</UIButton>\n </UISpace>\n }\n style={{ marginBottom: 24 }}\n />\n ) : (\n <UIAlert\n variant=\"success\"\n showIcon\n message=\"All packages are up to date\"\n description=\"No stale packages detected. Your monorepo build state is healthy.\"\n style={{ marginBottom: 24 }}\n />\n )}\n\n {/* Critical Chains */}\n {data?.criticalChains && data.criticalChains.length > 0 && (\n <UICard\n title={\n <UISpace>\n <UIIcon name=\"WarningOutlined\" style={{ color: '#ff4d4f' }} />\n Critical Rebuild Chains\n </UISpace>\n }\n style={{ marginBottom: 24 }}\n >\n <UIAlert\n variant=\"warning\"\n showIcon\n message=\"High-impact stale packages\"\n description=\"These packages affect many downstream packages. Rebuilding them will trigger cascading rebuilds.\"\n style={{ marginBottom: 16 }}\n />\n <UITable\n dataSource={data.criticalChains}\n columns={chainColumns}\n rowKey=\"root\"\n pagination={{ pageSize: 5 }}\n />\n </UICard>\n )}\n\n {/* Stale Packages Table */}\n <UICard\n title={\n <UISpace>\n <UIIcon name=\"FileOutlined\" />\n Stale Packages\n </UISpace>\n }\n >\n <UITable\n dataSource={data?.stalePackages ?? []}\n columns={staleColumns}\n rowKey=\"name\"\n pagination={{ pageSize: 20 }}\n expandable={{\n expandedRowRender: (record) => (\n <div style={{ padding: '8px 16px' }}>\n <UISpace direction=\"vertical\" size={8} style={{ width: '100%' }}>\n <div>\n <Text strong>Path: </Text>\n <Text type=\"secondary\" code>\n {record.path}\n </Text>\n </div>\n {record.affectedPackages && record.affectedPackages.length > 0 && (\n <div>\n <Text strong>Affected Packages ({record.affectedPackages.length}):</Text>\n <div style={{ marginTop: 8 }}>\n {record.affectedPackages.slice(0, 10).map((pkg: string) => (\n <UITag key={pkg} style={{ marginBottom: 4 }}>\n {pkg}\n </UITag>\n ))}\n {record.affectedPackages.length > 10 && (\n <UITag>+{record.affectedPackages.length - 10} more</UITag>\n )}\n </div>\n </div>\n )}\n </UISpace>\n </div>\n ),\n }}\n />\n </UICard>\n </div>\n );\n}\n","/**\n * QualityOverview — main Quality plugin page (Module Federation widget).\n * Tabbed view: Overview / Dependencies / Build Order / Graph / Stale Packages\n */\n\nimport * as React from 'react';\nimport { UIPage, UIPageHeader, UITabs } from '@kb-labs/sdk/studio';\nimport { OverviewTab } from '../components/OverviewTab';\nimport { DependenciesTab } from '../components/DependenciesTab';\nimport { BuildOrderTab } from '../components/BuildOrderTab';\nimport { GraphTab } from '../components/GraphTab';\nimport { StaleTab } from '../components/StaleTab';\n\nexport default function QualityOverview() {\n const tabs = (\n <UITabs\n syncUrl=\"search\"\n items={[\n {\n key: 'overview',\n label: 'Overview',\n children: <OverviewTab />,\n },\n {\n key: 'dependencies',\n label: 'Dependencies',\n children: <DependenciesTab />,\n },\n {\n key: 'build-order',\n label: 'Build Order',\n children: <BuildOrderTab />,\n },\n {\n key: 'graph',\n label: 'Dependency Graph',\n children: <GraphTab />,\n },\n {\n key: 'stale',\n label: 'Stale Packages',\n children: <StaleTab />,\n },\n ]}\n />\n );\n\n return (\n <UIPage>\n <UIPageHeader\n title=\"Quality\"\n description=\"Monorepo health metrics, dependency analysis, and build order visualization\"\n tabs={tabs}\n />\n </UIPage>\n );\n}\n"],"names":["Symbol","OverviewTab","score","_useData","statsData","statsLoading","_useData1","healthData","healthLoading","_useData2","staleData","staleLoading","UISpin","getSeverityVariant","severity","UIAlert","UIIcon","chain","idx","UISpace","UIButton","UICard","UIRow","UICol","UIProgress","UITag","getGradeColor","grade","UIStatistic","issue","undefined","DependenciesTab","_data_duplicates","_data_unused","_data_missing","data","isLoading","isError","duplicatesColumns","sorter","a","b","render","versions","v","unusedColumns","packages","missingColumns","files","UITable","BuildOrderTab","_React_useState","selectedPackage","setSelectedPackage","buildOrderUrl","encodeURIComponent","layersColumns","layer","pkg","layersData","UISelect","onChange","val","expandedRowRender","record","cycle","GraphTab","_buildOrderData_sorted","mode","setMode","_React_useState1","buildOrderData","React","graphUrl","convertToTreeData","node","_node_children","path","key","child","UITree","item","Text","UITypographyText","StaleTab","getSeverityColor","getReasonText","reason","getReasonColor","staleColumns","name","onFilter","value","order","count","_","Date","chainColumns","root","depth","affected","QualityOverview","tabs","UITabs","UIPage","UIPageHeader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"__federation_expose_QualityOverview.js","sources":["webpack://@kb-labs/quality-entry/../../../node_modules/.pnpm/react@19.2.5/node_modules/react/cjs/react-jsx-runtime.production.js","webpack://@kb-labs/quality-entry/../../../node_modules/.pnpm/react@19.2.5/node_modules/react/jsx-runtime.js","webpack://@kb-labs/quality-entry/./src/studio/components/OverviewTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/components/ArchitectureTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/components/DebtTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/components/HistoryTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/components/BuildOrderTab.tsx","webpack://@kb-labs/quality-entry/./src/studio/pages/QualityOverview.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import * as React from 'react';\nimport {\n useData,\n UIRow,\n UICol,\n UICard,\n UIStatistic,\n UIProgress,\n UITag,\n UIAlert,\n UISkeleton,\n UISpace,\n UIIcon,\n} from '@kb-labs/sdk/studio';\nimport type { StatsResponse, HealthV2Response, HistoryResponse, DimensionScores } from '@kb-labs/quality-contracts';\n\nfunction gradeColor(grade?: string): string {\n switch (grade) {\n case 'A': return 'green';\n case 'B': return 'blue';\n case 'C': return 'orange';\n case 'D': return 'red';\n case 'F': return 'volcano';\n default: return 'default';\n }\n}\n\nfunction scoreStatus(score?: number): 'success' | 'exception' | 'normal' {\n if (!score) return 'normal';\n if (score >= 80) return 'success';\n if (score < 60) return 'exception';\n return 'normal';\n}\n\nfunction deltaLabel(value: number, invert = false): React.ReactNode {\n if (value === 0) return null;\n const positive = invert ? value < 0 : value > 0;\n const color = positive ? '#52c41a' : '#ff4d4f';\n const arrow = value > 0 ? '▲' : '▼';\n return <span style={{ color, fontSize: 12, marginLeft: 4 }}>{arrow} {Math.abs(value)}</span>;\n}\n\nconst DIMENSIONS: Array<{ key: keyof DimensionScores; label: string; icon: string }> = [\n { key: 'architecture', label: 'Architecture', icon: 'ApartmentOutlined' },\n { key: 'typescript', label: 'TypeScript', icon: 'CodeOutlined' },\n { key: 'deadCode', label: 'Dead Code', icon: 'DeleteOutlined' },\n { key: 'depHygiene', label: 'Dep Hygiene', icon: 'NodeIndexOutlined' },\n { key: 'testCoverage', label: 'Test Coverage', icon: 'CheckCircleOutlined' },\n];\n\nexport function OverviewTab() {\n const { data: statsData, isLoading: statsLoading } = useData<StatsResponse>('/v1/plugins/quality/stats');\n const { data: healthData, isLoading: healthLoading } = useData<HealthV2Response>('/v1/plugins/quality/health');\n const { data: historyData, isLoading: historyLoading } = useData<HistoryResponse>('/v1/plugins/quality/history');\n\n if (statsLoading || healthLoading || historyLoading) {\n return <UISkeleton active lines={8} style={{ padding: '24px 0' }} />;\n }\n\n const delta = historyData?.delta;\n const dimensions: DimensionScores | undefined = historyData?.latest?.dimensions ?? healthData?.dimensions;\n\n return (\n <div>\n {/* Health Score */}\n <UICard title=\"Health Score\" style={{ marginBottom: 24 }}>\n <UIRow gutter={32} align=\"middle\">\n <UICol span={8} style={{ textAlign: 'center' }}>\n <UIProgress\n type=\"circle\"\n percent={healthData?.score ?? 0}\n size={160}\n status={scoreStatus(healthData?.score)}\n />\n <div style={{ marginTop: 12 }}>\n <UITag color={gradeColor(healthData?.grade)} style={{ fontSize: 16, padding: '4px 12px' }}>\n Grade {healthData?.grade ?? '—'}\n </UITag>\n {delta && (\n <div style={{ marginTop: 8, color: '#8c8c8c', fontSize: 13 }}>\n {deltaLabel(delta.score)} vs previous snapshot\n </div>\n )}\n </div>\n </UICol>\n\n <UICol span={16}>\n <UIRow gutter={[16, 16]}>\n {DIMENSIONS.map(({ key, label, icon }) => {\n const dim = dimensions ? dimensions[key] : undefined;\n return (\n <UICol span={12} key={key}>\n <UICard size=\"small\" style={{ borderRadius: 8 }}>\n <UISpace>\n <UIIcon name={icon} />\n <span style={{ fontWeight: 500 }}>{label}</span>\n <UITag color={gradeColor(dim?.grade)}>{dim?.grade ?? '—'}</UITag>\n </UISpace>\n <UIProgress\n percent={dim?.score ?? 0}\n size=\"small\"\n showInfo={false}\n strokeColor={\n (dim?.score ?? 0) >= 80 ? '#52c41a' :\n (dim?.score ?? 0) >= 60 ? '#faad14' : '#ff4d4f'\n }\n style={{ marginTop: 8 }}\n />\n <div style={{ fontSize: 12, color: '#8c8c8c', marginTop: 4 }}>\n {dim?.score ?? 0}/100\n </div>\n </UICard>\n </UICol>\n );\n })}\n </UIRow>\n </UICol>\n </UIRow>\n </UICard>\n\n {/* Delta summary */}\n {delta && (\n <UIAlert\n variant=\"info\"\n showIcon\n icon={<UIIcon name=\"LineChartOutlined\" />}\n message=\"Changes since last snapshot\"\n description={\n <UIRow gutter={16} style={{ marginTop: 8 }}>\n {[\n { label: 'Layering violations', value: -delta.layeringViolations, invert: true },\n { label: 'Any count', value: -delta.anyCount, invert: true },\n { label: 'Unused files', value: -delta.unusedFiles, invert: true },\n { label: 'Unused deps', value: -delta.unusedDeps, invert: true },\n { label: 'Avg instability', value: -delta.avgInstability, invert: true },\n ].map(({ label, value, invert }) => (\n <UICol key={label}>\n <span style={{ color: '#8c8c8c' }}>{label}: </span>\n {deltaLabel(value, invert)}\n {value === 0 && <span style={{ color: '#8c8c8c' }}>—</span>}\n </UICol>\n ))}\n </UIRow>\n }\n style={{ marginBottom: 24 }}\n />\n )}\n\n {/* Quick Stats */}\n <UIRow gutter={16}>\n <UICol span={8}>\n <UICard>\n <UIStatistic title=\"Packages\" value={statsData?.packages ?? 0} prefix={<UIIcon name=\"DatabaseOutlined\" />} />\n </UICard>\n </UICol>\n <UICol span={8}>\n <UICard>\n <UIStatistic title=\"Lines of Code\" value={statsData?.loc ?? 0} prefix={<UIIcon name=\"CodeOutlined\" />} />\n </UICard>\n </UICol>\n <UICol span={8}>\n <UICard>\n <UIStatistic title=\"Total Size\" value={statsData?.size ?? 'N/A'} prefix={<UIIcon name=\"FileTextOutlined\" />} />\n </UICard>\n </UICol>\n </UIRow>\n </div>\n );\n}\n","import * as React from 'react';\nimport {\n useData,\n UIRow,\n UICol,\n UICard,\n UITable,\n UITag,\n UIAlert,\n UISkeleton,\n UISpace,\n UIIcon,\n UIStatistic,\n} from '@kb-labs/sdk/studio';\nimport type { UITableColumn } from '@kb-labs/sdk/studio';\nimport type { LayeringResponse, CouplingResponse } from '@kb-labs/quality-contracts';\nimport type { LayeringViolation, PackageCoupling } from '@kb-labs/quality-contracts';\n\nfunction instabilityColor(instability: number): string {\n if (instability >= 0.8) return '#ff4d4f';\n if (instability >= 0.6) return '#faad14';\n if (instability >= 0.4) return '#1677ff';\n return '#52c41a';\n}\n\nfunction instabilityTag(instability: number): React.ReactNode {\n return (\n <UITag color={instabilityColor(instability)}>\n {instability.toFixed(2)}\n </UITag>\n );\n}\n\nconst couplingColumns: UITableColumn<PackageCoupling>[] = [\n {\n title: 'Package',\n dataIndex: 'name',\n key: 'name',\n render: (name: string) => <code style={{ fontSize: 12 }}>{name}</code>,\n ellipsis: true,\n },\n {\n title: 'Ca (afferent)',\n dataIndex: 'afferent',\n key: 'afferent',\n width: 110,\n sorter: (a, b) => a.afferent - b.afferent,\n },\n {\n title: 'Ce (efferent)',\n dataIndex: 'efferent',\n key: 'efferent',\n width: 110,\n sorter: (a, b) => a.efferent - b.efferent,\n },\n {\n title: 'Instability',\n dataIndex: 'instability',\n key: 'instability',\n width: 110,\n defaultSortOrder: 'descend',\n sorter: (a, b) => a.instability - b.instability,\n render: (v: number) => instabilityTag(v),\n },\n];\n\nconst violationColumns: UITableColumn<LayeringViolation>[] = [\n {\n title: 'File',\n dataIndex: 'file',\n key: 'file',\n ellipsis: true,\n render: (f: string) => <code style={{ fontSize: 11 }}>{f.replace(/^.*\\/src\\//, 'src/')}</code>,\n },\n {\n title: 'From',\n key: 'from',\n width: 180,\n render: (_, r) => (\n <UISpace size={4}>\n <UITag>{r.fromPackage}</UITag>\n <span style={{ color: '#8c8c8c', fontSize: 11 }}>L{r.fromLayer}</span>\n </UISpace>\n ),\n },\n {\n title: 'To',\n key: 'to',\n width: 180,\n render: (_, r) => (\n <UISpace size={4}>\n <UITag color=\"red\">{r.toPackage}</UITag>\n <span style={{ color: '#8c8c8c', fontSize: 11 }}>L{r.toLayer}</span>\n </UISpace>\n ),\n },\n {\n title: 'Import',\n dataIndex: 'importSpecifier',\n key: 'importSpecifier',\n ellipsis: true,\n render: (s: string) => <code style={{ fontSize: 11 }}>{s}</code>,\n },\n];\n\nexport function ArchitectureTab() {\n const { data: couplingData, isLoading: couplingLoading } = useData<CouplingResponse>('/v1/plugins/quality/coupling');\n const { data: layersData, isLoading: layersLoading } = useData<LayeringResponse>('/v1/plugins/quality/layers');\n\n if (couplingLoading || layersLoading) {\n return <UISkeleton active lines={10} style={{ padding: '24px 0' }} />;\n }\n\n const hasViolations = (layersData?.totalViolations ?? 0) > 0;\n\n return (\n <div>\n {/* Summary row */}\n <UIRow gutter={16} style={{ marginBottom: 24 }}>\n <UICol span={8}>\n <UICard>\n <UIStatistic\n title=\"Layering Violations\"\n value={layersData?.totalViolations ?? 0}\n valueStyle={{ color: hasViolations ? '#ff4d4f' : '#52c41a' }}\n prefix={<UIIcon name={hasViolations ? 'WarningOutlined' : 'CheckCircleOutlined'} />}\n />\n </UICard>\n </UICol>\n <UICol span={8}>\n <UICard>\n <UIStatistic\n title=\"Avg Instability\"\n value={(couplingData?.avgInstability ?? 0).toFixed(2)}\n prefix={<UIIcon name=\"NodeIndexOutlined\" />}\n />\n </UICard>\n </UICol>\n <UICol span={8}>\n <UICard>\n <UIStatistic\n title=\"Affected Packages\"\n value={layersData?.affectedPackages?.length ?? 0}\n prefix={<UIIcon name=\"ApartmentOutlined\" />}\n />\n </UICard>\n </UICol>\n </UIRow>\n\n {/* Layering violations */}\n {hasViolations && (\n <UIAlert\n variant=\"error\"\n showIcon\n icon={<UIIcon name=\"WarningOutlined\" />}\n message={`${layersData!.totalViolations} layering violation${layersData!.totalViolations > 1 ? 's' : ''} detected`}\n description=\"Lower-layer packages are importing from higher-layer packages, breaking the dependency rules.\"\n style={{ marginBottom: 16 }}\n />\n )}\n\n <UICard title=\"Layering Violations\" style={{ marginBottom: 24 }}>\n {!hasViolations ? (\n <UIAlert\n variant=\"success\"\n showIcon\n icon={<UIIcon name=\"CheckCircleOutlined\" />}\n message=\"No layering violations — architecture is clean\"\n />\n ) : (\n <UITable<LayeringViolation>\n dataSource={layersData?.violations ?? []}\n columns={violationColumns}\n rowKey={(r) => `${r.file}:${r.importSpecifier}`}\n size=\"small\"\n pagination={{ pageSize: 20 }}\n />\n )}\n </UICard>\n\n {/* Coupling metrics */}\n <UICard title=\"Package Coupling (Ca/Ce/Instability)\">\n <UITable<PackageCoupling>\n dataSource={couplingData?.packages ?? []}\n columns={couplingColumns}\n rowKey=\"name\"\n size=\"small\"\n pagination={{ pageSize: 30 }}\n />\n </UICard>\n </div>\n );\n}\n","import * as React from 'react';\nimport {\n useData,\n UIRow,\n UICol,\n UICard,\n UITable,\n UITag,\n UIAlert,\n UISkeleton,\n UISpace,\n UIIcon,\n UIStatistic,\n} from '@kb-labs/sdk/studio';\nimport type { UITableColumn } from '@kb-labs/sdk/studio';\nimport type { DeadCodeResponse, HealthV2Response } from '@kb-labs/quality-contracts';\n\ninterface UnusedExportRow { key: string; file: string; symbol: string }\ninterface UnusedDepRow { key: string; package: string; workspace: string }\n\nconst unusedFileColumns: UITableColumn<{ key: string; file: string }>[] = [\n { title: 'File', dataIndex: 'file', key: 'file', ellipsis: true,\n render: (f: string) => <code style={{ fontSize: 12 }}>{f}</code> },\n];\n\nconst unusedExportColumns: UITableColumn<UnusedExportRow>[] = [\n { title: 'File', dataIndex: 'file', key: 'file', ellipsis: true,\n render: (f: string) => <code style={{ fontSize: 12 }}>{f}</code> },\n { title: 'Symbol', dataIndex: 'symbol', key: 'symbol', width: 200,\n render: (s: string) => <UITag><code>{s}</code></UITag> },\n];\n\nconst unusedDepColumns: UITableColumn<UnusedDepRow>[] = [\n { title: 'Package', dataIndex: 'package', key: 'package',\n render: (p: string) => <code style={{ fontSize: 12 }}>{p}</code> },\n { title: 'Workspace', dataIndex: 'workspace', key: 'workspace', width: 220,\n render: (w: string) => <UITag>{w}</UITag> },\n];\n\nfunction gradeColor(g: string) {\n return ({ A: 'green', B: 'blue', C: 'orange', D: 'red', F: 'volcano' } as Record<string, string>)[g] ?? 'default';\n}\n\nexport function DebtTab() {\n const { data: deadData, isLoading: deadLoading } = useData<DeadCodeResponse>('/v1/plugins/quality/dead-code');\n const { data: healthData, isLoading: healthLoading } = useData<HealthV2Response>('/v1/plugins/quality/health');\n\n if (deadLoading || healthLoading) {\n return <UISkeleton active lines={8} style={{ padding: '24px 0' }} />;\n }\n\n const tsDetails = healthData?.dimensions?.typescript?.details ?? [];\n const tsScore = healthData?.dimensions?.typescript?.score ?? 100;\n const tsGrade = healthData?.dimensions?.typescript?.grade ?? 'A';\n\n const unusedFileRows = (deadData?.unusedFiles ?? []).map((f) => ({ key: f, file: f }));\n const unusedExportRows: UnusedExportRow[] = (deadData?.unusedExports ?? []).map((e) => ({\n key: `${e.file}:${e.symbol}`, file: e.file, symbol: e.symbol,\n }));\n const unusedDepRows: UnusedDepRow[] = (deadData?.unusedDependencies ?? []).map((d) => ({\n key: `${d.workspace}:${d.package}`, package: d.package, workspace: d.workspace,\n }));\n const unlistedDepRows: UnusedDepRow[] = (deadData?.unlistedDependencies ?? []).map((d) => ({\n key: `${d.workspace}:${d.package}`, package: d.package, workspace: d.workspace,\n }));\n\n return (\n <div>\n <UIRow gutter={16} style={{ marginBottom: 24 }}>\n <UICol span={6}>\n <UICard>\n <UIStatistic title=\"TypeScript Score\" value={`${tsScore}/100`}\n prefix={<UITag color={gradeColor(tsGrade)}>{tsGrade}</UITag>} />\n </UICard>\n </UICol>\n <UICol span={6}>\n <UICard>\n <UIStatistic title=\"Unused Files\" value={unusedFileRows.length}\n valueStyle={{ color: unusedFileRows.length > 0 ? '#ff4d4f' : '#52c41a' }}\n prefix={<UIIcon name=\"FileUnknownOutlined\" />} />\n </UICard>\n </UICol>\n <UICol span={6}>\n <UICard>\n <UIStatistic title=\"Unused Exports\" value={unusedExportRows.length}\n valueStyle={{ color: unusedExportRows.length > 0 ? '#faad14' : '#52c41a' }}\n prefix={<UIIcon name=\"ExportOutlined\" />} />\n </UICard>\n </UICol>\n <UICol span={6}>\n <UICard>\n <UIStatistic title=\"Dep Issues\"\n value={unusedDepRows.length + unlistedDepRows.length}\n valueStyle={{ color: (unusedDepRows.length + unlistedDepRows.length) > 0 ? '#faad14' : '#52c41a' }}\n prefix={<UIIcon name=\"NodeIndexOutlined\" />} />\n </UICard>\n </UICol>\n </UIRow>\n\n {tsDetails.length > 0 && (\n <UICard title=\"TypeScript Health\" style={{ marginBottom: 24 }}>\n {tsDetails.map((detail, i) => (\n <UIAlert key={i} variant={tsScore < 60 ? 'error' : tsScore < 80 ? 'warning' : 'info'}\n showIcon message={detail} style={{ marginBottom: 8 }} />\n ))}\n </UICard>\n )}\n\n {unusedFileRows.length > 0 && (\n <UICard title={<UISpace><UIIcon name=\"FileUnknownOutlined\" /><span>Unused Files</span>\n <UITag color=\"red\">{unusedFileRows.length}</UITag></UISpace>} style={{ marginBottom: 16 }}>\n <UITable dataSource={unusedFileRows} columns={unusedFileColumns} size=\"small\" pagination={{ pageSize: 20 }} />\n </UICard>\n )}\n\n {unusedExportRows.length > 0 && (\n <UICard title={<UISpace><UIIcon name=\"ExportOutlined\" /><span>Unused Exports</span>\n <UITag color=\"orange\">{unusedExportRows.length}</UITag></UISpace>} style={{ marginBottom: 16 }}>\n <UITable<UnusedExportRow> dataSource={unusedExportRows} columns={unusedExportColumns}\n size=\"small\" pagination={{ pageSize: 20 }} />\n </UICard>\n )}\n\n {unusedDepRows.length > 0 && (\n <UICard title={<UISpace><UIIcon name=\"NodeCollapseOutlined\" /><span>Unused Dependencies</span>\n <UITag color=\"orange\">{unusedDepRows.length}</UITag></UISpace>} style={{ marginBottom: 16 }}>\n <UITable<UnusedDepRow> dataSource={unusedDepRows} columns={unusedDepColumns}\n size=\"small\" pagination={{ pageSize: 20 }} />\n </UICard>\n )}\n\n {unlistedDepRows.length > 0 && (\n <UICard title={<UISpace><UIIcon name=\"WarningOutlined\" /><span>Unlisted Dependencies</span>\n <UITag color=\"red\">{unlistedDepRows.length}</UITag></UISpace>}>\n <UITable<UnusedDepRow> dataSource={unlistedDepRows} columns={unusedDepColumns}\n size=\"small\" pagination={{ pageSize: 20 }} />\n </UICard>\n )}\n\n {unusedFileRows.length === 0 && unusedExportRows.length === 0 &&\n unusedDepRows.length === 0 && unlistedDepRows.length === 0 && (\n <UIAlert variant=\"success\" showIcon icon={<UIIcon name=\"CheckCircleOutlined\" />}\n message=\"No dead code detected — codebase is clean\" />\n )}\n </div>\n );\n}\n","import * as React from 'react';\nimport {\n useData,\n useMutateData,\n UICard,\n UITable,\n UITag,\n UIAlert,\n UISkeleton,\n UISpace,\n UIIcon,\n UIButton,\n useNotification,\n} from '@kb-labs/sdk/studio';\nimport type { UITableColumn } from '@kb-labs/sdk/studio';\nimport type { HistoryResponse, QualitySnapshot } from '@kb-labs/quality-contracts';\n\nfunction gradeColor(grade?: string): string {\n return ({ A: 'green', B: 'blue', C: 'orange', D: 'red', F: 'volcano' } as Record<string, string>)[grade ?? ''] ?? 'default';\n}\n\nfunction deltaCell(value: number, lowerIsBetter = true): React.ReactNode {\n if (value === 0) return <span style={{ color: '#8c8c8c' }}>—</span>;\n const good = lowerIsBetter ? value < 0 : value > 0;\n const color = good ? '#52c41a' : '#ff4d4f';\n const arrow = value > 0 ? '▲' : '▼';\n return <span style={{ color }}>{arrow} {Math.abs(value)}</span>;\n}\n\nconst columns: UITableColumn<QualitySnapshot>[] = [\n { title: 'Date', dataIndex: 'timestamp', key: 'timestamp', width: 170,\n render: (ts: string) => new Date(ts).toLocaleString() },\n { title: 'Score', dataIndex: 'score', key: 'score', width: 80,\n sorter: (a, b) => a.score - b.score },\n { title: 'Grade', dataIndex: 'grade', key: 'grade', width: 70,\n render: (g: string) => <UITag color={gradeColor(g)}>{g}</UITag> },\n { title: 'Architecture', key: 'arch', width: 110,\n render: (_, r) => (\n <UISpace size={4}>\n <UITag color={gradeColor(r.dimensions.architecture.grade)} style={{ fontSize: 11 }}>\n {r.dimensions.architecture.grade}\n </UITag>\n <span style={{ fontSize: 11, color: '#8c8c8c' }}>{r.dimensions.architecture.score}</span>\n </UISpace>\n ) },\n { title: 'TypeScript', key: 'ts', width: 110,\n render: (_, r) => (\n <UISpace size={4}>\n <UITag color={gradeColor(r.dimensions.typescript.grade)} style={{ fontSize: 11 }}>\n {r.dimensions.typescript.grade}\n </UITag>\n <span style={{ fontSize: 11, color: '#8c8c8c' }}>{r.dimensions.typescript.score}</span>\n </UISpace>\n ) },\n { title: 'Dead Code', key: 'dc', width: 110,\n render: (_, r) => (\n <UISpace size={4}>\n <UITag color={gradeColor(r.dimensions.deadCode.grade)} style={{ fontSize: 11 }}>\n {r.dimensions.deadCode.grade}\n </UITag>\n <span style={{ fontSize: 11, color: '#8c8c8c' }}>{r.dimensions.deadCode.score}</span>\n </UISpace>\n ) },\n { title: 'Violations', key: 'violations', width: 95,\n render: (_, r) => (\n <span style={{ color: r.counters.layeringViolations > 0 ? '#ff4d4f' : '#52c41a' }}>\n {r.counters.layeringViolations}\n </span>\n ) },\n { title: 'Any', key: 'any', width: 70, render: (_, r) => r.counters.anyCount },\n { title: 'Unused', key: 'unused', width: 80, render: (_, r) => r.counters.unusedFiles },\n { title: 'Branch', key: 'branch', width: 120, ellipsis: true,\n render: (_, r) => <code style={{ fontSize: 11 }}>{r.git.branch || '—'}</code> },\n { title: 'Commit', key: 'commit', width: 90,\n render: (_, r) => <code style={{ fontSize: 11 }}>{r.git.commit ? r.git.commit.slice(0, 7) : '—'}</code> },\n];\n\nexport function HistoryTab() {\n const { data, isLoading, refetch } = useData<HistoryResponse>('/v1/plugins/quality/history');\n const saveSnapshot = useMutateData<Record<string, never>, QualitySnapshot>('/v1/plugins/quality/snapshot');\n const notify = useNotification();\n\n function handleSnapshot() {\n saveSnapshot.mutate({}, {\n onSuccess: () => {\n notify.success('Snapshot saved');\n void refetch();\n },\n onError: (err: unknown) => {\n notify.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);\n },\n });\n }\n\n if (isLoading) {\n return <UISkeleton active lines={8} style={{ padding: '24px 0' }} />;\n }\n\n const snapshots = data?.snapshots ?? [];\n const delta = data?.delta;\n const hasAnyDelta = delta && Object.values(delta).some(v => v !== 0);\n\n return (\n <div>\n {delta && (\n <UICard title=\"Changes since last snapshot\" style={{ marginBottom: 24 }}>\n {!hasAnyDelta ? (\n <span style={{ color: '#8c8c8c', fontSize: 13 }}>No changes since last snapshot</span>\n ) : (\n <div style={{ display: 'flex', gap: 32, flexWrap: 'wrap' }}>\n <div><span style={{ color: '#8c8c8c' }}>Score </span>{deltaCell(delta.score, false)}</div>\n <div><span style={{ color: '#8c8c8c' }}>Violations </span>{deltaCell(delta.layeringViolations)}</div>\n <div><span style={{ color: '#8c8c8c' }}>Any count </span>{deltaCell(delta.anyCount)}</div>\n <div><span style={{ color: '#8c8c8c' }}>Ts-ignore </span>{deltaCell(delta.tsIgnoreCount)}</div>\n <div><span style={{ color: '#8c8c8c' }}>Unused files </span>{deltaCell(delta.unusedFiles)}</div>\n <div><span style={{ color: '#8c8c8c' }}>Unused deps </span>{deltaCell(delta.unusedDeps)}</div>\n <div><span style={{ color: '#8c8c8c' }}>Avg instability </span>{deltaCell(parseFloat(delta.avgInstability.toFixed(2)))}</div>\n </div>\n )}\n </UICard>\n )}\n\n <UICard\n title={`Snapshot History (${snapshots.length})`}\n extra={\n <UIButton size=\"small\" icon={<UIIcon name=\"CameraOutlined\" />}\n loading={saveSnapshot.isLoading} onClick={handleSnapshot}>\n Save Snapshot\n </UIButton>\n }\n >\n {snapshots.length === 0 ? (\n <UIAlert variant=\"info\" showIcon icon={<UIIcon name=\"InfoCircleOutlined\" />}\n message=\"No snapshots yet\"\n description='Run \"kb quality snapshot\" or click \"Save Snapshot\" to start tracking trends.' />\n ) : (\n <UITable<QualitySnapshot>\n dataSource={snapshots.slice().reverse()}\n columns={columns}\n rowKey=\"id\"\n size=\"small\"\n pagination={{ pageSize: 20 }}\n scroll={{ x: 1200 }}\n />\n )}\n </UICard>\n </div>\n );\n}\n","/**\n * Build Order tab - shows parallel build layers and sequential order\n */\n\nimport * as React from 'react';\nimport { useData, UICard, UITable, UITag, UISkeleton, UIAlert, UISelect, UISpace } from '@kb-labs/sdk/studio';\nimport type { UITableColumn } from '@kb-labs/sdk/studio';\nimport type { BuildOrderResponse, CyclesResponse } from '@kb-labs/quality-contracts';\n\nexport function BuildOrderTab() {\n const [selectedPackage, setSelectedPackage] = React.useState<string | undefined>();\n\n const buildOrderUrl = selectedPackage\n ? `/v1/plugins/quality/build-order?package=${encodeURIComponent(selectedPackage)}`\n : '/v1/plugins/quality/build-order';\n\n const { data, isLoading, isError } = useData<BuildOrderResponse>(buildOrderUrl);\n const { data: cyclesData } = useData<CyclesResponse>('/v1/plugins/quality/cycles');\n\n if (isLoading) {\n return <UISkeleton active lines={6} style={{ padding: '24px 0' }} />;\n }\n\n if (isError) {\n return <UIAlert message=\"Failed to load build order\" variant=\"error\" showIcon />;\n }\n\n const layersColumns: UITableColumn<{ layer: number; packages: string[]; key: number }>[] = [\n {\n title: 'Layer',\n dataIndex: 'layer',\n key: 'layer',\n width: 100,\n render: (layer: number) => <UITag color=\"blue\">Layer {layer}</UITag>,\n },\n {\n title: 'Packages (can build in parallel)',\n dataIndex: 'packages',\n key: 'packages',\n render: (packages: string[]) => (\n <UISpace wrap>\n {packages.map((pkg) => (\n <UITag key={pkg}>{pkg}</UITag>\n ))}\n </UISpace>\n ),\n },\n ];\n\n const layersData = data?.layers.map((layer, idx) => ({\n layer: idx + 1,\n packages: layer,\n key: idx,\n }));\n\n return (\n <div>\n {/* Circular Dependencies Warning */}\n {data?.hasCircular && (\n <UIAlert\n message=\"Circular Dependencies Detected!\"\n description={`Found ${data.circular.length} circular dependency cycles. Build order may not be correct.`}\n variant=\"error\"\n showIcon\n style={{ marginBottom: 24 }}\n />\n )}\n\n {/* Package Filter */}\n <UICard title=\"Filter\" style={{ marginBottom: 24 }}>\n <UISelect\n style={{ width: 400 }}\n placeholder=\"Select package to see its build dependencies\"\n value={selectedPackage}\n onChange={(val) => setSelectedPackage(val as string | undefined)}\n allowClear\n showSearch\n options={data?.sorted.map((pkg) => ({\n label: pkg,\n value: pkg,\n })) ?? []}\n />\n </UICard>\n\n {/* Build Layers */}\n <UICard\n title={`Build Layers (${data?.layerCount ?? 0} layers, ${data?.packageCount ?? 0} packages)`}\n style={{ marginBottom: 24 }}\n >\n <UITable\n dataSource={layersData ?? []}\n columns={layersColumns}\n pagination={false}\n expandable={{\n expandedRowRender: (record) => (\n <div style={{ padding: '8px 0' }}>\n <strong>Packages in this layer:</strong>\n <div style={{ marginTop: 8 }}>\n {record.packages.map((pkg) => (\n <UITag key={pkg} style={{ marginBottom: 4 }}>\n {pkg}\n </UITag>\n ))}\n </div>\n </div>\n ),\n }}\n />\n </UICard>\n\n {/* Circular Dependencies */}\n {data?.hasCircular && (\n <UICard title={`Circular Dependencies (${data.circular.length})`}>\n {data.circular.map((cycle, idx) => (\n <UIAlert\n key={idx}\n message={`Cycle ${idx + 1}`}\n description={cycle.join(' → ')}\n variant=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n />\n ))}\n </UICard>\n )}\n </div>\n );\n}\n","import * as React from 'react';\nimport { UIPage, UIPageHeader, UITabs } from '@kb-labs/sdk/studio';\nimport { OverviewTab } from '../components/OverviewTab';\nimport { ArchitectureTab } from '../components/ArchitectureTab';\nimport { DebtTab } from '../components/DebtTab';\nimport { HistoryTab } from '../components/HistoryTab';\nimport { BuildOrderTab } from '../components/BuildOrderTab';\n\nexport default function QualityOverview() {\n const tabs = (\n <UITabs\n syncUrl=\"search\"\n items={[\n { key: 'overview', label: 'Overview', children: <OverviewTab /> },\n { key: 'architecture', label: 'Architecture', children: <ArchitectureTab /> },\n { key: 'debt', label: 'Debt', children: <DebtTab /> },\n { key: 'history', label: 'History', children: <HistoryTab /> },\n { key: 'build-order', label: 'Build Order', children: <BuildOrderTab /> },\n ]}\n />\n );\n\n return (\n <UIPage>\n <UIPageHeader\n title=\"Quality\"\n description=\"Code health, architecture analysis, and trend tracking\"\n tabs={tabs}\n />\n </UIPage>\n );\n}\n"],"names":["Symbol","gradeColor","grade","deltaLabel","value","invert","color","positive","Math","DIMENSIONS","OverviewTab","score","_historyData_latest","_useData","statsData","statsLoading","_useData1","healthData","healthLoading","_useData2","historyData","historyLoading","UISkeleton","delta","dimensions","UICard","UIRow","UICol","UIProgress","UITag","key","label","icon","dim","undefined","UISpace","UIIcon","UIAlert","UIStatistic","couplingColumns","render","name","sorter","a","b","v","instability","violationColumns","f","_","r","s","ArchitectureTab","_layersData_affectedPackages","couplingData","couplingLoading","layersData","layersLoading","hasViolations","UITable","rowKey","unusedFileColumns","unusedExportColumns","unusedDepColumns","p","w","DebtTab","_g","_healthData_dimensions_typescript","_healthData_dimensions_typescript1","_healthData_dimensions_typescript2","deadData","deadLoading","tsDetails","tsScore","tsGrade","unusedFileRows","unusedExportRows","e","unusedDepRows","d","unlistedDepRows","detail","i","deltaCell","lowerIsBetter","good","columns","ts","Date","g","HistoryTab","data","isLoading","refetch","saveSnapshot","useMutateData","notify","useNotification","snapshots","hasAnyDelta","Object","parseFloat","UIButton","onSuccess","onError","err","_instanceof","Error","String","BuildOrderTab","_React_useState","selectedPackage","setSelectedPackage","buildOrderUrl","encodeURIComponent","isError","layersColumns","layer","packages","pkg","idx","UISelect","onChange","val","expandedRowRender","record","cycle","QualityOverview","tabs","UITabs","UIPage","UIPageHeader"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"name": "qualityPlugin",
|
|
6
6
|
"globalName": "qualityPlugin",
|
|
7
7
|
"buildInfo": {
|
|
8
|
-
"buildVersion": "2.
|
|
8
|
+
"buildVersion": "2.94.0",
|
|
9
9
|
"buildName": "@kb-labs/quality-entry"
|
|
10
10
|
},
|
|
11
11
|
"publicPath": "auto",
|
|
@@ -25,16 +25,15 @@
|
|
|
25
25
|
},
|
|
26
26
|
"shared": [
|
|
27
27
|
{
|
|
28
|
-
"id": "qualityPlugin
|
|
29
|
-
"name": "
|
|
30
|
-
"version": "
|
|
28
|
+
"id": "qualityPlugin:react-router-dom",
|
|
29
|
+
"name": "react-router-dom",
|
|
30
|
+
"version": "7.14.0",
|
|
31
31
|
"singleton": true,
|
|
32
|
-
"requiredVersion": "^0.
|
|
32
|
+
"requiredVersion": "^7.0.0",
|
|
33
33
|
"assets": {
|
|
34
34
|
"js": {
|
|
35
35
|
"sync": [
|
|
36
|
-
"
|
|
37
|
-
"669.js"
|
|
36
|
+
"919.js"
|
|
38
37
|
],
|
|
39
38
|
"async": []
|
|
40
39
|
},
|
|
@@ -47,9 +46,9 @@
|
|
|
47
46
|
{
|
|
48
47
|
"id": "qualityPlugin:@kb-labs/studio-ui-core",
|
|
49
48
|
"name": "@kb-labs/studio-ui-core",
|
|
50
|
-
"version": "2.
|
|
49
|
+
"version": "2.94.0",
|
|
51
50
|
"singleton": true,
|
|
52
|
-
"requiredVersion": "^0.
|
|
51
|
+
"requiredVersion": "^2.0.0",
|
|
53
52
|
"assets": {
|
|
54
53
|
"js": {
|
|
55
54
|
"sync": [
|
|
@@ -86,9 +85,9 @@
|
|
|
86
85
|
{
|
|
87
86
|
"id": "qualityPlugin:@kb-labs/studio-hooks",
|
|
88
87
|
"name": "@kb-labs/studio-hooks",
|
|
89
|
-
"version": "2.
|
|
88
|
+
"version": "2.94.0",
|
|
90
89
|
"singleton": true,
|
|
91
|
-
"requiredVersion": "^0.
|
|
90
|
+
"requiredVersion": "^2.0.0",
|
|
92
91
|
"assets": {
|
|
93
92
|
"js": {
|
|
94
93
|
"sync": [
|
|
@@ -106,16 +105,16 @@
|
|
|
106
105
|
{
|
|
107
106
|
"id": "qualityPlugin:@kb-labs/studio-ui-kit",
|
|
108
107
|
"name": "@kb-labs/studio-ui-kit",
|
|
109
|
-
"version": "2.
|
|
108
|
+
"version": "2.94.0",
|
|
110
109
|
"singleton": true,
|
|
111
|
-
"requiredVersion": "^0.
|
|
110
|
+
"requiredVersion": "^2.0.0",
|
|
112
111
|
"assets": {
|
|
113
112
|
"js": {
|
|
114
113
|
"sync": [
|
|
115
114
|
"117.js",
|
|
116
115
|
"326.js",
|
|
117
|
-
"
|
|
118
|
-
"
|
|
116
|
+
"451.js",
|
|
117
|
+
"62.js"
|
|
119
118
|
],
|
|
120
119
|
"async": []
|
|
121
120
|
},
|
|
@@ -126,15 +125,16 @@
|
|
|
126
125
|
}
|
|
127
126
|
},
|
|
128
127
|
{
|
|
129
|
-
"id": "qualityPlugin:react",
|
|
130
|
-
"name": "react",
|
|
128
|
+
"id": "qualityPlugin:react-dom",
|
|
129
|
+
"name": "react-dom",
|
|
131
130
|
"version": "19.2.5",
|
|
132
131
|
"singleton": true,
|
|
133
132
|
"requiredVersion": "^19.0.0",
|
|
134
133
|
"assets": {
|
|
135
134
|
"js": {
|
|
136
135
|
"sync": [
|
|
137
|
-
"
|
|
136
|
+
"165.js",
|
|
137
|
+
"546.js"
|
|
138
138
|
],
|
|
139
139
|
"async": []
|
|
140
140
|
},
|
|
@@ -145,16 +145,15 @@
|
|
|
145
145
|
}
|
|
146
146
|
},
|
|
147
147
|
{
|
|
148
|
-
"id": "qualityPlugin:react
|
|
149
|
-
"name": "react
|
|
148
|
+
"id": "qualityPlugin:react",
|
|
149
|
+
"name": "react",
|
|
150
150
|
"version": "19.2.5",
|
|
151
151
|
"singleton": true,
|
|
152
152
|
"requiredVersion": "^19.0.0",
|
|
153
153
|
"assets": {
|
|
154
154
|
"js": {
|
|
155
155
|
"sync": [
|
|
156
|
-
"
|
|
157
|
-
"546.js"
|
|
156
|
+
"405.js"
|
|
158
157
|
],
|
|
159
158
|
"async": []
|
|
160
159
|
},
|
|
@@ -185,15 +184,16 @@
|
|
|
185
184
|
}
|
|
186
185
|
},
|
|
187
186
|
{
|
|
188
|
-
"id": "qualityPlugin
|
|
189
|
-
"name": "
|
|
190
|
-
"version": "
|
|
187
|
+
"id": "qualityPlugin:@kb-labs/studio-event-bus",
|
|
188
|
+
"name": "@kb-labs/studio-event-bus",
|
|
189
|
+
"version": "2.94.0",
|
|
191
190
|
"singleton": true,
|
|
192
|
-
"requiredVersion": "^
|
|
191
|
+
"requiredVersion": "^2.0.0",
|
|
193
192
|
"assets": {
|
|
194
193
|
"js": {
|
|
195
194
|
"sync": [
|
|
196
|
-
"
|
|
195
|
+
"50.js",
|
|
196
|
+
"669.js"
|
|
197
197
|
],
|
|
198
198
|
"async": []
|
|
199
199
|
},
|