@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,44 @@
1
+ ---
2
+ name: zaip-skill-frontend-componentization
3
+ description: Padronize UI e catálogo ao criar ou alterar componentes.
4
+ ---
5
+
6
+ # Componentização frontend
7
+
8
+ Use ao criar, alterar, renomear ou remover componentes de UI em `apps/frontend`,
9
+ `apps/site`, dashboard React ou no catálogo de design. Não inicia migração dos
10
+ componentes antigos: aplique somente ao componente tocado.
11
+
12
+ 1. Roteie a entrega: produto React/dashboard usa `$zaip-skill-frontend`; site
13
+ usa `$zaip-skill-website-readiness`; catálogo ou contrato central usa
14
+ `$zaip-skill-design-system` com Manu. Leia `RULE-DESIGN-SYSTEM-CENTRAL` e,
15
+ para dashboard, `RULE-DASHBOARD-UI-CONSISTENCY`.
16
+ 2. Antes de editar, inventarie consumidores, exportações públicas, catálogo,
17
+ stories e componentes próximos. Reutilize ou componha o que existe antes de
18
+ criar primitive, e registre o impacto de renomear/remover.
19
+ 3. Prefira variantes, `size`, slots e composição antes de duplicar. Classifique
20
+ o destino: a página só orquestra; componente local fica no domínio; UI
21
+ compartilhada só recebe contrato estável e consumidores reais. Não transforme
22
+ componente local em regra global nem crie primitives duplicadas.
23
+ 4. Extraia para hooks apenas lógica compartilhada ou efeitos; acesso a dados fica
24
+ em services. Estado visual local pode permanecer no componente. Mudança apenas
25
+ em hook ou service não cria entrada visual própria, mas atualiza o exemplo se
26
+ o comportamento observável do componente mudou.
27
+ 5. Para componente UI novo, alterado, renomeado ou removido, atualize a página
28
+ `Componentes` real em `.agents/design/apps/catalog/src/pages/ComponentsPage.tsx`
29
+ no mesmo Change. A página e a story devem consumir um espécime reutilizável e
30
+ os mesmos fixtures estáveis, renderizando o componente real pela fronteira
31
+ pública quando isso não acoplar produtos.
32
+ 6. Quando Storybook existir, mantenha a story alinhada ao espécime; ela nunca
33
+ substitui `#/components`. Fixtures não usam API, autenticação ou tempo atual.
34
+ Em Astro ou entre produtos sem dependência válida, use um fallback nativo ou
35
+ adaptador renderizável sem forçar island React; revalide o adaptador a cada
36
+ mudança. Cubra variantes e estados aplicáveis: padrão, foco/teclado,
37
+ desabilitado, carregamento, vazio e erro, além de largura estreita relevante.
38
+ 7. Em dashboard, inventarie e reutilize `@zaip-ai/dashboard-ui`; tabelas usam
39
+ `DataTable`, salvo Decision explícita. Não crie tabela ou primitive paralela.
40
+ 8. Ao renomear ou remover, retire exports, imports, stories, catálogo e referências
41
+ obsoletas. Valide consumidores, acessibilidade e os exemplos renderizados.
42
+
43
+ O catálogo documenta a implementação existente; ele não exige migração global
44
+ nem importa automaticamente componentes de produtos distintos.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Frontend Componentization"
3
+ short_description: "Standardize UI components and catalog"
4
+ default_prompt: "Use $zaip-skill-frontend-componentization to create or change UI components with coherent catalog examples."
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: zaip-skill-frontend-data-flows
3
+ description: Build reliable React data flows for remote state, forms, errors, pagination, and concurrent user actions.
4
+ ---
5
+
6
+ # Build frontend data flows
7
+
8
+ Use when React UI reads or mutates remote application state.
9
+
10
+ 1. Map the user-visible loading, empty, success, validation, authorization, and failure states before wiring data.
11
+ 2. Keep API services and request contracts outside presentation components; carry cancellation and request identity through concurrent transitions.
12
+ 3. Prevent stale responses from replacing newer state and disable or serialize destructive duplicate actions where the contract requires it.
13
+ 4. Preserve accessible feedback, focus behavior, and meaningful error recovery.
14
+ 5. Test relevant state transitions against the actual API contract or a controlled contract fixture.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Frontend Data Flows"
3
+ short_description: "Build reliable React remote state flows"
4
+ default_prompt: "Use $zaip-skill-frontend-data-flows to implement this React data flow."
@@ -9,3 +9,5 @@ description: Answer operational questions and deliver bounded documents, present
9
9
  - Para entrega persistente, carregue [o fluxo de entrega](references/extended-workflow.md): resultado, público, fontes, formato, escopo e verificação proporcional.
10
10
  - Domínios obrigatórios seguem o especialista; referência citada não muda o dono da entrega. Não invente dados ou aprovação.
11
11
  - Ato externo exige autoridade vigente; prepare a minuta e indique pendências quando faltar autorização. Interaction read-only não cria Task/Change; entrega segue lifecycle e ACs. Engenharia só se aplica ao trabalho técnico.
12
+
13
+ Para documento, resumo salvo ou organização de contexto simples, delimitada e de baixo impacto, use o [perfil editorial `lite`](../zaip-skill-task/SKILL.md#assurance-proporcional) e selecione `--risk lite`. Não o use para código, configuração, instruções de agentes, dado sensível, migração, decisão crítica ou ato externo.
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: zaip-skill-github-actions-setup
3
+ description: Configure GitHub Actions end to end for npm publishing, Cloudflare Pages frontend or Hostinger VPS backend, guiding credential setup and verifying access and deployments. Use for CI/CD onboarding or broken deployment credentials, not a routine GitHub push.
4
+ ---
5
+
6
+ # Configurar GitHub Actions com o usuário
7
+
8
+ Entregue workflows específicos do projeto, um guia preenchido com nomes exatos, testes executados e evidências. Acompanhe correções até funcionar ou até uma dependência concreta impedir o próximo passo; não encerre apenas entregando YAML.
9
+
10
+ ## Descoberta e autorização
11
+
12
+ 1. Leia configuração, remotes, workflows, manifests, lockfile e scripts de build/deploy existentes. Identifique repositório, pacote/app, diretório, provedor, ambiente, branch, runner e estratégia de release. Reutilize nomes já válidos.
13
+ 2. Pergunte somente o que falta: destinos desejados (npm, Pages, VPS, Supabase migration ou combinação), conta/projeto, ambiente e acesso administrativo. Faça poucas perguntas por vez. Não peça credenciais de provedores que não serão usados. Para migrations, explique antes que uma beta Supabase persistente pode gerar custo e obtenha confirmação explícita antes de criar branch hospedada, integração, GitHub App, secret ou workflow.
14
+ 3. Distinga configuração local, cadastro de credenciais, push, execução de verificação e deploy real. Reutilize autorização já dada. Prepare arquivos e comandos revisáveis antes de pedir autorização ainda ausente para publicar, alterar servidor ou promover produção.
15
+ 4. Nunca peça tokens, senhas, chaves privadas, OTP ou recovery codes no chat, screenshots ou registros. Peça cadastro diretamente no destino indicado e confirmação apenas de nome/escopo. Credencial local já existente segue [local-credentials](../zaip-skill-local-credentials/SKILL.md), sem busca global.
16
+ 5. Leia [contrato de secrets e testes](references/github.md) e somente as trilhas escolhidas: [npm](references/npm.md), [Cloudflare Pages](references/cloudflare-pages.md), [Hostinger VPS](references/hostinger-vps.md). Consulte as fontes oficiais ali vinculadas antes de configurar: telas, requisitos, permissões e versões podem mudar.
17
+
18
+ ## Implementação guiada
19
+
20
+ 6. Produza uma tabela preenchida: nome exato, secret ou variable, origem, escopo GitHub, job consumidor e teste. Use os nomes de referência em projetos novos; nomes existentes exigem mapeamento explícito no guia, scripts e YAML. A pessoa não deve adivinhar o que preencher.
21
+ 7. Explique cada cadastro na ordem das telas, valor esperado sem exibi-lo, onde salvar e como confirmar. GitHub Environment por ambiente é preferível quando disponível; repository secrets são alternativa explícita. IDs/configuração pública ficam em variables. Secrets de runtime ficam no servidor/secret manager; nada secreto entra em bundle frontend.
22
+ 8. Crie apenas os workflows selecionados no repositório do usuário e um guia operacional sem segredos. Separe verificação de publicação; modo verificar não pode subir pacote, criar deployment, reiniciar serviço ou mudar dados. Primeiro valide YAML, comandos, build e empacotamento locais.
23
+ 9. Integre ao stack: npm publica o tarball validado; Pages recebe o output real; VPS recebe artefato identificado por SHA e segue o runtime existente. Migrations usam o repositório central e `deploy.database.branch: beta`, com GitHub Integration como aplicador hospedado; o workflow nunca executa SQL direto em produção. Fixe actions por SHA verificado e ferramentas por versão compatível. Não entregue placeholders executáveis como configuração concluída.
24
+ 10. Use [deployment-pipeline](../zaip-skill-deployment-pipeline/SKILL.md) para entrega; [cloudflare-github-deploy](../zaip-skill-cloudflare-github-deploy/SKILL.md) para Pages; [github-deploy](../zaip-skill-github-deploy/SKILL.md) somente para publicação GitHub autorizada. Provisionamento VPS/DNS é outra operação: [hostinger-cloudflare-terraform](../zaip-skill-hostinger-cloudflare-terraform/SKILL.md) aplica-se apenas quando solicitado.
25
+
26
+ ## Verificação até o destino
27
+
28
+ 11. Confira nomes e escopos via UI ou `gh secret list` / `gh variable list`, sem tentar recuperar valores. Isso comprova cadastro, não funcionamento.
29
+ 12. Execute o job de verificação no GitHub com os mesmos secrets, environment e destino do deploy. Investigue logs sanitizados; corrija nome, escopo, permissão, expiração, trust ou conectividade e repita o teste que falhou.
30
+ 13. Faça deploy de teste somente no destino autorizado. npm requer versão nova real e canal explícito; Pages usa preview explícito; VPS usa staging/serviço escolhido. Ambiente indisponível não autoriza testar produção.
31
+ 14. Aguarde o run e verifique provedor e consumidor. Registre workflow/run URL, SHA, ambiente, artefato/versão, smoke e limites. Não confunda token ativo, SSH conectado, dry-run ou HTTP 200 genérico com publicação funcional.
32
+ 15. Termine com estados separados: configurado, autenticação/acesso verificados, deploy verificado, pendências e próximo passo exato. Se depender do usuário, indique a tela/campo pendente; retome dali sem refazer cadastros concluídos.
33
+
34
+ ## Portabilidade
35
+
36
+ Esta skill e seus recursos podem acompanhar o instalador npm. Sua instalação não cria workflows ativos, secrets, contas, recursos nem solicita credenciais. Workflows são gerados sob demanda para o projeto selecionado. O workflow npm exclusivo do mantenedor ZAIP-AIOS permanece fora do pacote; esta skill não recupera a antiga publicação npm local.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Configurar GitHub Actions"
3
+ short_description: "Guie credenciais e testes de npm, Pages e VPS"
4
+ default_prompt: "Use $zaip-skill-github-actions-setup para configurar meu deploy pelo GitHub Actions, orientar credenciais e verificar o resultado ponta a ponta."
@@ -0,0 +1,33 @@
1
+ # Frontend no Cloudflare Pages
2
+
3
+ ## Conta, projeto e token
4
+
5
+ 1. Identifique app, lockfile, diretório, build e output real. Confirme Pages; Workers segue a skill especializada. Verifique dono atual do deploy: Git integration ou Actions; não ative ambos para o mesmo evento.
6
+ 2. Cloudflare Dashboard → Workers & Pages → projeto: confirme nome, conta e production branch. Projeto novo: Create application → Pages → Direct Upload, conforme UI atual; criação externa depende de autorização.
7
+ 3. Account ID da conta/painel vai em variable **CLOUDFLARE_ACCOUNT_ID**; nome do projeto em **CLOUDFLARE_PAGES_PROJECT**. Esses valores não são tokens.
8
+ 4. Perfil → API Tokens → Create Token → Custom token: Account → Cloudflare Pages → Edit; limite Account Resources à conta alvo. Defina validade/rotação. Não conceda DNS Edit, Global API Key ou todas as contas por conveniência.
9
+ 5. Token de usuário vai diretamente para GitHub secret **CLOUDFLARE_API_TOKEN**, environment **pages-preview**. Token existente de conta pode usar endpoint diferente; preserve o tipo e adapte o probe, sem substituir automaticamente.
10
+ 6. **CLOUDFLARE_PAGES_BRANCH** é preview explícito, diferente da production branch. Verifique pela API/configuração antes do upload. Produção tem job/environment e autorização próprios.
11
+
12
+ ## Testar dentro do Actions
13
+
14
+ O helper [verify-cloudflare.mjs](../scripts/verify-cloudflare.mjs) faz somente GET para token de usuário: verifica estado ativo e leitura do projeto exato. Saída contém etapas/resultados sanitizados. Conta/projeto inválidos falham antes da rede. Use Node >=22.14 e este passo dentro de job com o mesmo environment do deploy:
15
+
16
+ ```yaml
17
+ - name: Verify Cloudflare access
18
+ env:
19
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
20
+ CLOUDFLARE_ACCOUNT_ID: ${{ vars.CLOUDFLARE_ACCOUNT_ID }}
21
+ CLOUDFLARE_PAGES_PROJECT: ${{ vars.CLOUDFLARE_PAGES_PROJECT }}
22
+ run: node .agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.mjs
23
+ ```
24
+
25
+ Se a skill instalada não for versionada, copie o helper revisado para script project-owned e ajuste o caminho no workflow. GET aprovado comprova leitura, **não** upload. Não imprima token, curl verbose ou resposta integral que possa conter configuração sensível. O helper recusa redirects e oculta corpos/erros remotos. 401/403 pede correção de validade/conta/permissão; 404 pede conferir projeto/conta, não ampliar token.
26
+
27
+ ## Entrega e smoke
28
+
29
+ Use Wrangler fixado e instalado pelo lockfile, pages deploy do output verificado, --project-name e --branch explícitos. Passe env validado e argumentos citados. Build ocorre antes de disponibilizar token. VITE_*/NEXT_PUBLIC_* são públicos no bundle: nenhum segredo ali. Secrets de Functions/runtime ficam no store Cloudflare apropriado, separados do token de upload.
30
+
31
+ Com autorização, envie preview e capture deployment ID/URL; confira conta, projeto, branch, SHA e estado na API. GET na URL exata deve validar conteúdo identificável da aplicação, rota principal, assets e navegação/fallback aplicáveis. HTTP 200 de página padrão/login não prova frontend correto. Corrija build/output, token somente leitura, branch indevida ou SPA e reteste. Registre URL/SHA sem configuração sensível.
32
+
33
+ Fontes: [CI Direct Upload](https://developers.cloudflare.com/pages/how-to/use-direct-upload-with-continuous-integration/), [Consultar projeto](https://developers.cloudflare.com/api/resources/pages/subresources/projects/methods/get/), [Token de usuário](https://developers.cloudflare.com/api/resources/user/subresources/tokens/), [Token de conta](https://developers.cloudflare.com/api/resources/accounts/subresources/tokens/).
@@ -0,0 +1,63 @@
1
+ # GitHub: cadastro, contrato e execução
2
+
3
+ ## Preencha primeiro o contrato do projeto
4
+
5
+ Informe OWNER/REPO verificado, branch autorizada, environment, filename, diretório da aplicação, comando de build, alvo de teste e alvo de produção. Campos deste guia devem ser resolvidos, nunca usados como defaults de produção.
6
+
7
+ Padrão para projetos novos; preserve nomes existentes com mapeamento explícito:
8
+
9
+ | Destino / environment sugerido | Nome exato | Tipo | Origem / consumidor |
10
+ | --- | --- | --- | --- |
11
+ | npm / npm | Nenhum token no modo OIDC | Trust no npm | Identidade GitHub do job publicador |
12
+ | npm / npm | NPM_TOKEN | Secret, só fallback | Token granular, mapeado a NODE_AUTH_TOKEN só no passo npm |
13
+ | Pages / pages-preview | CLOUDFLARE_API_TOKEN | Secret | Token de usuário, job Pages |
14
+ | Pages / pages-preview | CLOUDFLARE_ACCOUNT_ID | Variable | Conta Cloudflare, job/probe Pages |
15
+ | Pages / pages-preview | CLOUDFLARE_PAGES_PROJECT | Variable | Nome exato do projeto |
16
+ | Pages / pages-preview | CLOUDFLARE_PAGES_BRANCH | Variable | Preview diferente da production branch |
17
+ | VPS / vps-staging | VPS_SSH_PRIVATE_KEY | Secret | Chave exclusiva de deploy, job SSH |
18
+ | VPS / vps-staging | VPS_KNOWN_HOSTS | Variable | Chave pública do host verificada fora da conexão |
19
+ | VPS / vps-staging | VPS_HOST | Variable | IP/hostname real |
20
+ | VPS / vps-staging | VPS_PORT | Variable | Porta SSH real |
21
+ | VPS / vps-staging | VPS_USER | Variable | Usuário de deploy |
22
+ | VPS / vps-staging | VPS_DEPLOY_PATH | Variable | Diretório de releases |
23
+ | VPS / vps-staging | VPS_SERVICE | Variable | Serviço real |
24
+ | VPS / vps-staging | VPS_HEALTH_URL | Variable | Endpoint HTTPS da API |
25
+
26
+ Host pode ser secret por privacidade; ajuste o contexto em todo YAML. Nenhum GitHub PAT é necessário por padrão: GITHUB_TOKEN é fornecido pelo Actions. Não solicite senha npm/Cloudflare/Hostinger nem token Hostinger para deploy SSH.
27
+
28
+ ## Cadastro pela interface
29
+
30
+ 1. Abra o repositório correto → Settings. Confirme permissão de administração do environment; se faltar, peça o cadastro ao administrador.
31
+ 2. Em Environments, crie/selecione o nome exato do guia. Configure branches/tags permitidos e proteção de produção disponível no plano. O job declara exatamente esse environment.
32
+ 3. Environment secrets → Add secret: copie o nome do guia e cole o valor diretamente do provedor no GitHub. Preserve quebras de linha da chave privada. Salve; não cole na conversa.
33
+ 4. Environment variables → Add variable: cadastre cada configuração não secreta pelo nome exato.
34
+ 5. Se environments não estiverem disponíveis, escolha repository scope conscientemente: Settings → Secrets and variables → Actions → Secrets → New repository secret; aba Variables → New repository variable. Não suponha proteção de ambiente inexistente.
35
+ 6. Confirme somente os nomes. Secrets homônimos em environment/repository/organization podem se sobrepor; investigue o escopo que o job recebe.
36
+
37
+ Alternativa no terminal **do usuário**, com entrada interativa protegida:
38
+
39
+ ```sh
40
+ gh secret set CLOUDFLARE_API_TOKEN --repo OWNER/REPO --env pages-preview
41
+ gh secret list --repo OWNER/REPO --env pages-preview
42
+ gh variable list --repo OWNER/REPO --env pages-preview
43
+ ```
44
+
45
+ Substitua OWNER/REPO e ambiente pelos valores resolvidos. Chave multilinha: prefira UI. Não use --body com valor secreto, echo, leitura de clipboard pelo agente, arquivo versionado ou logs de debug. Arquivo temporário, se necessário, é privado, fora do repo e removido após envio seguro. Não solicite códigos de 2FA; reaproveite sessão autenticada.
46
+
47
+ ## Contrato dos workflows produzidos
48
+
49
+ - Configure workflow_dispatch para verificação sem mutação; job/arquivo separado ou input tipado com verify por padrão. Publicação recebe ambiente/canal/ref delimitados e depende das validações.
50
+ - Restrinja repositório e refs, environment, permissions, timeout e concorrência por destino; produção exige promoção autorizada. Nunca exponha secrets a código de fork/PR não confiável, especialmente pull_request_target com checkout do PR.
51
+ - Passe dados de evento/input/variables via env, valide allowlists e cite argumentos. Não interpole esses valores diretamente no shell. SSH usa shell remoto: valide parâmetros antes de compor o comando remoto.
52
+ - Credenciais só no passo necessário. Instalação/build e smoke não herdam token de escrita. Não use set -x, printenv, dumps de contexto, curl -v ou upload de .npmrc/.ssh/.env.
53
+ - Instale pelo lockfile e vincule o artefato ao SHA. Fixe actions por SHA confirmado no repositório oficial; nunca invente SHA.
54
+ - workflow_dispatch exige workflow presente na default branch. Se for produção, não faça merge implícito: prepare a mudança e obtenha autorização necessária. A ref selecionada respeita filtro do ambiente.
55
+ - Eventos gerados com GITHUB_TOKEN podem não disparar outro workflow. Avalie o evento real; workflow_dispatch é opção explícita sem PAT amplo automático.
56
+
57
+ ## Acompanhar e corrigir
58
+
59
+ Com autorização aplicável, execute `gh workflow run FILENAME --repo OWNER/REPO --ref BRANCH` com inputs definidos no workflow. Identifique o run por workflow, event, ref, horário e SHA; não escolha o último run concorrente. Use `gh run watch RUN_ID --repo OWNER/REPO --exit-status`.
60
+
61
+ Secret ausente pede checagem de nome/escopo, environment, disponibilidade em fork/Dependabot/reusable workflow e proteções pendentes. Não regenere credencial válida antes disso. Segredo exposto em log exige revogação/rotação e tratamento no provedor; nunca copie o valor ao relatório.
62
+
63
+ Fontes: [Secrets](https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets), [Environments](https://docs.github.com/en/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments), [Triggers](https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/trigger-a-workflow).
@@ -0,0 +1,55 @@
1
+ # Backend em Hostinger VPS existente
2
+
3
+ ## Descoberta e contrato
4
+
5
+ Inspecione runtime (systemd, Docker Compose, outro), artefato, OS/arquitetura, proxy/TLS, health endpoint, diretório e rollback. Não imponha Docker, Terraform ou dois VPS a servidor existente. SSH não requer token da API Hostinger. Provisionamento, DNS e migrations precisam do escopo correspondente.
6
+
7
+ Preencha cada campo: VPS_HOST, VPS_PORT, VPS_USER, VPS_DEPLOY_PATH, VPS_SERVICE, VPS_HEALTH_URL, VPS_KNOWN_HOSTS e secret VPS_SSH_PRIVATE_KEY; environment sugerido vps-staging. Não assuma porta 22, root, serviço nem produção.
8
+
9
+ ## Obter acesso e cadastrar
10
+
11
+ 1. hPanel → VPS → Manage → Overview: confirme IP e SSH; use porta efetiva. Web Console fornece primeiro acesso. Senha root fica com usuário, não no GitHub.
12
+ 2. Identifique/crie quando autorizado usuário de deploy com acesso só à pasta/comandos necessários. Evite sudo irrestrito; grupo docker equivale a privilégio elevado e precisa ser justificado.
13
+ 3. Na máquina confiável do usuário, fora do repo, gere chave dedicada: `ssh-keygen -t ed25519 -C github-actions-deploy`; escolha filename novo, sem sobrescrever chave existente. Comando solicita destino/passphrase. A receita abaixo usa chave de automação sem passphrase, restrita no servidor e protegida no GitHub. Se a política exigir passphrase, implemente/teste ssh-agent e secret adicional antes de continuar; não retire proteção de chave pessoal.
14
+ 4. Pelo console/conexão confiável, acrescente somente a chave **pública** .pub ao authorized_keys do usuário de deploy, preservando entradas. Confirme ownership do usuário, .ssh 700 e authorized_keys 600. Restrinja forwarding/comandos quando compatível com upload; teste sem bloquear administrador.
15
+ 5. Cole chave **privada completa**, com cabeçalho/rodapé/quebras de linha, diretamente no GitHub → vps-staging → secret VPS_SSH_PRIVATE_KEY. Não confunda .pub com privada; não salve em .env/repositório.
16
+ 6. Pelo Web Console confiável, obtenha chave pública do host e fingerprint (exemplo `ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub`). Monte VPS_KNOWN_HOSTS: `HOST ssh-ed25519 PUBLIC_KEY` na porta padrão ou `[HOST]:PORT ssh-ed25519 PUBLIC_KEY` em porta customizada, com host e chave verificados.
17
+ 7. ssh-keyscan sozinho não autentica o servidor. Se coletar por ele, compare fingerprint ao console antes de salvar. Divergência bloqueia conexão; nunca use StrictHostKeyChecking=no como correção.
18
+ 8. Cadastre demais variables conforme destinos existentes. Secrets da aplicação ficam em arquivo/store protegido no VPS; workflow recebe só credencial de deploy. Imagem privada pode exigir leitura do registry, separadamente e apenas se necessária.
19
+
20
+ ## Teste sem alterar aplicação
21
+
22
+ Gere job Linux com timeout, mesmo environment do deploy e Bash. Mapear env não é interpolar valores no script. Complete o fragmento com permissions, refs e versões do contrato GitHub:
23
+
24
+ ```bash
25
+ set -euo pipefail
26
+ [[ "$VPS_HOST" =~ ^[A-Za-z0-9][A-Za-z0-9.-]*$ ]] || exit 2
27
+ [[ "$VPS_PORT" =~ ^[0-9]{1,5}$ ]] || exit 2
28
+ (( 10#$VPS_PORT >= 1 && 10#$VPS_PORT <= 65535 )) || exit 2
29
+ [[ "$VPS_USER" =~ ^[a-z_][a-z0-9_-]*$ ]] || exit 2
30
+ test -n "$VPS_SSH_PRIVATE_KEY"
31
+ test -n "$VPS_KNOWN_HOSTS"
32
+ umask 077
33
+ ssh_tmp="$(mktemp -d)"
34
+ trap 'rm -f -- "$ssh_tmp/key" "$ssh_tmp/known_hosts"; rmdir -- "$ssh_tmp"' EXIT
35
+ printf '%s\n' "$VPS_SSH_PRIVATE_KEY" > "$ssh_tmp/key"
36
+ printf '%s\n' "$VPS_KNOWN_HOSTS" > "$ssh_tmp/known_hosts"
37
+ unset VPS_SSH_PRIVATE_KEY
38
+ ssh -F /dev/null -i "$ssh_tmp/key" -p "$VPS_PORT" \
39
+ -o BatchMode=yes -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes \
40
+ -o ConnectTimeout=15 -o ConnectionAttempts=1 \
41
+ -o UserKnownHostsFile="$ssh_tmp/known_hosts" \
42
+ "$VPS_USER@$VPS_HOST" 'true'
43
+ ```
44
+
45
+ Exemplo aceita hostname/IPv4; adapte/teste se precisar IPv6. Depois acrescente comandos read-only do runtime: identidade esperada, pasta, espaço e estado do serviço. Valide paths/service contra contrato restrito antes do shell remoto; aspas locais não bastam para SSH. Não faça restart, mkdir/upload, migrations ou docker pull no modo verify.
46
+
47
+ Runner sem conectividade: cheque DNS/porta/firewall e política de rede; não libere SSH para toda Internet automaticamente. Use solução aprovada de rede privada/runner adequado. Permission denied pede usuário, par de chaves e permissões. Host key mismatch exige validação pelo console.
48
+
49
+ ## Deploy e retorno
50
+
51
+ Prepare artefato identificado por SHA/checksum em CI. Implemente upload para release nova, integridade remota, ativação atômica compatível e restart/reload só do serviço permitido. Não use git pull irrestrito ou rsync --delete sobre dados/secrets. Backup/migrations seguem contrato de dados; rollback de código não desfaz banco.
52
+
53
+ Teste no staging/serviço autorizado. Confirme readiness local e HTTPS em VPS_HEALTH_URL, identidade/versão implantada e resposta esperada da API. Não exponha logs sensíveis. Se falhar, capture diagnóstico sanitizado, restaure release anterior pelo procedimento preparado quando seguro/autorizado e confirme health. Registre SHA, artefato, serviço, run e resultado; SSH conectado não é backend implantado.
54
+
55
+ Fonte: [SSH e Web Console Hostinger](https://www.hostinger.com/support/5723772-how-to-connect-to-your-vps-via-ssh-at-hostinger/). Consulte documentação do runtime/proxy observado antes de escrever ativação.
@@ -0,0 +1,30 @@
1
+ # npm: trust, publicação e prova
2
+
3
+ Resolva pacote, registry, visibility, diretório, versão SemVer, canal, branch e filename. Leia package.json, publishConfig, files e hooks. Não imponha a versão do framework a consumidores. No mantenedor ZAIP-AIOS reutilize seu workflow exclusivo, sem outro publicador.
4
+
5
+ ## Trusted Publishing, opção preferida
6
+
7
+ 1. Usuário entra no npm como mantenedor do pacote → página do pacote → Settings → Trusted Publisher → GitHub Actions.
8
+ 2. Entregue valores exatos: organization/user, repository sem owner, filename (exemplo publish-npm.yml, **sem** .github/workflows/), environment igual ao job.
9
+ 3. Allowed actions deve corresponder ao workflow: publicação direta permite npm publish; staged publishing tem aprovação própria e não equivale a pacote publicado.
10
+ 4. Use runner GitHub hospedado, contents: read e id-token: write só no job publicador, com environment/refs protegidos. Confira requisitos atuais: baseline Node >=22.14 e npm >=11.5.1. Fixe versões suportadas, sem depender silenciosamente do npm do runner.
11
+ 5. OIDC não requer NPM_TOKEN/NODE_AUTH_TOKEN. Dependências privadas podem exigir credencial de leitura separada, só no install.
12
+ 6. Pacote ainda inexistente: confira bootstrap suportado atualmente. Não prometa Settings de pacote que não existe. Prepare primeira publicação pelo Actions com fallback granular autorizado quando necessário; depois configure trust e remova/revogue o token temporário. Nunca publique pacote de teste arbitrário nem execute npm publish local.
13
+
14
+ ## Fallback granular, quando necessário
15
+
16
+ Explique por que OIDC não atende ao runner/registry/pacote. npm → avatar → Access Tokens → Generate New Token; nome para repo/ambiente, Read and write somente no pacote/scope selecionado, validade mínima adequada, sem acesso organizacional extra. Verifique Bypass 2FA exigido para publicação não interativa e política do pacote; não remova 2FA da conta. Usuário cola token diretamente no GitHub secret **NPM_TOKEN**, environment **npm**, nunca na conversa.
17
+
18
+ Configure registry HTTPS correto e mapeie secrets.NPM_TOKEN para NODE_AUTH_TOKEN somente no passo necessário. .npmrc contém referência literal à variável, nunca o valor. Planeje rotação: confirme substituto antes de revogar anterior.
19
+
20
+ ## Qualificar, testar e observar
21
+
22
+ - Build/testes, npm pack --dry-run, inspeção de arquivos, pack real, checksum e instalação/smoke do tarball limpo. Exclua .env, SSH, tokens e arquivos privados.
23
+ - Build sem credencial de escrita. Revise lifecycle scripts; prefira publicar tarball preparado com --ignore-scripts quando compatível.
24
+ - Combine pacote aprovado, versão inédita e canal explícito antes do teste real. Publicação npm é persistente mesmo com tag de teste. Não altere latest para diagnosticar.
25
+ - O job confere tag/ref, manifesto, SHA e canal e publica o mesmo tarball validado. Use provenance quando os requisitos de pacote/repositório permitirem.
26
+ - OIDC: id-token/trust presente ou dry-run não prova permissão de publish; npm whoami não valida esse grant. Fallback: teste autenticado read-only suportado prova somente autenticação; whoami pode exigir 2FA/política e não decide isoladamente validade de publicação.
27
+ - Prova final: run bem-sucedido, pacote@versão no registry, dist-tag esperado, integridade igual ao tarball e instalação/smoke da versão exata. Staged aguardando aprovação permanece pendente.
28
+ - 401/403: confira registry, validade, escopo/2FA e trust (owner, repo, filename, environment, allowed actions). Versão existente não é erro de token; não sobrescreva. Retry só considera recuperado após verificar integridade e canal.
29
+
30
+ Fontes: [Trusted publishers](https://docs.npmjs.com/trusted-publishers/), [Criar token](https://docs.npmjs.com/creating-and-viewing-access-tokens/), [Publicar](https://docs.npmjs.com/cli/v11/commands/npm-publish/), [Provenance](https://docs.npmjs.com/generating-provenance-statements/).
@@ -0,0 +1,55 @@
1
+ import assert from "node:assert/strict";
2
+ import { createHash } from "node:crypto";
3
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
4
+ import { dirname, relative, resolve } from "node:path";
5
+ import { parseDocument } from "../../zaip-skill-github-deploy/scripts/yaml-parser.mjs";
6
+
7
+ const skill = resolve(import.meta.dirname, "..");
8
+ const root = resolve(skill, "../../..");
9
+ const read = (file) => readFileSync(file, "utf8");
10
+ function yaml(source) {
11
+ const doc = parseDocument(source, { strict: true, uniqueKeys: true });
12
+ assert.equal(doc.errors.length, 0);
13
+ return doc.toJS();
14
+ }
15
+ const source = read(resolve(skill, "SKILL.md"));
16
+ const meta = yaml(source.match(/^---\r?\n([\s\S]*?)\r?\n---/)[1]);
17
+ assert.deepEqual(Object.keys(meta).sort(), ["description", "name"]);
18
+ assert.equal(meta.name, "zaip-skill-github-actions-setup");
19
+ assert.ok(source.split(/\r?\n/).length <= 120);
20
+ const ui = yaml(read(resolve(skill, "agents/openai.yaml"))).interface;
21
+ assert.ok(ui.default_prompt.includes("$" + meta.name));
22
+ assert.ok(ui.short_description.length >= 25 && ui.short_description.length <= 64);
23
+
24
+ const lock = yaml(read(resolve(root, ".agents/config/framework.lock.yaml")));
25
+ const files = readdirSync(skill, { recursive: true, withFileTypes: true }).filter((e) =>
26
+ e.isFile(),
27
+ );
28
+ for (const entry of files) {
29
+ const file = resolve(entry.parentPath, entry.name);
30
+ const path = relative(root, file).replaceAll("\\", "/");
31
+ const text = read(file);
32
+ const hash = createHash("sha256").update(text.replaceAll("\r\n", "\n")).digest("hex");
33
+ assert.equal(lock.managed_files[path], hash, "managed content differs: " + path);
34
+ if (!path.endsWith(".md")) continue;
35
+ for (const match of text.matchAll(/\[[^\]]*\]\(([^)]+)\)/g)) {
36
+ if (/^https:\/\//.test(match[1])) continue;
37
+ assert.ok(
38
+ existsSync(resolve(dirname(file), match[1].split("#")[0])),
39
+ "missing local resource: " + match[1],
40
+ );
41
+ }
42
+ }
43
+ const page = read(resolve(skill, "references/cloudflare-pages.md"));
44
+ const steps = yaml(page.match(/```yaml\n([\s\S]*?)\n```/)[1]);
45
+ assert.equal(steps.length, 1);
46
+ assert.deepEqual(Object.keys(steps[0].env).sort(), [
47
+ "CLOUDFLARE_ACCOUNT_ID",
48
+ "CLOUDFLARE_API_TOKEN",
49
+ "CLOUDFLARE_PAGES_PROJECT",
50
+ ]);
51
+ assert.equal(steps[0].env.CLOUDFLARE_API_TOKEN, "${{ secrets.CLOUDFLARE_API_TOKEN }}");
52
+ assert.ok(existsSync(resolve(root, steps[0].run.slice("node ".length))));
53
+ process.stdout.write(
54
+ "Skill metadata, local resources, executable YAML mapping and all managed checksums verified.\n",
55
+ );
@@ -0,0 +1,61 @@
1
+ import { pathToFileURL } from "node:url";
2
+
3
+ // GET-only user-token probe. No credential arguments, redirects or response dumps.
4
+ export async function verifyCloudflare(env = process.env, fetcher = globalThis.fetch) {
5
+ const token = env.CLOUDFLARE_API_TOKEN;
6
+ const account = env.CLOUDFLARE_ACCOUNT_ID;
7
+ const project = env.CLOUDFLARE_PAGES_PROJECT;
8
+ const result = {
9
+ credential: "unverified",
10
+ project_access: "unverified",
11
+ deployment: "unverified",
12
+ };
13
+ if (typeof token !== "string" || !token.trim() || /[\r\n]/.test(token)) {
14
+ return { ...result, error: "missing_or_invalid_CLOUDFLARE_API_TOKEN" };
15
+ }
16
+ if (!/^[a-fA-F0-9]{32}$/.test(account ?? "")) {
17
+ return { ...result, error: "invalid_CLOUDFLARE_ACCOUNT_ID" };
18
+ }
19
+ if (!/^[a-z0-9](?:[a-z0-9-]{0,56}[a-z0-9])?$/.test(project ?? "")) {
20
+ return { ...result, error: "invalid_CLOUDFLARE_PAGES_PROJECT" };
21
+ }
22
+ let stage = "credential";
23
+ async function get(path) {
24
+ const response = await fetcher("https://api.cloudflare.com/client/v4" + path, {
25
+ method: "GET",
26
+ headers: { Authorization: "Bearer " + token, Accept: "application/json" },
27
+ redirect: "error",
28
+ signal: AbortSignal.timeout(15000),
29
+ });
30
+ if (!response.ok) {
31
+ const status = Number.isInteger(response.status) ? response.status : "unknown";
32
+ return { error: stage + "_http_" + status };
33
+ }
34
+ const body = await response.json();
35
+ if (body?.success !== true || !body.result || typeof body.result !== "object") {
36
+ return { error: stage + "_invalid_response" };
37
+ }
38
+ return { value: body.result };
39
+ }
40
+ try {
41
+ const auth = await get("/user/tokens/verify");
42
+ if (auth.error) return { ...result, error: auth.error };
43
+ if (auth.value.status !== "active") return { ...result, error: "credential_not_active" };
44
+ result.credential = "verified";
45
+ stage = "project_access";
46
+ const access = await get("/accounts/" + account + "/pages/projects/" + project);
47
+ if (access.error) return { ...result, error: access.error };
48
+ if (access.value.name !== project) return { ...result, error: "project_identity_mismatch" };
49
+ result.project_access = "verified";
50
+ return result;
51
+ } catch {
52
+ // Fetch/parse exceptions can contain secrets or provider response text.
53
+ return { ...result, error: stage + "_transport_or_parse_error" };
54
+ }
55
+ }
56
+
57
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
58
+ const result = await verifyCloudflare();
59
+ process.stdout.write(JSON.stringify(result) + "\n");
60
+ process.exitCode = result.error ? 1 : 0;
61
+ }
@@ -0,0 +1,128 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawnSync } from "node:child_process";
3
+ import test from "node:test";
4
+ import { fileURLToPath } from "node:url";
5
+ import { verifyCloudflare } from "./verify-cloudflare.mjs";
6
+
7
+ const secret = "synthetic-secret-do-not-log";
8
+ const env = {
9
+ CLOUDFLARE_API_TOKEN: secret,
10
+ CLOUDFLARE_ACCOUNT_ID: "a".repeat(32),
11
+ CLOUDFLARE_PAGES_PROJECT: "demo-preview",
12
+ };
13
+ const response = (result, status = 200, success = true) => ({
14
+ ok: status === 200,
15
+ status,
16
+ json: async () => ({ success, result }),
17
+ });
18
+ function queue(...responses) {
19
+ const calls = [];
20
+ const fetcher = async (url, options) => {
21
+ calls.push({ url, options });
22
+ const next = responses.shift();
23
+ if (next instanceof Error) throw next;
24
+ assert.ok(next, "unexpected request");
25
+ return next;
26
+ };
27
+ return { calls, fetcher };
28
+ }
29
+
30
+ test("GET-only probe binds account/project, refuses redirects and does not claim deployment", async () => {
31
+ const q = queue(
32
+ response({ status: "active" }),
33
+ response({ name: env.CLOUDFLARE_PAGES_PROJECT, private_config: secret }),
34
+ );
35
+ assert.deepEqual(await verifyCloudflare(env, q.fetcher), {
36
+ credential: "verified",
37
+ project_access: "verified",
38
+ deployment: "unverified",
39
+ });
40
+ assert.equal(q.calls.length, 2);
41
+ assert.equal(
42
+ q.calls[1].url,
43
+ "https://api.cloudflare.com/client/v4/accounts/" +
44
+ "a".repeat(32) +
45
+ "/pages/projects/demo-preview",
46
+ );
47
+ for (const { options } of q.calls) {
48
+ assert.equal(options.method, "GET");
49
+ assert.equal(options.redirect, "error");
50
+ assert.equal(options.headers.Authorization, "Bearer " + secret);
51
+ assert.ok(options.signal instanceof AbortSignal);
52
+ }
53
+ });
54
+
55
+ for (const [key, value] of [
56
+ ["CLOUDFLARE_API_TOKEN", ""],
57
+ ["CLOUDFLARE_API_TOKEN", "token\ninjection"],
58
+ ["CLOUDFLARE_ACCOUNT_ID", "../other"],
59
+ ["CLOUDFLARE_PAGES_PROJECT", "project?account=other"],
60
+ ])
61
+ test("invalid input stops before network: " + key + "=" + JSON.stringify(value), async () => {
62
+ const q = queue();
63
+ const result = await verifyCloudflare({ ...env, [key]: value }, q.fetcher);
64
+ assert.ok(result.error);
65
+ assert.equal(q.calls.length, 0);
66
+ });
67
+
68
+ test("expired token never probes project", async () => {
69
+ const q = queue(response({ status: "expired" }));
70
+ const result = await verifyCloudflare(env, q.fetcher);
71
+ assert.equal(result.error, "credential_not_active");
72
+ assert.equal(q.calls.length, 1);
73
+ });
74
+
75
+ for (const status of [401, 403, 404])
76
+ test("project HTTP " + status + " stays unverified with no provider body", async () => {
77
+ const q = queue(response({ status: "active" }), response({ name: secret }, status));
78
+ const result = await verifyCloudflare(env, q.fetcher);
79
+ assert.equal(result.credential, "verified");
80
+ assert.equal(result.project_access, "unverified");
81
+ assert.equal(result.error, "project_access_http_" + status);
82
+ assert.ok(!JSON.stringify(result).includes(secret));
83
+ });
84
+
85
+ test("successful HTTP with API failure is not valid authentication", async () => {
86
+ const q = queue(response({ status: "active" }, 200, false));
87
+ assert.equal((await verifyCloudflare(env, q.fetcher)).credential, "unverified");
88
+ });
89
+
90
+ test("wrong project identity is rejected", async () => {
91
+ const q = queue(response({ status: "active" }), response({ name: "another-project" }));
92
+ assert.equal((await verifyCloudflare(env, q.fetcher)).error, "project_identity_mismatch");
93
+ });
94
+
95
+ for (const failure of [
96
+ new Error("network error " + secret),
97
+ {
98
+ ok: true,
99
+ status: 200,
100
+ json: async () => {
101
+ throw new Error(secret);
102
+ },
103
+ },
104
+ ])
105
+ test("transport/parse exceptions are sanitized", async () => {
106
+ const result = await verifyCloudflare(env, queue(failure).fetcher);
107
+ assert.equal(result.error, "credential_transport_or_parse_error");
108
+ assert.ok(!JSON.stringify(result).includes(secret));
109
+ });
110
+
111
+ test("CLI rejects missing configuration with nonzero exit and sanitized output", () => {
112
+ const child = spawnSync(
113
+ process.execPath,
114
+ [fileURLToPath(new URL("./verify-cloudflare.mjs", import.meta.url))],
115
+ {
116
+ encoding: "utf8",
117
+ env: {
118
+ ...process.env,
119
+ CLOUDFLARE_API_TOKEN: "",
120
+ CLOUDFLARE_ACCOUNT_ID: env.CLOUDFLARE_ACCOUNT_ID,
121
+ CLOUDFLARE_PAGES_PROJECT: env.CLOUDFLARE_PAGES_PROJECT,
122
+ },
123
+ },
124
+ );
125
+ assert.equal(child.status, 1, child.stderr);
126
+ assert.equal(JSON.parse(child.stdout).error, "missing_or_invalid_CLOUDFLARE_API_TOKEN");
127
+ assert.equal(child.stderr, "");
128
+ });