@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
@@ -1,24 +1,27 @@
1
1
  import { type FormEvent, type ReactNode, useEffect, useState } from "react";
2
- import type { DashboardApiClient, ProjectConfigSettings } from "./dashboard-api.js";
2
+ import type {
3
+ DashboardApiClient,
4
+ ProjectConfigSettings,
5
+ ProjectOverview,
6
+ } from "./dashboard-api.js";
3
7
  import {
4
8
  buildProjectSettingsPayload,
5
9
  defaultAutonomousExecution,
6
- defaultModelOrchestration,
7
- type LanguagesDraft,
8
10
  lineList,
9
- modelOrchestrationForMode,
10
11
  projectSettingsDraft,
12
+ shortFrameworkVersion,
13
+ type StackComponentsDraft,
14
+ withDetectedStackVersions,
11
15
  } from "./project-settings-model.js";
16
+ import { StackComponentEditor, StackVersions } from "./ProjectStackEditor.js";
12
17
  import "./project-settings-page.css";
13
18
 
14
19
  type Locale = "pt-BR" | "en-US";
15
-
16
20
  const copy = {
17
21
  "pt-BR": {
18
22
  eyebrow: "Configurações",
19
23
  title: "Configuração do projeto",
20
- intro:
21
- "Edite o arquivo central do projeto com validação do schema antes da gravação. Nenhuma credencial deve ser adicionada aqui.",
24
+ intro: "Edite o arquivo central do projeto com validação do schema antes da gravação.",
22
25
  loading: "Carregando configurações do projeto…",
23
26
  back: "Voltar ao dashboard",
24
27
  save: "Salvar configurações",
@@ -28,17 +31,51 @@ const copy = {
28
31
  frameworkHint: "Ativa ou desativa o framework para este projeto.",
29
32
  identity: "Identidade do projeto",
30
33
  stack: "Stack e linguagens",
31
- clients: "Clientes e rastreamento",
32
- models: "Orquestração de modelos",
33
34
  execution: "Execução",
34
35
  assurance: "Assurance",
36
+ executionToggleHint:
37
+ "Grava ou remove o bloco execution. Sem ele, o projeto usa execução manual.",
38
+ runtimeHint:
39
+ "Manual apenas materializa o trabalho; autonomous executa a DAG pelo provider configurado quando as precondições passam.",
40
+ providerHint: "Provider que inicia os agentes da execução autônoma: Codex ou Claude.",
41
+ executionModelHint:
42
+ "Modelo-base do runtime autônomo. A política automática de PRD/SPEC ainda pode selecionar um modelo permitido por agente.",
43
+ parallelismHint:
44
+ "Teto de agentes simultâneos. O valor efetivo é o menor limite entre projeto, DAG, provider e squad.",
45
+ leaseHint:
46
+ "Valor persistido no projeto. O coordenador atual ainda usa internamente um lease fixo de 60 segundos.",
47
+ assuranceToggleHint:
48
+ "Ativa ou remove os gates de evidência, revisão e qualidade do projeto. Recomenda-se manter ativo.",
49
+ assuranceVersionHint: "Versão do contrato de assurance. É fixa e somente leitura.",
50
+ assuranceDepthHint:
51
+ "Auto ajusta o rigor ao escopo; base exige o conjunto padrão; elevated amplia validações para mudanças mais abrangentes.",
52
+ finalCommitHint:
53
+ "Exige que as evidências comprovem o commit final integrado. Sinais de produção ou migração ainda podem exigir isso mesmo quando desativado.",
35
54
  context: "Contexto",
55
+ overview: "Visão geral do projeto",
56
+ available: "Criado",
57
+ unavailable: "Ainda não criado",
58
+ componentGuide:
59
+ "Preencha cada responsabilidade separadamente. A versão fica sem prefixos (^, ~, >=) e a referência identifica o pacote, imagem ou serviço.",
60
+ versionHint: "Versão exata: 22.16.0 ou 17.6. Deixe vazio para serviços sem versão fixada.",
61
+ referenceHint:
62
+ "Ex.: npm:hono, docker:node:22.16.0-bookworm-slim, service:supabase ou provider:cloudflare-pages.",
63
+ overrides: "Opções avançadas (JSON)",
64
+ overridesHint:
65
+ "Use apenas fatos técnicos transversais confirmados. Deixe vazio quando não houver exceções.",
66
+ versions: "Versões verificadas no workspace",
67
+ exact: "Verificada",
68
+ constraint: "Requisito",
69
+ versionUnavailable: "Não encontrada",
70
+ contextGuide:
71
+ "O contexto começa pelas fontes canônicas e inclui somente arquivos relevantes para a tarefa. Saídas geradas são consultadas apenas em setup, release ou checagem de paridade.",
72
+ contextDomains:
73
+ "Branding, Marketing, Growth e Sales são usados sob demanda pelos respectivos especialistas, quando houver uma tarefa e artefatos desses domínios. Não os adicione aqui apenas por existirem como capacidades.",
36
74
  },
37
75
  "en-US": {
38
76
  eyebrow: "Settings",
39
77
  title: "Project settings",
40
- intro:
41
- "Edit the central project file with schema validation before writing. Do not add credentials here.",
78
+ intro: "Edit the central project file with schema validation before writing.",
42
79
  loading: "Loading project settings…",
43
80
  back: "Back to dashboard",
44
81
  save: "Save settings",
@@ -48,11 +85,47 @@ const copy = {
48
85
  frameworkHint: "Enable or disable the framework for this project.",
49
86
  identity: "Project identity",
50
87
  stack: "Stack and languages",
51
- clients: "Clients and tracking",
52
- models: "Model orchestration",
53
88
  execution: "Execution",
54
89
  assurance: "Assurance",
90
+ executionToggleHint:
91
+ "Writes or removes the execution block. Without it, the project uses manual execution.",
92
+ runtimeHint:
93
+ "Manual only materializes work; autonomous runs the DAG through the configured provider after preconditions pass.",
94
+ providerHint: "Provider that starts autonomous execution agents: Codex or Claude.",
95
+ executionModelHint:
96
+ "Base model for the autonomous runtime. PRD/SPEC automatic policy may still select an allowed model per agent.",
97
+ parallelismHint:
98
+ "Maximum simultaneous agents. Effective parallelism is the smallest project, DAG, provider, and squad limit.",
99
+ leaseHint:
100
+ "Value persisted in the project. The current coordinator still uses a fixed internal 60-second lease.",
101
+ assuranceToggleHint:
102
+ "Enables or removes project evidence, review, and quality gates. Keeping it enabled is recommended.",
103
+ assuranceVersionHint: "Assurance contract version. It is fixed and read-only.",
104
+ assuranceDepthHint:
105
+ "Auto adapts rigor to scope; base uses the standard set; elevated expands validation for broader changes.",
106
+ finalCommitHint:
107
+ "Requires evidence for the final integrated commit. Production or migration signals may still require it when disabled.",
55
108
  context: "Context",
109
+ overview: "Project overview",
110
+ available: "Created",
111
+ unavailable: "Not created yet",
112
+ componentGuide:
113
+ "Fill each responsibility separately. Versions have no prefixes (^, ~, >=), and the reference identifies the package, image, or service.",
114
+ versionHint:
115
+ "Exact version: 22.16.0 or 17.6. Leave blank for services without a pinned version.",
116
+ referenceHint:
117
+ "E.g. npm:hono, docker:node:22.16.0-bookworm-slim, service:supabase, or provider:cloudflare-pages.",
118
+ overrides: "Advanced options (JSON)",
119
+ overridesHint:
120
+ "Use only confirmed cross-cutting technical facts. Leave empty when there are no exceptions.",
121
+ versions: "Versions verified in the workspace",
122
+ exact: "Verified",
123
+ constraint: "Requirement",
124
+ versionUnavailable: "Not found",
125
+ contextGuide:
126
+ "Context starts from canonical sources and includes only files relevant to the task. Generated outputs are consulted only for setup, release, or parity checks.",
127
+ contextDomains:
128
+ "Branding, Marketing, Growth, and Sales are used on demand by their respective specialists when there is a task and artifacts in those domains. Do not add them here merely because they exist as capabilities.",
56
129
  },
57
130
  } as const;
58
131
 
@@ -67,23 +140,22 @@ export function ProjectSettingsPage({
67
140
  }) {
68
141
  const text = copy[locale];
69
142
  const [config, setConfig] = useState<ProjectConfigSettings | null>(null);
70
- const [languages, setLanguages] = useState<LanguagesDraft>({
71
- frontend: "",
72
- backend: "",
73
- site: "",
74
- });
143
+ const [overview, setOverview] = useState<ProjectOverview | null>(null);
144
+ const [stackComponents, setStackComponents] = useState<StackComponentsDraft | null>(null);
75
145
  const [otherOverrides, setOtherOverrides] = useState("{}");
76
146
  const [saving, setSaving] = useState(false);
77
147
  const [error, setError] = useState<string | null>(null);
78
148
  const [notice, setNotice] = useState<string | null>(null);
79
149
 
80
150
  useEffect(() => {
81
- void api
82
- .projectSettings()
83
- .then((loaded) => {
151
+ void Promise.all([api.projectSettings(), api.projectOverview()])
152
+ .then(([loaded, projectOverview]) => {
84
153
  const draft = projectSettingsDraft(loaded);
85
154
  setConfig(loaded);
86
- setLanguages(draft.languages);
155
+ setOverview(projectOverview);
156
+ setStackComponents(
157
+ withDetectedStackVersions(draft.components, projectOverview.stack_components),
158
+ );
87
159
  setOtherOverrides(draft.otherOverrides);
88
160
  })
89
161
  .catch((cause) => setError(cause instanceof Error ? cause.message : String(cause)));
@@ -97,11 +169,17 @@ export function ProjectSettingsPage({
97
169
  setNotice(null);
98
170
  try {
99
171
  const saved = await api.saveProjectSettings(
100
- buildProjectSettingsPayload(config, languages, otherOverrides),
172
+ buildProjectSettingsPayload(
173
+ config,
174
+ stackComponents ?? projectSettingsDraft(config).components,
175
+ otherOverrides,
176
+ ),
101
177
  );
178
+ const refreshedOverview = await api.projectOverview();
102
179
  const draft = projectSettingsDraft(saved);
103
180
  setConfig(saved);
104
- setLanguages(draft.languages);
181
+ setOverview(refreshedOverview);
182
+ setStackComponents(draft.components);
105
183
  setOtherOverrides(draft.otherOverrides);
106
184
  setNotice(text.saved);
107
185
  } catch (cause) {
@@ -114,11 +192,14 @@ export function ProjectSettingsPage({
114
192
  if (config === null) {
115
193
  return (
116
194
  <main className="project-settings-state">
117
- <p>{text.eyebrow}</p>
118
- <h1>{error ?? text.loading}</h1>
119
- <button onClick={onClose} type="button">
120
- {text.back}
121
- </button>
195
+ <div className="project-settings-state-card">
196
+ <span aria-hidden="true" className="project-settings-loader" />
197
+ <p>{text.eyebrow}</p>
198
+ <h1>{error ?? text.loading}</h1>
199
+ <button onClick={onClose} type="button">
200
+ ← {text.back}
201
+ </button>
202
+ </div>
122
203
  </main>
123
204
  );
124
205
  }
@@ -146,7 +227,10 @@ export function ProjectSettingsPage({
146
227
 
147
228
  <section className="project-settings-feature">
148
229
  <div>
149
- <h2>{text.framework}</h2>
230
+ <h2>
231
+ {text.framework}
232
+ {shortFrameworkVersion(overview?.framework_version) ? ` - ${shortFrameworkVersion(overview?.framework_version)}` : ""}
233
+ </h2>
150
234
  <p>{text.frameworkHint}</p>
151
235
  </div>
152
236
  <Toggle
@@ -156,8 +240,33 @@ export function ProjectSettingsPage({
156
240
  />
157
241
  </section>
158
242
 
243
+ <section className="project-settings-summary" aria-label={text.overview}>
244
+ {overview?.metrics.map((metric) => (
245
+ <div className="project-settings-metric" key={metric.id}>
246
+ <strong>{metric.value}</strong>
247
+ <span>{metric.label}</span>
248
+ </div>
249
+ ))}
250
+ </section>
251
+
252
+ <SettingsCard className="is-wide" title={text.overview}>
253
+ <div className="project-overview" aria-live="polite">
254
+ {overview?.areas.map((area) => (
255
+ <div className="project-overview-item" key={area.id}>
256
+ <div>
257
+ <strong>{area.label}</strong>
258
+ <code>{area.artifact}</code>
259
+ </div>
260
+ <span className={area.available ? "is-available" : "is-unavailable"}>
261
+ {area.available ? text.available : text.unavailable}
262
+ </span>
263
+ </div>
264
+ ))}
265
+ </div>
266
+ </SettingsCard>
267
+
159
268
  <div className="project-settings-grid">
160
- <SettingsCard title={text.identity}>
269
+ <SettingsCard className="is-wide project-identity-card" title={text.identity}>
161
270
  <Field label="Schema">
162
271
  <input readOnly value={config.schema_version} />
163
272
  </Field>
@@ -200,135 +309,36 @@ export function ProjectSettingsPage({
200
309
  </SettingsCard>
201
310
 
202
311
  <SettingsCard className="is-wide" title={text.stack}>
203
- <div className="project-settings-fields two-columns">
204
- <Field label="Stack profile">
205
- <input
206
- required
207
- value={config.stack.profile}
208
- onChange={(event) =>
209
- setConfig({
210
- ...config,
211
- stack: { ...config.stack, profile: event.target.value },
212
- })
213
- }
214
- />
215
- </Field>
216
- <Field label={locale === "pt-BR" ? "Frontend" : "Frontend"}>
217
- <input
218
- placeholder="TypeScript, JavaScript"
219
- value={languages.frontend}
220
- onChange={(event) => setLanguages({ ...languages, frontend: event.target.value })}
221
- />
222
- </Field>
223
- <Field label={locale === "pt-BR" ? "Backend" : "Backend"}>
224
- <input
225
- placeholder="TypeScript, Python"
226
- value={languages.backend}
227
- onChange={(event) => setLanguages({ ...languages, backend: event.target.value })}
228
- />
229
- </Field>
230
- <Field label={locale === "pt-BR" ? "Site" : "Site"}>
231
- <input
232
- placeholder="Astro, TypeScript"
233
- value={languages.site}
234
- onChange={(event) => setLanguages({ ...languages, site: event.target.value })}
235
- />
236
- </Field>
237
- </div>
238
- <Field
239
- hint={
240
- locale === "pt-BR"
241
- ? "Objeto JSON. Chaves existentes são preservadas; linguagens são controladas pelos campos acima."
242
- : "JSON object. Existing keys are preserved; languages are controlled by the fields above."
243
- }
244
- label={locale === "pt-BR" ? "Demais overrides" : "Additional overrides"}
245
- >
246
- <textarea
247
- rows={7}
248
- value={otherOverrides}
249
- onChange={(event) => setOtherOverrides(event.target.value)}
312
+ <p className="project-stack-guide">{text.componentGuide}</p>
313
+ {stackComponents ? (
314
+ <StackComponentEditor
315
+ components={stackComponents}
316
+ locale={locale}
317
+ onChange={setStackComponents}
318
+ referenceHint={text.referenceHint}
319
+ versionHint={text.versionHint}
250
320
  />
251
- </Field>
252
- </SettingsCard>
253
-
254
- <SettingsCard title={text.clients}>
255
- <Toggle
256
- checked={config.clients.codex}
257
- label="Codex"
258
- onChange={(codex) => setConfig({ ...config, clients: { ...config.clients, codex } })}
259
- />
260
- <Toggle
261
- checked={config.clients.claude}
262
- label="Claude"
263
- onChange={(claude) =>
264
- setConfig({ ...config, clients: { ...config.clients, claude } })
265
- }
266
- />
267
- <Toggle
268
- checked={config.tracking.enabled}
269
- label={locale === "pt-BR" ? "Rastreamento ativo" : "Tracking enabled"}
270
- onChange={(enabled) =>
271
- setConfig({ ...config, tracking: { ...config.tracking, enabled } })
272
- }
273
- />
274
- <Field label={locale === "pt-BR" ? "Moeda ISO 4217" : "ISO 4217 currency"}>
275
- <input
276
- maxLength={3}
277
- required
278
- value={config.tracking.currency}
279
- onChange={(event) =>
280
- setConfig({
281
- ...config,
282
- tracking: {
283
- ...config.tracking,
284
- currency: event.target.value.toUpperCase(),
285
- },
286
- })
287
- }
288
- />
289
- </Field>
290
- <Field label="Storage mode">
291
- <select
292
- value={config.tracking.storage_mode}
293
- onChange={(event) =>
294
- setConfig({
295
- ...config,
296
- tracking: {
297
- ...config.tracking,
298
- storage_mode: event.target.value as "tracked_sanitized" | "local_only",
299
- },
300
- })
301
- }
302
- >
303
- <option value="tracked_sanitized">tracked_sanitized</option>
304
- <option value="local_only">local_only</option>
305
- </select>
306
- </Field>
307
- </SettingsCard>
308
-
309
- <SettingsCard className="is-wide" title={text.models}>
310
- <OptionalSectionToggle
311
- checked={config.model_orchestration !== undefined}
312
- label={
313
- locale === "pt-BR"
314
- ? "Incluir configuração de modelos"
315
- : "Include model configuration"
316
- }
317
- onChange={(checked) =>
318
- setConfig({
319
- ...config,
320
- model_orchestration: checked ? defaultModelOrchestration() : undefined,
321
- })
322
- }
323
- />
324
- {config.model_orchestration ? (
325
- <ModelOrchestrationFields config={config} setConfig={setConfig} />
326
321
  ) : null}
322
+ <StackVersions components={overview?.stack_components ?? []} text={text} />
323
+ <details className="project-settings-advanced">
324
+ <summary>{text.overrides}</summary>
325
+ <Field
326
+ hint={text.overridesHint}
327
+ label={locale === "pt-BR" ? "Overrides" : "Overrides"}
328
+ >
329
+ <textarea
330
+ rows={7}
331
+ value={otherOverrides}
332
+ onChange={(event) => setOtherOverrides(event.target.value)}
333
+ />
334
+ </Field>
335
+ </details>
327
336
  </SettingsCard>
328
337
 
329
338
  <SettingsCard title={text.execution}>
330
339
  <OptionalSectionToggle
331
340
  checked={config.execution !== undefined}
341
+ hint={text.executionToggleHint}
332
342
  label={
333
343
  locale === "pt-BR"
334
344
  ? "Incluir configuração de execução"
@@ -343,7 +353,7 @@ export function ProjectSettingsPage({
343
353
  />
344
354
  {config.execution ? (
345
355
  <>
346
- <Field label="Runtime">
356
+ <Field hint={text.runtimeHint} label="Runtime">
347
357
  <select
348
358
  value={config.execution.runtime}
349
359
  onChange={(event) =>
@@ -361,7 +371,7 @@ export function ProjectSettingsPage({
361
371
  </select>
362
372
  </Field>
363
373
  {config.execution.runtime === "autonomous" ? (
364
- <AutonomousExecutionFields config={config} setConfig={setConfig} />
374
+ <AutonomousExecutionFields config={config} setConfig={setConfig} text={text} />
365
375
  ) : null}
366
376
  </>
367
377
  ) : null}
@@ -370,6 +380,7 @@ export function ProjectSettingsPage({
370
380
  <SettingsCard title={text.assurance}>
371
381
  <OptionalSectionToggle
372
382
  checked={config.assurance !== undefined}
383
+ hint={text.assuranceToggleHint}
373
384
  label={locale === "pt-BR" ? "Incluir assurance" : "Include assurance"}
374
385
  onChange={(checked) =>
375
386
  setConfig({
@@ -382,10 +393,16 @@ export function ProjectSettingsPage({
382
393
  />
383
394
  {config.assurance ? (
384
395
  <>
385
- <Field label="Version">
396
+ <Field
397
+ hint={text.assuranceVersionHint}
398
+ label={locale === "pt-BR" ? "Versão" : "Version"}
399
+ >
386
400
  <input readOnly value={config.assurance.version} />
387
401
  </Field>
388
- <Field label="Standard depth">
402
+ <Field
403
+ hint={text.assuranceDepthHint}
404
+ label={locale === "pt-BR" ? "Profundidade padrão" : "Standard depth"}
405
+ >
389
406
  <select
390
407
  value={config.assurance.standard_depth}
391
408
  onChange={(event) =>
@@ -409,7 +426,8 @@ export function ProjectSettingsPage({
409
426
  </Field>
410
427
  <Toggle
411
428
  checked={config.assurance.require_final_commit}
412
- label="Require final commit"
429
+ hint={text.finalCommitHint}
430
+ label={locale === "pt-BR" ? "Exigir commit final" : "Require final commit"}
413
431
  onChange={(require_final_commit) =>
414
432
  setConfig({
415
433
  ...config,
@@ -442,51 +460,69 @@ export function ProjectSettingsPage({
442
460
  }
443
461
  />
444
462
  {config.context ? (
445
- <div className="project-settings-fields two-columns">
446
- <Field
447
- hint={locale === "pt-BR" ? "Uma raiz por linha." : "One root per line."}
448
- label="Canonical roots"
449
- >
450
- <textarea
451
- required
452
- rows={5}
453
- value={config.context.canonical_roots.join("\n")}
454
- onChange={(event) =>
455
- setConfig({
456
- ...config,
457
- context: {
458
- ...(config.context ?? {
459
- canonical_roots: ["packages"],
460
- projection_roots: [],
461
- }),
462
- canonical_roots: lineList(event.target.value),
463
- },
464
- })
463
+ <>
464
+ <div className="project-settings-guidance">
465
+ <p>{text.contextGuide}</p>
466
+ <p>{text.contextDomains}</p>
467
+ </div>
468
+ <div className="project-settings-fields two-columns">
469
+ <Field
470
+ hint={
471
+ locale === "pt-BR"
472
+ ? "Uma pasta por linha. Estas são as fontes principais do projeto."
473
+ : "One folder per line. These are the project's primary sources."
465
474
  }
466
- />
467
- </Field>
468
- <Field
469
- hint={locale === "pt-BR" ? "Uma raiz por linha." : "One root per line."}
470
- label="Projection roots"
471
- >
472
- <textarea
473
- rows={5}
474
- value={config.context.projection_roots.join("\n")}
475
- onChange={(event) =>
476
- setConfig({
477
- ...config,
478
- context: {
479
- ...(config.context ?? {
480
- canonical_roots: ["packages"],
481
- projection_roots: [],
482
- }),
483
- projection_roots: lineList(event.target.value),
484
- },
485
- })
475
+ label={locale === "pt-BR" ? "Fontes canônicas" : "Canonical sources"}
476
+ >
477
+ <textarea
478
+ required
479
+ rows={5}
480
+ value={config.context.canonical_roots.join("\n")}
481
+ onChange={(event) =>
482
+ setConfig({
483
+ ...config,
484
+ context: {
485
+ ...(config.context ?? {
486
+ canonical_roots: ["packages"],
487
+ projection_roots: [],
488
+ }),
489
+ canonical_roots: lineList(event.target.value),
490
+ },
491
+ })
492
+ }
493
+ />
494
+ </Field>
495
+ <Field
496
+ hint={
497
+ locale === "pt-BR"
498
+ ? "Uma pasta por linha. São saídas geradas, não fontes de contexto normal."
499
+ : "One folder per line. These are generated outputs, not normal context sources."
486
500
  }
487
- />
488
- </Field>
489
- </div>
501
+ label={
502
+ locale === "pt-BR"
503
+ ? "Saídas geradas/publicadas"
504
+ : "Generated/published outputs"
505
+ }
506
+ >
507
+ <textarea
508
+ rows={5}
509
+ value={config.context.projection_roots.join("\n")}
510
+ onChange={(event) =>
511
+ setConfig({
512
+ ...config,
513
+ context: {
514
+ ...(config.context ?? {
515
+ canonical_roots: ["packages"],
516
+ projection_roots: [],
517
+ }),
518
+ projection_roots: lineList(event.target.value),
519
+ },
520
+ })
521
+ }
522
+ />
523
+ </Field>
524
+ </div>
525
+ </>
490
526
  ) : null}
491
527
  </SettingsCard>
492
528
  </div>
@@ -531,23 +567,28 @@ function Field({ children, hint, label }: { children: ReactNode; hint?: string;
531
567
 
532
568
  function Toggle({
533
569
  checked,
570
+ hint,
534
571
  label,
535
572
  onChange,
536
573
  }: {
537
574
  checked: boolean;
575
+ hint?: string;
538
576
  label: string;
539
577
  onChange: (checked: boolean) => void;
540
578
  }) {
541
579
  return (
542
- <label className="project-settings-toggle">
543
- <input
544
- checked={checked}
545
- onChange={(event) => onChange(event.target.checked)}
546
- type="checkbox"
547
- />
548
- <span aria-hidden="true" />
549
- <strong>{label}</strong>
550
- </label>
580
+ <div className="project-settings-toggle-field">
581
+ <label className="project-settings-toggle">
582
+ <input
583
+ checked={checked}
584
+ onChange={(event) => onChange(event.target.checked)}
585
+ type="checkbox"
586
+ />
587
+ <span aria-hidden="true" />
588
+ <strong>{label}</strong>
589
+ </label>
590
+ {hint ? <small>{hint}</small> : null}
591
+ </div>
551
592
  );
552
593
  }
553
594
 
@@ -555,111 +596,14 @@ function OptionalSectionToggle(props: Parameters<typeof Toggle>[0]) {
555
596
  return <Toggle {...props} />;
556
597
  }
557
598
 
558
- function ModelOrchestrationFields({
559
- config,
560
- setConfig,
561
- }: {
562
- config: ProjectConfigSettings;
563
- setConfig: (config: ProjectConfigSettings) => void;
564
- }) {
565
- const model = config.model_orchestration ?? modelOrchestrationForMode("auto");
566
- return (
567
- <div className="project-settings-fields two-columns">
568
- <Field label="Mode">
569
- <select
570
- value={model.mode}
571
- onChange={(event) =>
572
- setConfig({
573
- ...config,
574
- model_orchestration: modelOrchestrationForMode(
575
- event.target.value as "manual" | "off" | "auto",
576
- ),
577
- })
578
- }
579
- >
580
- <option value="manual">manual</option>
581
- <option value="off">off</option>
582
- <option value="auto">auto</option>
583
- </select>
584
- </Field>
585
- <Field label="Notice">
586
- <select
587
- value={model.notice}
588
- onChange={(event) =>
589
- setConfig({
590
- ...config,
591
- model_orchestration: {
592
- ...model,
593
- notice: event.target.value as "always" | "mismatch",
594
- },
595
- })
596
- }
597
- >
598
- <option value="mismatch">mismatch</option>
599
- <option value="always">always</option>
600
- </select>
601
- </Field>
602
- {model.mode === "off" ? (
603
- <>
604
- <Field label="Default model">
605
- <input
606
- required
607
- value={model.default_model}
608
- onChange={(event) =>
609
- setConfig({
610
- ...config,
611
- model_orchestration: { ...model, default_model: event.target.value },
612
- })
613
- }
614
- />
615
- </Field>
616
- <Field label="Default effort">
617
- <input
618
- required
619
- value={model.default_effort}
620
- onChange={(event) =>
621
- setConfig({
622
- ...config,
623
- model_orchestration: { ...model, default_effort: event.target.value },
624
- })
625
- }
626
- />
627
- </Field>
628
- <Field label="Default velocity">
629
- <input
630
- required
631
- value={model.default_velocity}
632
- onChange={(event) =>
633
- setConfig({
634
- ...config,
635
- model_orchestration: { ...model, default_velocity: event.target.value },
636
- })
637
- }
638
- />
639
- </Field>
640
- </>
641
- ) : (
642
- <div className="project-settings-fixed">
643
- <strong>
644
- {model.default_model} · {model.default_effort} · {model.default_velocity}
645
- </strong>
646
- {model.mode === "auto" ? (
647
- <span>
648
- {model.allowed_models.join(", ")} · {model.allowed_efforts.join(", ")} · spec, prd
649
- </span>
650
- ) : null}
651
- </div>
652
- )}
653
- </div>
654
- );
655
- }
656
-
657
599
  function AutonomousExecutionFields({
658
600
  config,
659
601
  setConfig,
602
+ text,
660
603
  }: {
661
604
  config: ProjectConfigSettings;
662
605
  setConfig: (config: ProjectConfigSettings) => void;
606
+ text: (typeof copy)[Locale];
663
607
  }) {
664
608
  const execution =
665
609
  config.execution?.runtime === "autonomous" ? config.execution : defaultAutonomousExecution();
@@ -667,7 +611,7 @@ function AutonomousExecutionFields({
667
611
  setConfig({ ...config, execution: { runtime: "autonomous", autonomous } });
668
612
  return (
669
613
  <>
670
- <Field label="Provider">
614
+ <Field hint={text.providerHint} label="Provider">
671
615
  <select
672
616
  value={execution.autonomous.provider}
673
617
  onChange={(event) =>
@@ -681,14 +625,14 @@ function AutonomousExecutionFields({
681
625
  <option value="claude">claude</option>
682
626
  </select>
683
627
  </Field>
684
- <Field label="Model">
628
+ <Field hint={text.executionModelHint} label="Model">
685
629
  <input
686
630
  required
687
631
  value={execution.autonomous.model}
688
632
  onChange={(event) => update({ ...execution.autonomous, model: event.target.value })}
689
633
  />
690
634
  </Field>
691
- <Field label="Max parallelism">
635
+ <Field hint={text.parallelismHint} label="Max parallelism">
692
636
  <input
693
637
  max={8}
694
638
  min={1}
@@ -702,7 +646,7 @@ function AutonomousExecutionFields({
702
646
  }
703
647
  />
704
648
  </Field>
705
- <Field label="Lease (ms)">
649
+ <Field hint={text.leaseHint} label="Lease (ms)">
706
650
  <input
707
651
  max={3_600_000}
708
652
  min={5_000}