@zaip-ai/cli 1.0.7 → 1.0.8

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.
Files changed (410) hide show
  1. package/README.md +6 -4
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.d.ts.map +1 -1
  4. package/dist/services/adapters.js +15 -5
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/adapters.test.js +1 -1
  7. package/dist/services/agent-adapters.d.ts +9 -0
  8. package/dist/services/agent-adapters.d.ts.map +1 -1
  9. package/dist/services/agent-adapters.js +38 -3
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +8 -1
  12. package/dist/services/agent-adapters.test.js.map +1 -1
  13. package/dist/services/codex-config-template.d.ts +2 -1
  14. package/dist/services/codex-config-template.d.ts.map +1 -1
  15. package/dist/services/codex-config-template.js +13 -2
  16. package/dist/services/codex-config-template.js.map +1 -1
  17. package/dist/services/codex-rules.d.ts +1 -1
  18. package/dist/services/codex-rules.d.ts.map +1 -1
  19. package/dist/services/codex-rules.js +31 -7
  20. package/dist/services/codex-rules.js.map +1 -1
  21. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  22. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  23. package/dist/services/codex-subagent-hook-template.js +4 -1
  24. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  25. package/dist/services/doctor.d.ts.map +1 -1
  26. package/dist/services/doctor.js +3 -1
  27. package/dist/services/doctor.js.map +1 -1
  28. package/dist/services/global-codex-config.d.ts +6 -3
  29. package/dist/services/global-codex-config.d.ts.map +1 -1
  30. package/dist/services/global-codex-config.js +82 -13
  31. package/dist/services/global-codex-config.js.map +1 -1
  32. package/dist/services/global-codex-config.test.js +57 -10
  33. package/dist/services/global-codex-config.test.js.map +1 -1
  34. package/dist/services/install-agents-template.d.ts.map +1 -1
  35. package/dist/services/install-agents-template.js +15 -2
  36. package/dist/services/install-agents-template.js.map +1 -1
  37. package/dist/services/logger.js +1 -1
  38. package/dist/services/logger.js.map +1 -1
  39. package/dist/services/logger.test.js +3 -3
  40. package/dist/services/logger.test.js.map +1 -1
  41. package/dist/services/runtime-template.test.js +21 -5
  42. package/dist/services/runtime-template.test.js.map +1 -1
  43. package/dist/services/template-manifest.d.ts.map +1 -1
  44. package/dist/services/template-manifest.js +2 -0
  45. package/dist/services/template-manifest.js.map +1 -1
  46. package/package.json +1 -1
  47. package/templates/.agents/config/agents/catalog.yaml +310 -10
  48. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
  49. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
  50. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
  57. package/templates/.agents/config/project.yaml +1 -1
  58. package/templates/.agents/dashboard/.zaip-managed.json +659 -163
  59. package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
  60. package/templates/.agents/dashboard/README.md +48 -97
  61. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-Z60df2r-.js +1 -0
  62. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cv-JcoxP.js → DashboardHelpDialog-Cs6dzDmW.js} +294 -109
  63. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-Coc6pA-1.js +1 -0
  64. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +1 -0
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +3 -0
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +1 -0
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +68 -0
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-DFBuc_qp.js +1 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +2 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-CCQOHdVI.js +9 -0
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-pC2_0J8x.js +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
  79. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  80. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +952 -595
  81. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
  82. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
  83. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
  84. package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
  89. package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +257 -313
  91. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +149 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +35 -0
  93. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +111 -12
  94. package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
  95. package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
  96. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
  98. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +70 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +111 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +432 -13
  101. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
  102. package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
  105. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
  111. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +24 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
  114. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +471 -2
  115. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
  116. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +44 -0
  117. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +196 -39
  118. package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
  119. package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
  120. package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
  121. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
  122. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +187 -0
  123. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +190 -0
  124. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +121 -0
  125. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +398 -0
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
  128. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
  129. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +37 -0
  130. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +55 -5
  131. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  132. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
  133. package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
  134. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +64 -0
  135. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +275 -0
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +100 -15
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +131 -40
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +303 -0
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +226 -6
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +479 -402
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +312 -72
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +373 -321
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +52 -14
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
  159. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +32 -5
  160. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +108 -0
  161. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
  162. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +60 -0
  163. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +106 -0
  164. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
  165. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
  166. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
  167. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
  168. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -137
  169. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
  170. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +956 -0
  171. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +775 -0
  172. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +95 -0
  173. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  174. package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
  175. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
  176. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
  177. package/templates/.agents/dashboard/modules/operations/package.json +2 -1
  178. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +182 -0
  179. package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
  180. package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
  181. package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
  182. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
  183. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +325 -18
  184. package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
  185. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
  186. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
  187. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
  188. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
  189. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +365 -14
  190. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +532 -131
  191. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +314 -358
  192. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +68 -0
  193. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
  194. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +51 -8
  195. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
  196. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
  197. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
  198. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
  199. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +99 -42
  200. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
  201. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +255 -34
  202. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +163 -8
  203. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +101 -68
  204. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
  205. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -16
  206. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
  207. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +50 -1
  208. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +143 -9
  209. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +29 -4
  210. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
  211. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
  212. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
  213. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
  214. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
  215. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
  216. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +65 -5
  217. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
  218. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +19 -0
  219. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
  220. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
  221. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +136 -0
  222. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
  223. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
  224. package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
  225. package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
  226. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
  227. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +24 -7
  228. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
  229. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
  230. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
  231. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +165 -6
  232. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
  233. package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
  234. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
  235. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
  236. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
  237. package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
  238. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +5 -3
  239. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +4 -83
  240. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
  241. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
  242. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
  243. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
  244. package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
  245. package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
  246. package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
  247. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +27 -2
  248. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +22 -13
  249. package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
  250. package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
  251. package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
  252. package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
  253. package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
  254. package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
  255. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +324 -0
  256. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
  257. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
  258. package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
  259. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
  260. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  261. package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
  262. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  263. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  264. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  265. package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
  266. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  267. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1756 -0
  268. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1608 -0
  269. package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
  270. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +12 -0
  271. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +83 -0
  272. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +28 -0
  273. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +262 -0
  274. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +41 -0
  275. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +105 -0
  276. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1643 -107
  277. package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
  278. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
  279. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
  280. package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
  281. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +335 -4
  282. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
  283. package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
  284. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +71 -0
  285. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +179 -0
  286. package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
  287. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
  288. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
  289. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
  290. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
  291. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
  292. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
  293. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
  294. package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
  295. package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
  296. package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
  297. package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
  298. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +163 -84
  299. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +145 -0
  300. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +551 -266
  301. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1145 -308
  302. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
  303. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +708 -0
  304. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +2232 -0
  305. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +6151 -0
  306. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
  307. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
  308. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
  309. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +437 -190
  310. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +299 -24
  311. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  312. package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
  313. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
  314. package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
  315. package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
  316. package/templates/.agents/dashboard/read-model.dbml +2201 -0
  317. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  318. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
  319. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +214 -41
  320. package/templates/.agents/dashboard/work-priority.json +34 -0
  321. package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
  322. package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
  323. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  324. package/templates/.agents/design/.zaip-managed.json +3 -3
  325. package/templates/.agents/design/apps/catalog/package.json +1 -1
  326. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  327. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  328. package/templates/.agents/requirements/comparative-audit.md +1 -1
  329. package/templates/.agents/requirements/context-engine.md +1 -1
  330. package/templates/.agents/requirements/cost-observability.md +1 -1
  331. package/templates/.agents/requirements/dashboard-launch.md +24 -0
  332. package/templates/.agents/requirements/data-export.md +1 -1
  333. package/templates/.agents/requirements/design-system.md +1 -1
  334. package/templates/.agents/requirements/execution-engine.md +1 -1
  335. package/templates/.agents/requirements/kanban-dashboard.md +4 -3
  336. package/templates/.agents/requirements/model-orchestration.md +1 -1
  337. package/templates/.agents/requirements/public-distribution.md +9 -6
  338. package/templates/.agents/requirements/software-architecture.md +1 -1
  339. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  340. package/templates/.agents/requirements/work-lifecycle.md +9 -3
  341. package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
  342. package/templates/.agents/rules/autonomy-decision.md +15 -0
  343. package/templates/.agents/rules/core.md +1 -1
  344. package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
  345. package/templates/.agents/rules/specialist-routing.md +19 -0
  346. package/templates/.agents/rules/workflow.md +1 -1
  347. package/templates/.agents/runtime/VERSION +1 -1
  348. package/templates/.agents/runtime/bin/zaip.mjs +114 -64
  349. package/templates/.agents/runtime/checksums.sha256 +6 -4
  350. package/templates/.agents/runtime/manifest.json +3 -1
  351. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
  352. package/templates/.agents/runtime/provenance.json +11 -0
  353. package/templates/.agents/runtime/sbom.cdx.json +1929 -39
  354. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  355. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +15 -0
  356. package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
  357. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
  358. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
  359. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
  360. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
  361. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
  362. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
  363. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
  364. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
  365. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
  366. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
  367. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
  368. package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
  369. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
  370. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
  371. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
  372. package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
  373. package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
  374. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +15 -0
  375. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
  376. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
  377. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
  378. package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
  379. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +3 -3
  380. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +76 -27
  381. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +128 -24
  382. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +122 -4
  383. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +66 -19
  384. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +193 -7
  385. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +14 -0
  386. package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
  387. package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
  388. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
  389. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
  390. package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
  391. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +18 -0
  392. package/templates/.agents/zaip-aios/INDEX.md +1 -0
  393. package/templates/.agents/zaip-aios/README.md +37 -8
  394. package/templates/.agents/zaip-aios/VERSION +1 -1
  395. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
  396. package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
  397. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
  398. package/templates/template-manifest.json +945 -214
  399. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
  400. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
  401. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
  402. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
  403. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
  404. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
  405. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
  406. package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
  407. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
  408. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
  409. package/templates/.agents/dashboard/dashboard.config.json +0 -4
  410. package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
@@ -0,0 +1,136 @@
1
+ import type { ReactNode } from "react";
2
+ import type { DashboardTaskProjection, MacroProjection, OperationsProjection } from "../contracts.js";
3
+ import type { OperationDatePreset, OperationDateRange } from "./operation-date-range.js";
4
+ import type { OperationsView } from "./operations-page-filters.js";
5
+ import type { OperationsLocale } from "./status-labels.js";
6
+ import type { WorkStage, WorkTypeFilter } from "./work-board-model.js";
7
+
8
+ export interface DashboardGlobalFilters {
9
+ query: string;
10
+ datePreset: OperationDatePreset;
11
+ dateRange?: OperationDateRange;
12
+ }
13
+
14
+ export type OverviewStatusKind = "task" | "spec" | "prd";
15
+ export type OverviewClassification = "lite" | "standard" | "critical" | "empty" | "structured" | "rework";
16
+
17
+ /** A remounted Trabalho (Lista) selector always starts on "all". */
18
+ export function workListTypeOnViewChange(nextView: OperationsView): WorkTypeFilter | null {
19
+ return nextView === "work-list" ? "all" : null;
20
+ }
21
+
22
+ export interface OverviewStatusPage {
23
+ items: readonly (DashboardTaskProjection | MacroProjection)[];
24
+ total: number;
25
+ loading: boolean;
26
+ error: string | null;
27
+ }
28
+
29
+ /** Canonical, server-paginated population behind an Overview classification slice. */
30
+ export interface OverviewClassificationPage extends OverviewStatusPage {}
31
+
32
+ export interface OperationsPageProps {
33
+ alternateContent?: ReactNode | ((filters: DashboardGlobalFilters) => ReactNode);
34
+ boardTotals?: Partial<Record<WorkStage, number>>;
35
+ boardKindTotals?: Partial<
36
+ Record<WorkStage, { all: number; task: number; prd: number; spec: number }>
37
+ >;
38
+ boardStates?: Partial<Record<WorkStage, { loading: boolean; error: string | null }>>;
39
+ /** Immutable, filtered board snapshot supplied by the composition root for XLSX. */
40
+ boardExportSource?: (filters: {
41
+ query: string;
42
+ status: string;
43
+ risk: string;
44
+ origin: string;
45
+ }) => {
46
+ prepare: () => Promise<{
47
+ totalRows: number;
48
+ pages: () => AsyncGenerator<readonly Record<string, unknown>[]>;
49
+ }>;
50
+ };
51
+ capabilityNavigation: ReactNode;
52
+ data: OperationsProjection;
53
+ dashboardTitle?: string;
54
+ loading: boolean;
55
+ onLoadingChange?: (loading: boolean) => void;
56
+ currency: "BRL" | "USD";
57
+ locale: OperationsLocale;
58
+ onLocaleChange: (locale: OperationsLocale) => void;
59
+ onOpenDocument: (kind: "prd" | "spec", id: string) => void;
60
+ onOpenTask: (taskId: string) => Promise<boolean>;
61
+ onPriorityChange: (itemIds: readonly string[]) => Promise<void>;
62
+ onDetailDataRequest?: (view: OperationsView) => void;
63
+ entityPage?: {
64
+ offset: number;
65
+ total: number | null;
66
+ loading: boolean;
67
+ error: string | null;
68
+ aggregation?: "canonical_entity" | "page_partial" | undefined;
69
+ };
70
+ onEntityPageChange?: (offset: number) => void;
71
+ onEntityFiltersChange?: (
72
+ view: "runs" | "conversations" | "executions" | "changes" | "decisions",
73
+ filters: { query: string; status: string; risk: string },
74
+ ) => void;
75
+ onBoardFiltersChange?: (filters: {
76
+ query: string;
77
+ status: string;
78
+ risk: string;
79
+ origin: string;
80
+ }) => void;
81
+ /** Full, server-paginated work collection for Trabalho (Lista). */
82
+ onWorkListFiltersChange?: (filters: {
83
+ query: string;
84
+ status: string;
85
+ risk: string;
86
+ origin: string;
87
+ }) => void;
88
+ onBoardTypeChange?: (kind: WorkTypeFilter) => void;
89
+ onWorkListTypeChange?: (kind: WorkTypeFilter) => void;
90
+ onLoadMoreBoard?: (stage: WorkStage) => void;
91
+ /** A dedicated, server-filtered status collection; never a mixed Kanban page. */
92
+ statusPage?: (stage: WorkStage, kind: OverviewStatusKind) => OverviewStatusPage | undefined;
93
+ onLoadStatusPage?: (stage: WorkStage, kind: OverviewStatusKind, offset: number) => void;
94
+ classificationPage?: (
95
+ kind: OverviewStatusKind,
96
+ classification: OverviewClassification,
97
+ ) => OverviewClassificationPage | undefined;
98
+ onLoadClassificationPage?: (
99
+ kind: OverviewStatusKind,
100
+ classification: OverviewClassification,
101
+ offset: number,
102
+ ) => void;
103
+ datePreset?: OperationDatePreset | undefined;
104
+ dateRange?: OperationDateRange | undefined;
105
+ onDateChange?: (preset: OperationDatePreset, range: OperationDateRange) => void;
106
+ onPeriodChange?: (preset: OperationDatePreset, range: OperationDateRange) => void;
107
+ onRefresh: () => void;
108
+ repositoryName?: string;
109
+ settings?: ReactNode;
110
+ /** Cost Monitor provides the factual value in the dashboard-selected currency. */
111
+ resolveRunCost?: ((runId: string) => number | null) | undefined;
112
+ /**
113
+ * Coherent Cost Monitor summary total for the active period and currency.
114
+ * This is needed when its compact snapshot intentionally omits Run rows.
115
+ */
116
+ factualCostTotal?: number | null | undefined;
117
+ /** Factual Cost Monitor rows matching the active global period. */
118
+ factualCostPeriods?: Partial<
119
+ Record<"day" | "month" | "year", readonly { key: string; estimated_usd: number | null; estimated_brl: number | null }[]>
120
+ > | undefined;
121
+ }
122
+
123
+ /** Single-source period contract for App-controlled Operations navigation. */
124
+ export function resolveOperationsPeriodControl(input: {
125
+ datePreset?: OperationDatePreset | undefined;
126
+ dateRange?: OperationDateRange | undefined;
127
+ fallbackPreset: OperationDatePreset;
128
+ fallbackRange: OperationDateRange;
129
+ }) {
130
+ const controlled = input.datePreset !== undefined && input.dateRange !== undefined;
131
+ return {
132
+ controlled,
133
+ datePreset: input.datePreset ?? input.fallbackPreset,
134
+ dateRange: input.dateRange ?? input.fallbackRange,
135
+ };
136
+ }
@@ -0,0 +1,160 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { executionMetricTotals } from "./execution-metrics.js";
3
+ import { macroClassificationStats } from "./OperationsOverview.helpers.js";
4
+ import { macroStatusDistribution } from "./OperationsOverview.js";
5
+ import { macrosWithPeriodActivity } from "./operations-period-scope.js";
6
+
7
+ const inAugust = (value: string | null | undefined) => value?.startsWith("2026-08") ?? false;
8
+
9
+ describe("macrosWithPeriodActivity", () => {
10
+ it("keeps blocked macro work visible outside its update month", () => {
11
+ const blocked = {
12
+ ...macro("SPEC-BLOCKED", null, "2026-08-02T12:00:00.000Z"),
13
+ lifecycle_status: "blocked",
14
+ };
15
+ const result = macrosWithPeriodActivity({
16
+ datePreset: "last-month",
17
+ matchesSelectedDate: (value) => value?.startsWith("2026-07") ?? false,
18
+ prds: [],
19
+ runs: [],
20
+ specs: [blocked] as never,
21
+ tasks: [],
22
+ });
23
+
24
+ expect(result.specs).toEqual([blocked]);
25
+ });
26
+ it("propagates a period Task to its SPEC and its parent PRD", () => {
27
+ const result = macrosWithPeriodActivity({
28
+ datePreset: "this-month",
29
+ matchesSelectedDate: inAugust,
30
+ tasks: [{ id: "TASK-AUG", spec_id: "SPEC-1" }],
31
+ runs: [],
32
+ specs: [macro("SPEC-1", "PRD-1")],
33
+ prds: [macro("PRD-1")],
34
+ });
35
+
36
+ expect(result.specs.map(({ id }) => id)).toEqual(["SPEC-1"]);
37
+ expect(result.prds.map(({ id }) => id)).toEqual(["PRD-1"]);
38
+ });
39
+
40
+ it("excludes inactive terminal macros with no current-period activity", () => {
41
+ const result = macrosWithPeriodActivity({
42
+ datePreset: "this-month",
43
+ matchesSelectedDate: inAugust,
44
+ tasks: [],
45
+ runs: [],
46
+ specs: [macro("SPEC-JUL", "PRD-JUL", "2026-07-31T12:00:00.000Z")],
47
+ prds: [macro("PRD-JUL", null, "2026-07-31T12:00:00.000Z")],
48
+ });
49
+
50
+ expect(result).toEqual({ specs: [], prds: [] });
51
+ });
52
+
53
+ it.each([
54
+ ["Este Mês", "2026-08", "TASK-AUG", "SPEC-AUG", "PRD-AUG", "blocked", 800],
55
+ ["Mês Passado", "2026-07", "TASK-JUL", "SPEC-JUL", "PRD-JUL", "completed", 700],
56
+ ] as const)("%s keeps cards, status, classification and metrics on the same SPEC/PRD population", (_label, month, taskId, specId, prdId, expectedStatus, expectedDuration) => {
57
+ const macros = {
58
+ specs: [
59
+ detailedMacro(
60
+ specId,
61
+ prdId,
62
+ month,
63
+ expectedStatus,
64
+ 1,
65
+ expectedStatus === "blocked" ? 1 : 0,
66
+ ),
67
+ detailedMacro("SPEC-OTHER", "PRD-OTHER", "2026-06", "completed", 4, 0),
68
+ ],
69
+ prds: [
70
+ detailedMacro(
71
+ prdId,
72
+ null,
73
+ month,
74
+ expectedStatus,
75
+ 1,
76
+ expectedStatus === "blocked" ? 1 : 0,
77
+ "prd",
78
+ ),
79
+ detailedMacro("PRD-OTHER", null, "2026-06", "completed", 4, 0, "prd"),
80
+ ],
81
+ };
82
+ const result = macrosWithPeriodActivity({
83
+ datePreset: month === "2026-08" ? "this-month" : "last-month",
84
+ matchesSelectedDate: (value) => value?.startsWith(month) ?? false,
85
+ tasks: [{ id: taskId, spec_id: specId }],
86
+ runs: [{ id: `RUN-${month}`, spec_id: specId, prd_id: prdId }],
87
+ ...macros,
88
+ });
89
+
90
+ for (const selected of [result.specs, result.prds]) {
91
+ expect(selected).toHaveLength(1);
92
+ expect(
93
+ macroStatusDistribution(selected as never, [], "pt-BR").find(
94
+ (row) => row.key === expectedStatus,
95
+ )?.count,
96
+ ).toBe(1);
97
+ expect(
98
+ macroClassificationStats(selected as never, "pt-BR").reduce(
99
+ (total, row) => total + row.count,
100
+ 0,
101
+ ),
102
+ ).toBe(1);
103
+ }
104
+ expect(executionMetricTotals([run(taskId, expectedDuration, specId, prdId)])).toMatchObject({
105
+ durationMs: expectedDuration,
106
+ tokens: expectedDuration / 10,
107
+ costBrl: expectedDuration / 100,
108
+ });
109
+ });
110
+ });
111
+
112
+ function macro(id: string, parentId: string | null = null, updatedAt = "2026-07-01T12:00:00.000Z") {
113
+ return {
114
+ id,
115
+ parent_id: parentId,
116
+ created_at: updatedAt,
117
+ updated_at: updatedAt,
118
+ lifecycle_status: "completed" as const,
119
+ run_ids: [],
120
+ task_ids: [],
121
+ };
122
+ }
123
+
124
+ function detailedMacro(
125
+ id: string,
126
+ parentId: string | null,
127
+ month: string,
128
+ status: "blocked" | "completed",
129
+ taskCount: number,
130
+ reworkRunCount: number,
131
+ kind: "spec" | "prd" = "spec",
132
+ ) {
133
+ return {
134
+ ...macro(id, parentId, `${month}-10T12:00:00.000Z`),
135
+ kind,
136
+ lifecycle_status: status,
137
+ work_status: status,
138
+ task_count: taskCount,
139
+ rework_run_count: reworkRunCount,
140
+ };
141
+ }
142
+
143
+ function run(taskId: string, duration: number, specId: string, prdId: string) {
144
+ return {
145
+ id: `RUN-${taskId}`,
146
+ phase: "execution",
147
+ task_id: taskId,
148
+ parent_run_id: null,
149
+ spec_id: specId,
150
+ prd_id: prdId,
151
+ duration_ms: duration,
152
+ source_duration_ms: duration,
153
+ usage: {
154
+ total: {
155
+ tokens: { total: duration / 10 },
156
+ cost: { brl: duration / 100 },
157
+ },
158
+ },
159
+ };
160
+ }
@@ -0,0 +1,47 @@
1
+ import type { DashboardTaskProjection, MacroProjection, RunProjection } from "../contracts.js";
2
+ import type { OperationDatePreset } from "./operation-date-range.js";
3
+
4
+ export function macrosWithPeriodActivity({
5
+ datePreset,
6
+ matchesSelectedDate,
7
+ prds,
8
+ runs,
9
+ specs,
10
+ tasks,
11
+ }: {
12
+ datePreset: OperationDatePreset;
13
+ matchesSelectedDate: (value: string | null | undefined) => boolean;
14
+ prds: OperationsMacro[];
15
+ runs: readonly Pick<RunProjection, "id" | "prd_id" | "spec_id">[];
16
+ specs: OperationsMacro[];
17
+ tasks: readonly Pick<DashboardTaskProjection, "id" | "spec_id">[];
18
+ }): { prds: OperationsMacro[]; specs: OperationsMacro[] } {
19
+ const visibleTaskIds = new Set(tasks.map((task) => task.id));
20
+ const terminal = new Set(["completed", "delivered", "cancelled", "failed"]);
21
+ const hasPeriodActivity = (row: OperationsMacro, kind: "spec" | "prd") =>
22
+ datePreset === "all" ||
23
+ !terminal.has(row.lifecycle_status) ||
24
+ matchesSelectedDate(row.updated_at ?? row.created_at) ||
25
+ row.task_ids.some((taskId) => visibleTaskIds.has(taskId)) ||
26
+ (kind === "spec" && tasks.some((task) => task.spec_id === row.id)) ||
27
+ runs.some(
28
+ (run) =>
29
+ row.run_ids.includes(run.id) ||
30
+ (kind === "spec" ? run.spec_id === row.id : run.prd_id === row.id),
31
+ );
32
+ const activeSpecs = specs.filter((spec) => hasPeriodActivity(spec, "spec"));
33
+ const activeSpecIds = new Set(activeSpecs.map((spec) => spec.id));
34
+ return {
35
+ specs: activeSpecs,
36
+ prds: prds.filter(
37
+ (prd) =>
38
+ hasPeriodActivity(prd, "prd") ||
39
+ specs.some((spec) => spec.parent_id === prd.id && activeSpecIds.has(spec.id)),
40
+ ),
41
+ };
42
+ }
43
+
44
+ type OperationsMacro = Pick<
45
+ MacroProjection,
46
+ "id" | "created_at" | "updated_at" | "parent_id" | "run_ids" | "task_ids" | "lifecycle_status"
47
+ >;
@@ -0,0 +1,10 @@
1
+ export function matchesQuery(
2
+ query: string,
3
+ values: readonly (string | null | undefined)[],
4
+ ): boolean {
5
+ const normalized = query.trim().toLocaleLowerCase();
6
+ return (
7
+ normalized.length === 0 ||
8
+ values.some((value) => value?.toLocaleLowerCase().includes(normalized))
9
+ );
10
+ }
@@ -48,6 +48,9 @@
48
48
  width: 100%;
49
49
  min-width: 0;
50
50
  }
51
+ .operations-tab-export {
52
+ justify-content: flex-end;
53
+ }
51
54
  .operations-content {
52
55
  padding: 10px;
53
56
  }
@@ -0,0 +1,28 @@
1
+ import type { OperationsView } from "./operations-page-filters.js";
2
+
3
+ export const viewLabels: Record<"pt-BR" | "en-US", Record<OperationsView, string>> = {
4
+ "pt-BR": {
5
+ "work-kanban": "Visão de Quadro (Kanban)",
6
+ "work-list": "Visão de Lista",
7
+ changes: "Mudanças",
8
+ executions: "Execuções",
9
+ runs: "Invocações de agentes",
10
+ conversations: "Conversas",
11
+ decisions: "Decisões",
12
+ daily: "Diário",
13
+ monthly: "Mensal",
14
+ yearly: "Anual",
15
+ },
16
+ "en-US": {
17
+ "work-kanban": "Work (Kanban)",
18
+ "work-list": "Work (List)",
19
+ changes: "Changes",
20
+ executions: "Executions",
21
+ runs: "Agent invocations",
22
+ conversations: "Conversations",
23
+ decisions: "Decisions",
24
+ daily: "Daily",
25
+ monthly: "Monthly",
26
+ yearly: "Annual",
27
+ },
28
+ };
@@ -1,19 +1,36 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { describe, expect, it } from "vitest";
3
3
 
4
- describe("operations tab order", () => {
5
- it("offers Kanban and list work views before the operational entity tabs", () => {
6
- const source = readFileSync(new URL("OperationsPage.tsx", import.meta.url), "utf8");
7
- const start = source.indexOf('aria-label="Entidades do ciclo de trabalho"');
8
- const end = source.indexOf("</nav>", start);
9
- const navigation = source.slice(start, end);
4
+ describe("operations tab navigation", () => {
5
+ it("offers only the Kanban board and work list views", () => {
6
+ const navigation = readFileSync(
7
+ new URL("OperationsPageNavigation.tsx", import.meta.url),
8
+ "utf8",
9
+ );
10
10
 
11
11
  expect(navigation).toContain('"work-kanban"');
12
12
  expect(navigation).toContain('"work-list"');
13
13
  expect(navigation).not.toContain('"tasks"');
14
14
  expect(navigation).not.toContain('"specs"');
15
15
  expect(navigation).not.toContain('"prds"');
16
+ expect(navigation).not.toContain('"executions"');
17
+ expect(navigation).not.toContain('"runs"');
18
+ expect(navigation).not.toContain('"decisions"');
19
+ expect(navigation).not.toContain('"changes"');
20
+ expect(navigation).not.toContain('"conversations"');
21
+ expect(navigation).not.toContain('"daily"');
22
+ expect(navigation).not.toContain('"monthly"');
23
+ expect(navigation).not.toContain('"yearly"');
16
24
  expect(navigation.indexOf('"work-kanban"')).toBeLessThan(navigation.indexOf('"work-list"'));
17
- expect(navigation.indexOf('"work-list"')).toBeLessThan(navigation.indexOf('"changes"'));
25
+ });
26
+
27
+ it("uses the simplified Portuguese labels", () => {
28
+ const labels = readFileSync(
29
+ new URL("operations-view-labels.ts", import.meta.url),
30
+ "utf8",
31
+ );
32
+
33
+ expect(labels).toContain('"work-kanban": "Visão de Quadro (Kanban)"');
34
+ expect(labels).toContain('"work-list": "Visão de Lista"');
18
35
  });
19
36
  });
@@ -189,6 +189,7 @@
189
189
  }
190
190
  .operations-toolbar nav {
191
191
  display: flex;
192
+ min-width: 0;
192
193
  flex-wrap: wrap;
193
194
  gap: 6px;
194
195
  overflow-x: visible;
@@ -205,6 +206,36 @@
205
206
  background: var(--accent-soft);
206
207
  color: var(--accent);
207
208
  }
209
+ .operations-tab-export {
210
+ display: flex;
211
+ flex: 0 0 auto;
212
+ justify-content: flex-end;
213
+ }
214
+ .operations-tab-export .excel-export-action {
215
+ min-height: 44px;
216
+ gap: 6px;
217
+ border: 1px solid transparent;
218
+ border-radius: 999px;
219
+ padding: 0 10px;
220
+ background: linear-gradient(135deg, #00b0f0 0%, #72f4fb 100%);
221
+ color: #042330;
222
+ font-size: 0.82rem;
223
+ font-weight: 650;
224
+ }
225
+ .operations-tab-export .excel-export-action svg {
226
+ width: 14px;
227
+ height: 14px;
228
+ }
229
+ .operations-tab-export .excel-export-action:hover:not(:disabled) {
230
+ border-color: rgba(114, 244, 251, 0.72);
231
+ background: linear-gradient(135deg, #00b0f0 0%, #72f4fb 100%);
232
+ color: #042330;
233
+ }
234
+ .operations-toolbar nav button:focus-visible,
235
+ .operations-tab-export .excel-export-action:focus-visible {
236
+ outline: 3px solid #00b0f0;
237
+ outline-offset: 2px;
238
+ }
208
239
  .operations-toolbar input {
209
240
  min-width: 260px;
210
241
  min-height: 42px;
@@ -751,3 +782,14 @@
751
782
  background: rgba(37, 99, 235, 0.16);
752
783
  color: #cde3ff;
753
784
  }
785
+
786
+ .operations-content-skeleton {
787
+ display: grid;
788
+ gap: 16px;
789
+ min-height: 360px;
790
+ padding: 24px;
791
+ border: 1px solid var(--line);
792
+ border-radius: 18px;
793
+ background: rgba(17, 24, 39, 0.68);
794
+ color: var(--muted);
795
+ }
@@ -0,0 +1,54 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { periodSummaryPopulation } from "./period-summary-population.js";
3
+
4
+ describe("periodSummaryPopulation", () => {
5
+ it("uses creation time for entities and start time for Runs, not recent activity", () => {
6
+ const population = periodSummaryPopulation(
7
+ {
8
+ prds: [entity("PRD-JUL", "2026-07-30T12:00:00.000Z")],
9
+ specs: [entity("SPEC-JUL", "2026-07-30T12:00:00.000Z")],
10
+ tasks: [entity("TASK-JUL", "2026-07-30T12:00:00.000Z")],
11
+ runs: [run("RUN-AUG", "2026-08-02T12:00:00.000Z")],
12
+ } as never,
13
+ (value) => value?.startsWith("2026-08-0") ?? false,
14
+ );
15
+
16
+ expect(population.prds).toEqual([]);
17
+ expect(population.specs).toEqual([]);
18
+ expect(population.tasks).toEqual([]);
19
+ expect(population.runs.map(({ id }) => id)).toEqual(["RUN-AUG"]);
20
+ });
21
+
22
+ it("keeps the August fixture at 89 created Tasks, not 109 active or 74 financial", () => {
23
+ const population = periodSummaryPopulation(
24
+ {
25
+ prds: [entity("PRD-JUL", "2026-07-20T12:00:00.000Z")],
26
+ specs: [entity("SPEC-JUL", "2026-07-20T12:00:00.000Z")],
27
+ tasks: [
28
+ ...Array.from({ length: 89 }, (_, index) =>
29
+ entity(`TASK-AUG-${index}`, "2026-08-02T12:00:00.000Z"),
30
+ ),
31
+ ...Array.from({ length: 20 }, (_, index) =>
32
+ entity(`TASK-JUL-${index}`, "2026-07-20T12:00:00.000Z"),
33
+ ),
34
+ ],
35
+ runs: Array.from({ length: 74 }, (_, index) =>
36
+ run(`RUN-AUG-${index}`, "2026-08-02T12:00:00.000Z"),
37
+ ),
38
+ } as never,
39
+ (value) => value?.startsWith("2026-08-0") ?? false,
40
+ );
41
+
42
+ expect(population).toMatchObject({ prds: [], specs: [] });
43
+ expect(population.tasks).toHaveLength(89);
44
+ expect(population.runs).toHaveLength(74);
45
+ });
46
+ });
47
+
48
+ function entity(id: string, created_at: string) {
49
+ return { id, created_at, updated_at: "2026-08-02T12:00:00.000Z", is_active: true };
50
+ }
51
+
52
+ function run(id: string, started_at: string) {
53
+ return { id, started_at };
54
+ }
@@ -0,0 +1,32 @@
1
+ import type { OperationsProjection } from "../contracts.js";
2
+
3
+ /**
4
+ * Period reports describe work created in the selected window. This is kept
5
+ * separate from the activity-oriented work board population.
6
+ */
7
+ export function periodSummaryPopulation(
8
+ data: Pick<
9
+ OperationsProjection,
10
+ "prds" | "specs" | "tasks" | "runs" | "evidences" | "validations"
11
+ >,
12
+ matchesSelectedDate: (value: string | null | undefined) => boolean,
13
+ ): Pick<OperationsProjection, "prds" | "specs" | "tasks" | "runs" | "evidences" | "validations"> {
14
+ return {
15
+ prds: data.prds.filter((prd) => matchesSelectedDate(prd.created_at)),
16
+ specs: data.specs.filter((spec) => matchesSelectedDate(spec.created_at)),
17
+ tasks: data.tasks.filter((task) => matchesSelectedDate(task.created_at)),
18
+ runs: data.runs.filter((run) => matchesSelectedDate(run.started_at)),
19
+ ...(data.evidences === undefined
20
+ ? {}
21
+ : {
22
+ evidences: data.evidences.filter((evidence) => matchesSelectedDate(evidence.observed_at)),
23
+ }),
24
+ ...(data.validations === undefined
25
+ ? {}
26
+ : {
27
+ validations: data.validations.filter((validation) =>
28
+ matchesSelectedDate(validation.executed_at),
29
+ ),
30
+ }),
31
+ };
32
+ }