@zaip-ai/cli 2.0.0 → 2.6.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 (460) hide show
  1. package/README.md +33 -14
  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 +30 -25
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/agent-adapters.js +45 -15
  7. package/dist/services/agent-adapters.js.map +1 -1
  8. package/dist/services/agent-adapters.test.js +13 -7
  9. package/dist/services/agent-adapters.test.js.map +1 -1
  10. package/dist/services/agent-discovery.d.ts +27 -0
  11. package/dist/services/agent-discovery.d.ts.map +1 -0
  12. package/dist/services/agent-discovery.js +73 -0
  13. package/dist/services/agent-discovery.js.map +1 -0
  14. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  15. package/dist/services/codex-conversation-lifecycle-hook.js +153 -24
  16. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  17. package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
  18. package/dist/services/codex-pre-tool-hook-template.js +146 -72
  19. package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
  20. package/dist/services/codex-rules.d.ts +1 -1
  21. package/dist/services/codex-rules.d.ts.map +1 -1
  22. package/dist/services/codex-rules.js +3 -3
  23. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  24. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  25. package/dist/services/codex-subagent-hook-template.js +117 -66
  26. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  27. package/dist/services/install-agents-template.d.ts.map +1 -1
  28. package/dist/services/install-agents-template.js +56 -6
  29. package/dist/services/install-agents-template.js.map +1 -1
  30. package/dist/services/logger.js +1 -1
  31. package/dist/services/logger.js.map +1 -1
  32. package/dist/services/logger.test.js +24 -3
  33. package/dist/services/logger.test.js.map +1 -1
  34. package/dist/services/runtime-template.test.js +138 -1
  35. package/dist/services/runtime-template.test.js.map +1 -1
  36. package/package.json +1 -1
  37. package/templates/.agents/.env.example +9 -3
  38. package/templates/.agents/README-ENG.md +47 -5
  39. package/templates/.agents/README.md +38 -9
  40. package/templates/.agents/architecture/software-architecture.md +1 -59
  41. package/templates/.agents/branding/brandbook.md +3 -0
  42. package/templates/.agents/config/agents/catalog.yaml +40 -28
  43. package/templates/.agents/config/agents/discovery.json +319 -0
  44. package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +3 -6
  45. package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +3 -6
  46. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +4 -7
  47. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +6 -8
  48. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +4 -7
  49. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +13 -13
  50. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +5 -7
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +4 -7
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +3 -6
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +4 -7
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +6 -8
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +3 -6
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +6 -8
  57. package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +3 -6
  58. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +6 -8
  59. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +4 -5
  60. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +3 -6
  61. package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +3 -6
  62. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +6 -8
  63. package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +3 -6
  64. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +4 -7
  65. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +4 -7
  66. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +3 -6
  67. package/templates/.agents/config/pricing/models.json +57 -33
  68. package/templates/.agents/config/project.yaml +12 -1
  69. package/templates/.agents/dashboard/.zaip-managed.json +378 -98
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-CGxeQak4.js +1 -0
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-CYfpYsTr.js → DashboardHelpDialog-tzS7YxYB.js} +173 -47
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-DEbCi1gP.js +1 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-1L7Qw-Gq.js +3 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-EInWr641.css +1 -0
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-t1Om0Abw.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-B6aZfo5f.js +68 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-TPUT2IUt.js → icons-vendor-DiGC-dsJ.js} +1 -1
  78. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DgTmNHN5.js +2 -0
  79. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-Ct48XHGL.js → react-vendor-kPO6yNed.js} +1 -1
  80. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-Bh1tDfsg.js +1 -0
  81. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DQpKX9c1.js +1 -0
  82. package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
  83. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  84. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +3 -1264
  85. package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +363 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +99 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +62 -6
  88. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +3 -1
  89. package/templates/.agents/dashboard/apps/frontend/src/__tests__/app-composition-support.ts +7 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +9 -7
  91. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +151 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +28 -153
  93. package/templates/.agents/dashboard/apps/frontend/src/dashboard-app-shell.tsx +33 -0
  94. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.ts +30 -0
  95. package/templates/.agents/dashboard/apps/frontend/src/dashboard-project-overview.ts +7 -1
  96. package/templates/.agents/dashboard/apps/frontend/src/dashboard-retry.ts +17 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/dashboard-setup-route.ts +29 -0
  98. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.ts +66 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +3 -2
  100. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +2 -2
  101. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.test.ts +48 -0
  102. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.ts +29 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +68 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +2 -2
  105. package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.test.ts +36 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.ts +30 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +2 -5
  108. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +30 -19
  109. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +9 -1
  110. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-task-pagination.ts +77 -0
  111. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +397 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +782 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/use-snapshot-notice.tsx +49 -0
  114. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  115. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperPanelSlot.tsx +16 -0
  116. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +459 -0
  117. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +27 -17
  118. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +62 -186
  119. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorRunDialog.tsx +20 -0
  120. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-hides-calls-that-have-no-collected.test.ts +80 -0
  121. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +455 -0
  122. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +18 -525
  123. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +32 -508
  124. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-export-sources.ts +74 -0
  125. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-actions.ts +19 -0
  126. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +49 -0
  127. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-formatters.ts +115 -0
  128. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test-fixtures.ts +2 -0
  129. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  130. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +4 -0
  131. package/templates/.agents/dashboard/modules/operations/src/react/EntityTableBadges.tsx +34 -0
  132. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +8 -38
  133. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview-keeps-structure-classes-mutually-exclusive.test.ts +243 -0
  134. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +27 -275
  135. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +70 -247
  136. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewCharts.tsx +171 -0
  137. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewPanels.tsx +64 -0
  138. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +4 -3
  139. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +2 -1
  140. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +2 -1
  141. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +6 -2
  142. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +6 -14
  143. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +3 -1
  144. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +2 -0
  145. package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-format.ts +32 -0
  146. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  147. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  148. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  149. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  150. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  151. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1458 -1458
  152. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1425 -1425
  153. package/templates/.agents/dashboard/packages/local-runtime/package.json +2 -1
  154. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +7 -3
  155. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1458 -1459
  156. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +25 -0
  157. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +1 -1
  158. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +53 -8
  159. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +79 -24
  160. package/templates/.agents/dashboard/packages/local-runtime/src/projection-refresh-diagnostics.ts +35 -0
  161. package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +168 -0
  162. package/templates/.agents/dashboard/packages/local-runtime/src/server-dual-reads-manifest-summaries-without-losing.test.ts +344 -0
  163. package/templates/.agents/dashboard/packages/local-runtime/src/server-http-contracts.ts +31 -0
  164. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-routes.ts +345 -0
  165. package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +461 -0
  166. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +78 -0
  167. package/templates/.agents/dashboard/packages/local-runtime/src/server-route-context.ts +13 -0
  168. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +18 -0
  169. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +19 -3
  170. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -21
  171. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +1 -1
  172. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-view-allowlist.test.ts +25 -0
  173. package/templates/.agents/dashboard/packages/local-runtime/src/server-trace-routes.ts +64 -0
  174. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +2 -30
  175. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +6 -23
  176. package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +1 -1
  177. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +2 -330
  178. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +73 -1060
  179. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-first-fold.ts +78 -0
  180. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +561 -0
  181. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-runs.ts +600 -0
  182. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +1 -1
  183. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +269 -0
  184. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-context.ts +32 -0
  185. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +244 -0
  186. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +292 -0
  187. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +547 -0
  188. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +360 -0
  189. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +169 -0
  190. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +475 -0
  191. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-temporal-dimension.ts +132 -0
  192. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-timing.ts +299 -0
  193. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +692 -0
  194. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +739 -0
  195. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-does-not-convert-delayed-historical-finalizer.test.ts +706 -0
  196. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +748 -0
  197. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +1 -1
  198. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-keeps-orphan-telemetry-out-kanban-without.test.ts +710 -0
  199. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-marks-token-cost-telemetry-unavailable-when.test.ts +618 -0
  200. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +755 -0
  201. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuilds-disposable-snapshot-serves-zaip-records.test.ts +276 -0
  202. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +193 -0
  203. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-types.ts +123 -0
  204. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +1 -2805
  205. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +17 -6930
  206. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +385 -0
  207. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +412 -0
  208. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +4 -3
  209. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-build.mjs +195 -0
  210. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.test.mjs +2 -7
  211. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-logging.mjs +35 -0
  212. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-navigation.mjs +114 -0
  213. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-paths.mjs +90 -0
  214. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +89 -418
  215. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +22 -12
  216. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  217. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  218. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +4 -1
  219. package/templates/.agents/design/.zaip-managed.json +5 -5
  220. package/templates/.agents/design/DESIGN.md +2 -186
  221. package/templates/.agents/design/README.md +12 -2
  222. package/templates/.agents/design/apps/catalog/package.json +1 -1
  223. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  224. package/templates/.agents/growth/strategy.md +3 -0
  225. package/templates/.agents/marketing/strategy.md +3 -0
  226. package/templates/.agents/requirements/autonomous-assurance.md +2 -1
  227. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  228. package/templates/.agents/requirements/comparative-audit.md +1 -1
  229. package/templates/.agents/requirements/context-engine.md +1 -1
  230. package/templates/.agents/requirements/cost-observability.md +1 -1
  231. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  232. package/templates/.agents/requirements/data-export.md +1 -1
  233. package/templates/.agents/requirements/design-system.md +13 -4
  234. package/templates/.agents/requirements/execution-engine.md +1 -1
  235. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  236. package/templates/.agents/requirements/model-orchestration.md +15 -5
  237. package/templates/.agents/requirements/public-distribution.md +5 -3
  238. package/templates/.agents/requirements/software-architecture.md +1 -1
  239. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  240. package/templates/.agents/requirements/work-lifecycle.md +3 -3
  241. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  242. package/templates/.agents/rules/architecture.md +2 -0
  243. package/templates/.agents/rules/astra-diagnostic.md +20 -0
  244. package/templates/.agents/rules/autonomy-decision.md +3 -1
  245. package/templates/.agents/rules/cloud-hostinger-autonomy.md +2 -0
  246. package/templates/.agents/rules/context.md +2 -1
  247. package/templates/.agents/rules/core.md +9 -14
  248. package/templates/.agents/rules/design-system-central-contract.md +17 -0
  249. package/templates/.agents/rules/evolution.md +3 -1
  250. package/templates/.agents/rules/frontend-lite.md +3 -1
  251. package/templates/.agents/rules/local-sqlite-storage.md +2 -2
  252. package/templates/.agents/rules/meta-mcp.md +4 -1
  253. package/templates/.agents/rules/model-orchestration.md +1 -1
  254. package/templates/.agents/rules/run-lifecycle-closure.md +7 -5
  255. package/templates/.agents/rules/security.md +3 -1
  256. package/templates/.agents/rules/specialist-routing.md +6 -2
  257. package/templates/.agents/rules/text-writing-utf8.md +1 -1
  258. package/templates/.agents/rules/workflow.md +7 -5
  259. package/templates/.agents/runtime/VERSION +1 -1
  260. package/templates/.agents/runtime/bin/zaip.mjs +534 -266
  261. package/templates/.agents/runtime/checksums.sha256 +6 -6
  262. package/templates/.agents/runtime/manifest.json +1 -1
  263. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  264. package/templates/.agents/runtime/provenance.json +5 -5
  265. package/templates/.agents/runtime/sbom.cdx.json +1 -1
  266. package/templates/.agents/sales/playbook.md +3 -0
  267. package/templates/.agents/skills/zaip-aios/SKILL.md +5 -3
  268. package/templates/.agents/skills/zaip-skill-adapt-stack/SKILL.md +1 -0
  269. package/templates/.agents/skills/zaip-skill-api-contracts/SKILL.md +14 -0
  270. package/templates/.agents/skills/zaip-skill-api-contracts/agents/openai.yaml +4 -0
  271. package/templates/.agents/skills/zaip-skill-application-observability/SKILL.md +15 -0
  272. package/templates/.agents/skills/zaip-skill-application-observability/agents/openai.yaml +4 -0
  273. package/templates/.agents/skills/zaip-skill-application-observability/references/signal-design.md +3 -0
  274. package/templates/.agents/skills/zaip-skill-application-readiness/SKILL.md +15 -0
  275. package/templates/.agents/skills/zaip-skill-application-readiness/agents/openai.yaml +4 -0
  276. package/templates/.agents/skills/zaip-skill-application-readiness/references/evidence-matrix.md +3 -0
  277. package/templates/.agents/skills/zaip-skill-architecture-design/SKILL.md +14 -0
  278. package/templates/.agents/skills/zaip-skill-architecture-design/agents/openai.yaml +4 -0
  279. package/templates/.agents/skills/zaip-skill-async-jobs/SKILL.md +14 -0
  280. package/templates/.agents/skills/zaip-skill-async-jobs/agents/openai.yaml +4 -0
  281. package/templates/.agents/skills/zaip-skill-auth-tenancy/SKILL.md +15 -0
  282. package/templates/.agents/skills/zaip-skill-auth-tenancy/agents/openai.yaml +4 -0
  283. package/templates/.agents/skills/zaip-skill-auth-tenancy/references/data-access-paths.md +9 -0
  284. package/templates/.agents/skills/zaip-skill-auth-tenancy/references/worker-scenario.md +5 -0
  285. package/templates/.agents/skills/zaip-skill-auth-tenancy/scripts/worker-contract.test.mjs +27 -0
  286. package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +2 -0
  287. package/templates/.agents/skills/zaip-skill-author-skills/references/engineering-skill-index.md +9 -0
  288. package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +5 -3
  289. package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
  290. package/templates/.agents/skills/zaip-skill-backend/SKILL.md +4 -0
  291. package/templates/.agents/skills/zaip-skill-backend/references/deployment-environments.md +75 -0
  292. package/templates/.agents/skills/zaip-skill-backend/references/supabase-migration-contract.md +23 -0
  293. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +2 -0
  294. package/templates/.agents/skills/zaip-skill-cache-strategy/SKILL.md +14 -0
  295. package/templates/.agents/skills/zaip-skill-cache-strategy/agents/openai.yaml +4 -0
  296. package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
  297. package/templates/.agents/skills/zaip-skill-cloud-engineering/SKILL.md +7 -0
  298. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/SKILL.md +37 -0
  299. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/agents/openai.yaml +6 -0
  300. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workers-static-assets.md +26 -0
  301. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workflow-templates.md +71 -0
  302. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/scripts/cloudflare-github-deploy-contract.test.mjs +77 -0
  303. package/templates/.agents/skills/zaip-skill-config/SKILL.md +21 -11
  304. package/templates/.agents/skills/zaip-skill-config/agents/openai.yaml +2 -2
  305. package/templates/.agents/skills/zaip-skill-container-runtime/SKILL.md +14 -0
  306. package/templates/.agents/skills/zaip-skill-container-runtime/agents/openai.yaml +4 -0
  307. package/templates/.agents/skills/zaip-skill-context/SKILL.md +6 -1
  308. package/templates/.agents/skills/zaip-skill-context/references/prd-spec-task-handoff.md +10 -0
  309. package/templates/.agents/skills/zaip-skill-context/references/rule-selection.md +20 -0
  310. package/templates/.agents/skills/zaip-skill-cqrs/SKILL.md +1 -0
  311. package/templates/.agents/skills/zaip-skill-cybersecurity/SKILL.md +18 -0
  312. package/templates/.agents/skills/zaip-skill-cybersecurity/agents/openai.yaml +4 -0
  313. package/templates/.agents/skills/zaip-skill-cybersecurity/references/audit-contract.md +94 -0
  314. package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.mjs +185 -0
  315. package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.test.mjs +101 -0
  316. package/templates/.agents/skills/zaip-skill-data-modeling/SKILL.md +14 -0
  317. package/templates/.agents/skills/zaip-skill-data-modeling/agents/openai.yaml +4 -0
  318. package/templates/.agents/skills/zaip-skill-database-migrations/SKILL.md +20 -0
  319. package/templates/.agents/skills/zaip-skill-database-migrations/agents/openai.yaml +4 -0
  320. package/templates/.agents/skills/zaip-skill-database-migrations/references/manual-mode.md +15 -0
  321. package/templates/.agents/skills/zaip-skill-database-migrations/references/promotion-example.md +5 -0
  322. package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.mjs +145 -0
  323. package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.test.mjs +178 -0
  324. package/templates/.agents/skills/zaip-skill-dependency-upgrade/SKILL.md +14 -0
  325. package/templates/.agents/skills/zaip-skill-dependency-upgrade/agents/openai.yaml +4 -0
  326. package/templates/.agents/skills/zaip-skill-deployment-pipeline/SKILL.md +15 -0
  327. package/templates/.agents/skills/zaip-skill-deployment-pipeline/agents/openai.yaml +4 -0
  328. package/templates/.agents/skills/zaip-skill-deployment-pipeline/references/runtime-shapes.md +3 -0
  329. package/templates/.agents/skills/zaip-skill-design-system/SKILL.md +20 -9
  330. package/templates/.agents/skills/zaip-skill-dev-environment/SKILL.md +14 -0
  331. package/templates/.agents/skills/zaip-skill-dev-environment/agents/openai.yaml +4 -0
  332. package/templates/.agents/skills/zaip-skill-dev-environment/references/inventory-contract.md +7 -0
  333. package/templates/.agents/skills/zaip-skill-dev-environment/scripts/inventory.mjs +77 -0
  334. package/templates/.agents/skills/zaip-skill-disaster-recovery/SKILL.md +15 -0
  335. package/templates/.agents/skills/zaip-skill-disaster-recovery/agents/openai.yaml +4 -0
  336. package/templates/.agents/skills/zaip-skill-disaster-recovery/references/recovery-scope.md +3 -0
  337. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +5 -3
  338. package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +7 -0
  339. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +13 -0
  340. package/templates/.agents/skills/zaip-skill-external-integrations/SKILL.md +14 -0
  341. package/templates/.agents/skills/zaip-skill-external-integrations/agents/openai.yaml +4 -0
  342. package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -0
  343. package/templates/.agents/skills/zaip-skill-frontend-componentization/SKILL.md +44 -0
  344. package/templates/.agents/skills/zaip-skill-frontend-componentization/agents/openai.yaml +4 -0
  345. package/templates/.agents/skills/zaip-skill-frontend-data-flows/SKILL.md +14 -0
  346. package/templates/.agents/skills/zaip-skill-frontend-data-flows/agents/openai.yaml +4 -0
  347. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +8 -7
  348. package/templates/.agents/skills/zaip-skill-general-operations/references/extended-workflow.md +7 -0
  349. package/templates/.agents/skills/zaip-skill-github-actions-setup/SKILL.md +36 -0
  350. package/templates/.agents/skills/zaip-skill-github-actions-setup/agents/openai.yaml +4 -0
  351. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/cloudflare-pages.md +33 -0
  352. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/github.md +63 -0
  353. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/hostinger-vps.md +55 -0
  354. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/npm.md +30 -0
  355. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/check-skill.mjs +55 -0
  356. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.mjs +61 -0
  357. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.test.mjs +128 -0
  358. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-ssh.integration.test.mjs +106 -0
  359. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +43 -76
  360. package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +131 -0
  361. package/templates/.agents/skills/zaip-skill-github-deploy/references/github-release-workflow-template.md +31 -0
  362. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-gate-matrix.md +24 -0
  363. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +44 -0
  364. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-notes.md +134 -0
  365. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +389 -0
  366. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +134 -0
  367. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +25 -2
  368. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness-api.test.mjs +134 -0
  369. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.mjs +98 -0
  370. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.test.mjs +25 -0
  371. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.mjs +159 -0
  372. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.test.mjs +160 -0
  373. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +149 -12
  374. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +64 -5
  375. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/release-notes-coverage.test.mjs +126 -0
  376. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.mjs +78 -0
  377. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.test.mjs +51 -0
  378. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.mjs +184 -0
  379. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.test.mjs +109 -0
  380. package/templates/.agents/skills/zaip-skill-github-setup/SKILL.md +5 -0
  381. package/templates/.agents/skills/zaip-skill-github-setup-ssh-folder/SKILL.md +54 -0
  382. package/templates/.agents/skills/zaip-skill-github-setup-ssh-folder/agents/openai.yaml +4 -0
  383. package/templates/.agents/skills/zaip-skill-github-setup-ssh-folder/assets/.env.example +9 -0
  384. package/templates/.agents/skills/zaip-skill-github-setup-ssh-folder/references/operational-procedure.md +137 -0
  385. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +8 -18
  386. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/extended-workflow.md +21 -0
  387. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +18 -10
  388. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +3 -4
  389. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/aws-cli-terraform.md +62 -0
  390. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/guia-iniciante-hostinger-vps.md +183 -0
  391. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +8 -13
  392. package/templates/.agents/skills/zaip-skill-marketing/references/extended-workflow.md +16 -0
  393. package/templates/.agents/skills/zaip-skill-meta-ads-setup/SKILL.md +2 -0
  394. package/templates/.agents/skills/zaip-skill-meta-token-onboarding/SKILL.md +17 -0
  395. package/templates/.agents/skills/zaip-skill-meta-token-onboarding/agents/openai.yaml +4 -0
  396. package/templates/.agents/skills/zaip-skill-meta-token-onboarding/references/onboarding-manual.md +96 -0
  397. package/templates/.agents/skills/zaip-skill-module-scaffold/SKILL.md +14 -0
  398. package/templates/.agents/skills/zaip-skill-module-scaffold/agents/openai.yaml +4 -0
  399. package/templates/.agents/skills/zaip-skill-module-scaffold/references/scaffold-contract.md +9 -0
  400. package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/helpers.test.mjs +121 -0
  401. package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/scaffold.mjs +169 -0
  402. package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +1 -1
  403. package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +1 -1
  404. package/templates/.agents/skills/zaip-skill-performance-engineering/SKILL.md +14 -0
  405. package/templates/.agents/skills/zaip-skill-performance-engineering/agents/openai.yaml +4 -0
  406. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +1 -1
  407. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +1 -0
  408. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +26 -9
  409. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +39 -13
  410. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +1 -0
  411. package/templates/.agents/skills/zaip-skill-refactor-landing-page/SKILL.md +66 -0
  412. package/templates/.agents/skills/zaip-skill-refactor-landing-page/agents/openai.yaml +4 -0
  413. package/templates/.agents/skills/zaip-skill-refactor-landing-page/references/behavioral-dry-run.md +23 -0
  414. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +44 -1
  415. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +98 -0
  416. package/templates/.agents/skills/zaip-skill-review/SKILL.md +1 -0
  417. package/templates/.agents/skills/zaip-skill-rules/SKILL.md +3 -3
  418. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +9 -17
  419. package/templates/.agents/skills/zaip-skill-sales-methodology/references/extended-workflow.md +20 -0
  420. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +22 -21
  421. package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +2 -2
  422. package/templates/.agents/skills/zaip-skill-spec/SKILL.md +3 -2
  423. package/templates/.agents/skills/zaip-skill-storage-uploads/SKILL.md +14 -0
  424. package/templates/.agents/skills/zaip-skill-storage-uploads/agents/openai.yaml +4 -0
  425. package/templates/.agents/skills/zaip-skill-systematic-debugging/SKILL.md +14 -0
  426. package/templates/.agents/skills/zaip-skill-systematic-debugging/agents/openai.yaml +4 -0
  427. package/templates/.agents/skills/zaip-skill-task/SKILL.md +16 -7
  428. package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +25 -0
  429. package/templates/.agents/skills/zaip-skill-test-data/SKILL.md +14 -0
  430. package/templates/.agents/skills/zaip-skill-test-data/agents/openai.yaml +4 -0
  431. package/templates/.agents/skills/zaip-skill-test-data/scripts/generate.mjs +72 -0
  432. package/templates/.agents/skills/zaip-skill-testing-strategy/SKILL.md +15 -0
  433. package/templates/.agents/skills/zaip-skill-testing-strategy/agents/openai.yaml +4 -0
  434. package/templates/.agents/skills/zaip-skill-testing-strategy/references/example-map.md +3 -0
  435. package/templates/.agents/skills/zaip-skill-text-encoding/SKILL.md +1 -1
  436. package/templates/.agents/skills/zaip-skill-website-readiness/SKILL.md +8 -0
  437. package/templates/.agents/zaip-aios/INDEX.md +1 -1
  438. package/templates/.agents/zaip-aios/README.md +6 -0
  439. package/templates/.agents/zaip-aios/VERSION +1 -1
  440. package/templates/.agents/zaip-aios/guides/08-contexto-e-tokens.md +19 -3
  441. package/templates/.agents/zaip-aios/guides/10-seguranca.md +2 -1
  442. package/templates/.agents/zaip-aios/guides/12-instalacao-e-upgrade.md +37 -7
  443. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +19 -4
  444. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +32 -3
  445. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +21 -0
  446. package/templates/scripts/validate-cloud-hostinger-contract.mjs +34 -0
  447. package/templates/template-manifest.json +1031 -235
  448. package/templates/.agents/branding/.gitkeep +0 -0
  449. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-snUCQYTC.js +0 -1
  450. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-BPtVUGgs.js +0 -1
  451. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +0 -3
  452. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-GgzpZ_PY.css +0 -1
  453. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-DHDrd5rE.js +0 -1
  454. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +0 -68
  455. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-BYbpmqmM.js +0 -2
  456. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +0 -1
  457. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BDe4_Ubl.js +0 -1
  458. package/templates/.agents/growth/.gitkeep +0 -0
  459. package/templates/.agents/marketing/.gitkeep +0 -0
  460. package/templates/.agents/sales/.gitkeep +0 -0
@@ -0,0 +1,184 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import { parseArgs } from "node:util";
5
+
6
+ const categoryHeadings = new Map([
7
+ ["feat", "Novidades"],
8
+ ["added", "Novidades"],
9
+ ["fix", "Correções"],
10
+ ["perf", "Desempenho"],
11
+ ["refactor", "Alterações internas"],
12
+ ["build", "Alterações internas"],
13
+ ["ci", "Alterações internas"],
14
+ ["test", "Alterações internas"],
15
+ ["chore", "Alterações internas"],
16
+ ["changed", "Alterações internas"],
17
+ ["security", "Segurança"],
18
+ ["breaking", "Alterações incompatíveis e migrações"],
19
+ ["migration", "Alterações incompatíveis e migrações"],
20
+ ["removed", "Alterações incompatíveis e migrações"],
21
+ ["deprecated", "Alterações incompatíveis e migrações"],
22
+ ["docs", "Documentação"],
23
+ ]);
24
+ const releaseHeadings = new Set([
25
+ "Novidades",
26
+ "Correções",
27
+ "Desempenho",
28
+ "Alterações internas",
29
+ "Segurança",
30
+ "Alterações incompatíveis e migrações",
31
+ "Documentação",
32
+ ]);
33
+ const { values } = parseArgs({
34
+ options: {
35
+ repository: { type: "string" },
36
+ from: { type: "string" },
37
+ initial: { type: "boolean", default: false },
38
+ to: { type: "string" },
39
+ "notes-file": { type: "string" },
40
+ "inventory-file": { type: "string" },
41
+ },
42
+ strict: true,
43
+ });
44
+ for (const option of ["repository", "to", "notes-file", "inventory-file"]) {
45
+ if (!values[option]) throw new Error("--" + option + " is required");
46
+ }
47
+ if (values.initial === Boolean(values.from))
48
+ throw new Error("use exactly one of --from <previous-tag> or --initial");
49
+ if (!/^[a-f0-9]{40}$/i.test(values.to))
50
+ throw new Error("--to must be an explicit immutable 40-character candidate SHA");
51
+
52
+ const repository = resolve(values.repository);
53
+ const [notesBytes, inventoryBytes, candidate] = await Promise.all([
54
+ readFile(resolve(repository, values["notes-file"])),
55
+ readFile(resolve(repository, values["inventory-file"])),
56
+ gitText(repository, ["rev-parse", "--verify", values.to + "^{commit}"]),
57
+ ]);
58
+ if (candidate.trim().toLowerCase() !== values.to.toLowerCase())
59
+ throw new Error("--to must resolve to the supplied immutable candidate SHA");
60
+ if (!values.initial)
61
+ await gitText(repository, ["merge-base", "--is-ancestor", values.from, values.to]);
62
+ const changed = values.initial
63
+ ? await gitBytes(repository, ["ls-tree", "-rz", "--name-only", values.to])
64
+ : await gitBytes(repository, [
65
+ "diff",
66
+ "--name-only",
67
+ "-z",
68
+ "--no-renames",
69
+ "--diff-filter=ACMRTD",
70
+ values.from + ".." + values.to,
71
+ ]);
72
+ const notes = new TextDecoder("utf-8", { fatal: true }).decode(notesBytes);
73
+ const inventory = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(inventoryBytes));
74
+ validate(notes, inventory, values, nulPaths(changed));
75
+ process.stdout.write(
76
+ JSON.stringify({
77
+ status: "passed",
78
+ files: inventory.files.length,
79
+ topics: inventory.topics.length,
80
+ semantic_review: "required",
81
+ }) + "\n",
82
+ );
83
+
84
+ function validate(notes, inventory, values, actualFiles) {
85
+ const visible = stripFencedCode(notes);
86
+ if (visible.trim().length === 0) throw new Error("release notes body is empty");
87
+ const visibleBullets = bulletLines(visible);
88
+ if (/^\s*(?:full changelog|compare changes)\s*:/im.test(visible) && visibleBullets.length === 0)
89
+ throw new Error("release notes cannot be compare-only");
90
+ if (/--generate-notes|\bTBD\b|\bN\/A\b/i.test(visible))
91
+ throw new Error("release notes contain a generated-notes flag or placeholder");
92
+ if (!Array.isArray(inventory.files) || !Array.isArray(inventory.topics))
93
+ throw new Error("inventory must contain files and topics arrays");
94
+ if (inventory.from !== (values.initial ? null : values.from) || inventory.to !== values.to)
95
+ throw new Error("inventory range must exactly match the immutable candidate selection");
96
+ const inventoryFiles = unique(inventory.files);
97
+ if (!inventoryFiles.every(isPath) || !sameSet(actualFiles, inventoryFiles))
98
+ throw new Error("inventory files must exactly cover the changed Git range");
99
+ if (inventory.topics.length === 0)
100
+ throw new Error("inventory must describe at least one release topic");
101
+ const mappedFiles = [];
102
+ const mappedBullets = new Set();
103
+ for (const topic of inventory.topics) {
104
+ if (!categoryHeadings.has(topic?.category)) throw new Error("topic category is invalid");
105
+ if (typeof topic?.bullet !== "string" || !visibleBullets.includes(topic.bullet))
106
+ throw new Error("every inventory topic bullet must appear outside fenced examples");
107
+ if (mappedBullets.has(topic.bullet)) throw new Error("inventory topic bullets must be unique");
108
+ mappedBullets.add(topic.bullet);
109
+ if (!Array.isArray(topic.files) || topic.files.length === 0 || !topic.files.every(isPath))
110
+ throw new Error("every topic must map to at least one changed file");
111
+ mappedFiles.push(...topic.files);
112
+ }
113
+ if (!sameSet(inventoryFiles, unique(mappedFiles)))
114
+ throw new Error("release topics must exactly cover every inventoried file");
115
+ const headings = [...visible.matchAll(/^## (.+)$/gm)].map((match) => ({
116
+ name: match[1],
117
+ index: match.index,
118
+ }));
119
+ if (headings[0]?.name !== "Resumo")
120
+ throw new Error("release notes must open with a Resumo heading");
121
+ const firstCategory = headings.find((heading) => releaseHeadings.has(heading.name));
122
+ if (
123
+ visible.slice(headings[0].index + "## Resumo".length, firstCategory?.index).trim().length === 0
124
+ )
125
+ throw new Error("Resumo must contain plain-language release context before categories");
126
+ if (!headings.some((heading) => releaseHeadings.has(heading.name)))
127
+ throw new Error("release notes need at least one categorized heading");
128
+ const categoryBullets = new Map();
129
+ for (let index = 0; index < headings.length; index += 1) {
130
+ const heading = headings[index];
131
+ if (!releaseHeadings.has(heading.name)) continue;
132
+ const section = visible.slice(
133
+ heading.index + heading.name.length + 3,
134
+ headings[index + 1]?.index,
135
+ );
136
+ const bullets = bulletLines(section);
137
+ if (bullets.length === 0)
138
+ throw new Error("every recognized category section must contain a bullet");
139
+ categoryBullets.set(heading.name, bullets);
140
+ }
141
+ const expected = new Set(inventory.topics.map((topic) => topic.bullet));
142
+ const actual = new Set([...categoryBullets.values()].flat());
143
+ if (!sameSet([...expected].sort(), [...actual].sort()))
144
+ throw new Error("category bullets must exactly match inventory topics");
145
+ for (const topic of inventory.topics) {
146
+ if (!categoryBullets.get(categoryHeadings.get(topic.category))?.includes(topic.bullet)) {
147
+ throw new Error("topic bullet must appear under its mapped category heading");
148
+ }
149
+ }
150
+ }
151
+ function stripFencedCode(source) {
152
+ return source.replace(/^ {0,3}(\`\`\`|~~~)[\s\S]*?^ {0,3}\1\s*$/gm, "");
153
+ }
154
+ function bulletLines(source) {
155
+ return (source.match(/^\s*-\s+.+$/gm) ?? []).map((line) => line.trim());
156
+ }
157
+ function nulPaths(bytes) {
158
+ return unique(
159
+ new TextDecoder("utf-8", { fatal: true }).decode(bytes).split("\0").filter(Boolean),
160
+ );
161
+ }
162
+ function unique(values) {
163
+ return [...new Set(values)].sort();
164
+ }
165
+ function sameSet(left, right) {
166
+ return left.length === right.length && left.every((value, index) => value === right[index]);
167
+ }
168
+ function isPath(value) {
169
+ return typeof value === "string" && value.length > 0;
170
+ }
171
+ function gitText(cwd, args) {
172
+ return git(cwd, args, "utf8");
173
+ }
174
+ function gitBytes(cwd, args) {
175
+ return git(cwd, args, "buffer");
176
+ }
177
+ function git(cwd, args, encoding) {
178
+ return new Promise((resolveResult, reject) => {
179
+ execFile("git", args, { cwd, encoding }, (error, stdout, stderr) => {
180
+ if (error) reject(new Error("git " + args.join(" ") + " failed: " + String(stderr).trim()));
181
+ else resolveResult(stdout);
182
+ });
183
+ });
184
+ }
@@ -0,0 +1,109 @@
1
+ import assert from "node:assert/strict";
2
+ import { execFile as run } from "node:child_process";
3
+ import { mkdtemp, writeFile } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { resolve } from "node:path";
6
+ import test from "node:test";
7
+
8
+ const script = resolve(import.meta.dirname, "validate-release-notes.mjs");
9
+
10
+ test("accepts categorized reviewed notes that fully cover the exact range", async () => {
11
+ const root = await repository();
12
+ await writeFile(
13
+ resolve(root, "notes.md"),
14
+ "## Resumo\n\n- A release improves publication quality.\n\n## Novidades\n\n- **Feature:** Adds a useful capability for release reviewers.\n",
15
+ "utf8",
16
+ );
17
+ await writeFile(
18
+ resolve(root, "inventory.json"),
19
+ JSON.stringify({
20
+ from: "v1.0",
21
+ to: (await command("git", ["rev-parse", "HEAD"], root)).trim(),
22
+ files: ["feature.md"],
23
+ topics: [
24
+ {
25
+ category: "feat",
26
+ bullet: "- **Feature:** Adds a useful capability for release reviewers.",
27
+ files: ["feature.md"],
28
+ },
29
+ ],
30
+ }),
31
+ "utf8",
32
+ );
33
+ await expectValidation(root, 0);
34
+ });
35
+
36
+ test("rejects a compare-only body and incomplete range inventory", async () => {
37
+ const root = await repository();
38
+ await writeFile(
39
+ resolve(root, "notes.md"),
40
+ "Full Changelog: [v1.0...v1.1](https://example.test)\n",
41
+ "utf8",
42
+ );
43
+ await writeFile(
44
+ resolve(root, "inventory.json"),
45
+ JSON.stringify({
46
+ from: "v1.0",
47
+ to: (await command("git", ["rev-parse", "HEAD"], root)).trim(),
48
+ files: [],
49
+ topics: [],
50
+ }),
51
+ "utf8",
52
+ );
53
+ const result = await expectValidation(root, 1);
54
+ assert.match(result.stderr, /release notes cannot be compare-only/);
55
+ });
56
+
57
+ async function repository() {
58
+ const root = await mkdtemp(resolve(tmpdir(), "zaip-release-notes-"));
59
+ await command("git", ["init", "--quiet"], root);
60
+ await command("git", ["config", "user.email", "test@example.com"], root);
61
+ await command("git", ["config", "user.name", "Test"], root);
62
+ await writeFile(resolve(root, "feature.md"), "before\n", "utf8");
63
+ await command("git", ["add", "feature.md"], root);
64
+ await command("git", ["commit", "--quiet", "-m", "initial"], root);
65
+ await command("git", ["tag", "v1.0"], root);
66
+ await writeFile(resolve(root, "feature.md"), "after\n", "utf8");
67
+ await command("git", ["commit", "--quiet", "-am", "feature"], root);
68
+ return root;
69
+ }
70
+
71
+ function expectValidation(cwd, expectedCode) {
72
+ return new Promise((resolveResult, reject) => {
73
+ command("git", ["rev-parse", "HEAD"], cwd)
74
+ .then((sha) =>
75
+ run(
76
+ process.execPath,
77
+ [
78
+ script,
79
+ "--repository",
80
+ cwd,
81
+ "--from",
82
+ "v1.0",
83
+ "--to",
84
+ sha.trim(),
85
+ "--notes-file",
86
+ "notes.md",
87
+ "--inventory-file",
88
+ "inventory.json",
89
+ ],
90
+ { cwd },
91
+ (error, stdout, stderr) => {
92
+ const code = error?.code ?? 0;
93
+ if (code !== expectedCode)
94
+ reject(new Error(`expected ${expectedCode}, got ${code}: ${stderr}`));
95
+ else resolveResult({ stdout, stderr });
96
+ },
97
+ ),
98
+ )
99
+ .catch(reject);
100
+ });
101
+ }
102
+
103
+ function command(file, args, cwd) {
104
+ return new Promise((resolveResult, reject) => {
105
+ run(file, args, { cwd, encoding: "utf8" }, (error, stdout) =>
106
+ error ? reject(error) : resolveResult(stdout),
107
+ );
108
+ });
109
+ }
@@ -18,6 +18,11 @@ Support these independent modes:
18
18
  5. Create the first local commit.
19
19
  6. Publish only when the user also explicitly requests deploy/push.
20
20
 
21
+ When one selected absolute parent folder must govern several child repositories,
22
+ route to `$zaip-skill-github-setup-ssh-folder`. It owns the conditional-include,
23
+ selected-parent dotenv, child-repository and GitHub-creation safeguards; do not
24
+ apply the single-repository procedure below across an inferred folder tree.
25
+
21
26
  Before creating remote state, require the repository owner/name and visibility. Before generating a key, require the intended identity, key path, and passphrase policy. These choices materially affect security and cannot be guessed.
22
27
 
23
28
  ## Inspect before mutation
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: zaip-skill-github-setup-ssh-folder
3
+ description: Configure SSH and Git identity for child repositories under one selected parent folder; use for multi-repository setup, never to publish.
4
+ ---
5
+
6
+ # Configurar SSH e Git por pasta
7
+
8
+ Use quando uma pessoa selecionar uma pasta pai absoluta que contém vários
9
+ repositórios filhos e precisar de uma identidade Git e SSH limitada a ela. A
10
+ pasta pai cobre seus descendentes; não descubra outras pastas, repositórios,
11
+ dotenvs ou identidades.
12
+
13
+ Um pedido explícito de **configurar** autoriza a configuração local, limitada à
14
+ pasta pai escolhida: Git, SSH e o `.env` explicitamente indicado nela. Não peça
15
+ novamente essa autorização. Pergunte somente os fatos ainda ausentes: pasta pai
16
+ absoluta, conta GitHub, chave selecionada ou pedido de criação de chave, e
17
+ política de passphrase. Criação remota de repositório e push exigem pedido
18
+ explícito, que pode já constar na mesma mensagem do usuário.
19
+
20
+ Conduza uma etapa por vez: dados da pasta e conta, chave local, cadastro público
21
+ no GitHub, `.env`, configuração e verificação. Explique o próximo passo e aguarde
22
+ somente a intervenção humana necessária; não peça segredos no chat.
23
+ Use o [modelo de dotenv](assets/.env.example) para preparar o arquivo escolhido,
24
+ preservando seu conteúdo existente. O modelo não contém credenciais utilizáveis.
25
+
26
+ 1. Inspecione somente a pasta pai selecionada e cada repositório filho que a
27
+ pessoa indicar. Não faça busca recursiva de `.env`; leia ou altere somente o
28
+ `.env` explicitamente nomeado na pasta pai, como limite autorizado deste fluxo.
29
+ 2. Para configurar ou diagnosticar `includeIf`, chave, alias SSH, clone, acesso
30
+ GitHub ou criação de repositório, leia o [procedimento operacional](references/operational-procedure.md).
31
+ 3. Aplique uma única estratégia: `includeIf` com `core.sshCommand` ou alias SSH
32
+ existente. Confirme o comando efetivo com Git no repositório real; um teste
33
+ SSH isolado não prova o transporte Git.
34
+ 4. Cada repositório filho independente recebe seu próprio `.gitignore` ou
35
+ `info/exclude` revisado antes de qualquer stage. Pare e relate override,
36
+ política organizacional, autorização ou escopo ambíguo.
37
+
38
+ ## Proteção contra deleção de repositório
39
+
40
+ Nunca exclua repositórios locais ou remotos, diretórios `.git`, a pasta pai, nem
41
+ o diretório de um clone parcial como rollback. Preserve o clone parcial e
42
+ reporte a falha. Esta restrição cobre somente esses alvos de repositório; ela não
43
+ proíbe alterações de arquivos locais que a pessoa autorizou expressamente dentro
44
+ do escopo selecionado. A proibição cobre CLI, REST, GraphQL, SDK, navegador,
45
+ scripts e delegação; não contorne a trava por outra ferramenta. Na criação via
46
+ API, aceite somente a credencial verificada sem permissão de excluir conforme
47
+ o procedimento. Não teste a proteção tentando uma exclusão real.
48
+
49
+ Esta skill oferece orientação e não concede permissões no sistema operacional,
50
+ nem substitui controles do GitHub. A seleção por `includeIf` escolhe identidade
51
+ por caminho; a permissão real continua confinada à conta, chave e permissões do
52
+ repositório no GitHub. Para setup Git/GitHub de um único repositório, use
53
+ `$zaip-skill-github-setup`; para publicação explicitamente solicitada, use
54
+ `$zaip-skill-github-deploy`.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "ZAIP SSH por Pasta"
3
+ short_description: "Configura SSH e Git por pasta com seguranca"
4
+ default_prompt: "Use $zaip-skill-github-setup-ssh-folder para configurar SSH e Git sob uma pasta pai absoluta selecionada."
@@ -0,0 +1,9 @@
1
+ # Copie para a pasta pai escolhida como .env; nunca publique esse arquivo.
2
+ ZAIP_SSH_PARENT_PATH=C:/Repos/Cliente A/
3
+ GITHUB_ACCOUNT=conta-selecionada
4
+ GIT_USER_NAME=Nome da Pessoa
5
+ GIT_USER_EMAIL=nome@exemplo.com
6
+ # Somente caminho local; nunca coloque o conteúdo privado da chave aqui.
7
+ SSH_PRIVATE_KEY_PATH=C:/Chaves SSH/cliente-a_ed25519
8
+ # Deixe vazio enquanto a criação remota autorizada não precisar de token.
9
+ GITHUB_TOKEN=
@@ -0,0 +1,137 @@
1
+ # Procedimento operacional
2
+
3
+ Leia esta referência depois de a pessoa selecionar uma pasta pai absoluta e um objetivo. Um pedido explícito de configurar autoriza a configuração local de Git, SSH e do `.env` pai indicado. A skill orienta a ação, mas não altera permissões do Windows ou do GitHub por si só. Push e criação remota exigem pedido explícito, inclusive na mesma mensagem; não repita autorização concedida.
4
+
5
+ ## Limite e dotenv
6
+
7
+ 1. Resolva o caminho físico da pasta pai absoluta, incluindo junctions/symlinks, e use barras `/` e barra final. Valide containment físico de cada destino; para um novo clone, valide o ancestral existente mais próximo antes de criar o filho. Não pesquise credenciais em pais, irmãos ou `.env` de filhos. A leitura pontual dos arquivos Git/SSH do usuário que participam dessa configuração é necessária; não faça varredura global.
8
+ 2. Inspecione só repositórios filhos explicitamente selecionados. Para clone bootstrap, a pessoa informa o diretório filho alvo absoluto. Preserve diretório parcial quando o clone falhar e reporte a falha.
9
+ 3. Trate **todo** valor de dotenv como dado: nunca o interpole em shell, nem use `source` ou `eval`. Leia apenas o `.env` pai explicitamente indicado; não faça varredura global ou recursiva. Antes de um valor compor `core.sshCommand`, valide e canonicalize o `SSH_PRIVATE_KEY_PATH` selecionado: rejeite NUL, quebra de linha e metacaracteres de controle do shell, inclusive `&`, `|`, `;`, `<`, `>`, `(`, `)`, `$`, crase, aspas simples e aspas duplas; exija caminho absoluto local permitido e confira que ele aponta à chave selecionada. Só então construa o argumento SSH com o caminho entre aspas duplas, para suportar espaços com segurança. O dotenv guarda caminho de chave, nunca a chave privada.
10
+
11
+ ```dotenv
12
+ # Pasta pai selecionada; use barras / e barra final.
13
+ ZAIP_SSH_PARENT_PATH=C:/Repos/Cliente A/
14
+ GITHUB_ACCOUNT=conta-selecionada
15
+ GIT_USER_NAME=Nome da Pessoa
16
+ GIT_USER_EMAIL=nome@exemplo.com
17
+ # Caminho local: nunca cole o conteúdo da chave privada aqui.
18
+ SSH_PRIVATE_KEY_PATH=C:/Chaves SSH/cliente-a_ed25519
19
+ # Opcional e em branco. Use apenas para criação remota explicitamente autorizada.
20
+ GITHUB_TOKEN=
21
+ ```
22
+
23
+ Adapte os valores com os dados já fornecidos e preserve variáveis existentes. O `.env` é uma entrada lida pela IA: Git e SSH não o carregam automaticamente. Guarde-o fora dos repositórios filhos, quando possível. Se a pasta pai também for um repositório, proteja-o no ignore desse repositório; cada filho independente precisa de seu próprio `.gitignore` ou `info/exclude` antes de stage. Ignore não retira segredos já rastreados: se houver algum, pare a publicação e trate a exposição. Proteja o `.env` com ACL apropriada ao usuário no Windows, não o faça commit e não procure dotenvs fora do caminho selecionado. O GitHub não pode fornecer uma chave privada: ela é criada e fica localmente sob controle da pessoa.
24
+
25
+ ## Chave SSH: fluxo iniciante no Windows
26
+
27
+ Depois de confirmar conta, destino da chave e política de passphrase, uma pessoa que pediu explicitamente a criação pode seguir estes passos. Nunca exponha o arquivo privado criado.
28
+
29
+ 1. Confira `git --version`, `ssh -V` e a disponibilidade de `ssh-keygen`. Confirme um diretório de chaves existente ou crie o diretório escolhido dentro do setup autorizado; ele deve ficar fora de repositórios versionados. Abra PowerShell e crie a chave em um caminho novo:
30
+
31
+ ```powershell
32
+ ssh-keygen -t ed25519 -C 'nome@exemplo.com' -f 'C:\Chaves SSH\cliente-a_ed25519'
33
+ ```
34
+
35
+ Defina a passphrase conforme a política confirmada. Não sobrescreva chave existente nem presuma passphrase vazia.
36
+ 2. Copie **somente** o conteúdo do arquivo público terminado em `.pub`:
37
+
38
+ ```powershell
39
+ Get-Content -Raw 'C:\Chaves SSH\cliente-a_ed25519.pub' | Set-Clipboard
40
+ ```
41
+
42
+ 3. No GitHub, abra o perfil da conta: **Settings > SSH and GPG keys > New SSH key**. Em **Key type**, selecione **Authentication Key**, dê um título reconhecível, cole a chave pública e clique em **Add SSH key**.
43
+ 4. Volte com confirmação não secreta: conta usada, título da chave e caminho público, ou apenas que o cadastro foi concluído. Nunca envie chave privada ou passphrase.
44
+
45
+ Mantenha ACL restritiva no arquivo privado e use passphrase quando a política ou o risco exigir. Não eleve privilégios nem inicie/configure `ssh-agent` sem autorização específica. Antes do primeiro uso, verifique a impressão digital do host com a fonte oficial do GitHub e confira a chave apresentada antes de aceitá-la; não aceite impressão nova apenas por um prompt.
46
+
47
+ Use a chave selecionada para conferir a conta: `ssh -T -i 'C:/Chaves SSH/cliente-a_ed25519' -o IdentitiesOnly=yes git@github.com`. A saudação deve conter a conta esperada; o GitHub normalmente retorna código 1 mesmo após autenticação bem-sucedida. Não confunda nome/e-mail de commit com autenticação. A pessoa digita a passphrase localmente; nunca a salve no `.env` nem em argumentos. Se o agente SSH já estiver disponível, `ssh-add` pode carregar a chave no contexto do usuário; se indisponível, a digitação interativa continua possível. Git for Windows e Windows OpenSSH podem usar agentes distintos: verifique o executável usado por Git antes de diagnosticar falha.
48
+
49
+ ## Identidade dedicada e includeIf
50
+
51
+ Escolha uma estratégia e mantenha-a consistente:
52
+
53
+ - **Configuração condicional:** uma entrada `includeIf` global referencia arquivo dedicado com `user.name`, `user.email` e `core.sshCommand`.
54
+ - **Alias SSH existente:** a URL remota usa `git@github-identidade:` e a configuração SSH existente escolhe a chave. Não misture alias e `core.sshCommand` sem motivo comprovado.
55
+
56
+ `includeIf` seleciona identidade pelo diretório Git; não impede que a chave seja usada fora dessa pasta por outro comando e não concede acesso a repositórios sem permissão na conta. A chave de conta atende múltiplos repositórios; uma deploy key é ligada a um repositório e não é o padrão deste fluxo. Use `gitdir/i` no Windows e `gitdir` em sistemas com caminhos sensíveis a maiúsculas. Inspecione a condição exata e reutilize-a se corresponder à pasta normalizada. Adicione somente a entrada ausente. Faça backups com nomes únicos, somente dos arquivos editados que já existam, preservando entradas sem relação. Um Git global novo não exige copiar um arquivo inexistente. Consulte a origem efetiva, incluindo configuração XDG, antes de escolher o arquivo global a editar.
57
+
58
+ Depois da validação descrita acima, use o caminho canonicalizado como dado no argumento. Em PowerShell, aspas simples preservam caminhos com espaços e aspas duplas dentro de `$sshCommand` protegem o caminho para o SSH; o valor não é executado por PowerShell:
59
+
60
+ ```powershell
61
+ $parent = 'C:/Repos/Cliente A/'
62
+ $identityConfig = 'C:/Git Config/cliente-a.gitconfig'
63
+ $keyPath = 'C:/Chaves SSH/cliente-a_ed25519' # caminho já validado e canonicalizado
64
+ $condition = "includeIf.gitdir/i:${parent}.path"
65
+ $sshCommand = 'ssh -i "' + $keyPath + '" -o IdentitiesOnly=yes'
66
+
67
+ git config --global --get-regexp '^includeIf\..*\.path$'
68
+ git config --file $identityConfig user.name 'Nome da Pessoa'
69
+ git config --file $identityConfig user.email 'nome@exemplo.com'
70
+ git config --file $identityConfig core.sshCommand $sshCommand
71
+ # Após os backups e a verificação: somente se $condition ainda não existir:
72
+ git config --global $condition $identityConfig
73
+ ```
74
+
75
+ Crie o diretório do arquivo de identidade quando necessário; faça os backups antes de executar o bloco. A condição deve ser aplicada depois de preparar o arquivo dedicado com sucesso. Em seguida, verifique origem e valor efetivo em repositório filho real:
76
+
77
+ ```powershell
78
+ git -C 'C:/Repos/Cliente A/repo' config --show-origin --get user.name
79
+ git -C 'C:/Repos/Cliente A/repo' config --show-origin --get user.email
80
+ git -C 'C:/Repos/Cliente A/repo' config --show-origin --get core.sshCommand
81
+ git -C 'C:/Repos/Cliente A/repo' ls-remote origin HEAD
82
+ ```
83
+
84
+ `includeIf` corresponde ao diretório Git. Em worktrees, confirme `git rev-parse --git-dir`; se ele estiver fora da árvore, explique a exceção e adapte somente dentro do escopo autorizado. Diagnostique overrides locais, `GIT_SSH_COMMAND`, `GIT_SSH` e URLs HTTPS (que não usam SSH). Preserve remotos existentes; migre para SSH somente quando isso fizer parte do pedido. Um teste `ssh -T` não lê `core.sshCommand`; `git ls-remote` no filho prova o transporte efetivo. Um repositório remoto vazio pode responder sem referências com sucesso. Verifique pelo menos dois filhos, se existirem, e um repositório fora da pasta para demonstrar alcance; não crie nem clone repositórios reais apenas para testar.
85
+
86
+ ## Clone bootstrap por SSH
87
+
88
+ Um clone exigido explicitamente pode usar o comando SSH selecionado apenas nessa operação; não grave override local persistente. O alvo deve ser filho absoluto da pasta pai e não pode ser removido se o clone falhar.
89
+
90
+ ```powershell
91
+ # Reutilize somente o $sshCommand construído anteriormente com $keyPath validado.
92
+ $target = 'C:\Repos\Cliente A\novo-repo'
93
+ git -c "core.sshCommand=$sshCommand" clone git@github.com:OWNER/REPO.git $target
94
+ ```
95
+
96
+ Se falhar, preserve `$target`, inspecione e reporte seu estado. Após sucesso, prove que `includeIf` foi selecionado no clone e que nenhum override local persistiu:
97
+
98
+ ```powershell
99
+ git -C $target config --show-origin --get core.sshCommand
100
+ git -C $target config --local --get core.sshCommand
101
+ ```
102
+
103
+ O segundo comando não deve retornar valor. Não use clone para criar, publicar ou alterar repositório remoto.
104
+
105
+ ## GitHub e criação de repositório
106
+
107
+ SSH autentica transporte Git, não a API do GitHub. Não troque autenticação global de `gh`. Sem token autorizado, clone SSH pode prosseguir quando solicitado; criação remota espera autorização manual ou token selecionado.
108
+
109
+ Para criação automática explicitamente solicitada, escolha token somente do `.env` pai indicado. Um PAT clássico é o caminho prático: no GitHub, abra **Settings > Developer settings > Personal access tokens > Tokens (classic) > Generate**, escolha expiração e conceda `public_repo` para criação pública ou `repo` para criação privada. Rejeite `delete_repo` e escopos desconhecidos. Se a organização proibir PAT clássico, entregue a etapa manual; não use token fine-grained com **Administration (write)** para criação automatizada sem deleção, porque essa permissão pode permitir exclusão.
110
+
111
+ Depois de gerar o PAT, a pessoa o salva localmente em `GITHUB_TOKEN` no `.env` escolhido e informa apenas que terminou. Reutilize o procedimento de [credenciais locais](../../zaip-skill-local-credentials/SKILL.md) com a pasta pai explicitamente escolhida como limite; não imprima, registre ou passe o token em argumentos. Parseie dotenv como dados, sem executar seu conteúdo. A chave privada permanece em seu arquivo, não nesse campo.
112
+
113
+ Crie um ambiente somente para cada subprocesso mínimo de verificação/criação. Remova credenciais GitHub e overrides herdados (`GH_TOKEN`, `GITHUB_TOKEN`, variantes Enterprise, `GH_HOST`, `GH_REPO`, `GH_DEBUG` e tracing); injete apenas o token escolhido como `GH_TOKEN` e o host esperado. Não altere o ambiente global, não use `gh auth switch`, não salve o token com `gh auth login` e não use `gh auth token` em diagnóstico. Descarte as referências em `finally`.
114
+
115
+ Antes da criação, consulte `GET /user` nesse contexto e confira a conta esperada. Leia somente o cabeçalho de escopos `x-oauth-scopes` de forma sanitizada: aceite apenas `public_repo`/`repo` suficientes para o alvo e sem `delete_repo`; não confunda `x-accepted-oauth-scopes` (o que o endpoint aceita) com escopos concedidos. Tipo ou escopos não verificáveis bloqueiam apenas criação automática; não recorra à credencial global. Nunca confirme proteção enviando DELETE. Esta restrição do PAT vale para ele, não para outras sessões da conta ou para o navegador.
116
+
117
+ Antes de criar, resolva owner, nome e visibilidade a partir do pedido; pergunte apenas o que falta. Consulte a existência: repositório existente é reutilizado conforme autorização, não apagado/recriado. Um 404 também pode ser falta de acesso; confirme conta/owner e não repita criação após erro ambíguo sem consultar o estado. No subprocesso autenticado, execute `gh repo create OWNER/REPO --private` ou `--public` conforme a visibilidade escolhida, sem `--push`. Depois clone a URL SSH no filho escolhido pelo procedimento anterior. Se já houver repositório local, adicione `origin` somente quando ausente e valide qualquer remoto existente.
118
+
119
+ Quando o token estiver ausente ou a organização proibir o fluxo, oriente criação manual: GitHub **+ > New repository**, selecione owner, nome e visibilidade, clique **Create repository** e volte com a URL SSH. Isso não exige PAT da IA; o clone pode continuar após a criação humana. Políticas de SSO e organização devem ser atendidas, nunca contornadas. Não use outras credenciais para driblar a trava.
120
+
121
+ ## Proteção contra deleção
122
+
123
+ Nunca exclua repositórios locais ou remotos, diretórios `.git`, a pasta pai ou clones parciais. Aplique a proibição a CLI, REST, GraphQL, SDK, navegador, scripts, delegação e rollback; não ofereça comandos executáveis de exclusão. Não tente substituir a exclusão por esvaziamento destrutivo, force-push ou remoção de todas as referências. A trava não bloqueia edições normais de arquivos já autorizadas. Em falha de configuração, restaure somente os trechos próprios a partir do backup e preserve mudanças concorrentes; em falha de clone ou criação, preserve o repositório e relate o estado.
124
+
125
+ Ao concluir, informe pasta abrangida, caminhos de configuração alterados, conta SSH verificada, origem da identidade Git e estado separado de clone/criação/publicação. Diferencie validação local, teste Git/SSH e criação remota efetivamente observada. Nunca afirme que configurar SSH publicou algo.
126
+
127
+ ## Fontes oficiais
128
+
129
+ - [Git conditional includes](https://git-scm.com/docs/git-config#_conditional_includes)
130
+ - [GitHub: testar conexão SSH](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection)
131
+ - [GitHub: fingerprints SSH](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints)
132
+ - [GitHub: adicionar nova chave SSH](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account)
133
+ - [GitHub: escopos de PAT clássico](https://docs.github.com/en/developers/apps/scopes-for-oauth-apps#available-scopes)
134
+ - [GitHub: permissões de fine-grained PAT](https://docs.github.com/en/rest/authentication/permissions-required-for-fine-grained-personal-access-tokens)
135
+ - [GitHub CLI: ambiente](https://cli.github.com/manual/gh_help_environment)
136
+ - [GitHub: criar e excluir repositórios e escopos exigidos](https://docs.github.com/en/rest/repos/repos)
137
+ - [GitHub: gerenciamento de tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)
@@ -3,24 +3,14 @@ name: zaip-skill-growth-strategy-revops
3
3
  description: Guide data-driven growth strategy, RevOps decisions, experiments, and financial-impact recommendations. Use for cross-funnel growth or operating decisions; not for raw data analysis, campaign production, or external commercial action.
4
4
  ---
5
5
 
6
- # Orientar Growth e RevOps
6
+ # Growth e RevOps proporcionais ao pedido
7
7
 
8
- ## Localização canônica
8
+ - Responda uma pergunta delimitada diretamente, usando apenas métricas, período e contexto necessários; não imponha diagnóstico completo ou plano integral.
9
+ - Separe fato observado, cálculo, hipótese e recomendação. Para números, declare fórmula, unidade, premissas e lacunas. Não prometa receita/economia nem atribua causalidade sem evidência adequada.
10
+ - Pergunte somente pela informação que muda a decisão; silêncio não é resposta. Preserve estratégias e fontes aprovadas sem duplicá-las.
11
+ - Para diagnóstico, decisão estratégica, recomendação financeira, desenho de experimento ou entrega persistente, carregue [o fluxo progressivo](references/extended-workflow.md). Artefatos vivem em `.agents/growth/`; `strategy.md` centraliza decisões.
12
+ - Dados e significância exigem método reproduzível; marca, campanha e playbook comercial vão aos respectivos especialistas. Esta skill não autoriza campanha, alteração comercial ou experimento externo.
9
13
 
10
- Salve diagnósticos, estratégias, decisões de RevOps, hipóteses de experimento e recomendações de Growth em `.agents/growth/`. Não salve esses artefatos em `docs/`, na raiz do repositório ou em diretórios de brand, marketing ou sales.
14
+ Uma interaction read-only não materializa Task/Change. Entrega persistente segue lifecycle, Requirements/AC e assurance proporcionais; só trabalho técnico carrega engenharia.
11
15
 
12
- O arquivo central da área é `.agents/growth/strategy.md`; atualize-o quando uma decisão mudar a estratégia de Growth ou RevOps. Diagnósticos e experimentos específicos podem ser arquivos adicionais na mesma pasta.
13
-
14
- ## Descoberta e entrega progressivas
15
-
16
- 1. Comece pelas referências acessíveis fornecidas — texto, site, PDF, PPT, planilha, arquivo ou imagem. Registre cada fonte com locator e classifique seu conteúdo como fato, decisão aprovada, hipótese, dado ou lacuna. Reutilize os artefatos aprovados; não recrie sua fonte central nem duplique seu conteúdo em outro arquivo.
17
- 2. Se o trabalho começar do zero ou o contexto for insuficiente, faça no máximo cinco perguntas críticas por turno, por até três turnos. Pergunte somente por lacunas que mudam a decisão: objetivo, período, segmentos, funil, métricas, restrições ou impacto financeiro. Espere as respostas antes de avançar nas partes que delas dependem; silêncio não é resposta nem aprovação. Após três turnos, prossiga somente com hipóteses delegáveis rotuladas e lacunas explícitas, sem inventar decisões, autoridade, métricas ou datasets.
18
- 3. Um pedido pontual com contexto suficiente deve ser respondido diretamente, sem questionário obrigatório nem plano integral.
19
- 4. Aplique somente as partes necessárias ao escopo solicitado: `diagnóstico do funil e handoffs` → `prioridades` → `experimento` → `estratégia consolidada`. Identifique a parte em construção e só consolide em `.agents/growth/strategy.md` quando o contexto sustentar uma decisão estratégica. Mantenha diagnósticos e experimentos específicos como arquivos complementares, sem duplicar a estratégia central; não exija todos os módulos ou formatos.
20
- 5. No diagnóstico, examine aquisição, qualificação, conversão, receita, retenção, expansão, custos e capacidade. Separe fatos observados, cálculo determinístico, hipótese e recomendação; não declare causalidade sem desenho ou evidência adequados.
21
- 6. Priorize oportunidades por impacto potencial, confiança, esforço, dependências e reversibilidade. Para recomendações financeiras, explicite fórmula, premissas, sensibilidade e lacunas; não prometa receita nem economia.
22
- 7. Para cada experimento, registre hipótese, população, métrica primária, guardrails, duração, critério de decisão, risco e responsável. Não execute campanhas, alterações comerciais externas ou experimentos sem a autorização e o escopo correspondentes.
23
- 8. Em conselho ou planejamento de negócio, priorize portfólio, modelo de negócio, opções e handoffs de execução. Solicite análise reprodutível de Gabi quando houver dataset, cálculo, qualidade de dados ou significância. Encaminhe plataforma de marca à Sarah, campanha/copy a Lúcia e playbook/processo sales-facing a Aaron.
24
- 9. Produza uma recomendação consultiva: decisão, evidência, incerteza, opções, impacto esperado, próximo experimento e dono da próxima ação. Não produza campanha, Brandbook ou playbook comercial como substituto da recomendação.
25
-
26
- Consulte o [framework de decisão](references/growth-revops-framework.md) para planejar diagnóstico ou experimento.
16
+ Para resumo salvo ou documento de contexto simples, delimitado e de baixo impacto com fontes fornecidas, use o [perfil editorial `lite`](../zaip-skill-task/SKILL.md#assurance-proporcional) e selecione `--risk lite`. Diagnóstico estratégico, recomendação financeira, experimento, alteração operacional ou ação externa permanecem fora desse perfil.
@@ -0,0 +1,21 @@
1
+ # Orientar Growth e RevOps
2
+
3
+ ## Localização canônica
4
+
5
+ Salve diagnósticos, estratégias, decisões de RevOps, hipóteses de experimento e recomendações de Growth em `.agents/growth/`. Não salve esses artefatos em `docs/`, na raiz do repositório ou em diretórios de brand, marketing ou sales.
6
+
7
+ O arquivo central da área é `.agents/growth/strategy.md`; atualize-o quando uma decisão mudar a estratégia de Growth ou RevOps. Diagnósticos e experimentos específicos podem ser arquivos adicionais na mesma pasta.
8
+
9
+ ## Descoberta e entrega progressivas
10
+
11
+ 1. Comece pelas referências acessíveis fornecidas — texto, site, PDF, PPT, planilha, arquivo ou imagem. Registre cada fonte com locator e classifique seu conteúdo como fato, decisão aprovada, hipótese, dado ou lacuna. Reutilize os artefatos aprovados; não recrie sua fonte central nem duplique seu conteúdo em outro arquivo.
12
+ 2. Se o trabalho começar do zero ou o contexto for insuficiente, faça no máximo cinco perguntas críticas por turno, por até três turnos. Pergunte somente por lacunas que mudam a decisão: objetivo, período, segmentos, funil, métricas, restrições ou impacto financeiro. Espere as respostas antes de avançar nas partes que delas dependem; silêncio não é resposta nem aprovação. Após três turnos, prossiga somente com hipóteses delegáveis rotuladas e lacunas explícitas, sem inventar decisões, autoridade, métricas ou datasets.
13
+ 3. Um pedido pontual com contexto suficiente deve ser respondido diretamente, sem questionário obrigatório nem plano integral.
14
+ 4. Aplique somente as partes necessárias ao escopo solicitado: `diagnóstico do funil e handoffs` → `prioridades` → `experimento` → `estratégia consolidada`. Identifique a parte em construção e só consolide em `.agents/growth/strategy.md` quando o contexto sustentar uma decisão estratégica. Mantenha diagnósticos e experimentos específicos como arquivos complementares, sem duplicar a estratégia central; não exija todos os módulos ou formatos.
15
+ 5. No diagnóstico, examine aquisição, qualificação, conversão, receita, retenção, expansão, custos e capacidade. Separe fatos observados, cálculo determinístico, hipótese e recomendação; não declare causalidade sem desenho ou evidência adequados.
16
+ 6. Priorize oportunidades por impacto potencial, confiança, esforço, dependências e reversibilidade. Para recomendações financeiras, explicite fórmula, premissas, sensibilidade e lacunas; não prometa receita nem economia.
17
+ 7. Para cada experimento, registre hipótese, população, métrica primária, guardrails, duração, critério de decisão, risco e responsável. Não execute campanhas, alterações comerciais externas ou experimentos sem a autorização e o escopo correspondentes.
18
+ 8. Em conselho ou planejamento de negócio, priorize portfólio, modelo de negócio, opções e handoffs de execução. Solicite análise reprodutível de Gabi quando houver dataset, cálculo, qualidade de dados ou significância. Encaminhe plataforma de marca à Sarah, campanha/copy a Lúcia e playbook/processo sales-facing a Aaron.
19
+ 9. Produza uma recomendação consultiva: decisão, evidência, incerteza, opções, impacto esperado, próximo experimento e dono da próxima ação. Não produza campanha, Brandbook ou playbook comercial como substituto da recomendação.
20
+
21
+ Consulte o [framework de decisão](growth-revops-framework.md) para planejar diagnóstico ou experimento.
@@ -1,17 +1,25 @@
1
1
  ---
2
2
  name: zaip-skill-hostinger-cloudflare-terraform
3
- description: Operate Terraform for scoped Cloudflare DNS and Hostinger VPS with target-bound credentials, state safety, and truthful validation.
3
+ description: Operate scoped Cloudflare/Hostinger Terraform and prepare AWS CLI/Terraform environments with target-bound credentials, state safety, and truthful validation.
4
4
  ---
5
5
 
6
- # Terraform Cloudflare e Hostinger
6
+ # Terraform Cloudflare, Hostinger e preparação AWS
7
7
 
8
- Use para criar, importar, ler, alterar ou validar VPS Hostinger e DNS Cloudflare por Terraform. Leia o contrato de infraestrutura indicado pela Task, [o procedimento operacional](references/operational-contract.md) e [o guia do runner autônomo](references/autonomous-runner.md).
8
+ Use para criar, importar, ler, alterar ou validar VPS Hostinger e DNS Cloudflare por Terraform, ou preparar/provisionar AWS com AWS CLI e Terraform dentro de uma Task autorizada. Primeiro escolha o fluxo pela Task:
9
9
 
10
- 1. Delimite o perfil `autonomous-cloud`, conta+zona Cloudflare, conta Hostinger, IDs das VPS e fingerprints SSH. Credenciais de dotenv não concedem autoridade nem permitem novo alvo. Use `.env` da raiz primeiro e `.agents/.env` somente quando selecionado pela execução.
10
+ Para alguém iniciando a contratação ou configuração de VPS, comece pelo [guia inicial Hostinger VPS e Terraform](references/guia-iniciante-hostinger-vps.md). Comece pelo estágio já conhecido e faça no máximo três perguntas somente quando faltar contexto; prossiga sem reautorização nas ações já delimitadas. A preferência é a oferta apresentada pela Hostinger como VPS gerenciada por IA; ela facilita o hPanel, terminal Web e assistência Kodee, mas continua sendo VPS KVM com root SSH e administração do cliente. Não peça token de API para o primeiro acesso SSH e não execute ação remota sem a autorização e o contrato exigidos abaixo.
11
+
12
+ - **Cloudflare/Hostinger:** leia o contrato de infraestrutura indicado pela Task, [o procedimento operacional](references/operational-contract.md) e [o guia do runner autônomo](references/autonomous-runner.md). Preserve o runner existente e seus requisitos.
13
+ - **AWS:** leia somente o contrato AWS declarado na Task e [o contrato AWS CLI/Terraform](references/aws-cli-terraform.md). Não leia, exija ou derive `operational-contract`, `autonomous-runner`, conta/zona Cloudflare, conta/VPS Hostinger ou inputs SSH. Não use `cloud-runner.mjs` para AWS.
14
+
15
+ 1. No fluxo Cloudflare/Hostinger, delimite o perfil `autonomous-cloud`, conta+zona Cloudflare, conta Hostinger, IDs das VPS e fingerprints SSH. Credenciais de dotenv não concedem autoridade nem permitem novo alvo. Use `.env` da raiz primeiro e `.agents/.env` somente quando selecionado pela execução.
11
16
  Quando uma Task já registra mandato permanente e o `.env` raiz possui identificadores deliberados, faça descoberta somente de leitura para derivar o contrato de alvo; não exija JSON manual ou reautorização. Não generalize essa exceção a outro projeto.
12
- 2. Aplique `$zaip-skill-local-credentials` e injete a credencial mínima por subprocesso: Cloudflare para DNS, Hostinger para VPS, backend de state quando aplicável, e referência de chave+fingerprint para SSH. Nunca mostre token, senha, state, plano binário ou material de chave.
13
- 3. Cloudflare controla DNS e edge; Hostinger controla apenas VPS. Nunca chame ou modele DNS Hostinger. Preserve Pages como destino web separado da origem VPS.
14
- 4. Exija VPS 1 como ingress público e VPS 2 como aplicação privada. Não exponha Redis, BullMQ, exporters, painéis ou observabilidade; declare transporte privado, firewall e executor de configuração antes de afirmar que existem.
15
- 5. Antes de `apply`, exija backend remoto criptografado, versionado e com locking. Rode `init`, `fmt`, `validate` e plano salvo/revisado. Apply usa somente o plano revisado; importação exige ID explicitamente aprovado e revisão de state sem segredo.
16
- 6. Depois de escrever, faça refresh/read-after-write e testes de DNS, TLS, saúde, negação de portas, isolamento beta/produção e restore. Sem execução observada contra os alvos delimitados, registre somente prova estática/local.
17
- 7. Em criação, confirme nomes, plano, região, template e teto aprovados, vincule IDs observados e verifique fingerprint antes de SSH. Dentro desse escopo, portas aprovadas, firewall, rotação de chave e DNS são autônomos. Troca de conta/zona/VPS/fingerprint, expansão de orçamento, destino ou recurso desconhecido, ou efeito irreversível ainda não aprovado bloqueia até que a Task atualize o escopo.
17
+ 2. No fluxo Cloudflare/Hostinger, aplique `$zaip-skill-local-credentials` e injete a credencial mínima por subprocesso: Cloudflare para DNS, Hostinger para VPS, backend de state quando aplicável, e referência de chave+fingerprint para SSH. Nunca mostre token, senha, state, plano binário ou material de chave.
18
+ 3. No fluxo Cloudflare/Hostinger, Cloudflare controla DNS e edge; Hostinger controla apenas VPS. Nunca chame ou modele DNS Hostinger. Preserve Pages como destino web separado da origem VPS.
19
+ 4. No fluxo Cloudflare/Hostinger, exija VPS 1 como ingress público e VPS 2 como aplicação privada. Não exponha Redis, BullMQ, exporters, painéis ou observabilidade; declare transporte privado, firewall e executor de configuração antes de afirmar que existem.
20
+ 5. No fluxo Cloudflare/Hostinger, antes de `apply`, exija backend remoto criptografado, versionado e com locking. Rode `init`, `fmt`, `validate` e plano salvo/revisado. Apply usa somente o plano revisado; importação exige ID explicitamente aprovado e revisão de state sem segredo.
21
+ 6. No fluxo Cloudflare/Hostinger, depois de escrever, faça refresh/read-after-write e testes de DNS, TLS, saúde, negação de portas, isolamento beta/produção e restore. Sem execução observada contra os alvos delimitados, registre somente prova estática/local.
22
+ 7. No fluxo Cloudflare/Hostinger, em criação, confirme nomes, plano, região, template e teto aprovados, vincule IDs observados e verifique fingerprint antes de SSH. Dentro desse escopo, portas aprovadas, firewall, rotação de chave e DNS são autônomos. Troca de conta/zona/VPS/fingerprint, expansão de orçamento, destino ou recurso desconhecido, ou efeito irreversível ainda não aprovado bloqueia até que a Task atualize o escopo.
23
+ 8. No fluxo AWS, delimite `account_id`, região, profile de origem, principal do backend, principal/role do provider, bucket/key S3 e recursos Terraform antes de usar a CLI. SSO é preferível: `aws configure sso`, `aws sso login --profile` e `aws sts get-caller-identity --profile --region`. Profile existente, OIDC ou role já autorizada também podem cumprir o contrato se a identidade STS conferida corresponder; não use profile padrão implícito.
24
+ 9. No fluxo AWS, separe o principal que faz bootstrap/inicializa/acessa o backend S3 do principal/role que o provider AWS usa. O contrato deve nomear os dois, suas contas e regiões, e a verificação STS de cada um. Prefira `role_arn` com `source_profile` ou OIDC; se `aws sts assume-role` for inevitável, não exponha stdout de credenciais. Credenciais ou cache SSO não entram em `.env`, backend-config secreto, plano, state, Git ou evidência.
25
+ 10. No fluxo AWS, para Terraform >= 1.10, exija bucket e key aprovados, `region` explícita, `encrypt = true` e `use_lockfile = true`. Faça bootstrap zero-environment separado pelo AWS CLI/Terraform autorizado para criar somente o bucket S3 de state, habilitar versionamento, recovery, encryption e lockfile; `terraform init` não cria o bucket. Exija IAM de menor privilégio e procedimento de recuperação; não configure DynamoDB para novo locking. `backend-config` sem segredo pode ser versionado. Sem lockfile, faça bootstrap com `terraform init`, revise o lock gerado e só então use `terraform init -lockfile=readonly`. A preparação executa `fmt`, `validate` e `plan -out` revisável. A Task AWS ativa, explicitamente autorizada, pode cobrir bootstrap e provisionamento AWS delimitado via AWS CLI/Terraform sem confirmação repetida; `apply` somente consome o plano salvo revisado e contrato delimitado.