@zaip-ai/cli 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/README.md +36 -13
  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 +26 -9
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/agent-adapters.js +37 -18
  7. package/dist/services/agent-adapters.js.map +1 -1
  8. package/dist/services/agent-discovery.d.ts +27 -0
  9. package/dist/services/agent-discovery.d.ts.map +1 -0
  10. package/dist/services/agent-discovery.js +73 -0
  11. package/dist/services/agent-discovery.js.map +1 -0
  12. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  13. package/dist/services/codex-conversation-lifecycle-hook.js +164 -24
  14. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  15. package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
  16. package/dist/services/codex-pre-tool-hook-template.js +146 -72
  17. package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
  18. package/dist/services/codex-rules.d.ts +1 -1
  19. package/dist/services/codex-rules.d.ts.map +1 -1
  20. package/dist/services/codex-rules.js +3 -3
  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 +117 -66
  24. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  25. package/dist/services/install-agents-template.d.ts.map +1 -1
  26. package/dist/services/install-agents-template.js +65 -7
  27. package/dist/services/install-agents-template.js.map +1 -1
  28. package/dist/services/logger.js +1 -1
  29. package/dist/services/logger.js.map +1 -1
  30. package/dist/services/logger.test.js +22 -1
  31. package/dist/services/logger.test.js.map +1 -1
  32. package/dist/services/runtime-template.test.js +153 -1
  33. package/dist/services/runtime-template.test.js.map +1 -1
  34. package/dist/services/transactional-files.d.ts.map +1 -1
  35. package/dist/services/transactional-files.js +59 -14
  36. package/dist/services/transactional-files.js.map +1 -1
  37. package/package.json +1 -1
  38. package/templates/.agents/.env.example +9 -3
  39. package/templates/.agents/README-ENG.md +101 -15
  40. package/templates/.agents/README.md +102 -17
  41. package/templates/.agents/architecture/software-architecture.md +1 -59
  42. package/templates/.agents/branding/brandbook.md +3 -0
  43. package/templates/.agents/config/agents/catalog.yaml +25 -10
  44. package/templates/.agents/config/agents/discovery.json +319 -0
  45. package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +1 -1
  46. package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +1 -1
  47. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +3 -3
  48. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -1
  49. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +3 -3
  50. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +12 -9
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -1
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +3 -3
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +2 -2
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +3 -3
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -1
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -1
  57. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -1
  58. package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +1 -1
  59. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +1 -1
  60. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +13 -10
  61. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -1
  62. package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +1 -1
  63. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -1
  64. package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +1 -1
  65. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +3 -3
  66. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +3 -3
  67. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -1
  68. package/templates/.agents/config/pricing/models.json +9 -5
  69. package/templates/.agents/config/project.yaml +22 -2
  70. package/templates/.agents/dashboard/.zaip-managed.json +530 -138
  71. package/templates/.agents/dashboard/README.md +16 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-CEDZjl4V.js +1 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-DaSllaJp.js → DashboardHelpDialog-TnrL1ZyZ.js} +967 -578
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-DjQpBqGU.js +1 -0
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-B9GWkEyN.css +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BAvLPAee.js +3 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BQZXUnQu.js +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-06__WZco.js +68 -0
  79. package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-Basaw1NR.js +824 -0
  80. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-TPUT2IUt.js → icons-vendor-DEmo6Tn2.js} +1 -1
  81. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-BQe3zTvL.js +2 -0
  82. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-Ct48XHGL.js → react-vendor-CadYsm83.js} +1 -1
  83. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-Bh1tDfsg.js +1 -0
  84. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BzKK8kK3.js +1 -0
  85. package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
  86. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  87. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +3 -1264
  88. package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +368 -0
  89. package/templates/.agents/dashboard/apps/frontend/src/AutonomySettings.tsx +82 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +130 -0
  91. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +206 -157
  92. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +3 -1
  93. package/templates/.agents/dashboard/apps/frontend/src/__tests__/app-composition-support.ts +12 -0
  94. package/templates/.agents/dashboard/apps/frontend/src/cost-monitor-population.test.tsx +149 -0
  95. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +9 -7
  96. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +152 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +19 -0
  98. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +50 -154
  99. package/templates/.agents/dashboard/apps/frontend/src/dashboard-app-shell.tsx +33 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.test.ts +54 -0
  101. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.ts +48 -0
  102. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.test.ts +37 -43
  103. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +9 -251
  104. package/templates/.agents/dashboard/apps/frontend/src/dashboard-project-overview.ts +35 -2
  105. package/templates/.agents/dashboard/apps/frontend/src/dashboard-retry.ts +17 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/dashboard-setup-route.ts +29 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.test.ts +51 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.ts +68 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +38 -2
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +19 -4
  111. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +5 -3
  112. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +2 -2
  113. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.test.ts +137 -0
  114. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.ts +66 -0
  115. package/templates/.agents/dashboard/apps/frontend/src/project-settings-copy.ts +181 -0
  116. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +11 -1
  117. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +102 -51
  118. package/templates/.agents/dashboard/apps/frontend/src/project-settings-state.css +55 -0
  119. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +14 -2
  120. package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.test.ts +36 -0
  121. package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.ts +30 -0
  122. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +2 -5
  123. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +31 -20
  124. package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.ts +1 -2
  125. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +6 -0
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +2 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +9 -1
  128. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +3 -1
  129. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-task-pagination.ts +66 -0
  130. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +397 -0
  131. package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +782 -0
  132. package/templates/.agents/dashboard/apps/frontend/src/use-snapshot-notice.tsx +49 -0
  133. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  134. package/templates/.agents/dashboard/modules/cost-monitor/src/complete-cost-average.test.ts +73 -0
  135. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +9 -0
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/period-averages.ts +60 -0
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperPanelSlot.tsx +16 -0
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +459 -0
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +8 -22
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +27 -17
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +64 -189
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorRunDialog.tsx +20 -0
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostPeriodAverageCards.tsx +32 -8
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-hides-calls-that-have-no-collected.test.ts +80 -0
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +455 -0
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +18 -525
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +32 -508
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-export-sources.ts +74 -0
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-actions.ts +19 -0
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +49 -0
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +3 -2
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-formatters.ts +115 -0
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +1 -42
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +2 -1
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test-fixtures.ts +2 -0
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +3 -2
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +8 -2
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  159. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  160. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +4 -0
  161. package/templates/.agents/dashboard/modules/operations/src/react/EntityTableBadges.tsx +34 -0
  162. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +8 -38
  163. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview-keeps-structure-classes-mutually-exclusive.test.ts +244 -0
  164. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +66 -3
  165. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +98 -276
  166. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +105 -276
  167. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewCharts.tsx +171 -0
  168. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewPanels.tsx +64 -0
  169. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +9 -17
  170. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +3 -0
  171. package/templates/.agents/dashboard/modules/operations/src/react/OverviewCostKpi.tsx +46 -0
  172. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +2 -1
  173. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +28 -1
  174. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +11 -4
  175. package/templates/.agents/dashboard/modules/operations/src/react/index.ts +1 -0
  176. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +2 -1
  177. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +8 -4
  178. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +34 -22
  179. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +3 -1
  180. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +21 -2
  181. package/templates/.agents/dashboard/modules/operations/src/react/overview-cost-card.test.tsx +89 -0
  182. package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-format.ts +32 -0
  183. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +3 -3
  184. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +2 -1
  185. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  186. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  187. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  188. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  189. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  190. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1625 -1613
  191. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1592 -1582
  192. package/templates/.agents/dashboard/packages/local-runtime/package.json +3 -2
  193. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +22 -28
  194. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1625 -1614
  195. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +25 -0
  196. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +1 -1
  197. package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.test.ts +142 -0
  198. package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.ts +190 -0
  199. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +118 -8
  200. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +92 -36
  201. package/templates/.agents/dashboard/packages/local-runtime/src/projection-refresh-diagnostics.ts +35 -0
  202. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.test.ts +91 -0
  203. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.ts +24 -4
  204. package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +168 -0
  205. package/templates/.agents/dashboard/packages/local-runtime/src/server-dual-reads-manifest-summaries-without-losing.test.ts +344 -0
  206. package/templates/.agents/dashboard/packages/local-runtime/src/server-hono-security.test.ts +17 -0
  207. package/templates/.agents/dashboard/packages/local-runtime/src/server-http-contracts.ts +31 -0
  208. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-routes.ts +364 -0
  209. package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +461 -0
  210. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +78 -0
  211. package/templates/.agents/dashboard/packages/local-runtime/src/server-route-context.ts +13 -0
  212. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +94 -2
  213. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +62 -12
  214. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +44 -0
  215. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +22 -3
  216. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -21
  217. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.test.ts +97 -0
  218. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +10 -13
  219. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-view-allowlist.test.ts +25 -0
  220. package/templates/.agents/dashboard/packages/local-runtime/src/server-trace-routes.ts +56 -0
  221. package/templates/.agents/dashboard/packages/local-runtime/src/server-traceability-index.test.ts +84 -0
  222. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +2 -30
  223. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +6 -23
  224. package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +1 -1
  225. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +2 -330
  226. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +87 -1060
  227. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-dimension-facts.test.ts +12 -1
  228. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-file-index.test.ts +69 -0
  229. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +3 -1
  230. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-force-canonical.test.ts +3 -1
  231. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-refresh.test.ts +2 -0
  232. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-first-fold.ts +78 -0
  233. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +570 -0
  234. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-runs.ts +600 -0
  235. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +1 -1
  236. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-period-averages.ts +46 -0
  237. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-provider-alias-parity.test.ts +50 -0
  238. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +269 -0
  239. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-context.ts +32 -0
  240. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +244 -0
  241. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +303 -0
  242. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +547 -0
  243. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +360 -0
  244. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +169 -0
  245. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +493 -0
  246. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-temporal-dimension.ts +134 -0
  247. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-timing.ts +299 -0
  248. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +692 -0
  249. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +763 -0
  250. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-does-not-convert-delayed-historical-finalizer.test.ts +706 -0
  251. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +762 -0
  252. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +1 -1
  253. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-keeps-orphan-telemetry-out-kanban-without.test.ts +710 -0
  254. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-marks-token-cost-telemetry-unavailable-when.test.ts +618 -0
  255. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +764 -0
  256. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuilds-disposable-snapshot-serves-zaip-records.test.ts +276 -0
  257. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +193 -0
  258. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +54 -1
  259. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +7 -3
  260. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-types.ts +123 -0
  261. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +5 -2806
  262. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +17 -6930
  263. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-risk-population.test.ts +98 -0
  264. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +390 -0
  265. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +413 -0
  266. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-seed.test.ts +2 -0
  267. package/templates/.agents/dashboard/packages/local-runtime/src/verify-project-settings.mjs +57 -0
  268. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +4 -3
  269. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-build.mjs +195 -0
  270. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.test.mjs +2 -7
  271. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-logging.mjs +35 -0
  272. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-navigation.mjs +114 -0
  273. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-paths.mjs +90 -0
  274. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +89 -418
  275. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +22 -12
  276. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  277. package/templates/.agents/dashboard/scripts/qualify-observability.mjs +130 -0
  278. package/templates/.agents/dashboard/scripts/verify-autonomy-settings.mjs +175 -0
  279. package/templates/.agents/dashboard/scripts/verify-observability.mjs +254 -0
  280. package/templates/.agents/dashboard/scripts/verify-project-setup.mjs +64 -0
  281. package/templates/.agents/dashboard/tests/e2e/lease-global-setup.ts +37 -0
  282. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  283. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +9 -4
  284. package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-period-transition.spec.ts +22 -1
  285. package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +17 -8
  286. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +47 -6
  287. package/templates/.agents/dashboard/tests/e2e/specs/lease-lifetime.spec.ts +14 -0
  288. package/templates/.agents/dashboard/tests/observability-fixture.mjs +200 -0
  289. package/templates/.agents/design/.zaip-managed.json +86 -42
  290. package/templates/.agents/design/DESIGN.md +2 -186
  291. package/templates/.agents/design/README.md +12 -2
  292. package/templates/.agents/design/apps/catalog/dist/assets/index-BJV597iq.js +72 -0
  293. package/templates/.agents/design/apps/catalog/dist/assets/index-BOjCcUaU.js +72 -0
  294. package/templates/.agents/design/apps/catalog/dist/assets/index-B_WhrCZe.js +72 -0
  295. package/templates/.agents/design/apps/catalog/dist/assets/index-CqtYXZfV.js +72 -0
  296. package/templates/.agents/design/apps/catalog/dist/assets/index-D_lfqoyx.js +72 -0
  297. package/templates/.agents/design/apps/catalog/dist/assets/index-i_PO2k9R.js +9 -0
  298. package/templates/.agents/design/apps/catalog/dist/index.html +1 -1
  299. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-Cstn1UwA.js +1 -0
  300. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{Color-6AOWCN3U-B-kAgAjB.js → Color-6AOWCN3U-Cm-yJJz_.js} +1 -1
  301. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-D1WopB2L.js +137 -0
  302. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DQ9PJ3N3.js +1 -0
  303. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{DocsRenderer-JROSPFPF-BVN7xHtv.js → DocsRenderer-JROSPFPF-Belk4jRr.js} +4 -4
  304. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{WithTooltip-7X4HQR7L-CDHtKYkz.js → WithTooltip-7X4HQR7L-DoPvjkS1.js} +1 -1
  305. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-DRQKCCAG-D6AsDkMK.js → chunk-DRQKCCAG-B1itKXEN.js} +1 -1
  306. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-W22LQPXL-B4m5uloN.js → chunk-W22LQPXL-C-Eb5SPY.js} +1 -1
  307. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{components-CN8YyTUg.js → components-DnyKLwhj.js} +5 -5
  308. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-D0OSgxWz.js +1 -0
  309. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{iframe-9yZfIsdT.js → iframe-DcXBsFPz.js} +3 -3
  310. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{react-18-BoCSnq6H.js → react-18-CRM89QRf.js} +1 -1
  311. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-C3tkVMIp.js +1 -0
  312. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{syntaxhighlighter-YFXUGROL-Bnn_nMwJ.js → syntaxhighlighter-YFXUGROL-B03jQGTF.js} +1 -1
  313. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{theming-DS_ue2sb.js → theming-4ZyufAga.js} +1 -1
  314. package/templates/.agents/design/apps/catalog/dist/storybook/iframe.html +1 -1
  315. package/templates/.agents/design/apps/catalog/dist/storybook/index.json +1 -1
  316. package/templates/.agents/design/apps/catalog/package.json +2 -2
  317. package/templates/.agents/design/apps/catalog/src/components/AutonomySpecimen.tsx +15 -0
  318. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.test.tsx +19 -0
  319. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.tsx +45 -0
  320. package/templates/.agents/design/apps/catalog/src/components/EstimatedCostSpecimen.tsx +48 -0
  321. package/templates/.agents/design/apps/catalog/src/components/ProjectStatusSpecimen.tsx +169 -0
  322. package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +55 -0
  323. package/templates/.agents/design/apps/catalog/src/stories/Components.stories.tsx +60 -0
  324. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  325. package/templates/.agents/growth/strategy.md +3 -0
  326. package/templates/.agents/marketing/strategy.md +3 -0
  327. package/templates/.agents/requirements/autonomous-assurance.md +2 -1
  328. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  329. package/templates/.agents/requirements/comparative-audit.md +1 -1
  330. package/templates/.agents/requirements/context-engine.md +1 -1
  331. package/templates/.agents/requirements/cost-observability.md +1 -1
  332. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  333. package/templates/.agents/requirements/data-export.md +1 -1
  334. package/templates/.agents/requirements/design-system.md +13 -4
  335. package/templates/.agents/requirements/execution-engine.md +1 -1
  336. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  337. package/templates/.agents/requirements/model-orchestration.md +1 -1
  338. package/templates/.agents/requirements/public-distribution.md +4 -2
  339. package/templates/.agents/requirements/software-architecture.md +1 -1
  340. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  341. package/templates/.agents/requirements/work-lifecycle.md +6 -6
  342. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  343. package/templates/.agents/rules/architecture.md +2 -0
  344. package/templates/.agents/rules/astra-diagnostic.md +3 -1
  345. package/templates/.agents/rules/autonomy-decision.md +12 -2
  346. package/templates/.agents/rules/cloud-hostinger-autonomy.md +2 -0
  347. package/templates/.agents/rules/context.md +2 -1
  348. package/templates/.agents/rules/core.md +15 -4
  349. package/templates/.agents/rules/design-system-central-contract.md +17 -0
  350. package/templates/.agents/rules/evolution.md +3 -1
  351. package/templates/.agents/rules/frontend-lite.md +3 -1
  352. package/templates/.agents/rules/local-sqlite-storage.md +2 -2
  353. package/templates/.agents/rules/meta-mcp.md +3 -1
  354. package/templates/.agents/rules/model-orchestration.md +1 -1
  355. package/templates/.agents/rules/run-lifecycle-closure.md +11 -7
  356. package/templates/.agents/rules/security.md +3 -1
  357. package/templates/.agents/rules/specialist-routing.md +3 -1
  358. package/templates/.agents/rules/text-writing-utf8.md +1 -1
  359. package/templates/.agents/rules/workflow.md +7 -5
  360. package/templates/.agents/runtime/VERSION +1 -1
  361. package/templates/.agents/runtime/bin/zaip.mjs +821 -516
  362. package/templates/.agents/runtime/checksums.sha256 +6 -6
  363. package/templates/.agents/runtime/manifest.json +1 -1
  364. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  365. package/templates/.agents/runtime/provenance.json +5 -5
  366. package/templates/.agents/runtime/sbom.cdx.json +3 -3
  367. package/templates/.agents/sales/playbook.md +3 -0
  368. package/templates/.agents/skills/zaip-aios/SKILL.md +5 -3
  369. package/templates/.agents/skills/zaip-skill-adapt-stack/SKILL.md +1 -0
  370. package/templates/.agents/skills/zaip-skill-api-contracts/SKILL.md +14 -0
  371. package/templates/.agents/skills/zaip-skill-api-contracts/agents/openai.yaml +4 -0
  372. package/templates/.agents/skills/zaip-skill-application-observability/SKILL.md +15 -0
  373. package/templates/.agents/skills/zaip-skill-application-observability/agents/openai.yaml +4 -0
  374. package/templates/.agents/skills/zaip-skill-application-observability/references/signal-design.md +3 -0
  375. package/templates/.agents/skills/zaip-skill-application-readiness/SKILL.md +15 -0
  376. package/templates/.agents/skills/zaip-skill-application-readiness/agents/openai.yaml +4 -0
  377. package/templates/.agents/skills/zaip-skill-application-readiness/references/evidence-matrix.md +3 -0
  378. package/templates/.agents/skills/zaip-skill-architecture-design/SKILL.md +14 -0
  379. package/templates/.agents/skills/zaip-skill-architecture-design/agents/openai.yaml +4 -0
  380. package/templates/.agents/skills/zaip-skill-async-jobs/SKILL.md +14 -0
  381. package/templates/.agents/skills/zaip-skill-async-jobs/agents/openai.yaml +4 -0
  382. package/templates/.agents/skills/zaip-skill-auth-tenancy/SKILL.md +15 -0
  383. package/templates/.agents/skills/zaip-skill-auth-tenancy/agents/openai.yaml +4 -0
  384. package/templates/.agents/skills/zaip-skill-auth-tenancy/references/data-access-paths.md +9 -0
  385. package/templates/.agents/skills/zaip-skill-auth-tenancy/references/worker-scenario.md +5 -0
  386. package/templates/.agents/skills/zaip-skill-auth-tenancy/scripts/worker-contract.test.mjs +27 -0
  387. package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +2 -0
  388. package/templates/.agents/skills/zaip-skill-author-skills/references/engineering-skill-index.md +9 -0
  389. package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +5 -3
  390. package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
  391. package/templates/.agents/skills/zaip-skill-backend/SKILL.md +4 -0
  392. package/templates/.agents/skills/zaip-skill-backend/references/deployment-environments.md +75 -0
  393. package/templates/.agents/skills/zaip-skill-backend/references/supabase-migration-contract.md +23 -0
  394. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +2 -0
  395. package/templates/.agents/skills/zaip-skill-cache-strategy/SKILL.md +14 -0
  396. package/templates/.agents/skills/zaip-skill-cache-strategy/agents/openai.yaml +4 -0
  397. package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
  398. package/templates/.agents/skills/zaip-skill-cloud-engineering/SKILL.md +7 -0
  399. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/SKILL.md +37 -0
  400. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/agents/openai.yaml +6 -0
  401. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workers-static-assets.md +26 -0
  402. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workflow-templates.md +71 -0
  403. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/scripts/cloudflare-github-deploy-contract.test.mjs +77 -0
  404. package/templates/.agents/skills/zaip-skill-config/SKILL.md +21 -11
  405. package/templates/.agents/skills/zaip-skill-config/agents/openai.yaml +2 -2
  406. package/templates/.agents/skills/zaip-skill-container-runtime/SKILL.md +14 -0
  407. package/templates/.agents/skills/zaip-skill-container-runtime/agents/openai.yaml +4 -0
  408. package/templates/.agents/skills/zaip-skill-context/SKILL.md +6 -1
  409. package/templates/.agents/skills/zaip-skill-context/references/prd-spec-task-handoff.md +10 -0
  410. package/templates/.agents/skills/zaip-skill-context/references/rule-selection.md +20 -0
  411. package/templates/.agents/skills/zaip-skill-cqrs/SKILL.md +1 -0
  412. package/templates/.agents/skills/zaip-skill-cybersecurity/SKILL.md +18 -0
  413. package/templates/.agents/skills/zaip-skill-cybersecurity/agents/openai.yaml +4 -0
  414. package/templates/.agents/skills/zaip-skill-cybersecurity/references/audit-contract.md +94 -0
  415. package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.mjs +185 -0
  416. package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.test.mjs +101 -0
  417. package/templates/.agents/skills/zaip-skill-data-modeling/SKILL.md +14 -0
  418. package/templates/.agents/skills/zaip-skill-data-modeling/agents/openai.yaml +4 -0
  419. package/templates/.agents/skills/zaip-skill-database-migrations/SKILL.md +20 -0
  420. package/templates/.agents/skills/zaip-skill-database-migrations/agents/openai.yaml +4 -0
  421. package/templates/.agents/skills/zaip-skill-database-migrations/references/manual-mode.md +15 -0
  422. package/templates/.agents/skills/zaip-skill-database-migrations/references/promotion-example.md +5 -0
  423. package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.mjs +145 -0
  424. package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.test.mjs +178 -0
  425. package/templates/.agents/skills/zaip-skill-dependency-upgrade/SKILL.md +14 -0
  426. package/templates/.agents/skills/zaip-skill-dependency-upgrade/agents/openai.yaml +4 -0
  427. package/templates/.agents/skills/zaip-skill-deployment-pipeline/SKILL.md +15 -0
  428. package/templates/.agents/skills/zaip-skill-deployment-pipeline/agents/openai.yaml +4 -0
  429. package/templates/.agents/skills/zaip-skill-deployment-pipeline/references/runtime-shapes.md +3 -0
  430. package/templates/.agents/skills/zaip-skill-design-system/SKILL.md +20 -9
  431. package/templates/.agents/skills/zaip-skill-dev-environment/SKILL.md +16 -0
  432. package/templates/.agents/skills/zaip-skill-dev-environment/agents/openai.yaml +4 -0
  433. package/templates/.agents/skills/zaip-skill-dev-environment/references/inventory-contract.md +7 -0
  434. package/templates/.agents/skills/zaip-skill-dev-environment/scripts/inventory.mjs +77 -0
  435. package/templates/.agents/skills/zaip-skill-disaster-recovery/SKILL.md +15 -0
  436. package/templates/.agents/skills/zaip-skill-disaster-recovery/agents/openai.yaml +4 -0
  437. package/templates/.agents/skills/zaip-skill-disaster-recovery/references/recovery-scope.md +3 -0
  438. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +31 -8
  439. package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +7 -0
  440. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +18 -8
  441. package/templates/.agents/skills/zaip-skill-external-integrations/SKILL.md +14 -0
  442. package/templates/.agents/skills/zaip-skill-external-integrations/agents/openai.yaml +4 -0
  443. package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -0
  444. package/templates/.agents/skills/zaip-skill-frontend-componentization/SKILL.md +44 -0
  445. package/templates/.agents/skills/zaip-skill-frontend-componentization/agents/openai.yaml +4 -0
  446. package/templates/.agents/skills/zaip-skill-frontend-data-flows/SKILL.md +14 -0
  447. package/templates/.agents/skills/zaip-skill-frontend-data-flows/agents/openai.yaml +4 -0
  448. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +2 -0
  449. package/templates/.agents/skills/zaip-skill-github-actions-setup/SKILL.md +36 -0
  450. package/templates/.agents/skills/zaip-skill-github-actions-setup/agents/openai.yaml +4 -0
  451. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/cloudflare-pages.md +33 -0
  452. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/github.md +63 -0
  453. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/hostinger-vps.md +55 -0
  454. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/npm.md +30 -0
  455. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/check-skill.mjs +55 -0
  456. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.mjs +61 -0
  457. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.test.mjs +128 -0
  458. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-ssh.integration.test.mjs +106 -0
  459. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +42 -76
  460. package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +135 -0
  461. package/templates/.agents/skills/zaip-skill-github-deploy/references/github-release-workflow-template.md +31 -0
  462. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-gate-matrix.md +24 -0
  463. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +44 -0
  464. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-notes.md +134 -0
  465. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +389 -0
  466. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +134 -0
  467. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +25 -2
  468. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness-api.test.mjs +134 -0
  469. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.mjs +98 -0
  470. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.test.mjs +25 -0
  471. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.mjs +159 -0
  472. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.test.mjs +160 -0
  473. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +149 -12
  474. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +64 -5
  475. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/release-notes-coverage.test.mjs +126 -0
  476. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.mjs +78 -0
  477. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.test.mjs +51 -0
  478. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.mjs +184 -0
  479. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.test.mjs +109 -0
  480. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +2 -0
  481. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +18 -10
  482. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +3 -4
  483. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/aws-cli-terraform.md +62 -0
  484. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/guia-iniciante-hostinger-vps.md +183 -0
  485. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +2 -0
  486. package/templates/.agents/skills/zaip-skill-module-scaffold/SKILL.md +14 -0
  487. package/templates/.agents/skills/zaip-skill-module-scaffold/agents/openai.yaml +4 -0
  488. package/templates/.agents/skills/zaip-skill-module-scaffold/references/scaffold-contract.md +9 -0
  489. package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/helpers.test.mjs +121 -0
  490. package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/scaffold.mjs +169 -0
  491. package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +3 -1
  492. package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +1 -1
  493. package/templates/.agents/skills/zaip-skill-performance-engineering/SKILL.md +14 -0
  494. package/templates/.agents/skills/zaip-skill-performance-engineering/agents/openai.yaml +4 -0
  495. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +3 -1
  496. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +1 -0
  497. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +26 -9
  498. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +39 -13
  499. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +1 -0
  500. package/templates/.agents/skills/zaip-skill-refactor-landing-page/SKILL.md +66 -0
  501. package/templates/.agents/skills/zaip-skill-refactor-landing-page/agents/openai.yaml +4 -0
  502. package/templates/.agents/skills/zaip-skill-refactor-landing-page/references/behavioral-dry-run.md +23 -0
  503. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +38 -1
  504. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +122 -0
  505. package/templates/.agents/skills/zaip-skill-review/SKILL.md +1 -0
  506. package/templates/.agents/skills/zaip-skill-rules/SKILL.md +3 -3
  507. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +2 -0
  508. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +21 -21
  509. package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +2 -2
  510. package/templates/.agents/skills/zaip-skill-spec/SKILL.md +3 -2
  511. package/templates/.agents/skills/zaip-skill-storage-uploads/SKILL.md +14 -0
  512. package/templates/.agents/skills/zaip-skill-storage-uploads/agents/openai.yaml +4 -0
  513. package/templates/.agents/skills/zaip-skill-systematic-debugging/SKILL.md +14 -0
  514. package/templates/.agents/skills/zaip-skill-systematic-debugging/agents/openai.yaml +4 -0
  515. package/templates/.agents/skills/zaip-skill-task/SKILL.md +16 -7
  516. package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +25 -0
  517. package/templates/.agents/skills/zaip-skill-test-data/SKILL.md +14 -0
  518. package/templates/.agents/skills/zaip-skill-test-data/agents/openai.yaml +4 -0
  519. package/templates/.agents/skills/zaip-skill-test-data/scripts/generate.mjs +72 -0
  520. package/templates/.agents/skills/zaip-skill-testing-strategy/SKILL.md +15 -0
  521. package/templates/.agents/skills/zaip-skill-testing-strategy/agents/openai.yaml +4 -0
  522. package/templates/.agents/skills/zaip-skill-testing-strategy/references/example-map.md +3 -0
  523. package/templates/.agents/skills/zaip-skill-tool-setup/SKILL.md +2 -0
  524. package/templates/.agents/skills/zaip-skill-website-readiness/SKILL.md +8 -0
  525. package/templates/.agents/zaip-aios/INDEX.md +9 -1
  526. package/templates/.agents/zaip-aios/README.md +23 -2
  527. package/templates/.agents/zaip-aios/VERSION +1 -1
  528. package/templates/.agents/zaip-aios/guides/01-primeiros-passos.md +5 -1
  529. package/templates/.agents/zaip-aios/guides/03-tasks.md +15 -2
  530. package/templates/.agents/zaip-aios/guides/04-specs.md +13 -0
  531. package/templates/.agents/zaip-aios/guides/05-prds.md +13 -0
  532. package/templates/.agents/zaip-aios/guides/06-execucao.md +19 -4
  533. package/templates/.agents/zaip-aios/guides/07-revisao-e-validacao.md +14 -0
  534. package/templates/.agents/zaip-aios/guides/08-contexto-e-tokens.md +4 -3
  535. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +17 -9
  536. package/templates/.agents/zaip-aios/guides/10-seguranca.md +11 -1
  537. package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +69 -0
  538. package/templates/.agents/zaip-aios/guides/12-instalacao-e-upgrade.md +9 -4
  539. package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +7 -1
  540. package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +18 -0
  541. package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +54 -3
  542. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +10 -2
  543. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +186 -5
  544. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +26 -18
  545. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +18 -2
  546. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +14 -2
  547. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +190 -489
  548. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +61 -13
  549. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +18 -0
  550. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +18 -1
  551. package/templates/scripts/validate-cloud-hostinger-contract.mjs +34 -0
  552. package/templates/template-manifest.json +1229 -329
  553. package/templates/.agents/branding/.gitkeep +0 -0
  554. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-snUCQYTC.js +0 -1
  555. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-BPtVUGgs.js +0 -1
  556. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +0 -3
  557. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-GgzpZ_PY.css +0 -1
  558. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BCvZFMEf.js +0 -1
  559. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +0 -68
  560. package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-CLJ0lT9v.js +0 -231
  561. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-_MEktQNM.js +0 -2
  562. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +0 -1
  563. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BDe4_Ubl.js +0 -1
  564. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-BWY-80s4.js +0 -1
  565. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-Be2mDUQj.js +0 -27
  566. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DRx9blDs.js +0 -1
  567. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-EwuTh8Zk.js +0 -1
  568. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-DyL61NPT.js +0 -1
  569. package/templates/.agents/growth/.gitkeep +0 -0
  570. package/templates/.agents/marketing/.gitkeep +0 -0
  571. package/templates/.agents/sales/.gitkeep +0 -0
@@ -0,0 +1,134 @@
1
+ # Release notes contract
2
+
3
+ Every GitHub Release needs an agent-reviewed UTF-8 Markdown body that explains the delivered product
4
+ changes. GitHub's generated notes and a `Full Changelog` comparison are useful navigation aids only;
5
+ neither is an acceptable body on its own. The body opens with a Resumo section containing a short
6
+ plain-language paragraph or bullets before the categorized sections. Write in the project's language;
7
+ the validator's headings below use Brazilian Portuguese. A configured human-only review policy remains
8
+ mandatory where it applies.
9
+
10
+ ## Build the reviewed source
11
+
12
+ 1. Resolve the exact previous Release tag for the same product and channel, then resolve the exact
13
+ candidate commit SHA. Prove the tag is an ancestor of that candidate with git merge-base
14
+ --is-ancestor. Do not substitute the previous Git commit, a moving branch head, or a guessed
15
+ version. For a first release, record that there is no previous tag and inventory the initial
16
+ candidate explicitly with the initial mode.
17
+ 2. Inventory the exact range before writing prose: `git diff --name-status <previous-tag>..<candidate-sha>`
18
+ and the corresponding commit messages. Read the meaningful diffs. This covers direct commits,
19
+ merge commits, and squashed pull requests without relying on PR titles. The file inventory is an
20
+ internal coverage aid, not a release-note dump.
21
+ 3. Group files that implement one outcome into one topic. Deduplicate generated, template, lock, and
22
+ projection files behind their canonical user-facing improvement, but retain every changed file in
23
+ that topic's internal mapping. Do not omit a meaningful change because it is spread across files.
24
+ 4. Write the body in UTF-8 Markdown. After Resumo, use only sections with content: Novidades (feat),
25
+ Correções (fix), Desempenho (perf), Alterações internas (refactor, build, ci, test, chore),
26
+ Segurança, Alterações incompatíveis e migrações, and Documentação. Each topic gets one concrete
27
+ bullet that states the outcome and affected capability, rather than a commit subject or a list of
28
+ paths. Conventional commits are useful input, never a substitute for reviewing the diff.
29
+ 5. Keep an adjacent uncommitted-or-local release inventory JSON while publishing. It must state the
30
+ exact `from` tag, `to` SHA, every changed file, and one or more topics. Each topic has a category,
31
+ a unique bullet copied verbatim into the Markdown body, and the source files it covers. This makes
32
+ coverage mechanically checkable while keeping the published body readable.
33
+
34
+ Illustrative body (replace every example with observed facts):
35
+
36
+ ```md
37
+ ## Resumo
38
+
39
+ - A publicação agora entrega uma descrição revisada e verificável das melhorias.
40
+
41
+ ## Novidades
42
+
43
+ - **Feature:** Releases now include grouped, reviewed summaries of every delivered capability.
44
+
45
+ ## Documentação
46
+
47
+ - **Documentation:** The deploy guide now records the prior release range and validates the published body.
48
+
49
+ Full Changelog: [v2.4...v2.5](https://github.com/owner/repository/compare/v2.4...v2.5)
50
+ ```
51
+
52
+ The optional comparison link belongs after the explanatory bullets. Do not use empty category headings,
53
+ placeholders, `TBD`, `N/A`, a single generic bullet, or a raw file/commit list as a substitute for the
54
+ summary.
55
+
56
+ Example inventory shape:
57
+
58
+ ```json
59
+ {
60
+ "from": "v2.4",
61
+ "to": "0123456789abcdef0123456789abcdef01234567",
62
+ "files": ["src/release-notes.ts", "docs/releases.md"],
63
+ "topics": [
64
+ {
65
+ "category": "feat",
66
+ "bullet": "- **Feature:** Releases now include grouped, reviewed summaries of every delivered capability.",
67
+ "files": ["src/release-notes.ts"]
68
+ },
69
+ {
70
+ "category": "docs",
71
+ "bullet": "- **Documentation:** The deploy guide now records the prior release range and validates the published body.",
72
+ "files": ["docs/releases.md"]
73
+ }
74
+ ]
75
+ }
76
+ ```
77
+
78
+ ## Validate, publish, and read back
79
+
80
+ Use a local working path such as `.local/release-notes-<tag>.md` and
81
+ `.local/release-notes-<tag>.inventory.json`; never commit temporary release-note working files unless the
82
+ repository explicitly owns them. Before creating the Release, validate the actual Git range, inventory,
83
+ and reviewed body:
84
+
85
+ ```powershell
86
+ node .agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.mjs --repository . --from <previous-tag> --to <candidate-sha> --notes-file .local/release-notes-<tag>.md --inventory-file .local/release-notes-<tag>.inventory.json
87
+ gh release create <tag> --repo <owner/repo> --target <candidate-sha> --title <title> --notes-file .local/release-notes-<tag>.md --prerelease --latest=false
88
+ ```
89
+
90
+ Read the release back after creation. Save the returned `body` as UTF-8 and run the same validator with
91
+ the same range and inventory. Also inspect the returned title, tag, target commit, prerelease state, and
92
+ URL. A mismatch, missing bullet, compare-only body, or incomplete inventory is a release failure that
93
+ must be corrected by editing the authorized Release body and reading it back again.
94
+
95
+ ```powershell
96
+ gh release view <tag> --repo <owner/repo> --json body,name,tagName,targetCommitish,isPrerelease,url
97
+ ```
98
+
99
+ For an initial release, invoke the validator with `--initial` instead of `--from`, and use null as
100
+ the inventory from value.
101
+
102
+ The validator proves UTF-8, a non-empty categorized structure, the exact immutable candidate range, and
103
+ one visible bullet plus an internal file mapping for every topic. It cannot prove that a bullet explains
104
+ a change well, that the grouping is useful, or that a sensitive detail is appropriate to disclose; the
105
+ agent must review those semantic judgments, with human review where a configured policy requires it.
106
+ Never include credentials, personal data, exploit instructions, or unapproved vulnerability details in a
107
+ public release body. Use the approved private security process when disclosure must be delayed or limited.
108
+
109
+ Record the prior tag, candidate SHA, reviewed notes path, inventory result, and published-body readback
110
+ in the delivery evidence. This contract changes the release description only; it does not authorize a
111
+ GitHub Release, a push, or npm publication.
112
+
113
+ ## Completeness and reader impact
114
+
115
+ - Explain every meaningful created, edited, removed or deprecated topic, including documentation,
116
+ dependencies, CI and maintenance. Map `added` to Novidades, `changed` to Alterações internas,
117
+ and `removed` or `deprecated` to Alterações incompatíveis e migrações in the inventory. Put
118
+ incompatibilities first after Resumo when present. Distinguish observable behavior changes from
119
+ internal refactors in the bullet text.
120
+ - For each breaking change, removal or deprecation, describe who is affected, the migration or
121
+ replacement, and any confirmed deadline. Add Atualização and Limitações sections only when useful.
122
+ Do not invent compatibility, performance gains or successful tests.
123
+ - Reconcile reverted changes and intermediate fixes against the final diff; do not claim work that
124
+ was undone. Rebuild the inventory and notes if the candidate changes. Generated copies belong to
125
+ their canonical topic; mechanical noise may be grouped, without hiding a distinct improvement.
126
+ - Review the wording for both open-source users and private company audiences. Keep private links
127
+ accessible to their intended audience and remove sensitive internal details from public notes.
128
+ - Read back the published `body` and compare it with the reviewed UTF-8 file, in addition to running
129
+ the validator. The transport must preserve the prose, not just its structural validity. Verify the
130
+ tag's resolved SHA separately; `targetCommitish` may be a branch name.
131
+
132
+ Sources: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
133
+ [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), and
134
+ [GitHub release notes](https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes).
@@ -0,0 +1,389 @@
1
+ import { execFileSync, spawnSync } from "node:child_process";
2
+ import {
3
+ createHash,
4
+ createPrivateKey,
5
+ createPublicKey,
6
+ generateKeyPairSync,
7
+ sign,
8
+ verify,
9
+ } from "node:crypto";
10
+ import { existsSync } from "node:fs";
11
+ import { cp, mkdir, readFile, writeFile } from "node:fs/promises";
12
+ import { dirname, join, resolve } from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+ import { parseArgs } from "node:util";
15
+ import { parseDocument } from "./yaml-parser.mjs";
16
+
17
+ const fail = (m) => {
18
+ throw new Error(m);
19
+ },
20
+ sha40 = /^[a-f0-9]{40}$/i,
21
+ tag = /^v\d+\.\d+$/;
22
+ const hash = async (p) =>
23
+ createHash("sha256")
24
+ .update(await readFile(p))
25
+ .digest("hex"),
26
+ json = async (p) => JSON.parse(await readFile(p, "utf8"));
27
+ const git = (cwd, args) =>
28
+ execFileSync("git", args, { cwd, encoding: "utf8", windowsHide: true }).trim();
29
+ const unsigned = (r) => {
30
+ const { signature, ...body } = r;
31
+ return Buffer.from(JSON.stringify(body));
32
+ };
33
+ const key = (x, label) => {
34
+ if (x.asymmetricKeyType !== "ed25519") fail(`${label} must be Ed25519`);
35
+ };
36
+ export function identity(repository, expected) {
37
+ const sha = git(repository, ["rev-parse", "HEAD"]).toLowerCase();
38
+ if (!sha40.test(sha) || sha !== expected.toLowerCase())
39
+ fail("repository SHA does not match requested SHA");
40
+ if (git(repository, ["status", "--porcelain"]) !== "") fail("repository must be clean");
41
+ return {
42
+ sha,
43
+ tree: git(repository, ["rev-parse", "HEAD^{tree}"]).toLowerCase(),
44
+ tree_sha256: createHash("sha256")
45
+ .update(execFileSync("git", ["ls-tree", "-r", "-z", sha], { cwd: repository }))
46
+ .digest("hex"),
47
+ };
48
+ }
49
+ export async function configuredBranch(repository, scope = "frontend") {
50
+ if (!["frontend", "backend"].includes(scope))
51
+ fail("consumer release scope must be frontend or backend");
52
+ const configPath = join(repository, ".agents", "config", "project.yaml");
53
+ if (!existsSync(configPath)) return "beta";
54
+ let document;
55
+ try {
56
+ document = parseDocument(await readFile(configPath, "utf8"), {
57
+ strict: true,
58
+ uniqueKeys: true,
59
+ });
60
+ } catch {
61
+ fail("project.yaml must contain a mapping");
62
+ }
63
+ if (document.errors.length) fail("project.yaml is invalid");
64
+ const config = document.toJS();
65
+ if (config === null || typeof config !== "object" || Array.isArray(config))
66
+ fail("project.yaml must contain a mapping");
67
+ const deploy = config.deploy;
68
+ if (deploy === undefined) return "beta";
69
+ if (deploy === null || typeof deploy !== "object" || Array.isArray(deploy))
70
+ fail("project.yaml deploy must be a mapping");
71
+ if (
72
+ !Object.keys(deploy).every((key) =>
73
+ [
74
+ "branch",
75
+ "production_branch",
76
+ "allow_production",
77
+ "frontend",
78
+ "backend",
79
+ "database",
80
+ ].includes(key),
81
+ )
82
+ )
83
+ fail("project.yaml deploy has unsupported keys");
84
+ for (const key of ["frontend", "backend", "database"])
85
+ if (
86
+ deploy[key] !== undefined &&
87
+ (deploy[key] === null ||
88
+ typeof deploy[key] !== "object" ||
89
+ Array.isArray(deploy[key]) ||
90
+ !Object.keys(deploy[key]).every((nested) => nested === "branch"))
91
+ )
92
+ fail(`project.yaml deploy.${key} must be a branch mapping`);
93
+ const branch = deploy[scope]?.branch ?? deploy.branch ?? "beta";
94
+ if (typeof branch !== "string" || branch.trim() === "" || branch.trim() !== branch)
95
+ fail("project.yaml deploy branch must be a non-empty Git branch name");
96
+ if (branch.length > 255 || !/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(branch))
97
+ fail(`project.yaml deploy branch is invalid: ${branch}`);
98
+ return branch;
99
+ }
100
+ export function commands(value) {
101
+ if (
102
+ !Array.isArray(value) ||
103
+ !value.length ||
104
+ !value.every(
105
+ (x) =>
106
+ x &&
107
+ ["node", "corepack", "npm", "pnpm"].includes(x.command) &&
108
+ Array.isArray(x.args) &&
109
+ x.args.every((a) => typeof a === "string") &&
110
+ (x.command === "node" || x.args.every((a) => /^[-A-Za-z0-9_./:@=*]+$/.test(a))),
111
+ )
112
+ )
113
+ fail("required_commands must use node or a supported package manager with safe string args");
114
+ return value;
115
+ }
116
+ export function commandInvocation(item, platform = process.platform) {
117
+ if (item.command === "node") return { command: process.execPath, args: item.args };
118
+ if (platform === "win32")
119
+ return {
120
+ command: process.env.ComSpec ?? "cmd.exe",
121
+ args: ["/d", "/s", "/c", `${item.command}.cmd`, ...item.args],
122
+ };
123
+ return { command: item.command, args: item.args };
124
+ }
125
+ export function run(list, cwd, label = "preparation") {
126
+ for (const item of commands(list)) {
127
+ const invocation = commandInvocation(item);
128
+ const result = spawnSync(invocation.command, invocation.args, {
129
+ cwd,
130
+ encoding: "utf8",
131
+ windowsHide: true,
132
+ shell: false,
133
+ });
134
+ if (result.error || result.status !== 0) fail(`${label} command failed: ${item.command}`);
135
+ }
136
+ }
137
+ export function policyFor(policy, caller) {
138
+ if (
139
+ policy?.schema_version !== 1 ||
140
+ policy.repository !== caller.repository ||
141
+ policy.configured_branch !== caller.branch ||
142
+ !tag.test(policy.github_version ?? "") ||
143
+ policy.github_version !== caller.githubVersion
144
+ )
145
+ fail("policy is not authorized for this GitHub caller");
146
+ const required = commands(policy.required_commands);
147
+ if (JSON.stringify(required) !== JSON.stringify(caller.commands))
148
+ fail("caller commands differ from policy required_commands");
149
+ return required;
150
+ }
151
+ export async function bootstrap({ trustStore, publicKey, keyId }) {
152
+ const parsedKey = createPublicKey(await readFile(publicKey));
153
+ key(parsedKey, "public key");
154
+ if (!/^[A-Za-z0-9._-]{1,64}$/.test(keyId)) fail("invalid key id");
155
+ const store = resolve(trustStore),
156
+ file = `${keyId}.pub.pem`;
157
+ await mkdir(store, { recursive: true });
158
+ await cp(resolve(publicKey), join(store, file));
159
+ await writeFile(
160
+ join(store, "trusted-github-release-keys.json"),
161
+ `${JSON.stringify({ schema_version: 1, keys: [{ key_id: keyId, file, sha256: await hash(join(store, file)) }] }, null, 2)}\n`,
162
+ );
163
+ }
164
+ export async function keygen({ privateKey, publicKey }) {
165
+ const privatePath = resolve(privateKey);
166
+ const publicPath = resolve(publicKey);
167
+ if (privatePath === publicPath) fail("private and public key paths must differ");
168
+ const pair = generateKeyPairSync("ed25519");
169
+ await mkdir(dirname(privatePath), { recursive: true });
170
+ await mkdir(dirname(publicPath), { recursive: true });
171
+ await writeFile(privatePath, pair.privateKey.export({ type: "pkcs8", format: "pem" }), {
172
+ encoding: "utf8",
173
+ flag: "wx",
174
+ mode: 0o600,
175
+ });
176
+ await writeFile(publicPath, pair.publicKey.export({ type: "spki", format: "pem" }), {
177
+ encoding: "utf8",
178
+ flag: "wx",
179
+ mode: 0o644,
180
+ });
181
+ return { privateKey: privatePath, publicKey: publicPath };
182
+ }
183
+ export async function prepare(input) {
184
+ if (!sha40.test(input.sha) || !tag.test(input.githubVersion))
185
+ fail("SHA and GitHub version vN.N are required");
186
+ const repository = resolve(input.repository),
187
+ branch = await configuredBranch(repository, input.scope ?? "frontend");
188
+ if (branch !== input.branch || git(repository, ["branch", "--show-current"]) !== branch)
189
+ fail("checked out branch does not match configured branch");
190
+ const policyDigest = await hash(input.policy),
191
+ before = identity(repository, input.sha),
192
+ required = policyFor(await json(input.policy), input);
193
+ run(required, repository);
194
+ const after = identity(repository, input.sha);
195
+ if (policyDigest !== (await hash(input.policy))) fail("policy changed during preparation");
196
+ if (JSON.stringify(before) !== JSON.stringify(after))
197
+ fail("repository identity changed during preparation");
198
+ const privateKey = createPrivateKey(await readFile(input.privateKey));
199
+ key(privateKey, "private key");
200
+ const clock = Date.now(),
201
+ issued_at = new Date(clock).toISOString(),
202
+ expires_at = new Date(clock + 7 * 86400000).toISOString(),
203
+ receipt = {
204
+ schema_version: 1,
205
+ algorithm: "ed25519",
206
+ key_id: input.keyId,
207
+ issued_at,
208
+ expires_at,
209
+ repository: input.repository,
210
+ configured_branch: branch,
211
+ github_version: input.githubVersion,
212
+ candidate: after,
213
+ policy_sha256: policyDigest,
214
+ required_commands: required,
215
+ };
216
+ const signed = {
217
+ ...receipt,
218
+ signature: sign(null, unsigned(receipt), privateKey).toString("base64"),
219
+ };
220
+ await mkdir(resolve(input.outputDir), { recursive: true });
221
+ const receiptPath = join(resolve(input.outputDir), "consumer-github-release-receipt.json");
222
+ await writeFile(receiptPath, `${JSON.stringify(signed, null, 2)}\n`);
223
+ return { receiptPath, receipt: signed };
224
+ }
225
+ export async function verifyPreparation(input) {
226
+ const receipt = await json(input.receipt),
227
+ repository = resolve(input.repository),
228
+ branch = await configuredBranch(repository, input.scope ?? "frontend"),
229
+ current = identity(repository, input.sha),
230
+ required = policyFor(await json(input.policy), input),
231
+ now = Date.now(),
232
+ issued = Date.parse(receipt.issued_at),
233
+ expires = Date.parse(receipt.expires_at);
234
+ if (
235
+ !Number.isFinite(issued) ||
236
+ !Number.isFinite(expires) ||
237
+ issued > now + 300000 ||
238
+ now - issued > 7 * 86400000 ||
239
+ expires <= now ||
240
+ expires > issued + 7 * 86400000 ||
241
+ !tag.test(input.githubVersion) ||
242
+ branch !== input.branch ||
243
+ receipt.schema_version !== 1 ||
244
+ receipt.algorithm !== "ed25519" ||
245
+ receipt.repository !== input.repository ||
246
+ receipt.configured_branch !== branch ||
247
+ receipt.github_version !== input.githubVersion ||
248
+ JSON.stringify(receipt.candidate) !== JSON.stringify(current) ||
249
+ JSON.stringify(receipt.required_commands) !== JSON.stringify(required) ||
250
+ receipt.policy_sha256 !== (await hash(input.policy))
251
+ )
252
+ fail("receipt GitHub identity, expiry or policy mismatch");
253
+ const trust = await json(join(resolve(input.trustStore), "trusted-github-release-keys.json")),
254
+ entry = trust.keys?.find((x) => x.key_id === receipt.key_id);
255
+ if (!entry) fail("receipt key is not trusted");
256
+ const keyPath = join(resolve(input.trustStore), entry.file);
257
+ if (entry.sha256 !== (await hash(keyPath))) fail("trusted key digest mismatch");
258
+ const publicKey = createPublicKey(await readFile(keyPath));
259
+ key(publicKey, "trusted public key");
260
+ if (!verify(null, unsigned(receipt), publicKey, Buffer.from(receipt.signature, "base64")))
261
+ fail("receipt signature is invalid");
262
+ return receipt;
263
+ }
264
+ export async function guardedPush(input, runner = null) {
265
+ const prepared = await prepare(input);
266
+ await verifyPreparation({ ...input, receipt: prepared.receiptPath });
267
+ const remote = input.remote ?? "origin";
268
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(remote)) fail("invalid Git remote name");
269
+ const repository = resolve(input.repository),
270
+ source = git(repository, ["remote", "get-url", "--push", remote]),
271
+ refspec = `${input.sha}:refs/heads/${input.branch}`;
272
+ if (
273
+ source !== input.remoteUrl ||
274
+ git(repository, ["rev-parse", "HEAD"]).toLowerCase() !== input.sha.toLowerCase()
275
+ )
276
+ fail("push remote or HEAD changed after verification");
277
+ const preflight = {
278
+ phase: "preflight",
279
+ repository,
280
+ remote,
281
+ branch: input.branch,
282
+ scope: input.scope ?? "frontend",
283
+ };
284
+ if (runner) runner(preflight);
285
+ else
286
+ execFileSync(
287
+ process.execPath,
288
+ [
289
+ join(dirname(fileURLToPath(import.meta.url)), "preflight.mjs"),
290
+ "--repository",
291
+ repository,
292
+ "--remote",
293
+ remote,
294
+ "--branch",
295
+ input.branch,
296
+ "--scope",
297
+ preflight.scope,
298
+ ],
299
+ { cwd: repository, stdio: "inherit", windowsHide: true },
300
+ );
301
+ if (git(repository, ["rev-parse", "HEAD"]).toLowerCase() !== input.sha.toLowerCase())
302
+ fail("HEAD changed after preflight");
303
+ if (runner) runner({ phase: "push", repository, remote, refspec });
304
+ else
305
+ execFileSync("git", ["push", remote, refspec], {
306
+ cwd: repository,
307
+ stdio: "inherit",
308
+ windowsHide: true,
309
+ });
310
+ return { ...prepared, refspec };
311
+ }
312
+ const opts = {
313
+ repository: { type: "string" },
314
+ sha: { type: "string" },
315
+ branch: { type: "string" },
316
+ scope: { type: "string", default: "frontend" },
317
+ remote: { type: "string", default: "origin" },
318
+ "remote-url": { type: "string" },
319
+ "github-version": { type: "string" },
320
+ policy: { type: "string" },
321
+ "trust-store": { type: "string" },
322
+ "private-key": { type: "string" },
323
+ "public-key": { type: "string" },
324
+ "key-id": { type: "string" },
325
+ "output-dir": { type: "string" },
326
+ receipt: { type: "string" },
327
+ "commands-json": { type: "string" },
328
+ };
329
+ async function main() {
330
+ const [action] = process.argv.slice(2),
331
+ { values } = parseArgs({ options: opts, strict: true, allowPositionals: true }),
332
+ need = (n) => values[n] ?? fail(`--${n} is required`);
333
+ if (action === "bootstrap")
334
+ return bootstrap({
335
+ trustStore: need("trust-store"),
336
+ publicKey: need("public-key"),
337
+ keyId: need("key-id"),
338
+ });
339
+ if (action === "keygen")
340
+ return keygen({
341
+ privateKey: need("private-key"),
342
+ publicKey: need("public-key"),
343
+ });
344
+ const common = {
345
+ repository: need("repository"),
346
+ sha: need("sha"),
347
+ branch: need("branch"),
348
+ scope: values.scope,
349
+ githubVersion: need("github-version"),
350
+ policy: need("policy"),
351
+ trustStore: values["trust-store"],
352
+ commands: JSON.parse(need("commands-json")),
353
+ };
354
+ if (action === "prepare") {
355
+ const r = await prepare({
356
+ ...common,
357
+ outputDir: need("output-dir"),
358
+ privateKey: need("private-key"),
359
+ keyId: need("key-id"),
360
+ });
361
+ process.stdout.write(`${JSON.stringify({ valid: true, receipt: r.receiptPath })}\n`);
362
+ return;
363
+ }
364
+ if (action === "verify") {
365
+ await verifyPreparation({ ...common, receipt: need("receipt") });
366
+ process.stdout.write('{"valid":true}\n');
367
+ return;
368
+ }
369
+ if (action === "guarded-push") {
370
+ const r = await guardedPush({
371
+ ...common,
372
+ outputDir: need("output-dir"),
373
+ privateKey: need("private-key"),
374
+ keyId: need("key-id"),
375
+ remote: values.remote,
376
+ remoteUrl: need("remote-url"),
377
+ });
378
+ process.stdout.write(
379
+ `${JSON.stringify({ valid: true, pushed: true, receipt: r.receiptPath, refspec: r.refspec })}\n`,
380
+ );
381
+ return;
382
+ }
383
+ fail("Usage: consumer-release-preparation.mjs bootstrap|keygen|prepare|verify|guarded-push");
384
+ }
385
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url))
386
+ main().catch((error) => {
387
+ process.stderr.write(`${error.message}\n`);
388
+ process.exitCode = 1;
389
+ });
@@ -0,0 +1,134 @@
1
+ import assert from "node:assert/strict";
2
+ import { execFileSync } from "node:child_process";
3
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import test from "node:test";
7
+ import {
8
+ bootstrap,
9
+ commandInvocation,
10
+ configuredBranch,
11
+ guardedPush,
12
+ keygen,
13
+ prepare,
14
+ run,
15
+ verifyPreparation,
16
+ } from "./consumer-release-preparation.mjs";
17
+
18
+ const git = (cwd, ...args) => execFileSync("git", args, { cwd, encoding: "utf8" }).trim();
19
+
20
+ test("resolves only the selected application scope from nested deploy configuration", async () => {
21
+ const root = await mkdtemp(join(tmpdir(), "zaip-consumer-config-"));
22
+ try {
23
+ const repo = join(root, "repo");
24
+ await mkdir(join(repo, ".agents", "config"), { recursive: true });
25
+ await writeFile(
26
+ join(repo, ".agents", "config", "project.yaml"),
27
+ [
28
+ "deploy:",
29
+ " branch: beta",
30
+ " frontend:",
31
+ " branch: main",
32
+ " backend:",
33
+ " branch: beta",
34
+ " database:",
35
+ " branch: beta",
36
+ "",
37
+ ].join("\n"),
38
+ );
39
+ assert.equal(await configuredBranch(repo), "main");
40
+ assert.equal(await configuredBranch(repo, "backend"), "beta");
41
+ await assert.rejects(() => configuredBranch(repo, "database"), /frontend or backend/);
42
+ await writeFile(join(repo, ".agents", "config", "project.yaml"), "project: consumer\n");
43
+ assert.equal(await configuredBranch(repo), "beta");
44
+ } finally {
45
+ await rm(root, { recursive: true, force: true });
46
+ }
47
+ });
48
+
49
+ test("GitHub-only guard binds parsed config, policy, receipt expiry and fixed refspec", async () => {
50
+ const root = await mkdtemp(join(tmpdir(), "zaip-consumer-"));
51
+ try {
52
+ const repo = join(root, "repo");
53
+ await mkdir(join(repo, ".agents", "config"), { recursive: true });
54
+ git(repo, "init", "--quiet");
55
+ git(repo, "checkout", "-qb", "main");
56
+ git(repo, "config", "user.email", "x@y.invalid");
57
+ git(repo, "config", "user.name", "x");
58
+ git(repo, "remote", "add", "origin", "ssh://git@example.invalid/consumer.git");
59
+ await writeFile(
60
+ join(repo, ".agents", "config", "project.yaml"),
61
+ "deploy:\n branch: beta\n frontend:\n branch: main\n backend:\n branch: beta\n database:\n branch: beta\n",
62
+ );
63
+ await writeFile(join(repo, "README.md"), "x");
64
+ git(repo, "add", ".");
65
+ git(repo, "commit", "--quiet", "-m", "x");
66
+ const priv = join(root, "k.pem");
67
+ const pub = join(root, "k.pub");
68
+ const policy = join(root, "policy.json");
69
+ const trust = join(root, "trust");
70
+ const out = join(root, "out");
71
+ const sha = git(repo, "rev-parse", "HEAD");
72
+ const required = [{ command: "node", args: ["-e", "process.exit(0)"] }];
73
+ const input = {
74
+ repository: repo,
75
+ sha,
76
+ branch: "main",
77
+ scope: "frontend",
78
+ githubVersion: "v1.2",
79
+ policy,
80
+ trustStore: trust,
81
+ commands: required,
82
+ outputDir: out,
83
+ privateKey: priv,
84
+ keyId: "consumer",
85
+ remoteUrl: "ssh://git@example.invalid/consumer.git",
86
+ };
87
+ await keygen({ privateKey: priv, publicKey: pub });
88
+ await writeFile(
89
+ policy,
90
+ JSON.stringify({
91
+ schema_version: 1,
92
+ repository: repo,
93
+ configured_branch: "main",
94
+ github_version: "v1.2",
95
+ required_commands: required,
96
+ }),
97
+ );
98
+ await bootstrap({ trustStore: trust, publicKey: pub, keyId: "consumer" });
99
+ const prepared = await prepare(input);
100
+ await verifyPreparation({ ...input, receipt: prepared.receiptPath });
101
+ const calls = [];
102
+ await guardedPush(input, (value) => calls.push(value));
103
+ assert.deepEqual(
104
+ calls.map((value) => value.phase),
105
+ ["preflight", "push"],
106
+ );
107
+ assert.equal(calls[1].refspec, sha + ":refs/heads/main");
108
+ await assert.rejects(
109
+ () => prepare({ ...input, commands: [{ command: "node", args: ["-e", "process.exit(2)"] }] }),
110
+ /differ/,
111
+ );
112
+ await writeFile(join(repo, "dirty"), "x");
113
+ await assert.rejects(
114
+ () => verifyPreparation({ ...input, receipt: prepared.receiptPath }),
115
+ /clean/,
116
+ );
117
+ await rm(join(repo, "dirty"));
118
+ await writeFile(policy, "{}");
119
+ await assert.rejects(() => verifyPreparation({ ...input, receipt: prepared.receiptPath }));
120
+ } finally {
121
+ await rm(root, { recursive: true, force: true });
122
+ }
123
+ });
124
+
125
+ test("runs corepack through the Windows command wrapper without arbitrary shell input", () => {
126
+ const invocation = commandInvocation({ command: "corepack", args: ["--version"] }, "win32");
127
+ assert.match(invocation.command, /cmd\.exe$/i);
128
+ assert.deepEqual(invocation.args, ["/d", "/s", "/c", "corepack.cmd", "--version"]);
129
+ run([{ command: "corepack", args: ["--version"] }], process.cwd(), "corepack");
130
+ assert.throws(
131
+ () => run([{ command: "corepack", args: ["--version;whoami"] }], process.cwd()),
132
+ /supported package manager/,
133
+ );
134
+ });