@zaip-ai/cli 1.3.8 → 1.4.1

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 (315) hide show
  1. package/README.md +58 -3
  2. package/dist/commands/init.d.ts +1 -0
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +17 -6
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/services/adapters.js +4 -4
  11. package/dist/services/adapters.js.map +1 -1
  12. package/dist/services/codex-config-template.d.ts +2 -2
  13. package/dist/services/codex-config-template.d.ts.map +1 -1
  14. package/dist/services/codex-config-template.js +3 -3
  15. package/dist/services/codex-config-template.js.map +1 -1
  16. package/dist/services/codex-rules.d.ts +1 -1
  17. package/dist/services/codex-rules.d.ts.map +1 -1
  18. package/dist/services/codex-rules.js +9 -24
  19. package/dist/services/codex-rules.js.map +1 -1
  20. package/dist/services/delivery-git-preflight.d.ts +23 -0
  21. package/dist/services/delivery-git-preflight.d.ts.map +1 -0
  22. package/dist/services/delivery-git-preflight.js +69 -0
  23. package/dist/services/delivery-git-preflight.js.map +1 -0
  24. package/dist/services/doctor.d.ts.map +1 -1
  25. package/dist/services/doctor.js +13 -1
  26. package/dist/services/doctor.js.map +1 -1
  27. package/dist/services/install-agents-template.d.ts.map +1 -1
  28. package/dist/services/install-agents-template.js +22 -28
  29. package/dist/services/install-agents-template.js.map +1 -1
  30. package/dist/services/install-profile.d.ts +8 -0
  31. package/dist/services/install-profile.d.ts.map +1 -0
  32. package/dist/services/install-profile.js +56 -0
  33. package/dist/services/install-profile.js.map +1 -0
  34. package/dist/services/logger.d.ts.map +1 -1
  35. package/dist/services/logger.js +6 -5
  36. package/dist/services/logger.js.map +1 -1
  37. package/dist/services/stack-git.d.ts +9 -0
  38. package/dist/services/stack-git.d.ts.map +1 -0
  39. package/dist/services/stack-git.js +188 -0
  40. package/dist/services/stack-git.js.map +1 -0
  41. package/dist/services/stack-plan.d.ts +3 -1
  42. package/dist/services/stack-plan.d.ts.map +1 -1
  43. package/dist/services/stack-plan.js +15 -1
  44. package/dist/services/stack-plan.js.map +1 -1
  45. package/dist/services/stack-terraform.d.ts +13 -0
  46. package/dist/services/stack-terraform.d.ts.map +1 -0
  47. package/dist/services/stack-terraform.js +274 -0
  48. package/dist/services/stack-terraform.js.map +1 -0
  49. package/dist/services/template-manifest.d.ts.map +1 -1
  50. package/dist/services/template-manifest.js +14 -1
  51. package/dist/services/template-manifest.js.map +1 -1
  52. package/dist/types.d.ts +1 -0
  53. package/dist/types.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/templates/.agents/.env.example +34 -0
  56. package/templates/{README.md → .agents/README.md} +124 -60
  57. package/templates/.agents/config/agents/catalog.yaml +23 -23
  58. package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +1 -0
  59. package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +1 -0
  60. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +5 -4
  61. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -0
  62. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +1 -0
  63. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +10 -7
  64. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -0
  65. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +1 -0
  66. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -0
  67. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +5 -4
  68. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -0
  69. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -0
  70. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -0
  71. package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +1 -0
  72. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +5 -4
  73. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -0
  74. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -0
  75. package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +1 -0
  76. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -0
  77. package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +1 -0
  78. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +1 -0
  79. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +5 -4
  80. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -0
  81. package/templates/.agents/config/pricing/models.json +25 -1
  82. package/templates/.agents/config/project.yaml +2 -0
  83. package/templates/.agents/dashboard/.zaip-managed.json +200 -88
  84. package/templates/.agents/dashboard/DATA-DICTIONARY.md +1 -1
  85. package/templates/.agents/dashboard/README.md +58 -19
  86. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-DwVZOmMV.js → CostCalculationGuidePage-snUCQYTC.js} +1 -1
  87. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-VcLx9iOO.js → DashboardHelpDialog-oZVlf-l5.js} +72 -8
  88. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-CyjMXkm8.js → PricingSettingsDialog-BPtVUGgs.js} +1 -1
  89. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +3 -0
  90. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-DFZwIXSC.js → TraceabilityWorkspace-BYjVOHI_.js} +1 -1
  91. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +68 -0
  92. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DXBOtWNI.js → icons-vendor-TPUT2IUt.js} +1 -1
  93. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Cmlx8OYH.css +1 -0
  94. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-ZJFXmK7m.js +2 -0
  95. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-DaNXQPyk.js → react-vendor-Ct48XHGL.js} +1 -1
  96. package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-I4AKqVDX.js → traceability-BDe4_Ubl.js} +1 -1
  97. package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
  98. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +73 -67
  99. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +35 -7
  100. package/templates/.agents/dashboard/apps/frontend/src/AppWorkBoard.ts +55 -0
  101. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +11 -0
  102. package/templates/.agents/dashboard/apps/frontend/src/app-loading-boundary.css +98 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +5 -5
  104. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-reconciliation.ts +33 -0
  105. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +75 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +7 -8
  107. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +14 -2
  108. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +35 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +78 -2
  110. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +28 -0
  111. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +8 -5
  112. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +180 -1
  113. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +7 -4
  114. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +13 -7
  115. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +14 -0
  116. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableDisplay.ts +211 -0
  117. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +152 -157
  118. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +155 -142
  119. package/templates/.agents/dashboard/modules/cost-monitor/src/react/InvocationManifestQuery.test.ts +145 -0
  120. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +7 -5
  121. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +4 -1
  122. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +4 -1
  123. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +4 -1
  124. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +4 -4
  125. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +79 -1
  126. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +105 -11
  127. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +482 -332
  128. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +430 -285
  129. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +14 -2
  130. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +6 -26
  131. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +1 -1
  132. package/templates/.agents/dashboard/packages/local-runtime/scripts/verify-persistent-launch.mjs +268 -0
  133. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +482 -332
  134. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +90 -1
  135. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +112 -22
  136. package/templates/.agents/dashboard/packages/local-runtime/src/server-agent-assets.ts +39 -0
  137. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.ts +33 -0
  138. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +148 -11
  139. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-result.test.ts +68 -0
  140. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +19 -0
  141. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +39 -43
  142. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-revision.test.ts +42 -0
  143. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-revision.ts +26 -0
  144. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +34 -0
  145. package/templates/.agents/dashboard/packages/local-runtime/src/server-startup.ts +30 -0
  146. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +89 -0
  147. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +88 -0
  148. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +68 -7
  149. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +11 -5
  150. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +129 -99
  151. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-agent-productivity.test.ts +111 -0
  152. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-agent-productivity.ts +140 -0
  153. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.test.ts +127 -4
  154. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.ts +145 -5
  155. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-aggregates.ts +156 -23
  156. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts +18 -9
  157. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-projection.ts +52 -0
  158. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-persistence.ts +35 -13
  159. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-force-canonical.test.ts +56 -0
  160. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-cache.test.ts +29 -0
  161. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-cache.ts +136 -0
  162. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-refresh.test.ts +251 -0
  163. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +22 -7
  164. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-cache.test-support.ts +1 -1
  165. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical-parsing.ts +42 -0
  166. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical.ts +793 -0
  167. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-duration.test.ts +270 -0
  168. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-fixture.ts +3 -2
  169. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +18 -4
  170. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +87 -0
  171. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +105 -16
  172. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +131 -59
  173. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +1000 -1115
  174. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-cache.ts +13 -92
  175. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-claims.test.mjs +79 -0
  176. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +27 -0
  177. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.mjs +6 -6
  178. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-prerequisites.mjs +1 -1
  179. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-refresh.mjs +2 -10
  180. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-server.mjs +142 -0
  181. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +231 -239
  182. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +18 -29
  183. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +6 -0
  184. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  185. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  186. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +47 -0
  187. package/templates/.agents/requirements/comparative-audit.md +1 -1
  188. package/templates/.agents/requirements/context-engine.md +1 -1
  189. package/templates/.agents/requirements/cost-observability.md +1 -1
  190. package/templates/.agents/requirements/dashboard-launch.md +2 -2
  191. package/templates/.agents/requirements/data-export.md +1 -1
  192. package/templates/.agents/requirements/design-system.md +1 -1
  193. package/templates/.agents/requirements/execution-engine.md +1 -1
  194. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  195. package/templates/.agents/requirements/model-orchestration.md +1 -1
  196. package/templates/.agents/requirements/public-distribution.md +1 -1
  197. package/templates/.agents/requirements/software-architecture.md +1 -1
  198. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  199. package/templates/.agents/requirements/work-lifecycle.md +1 -1
  200. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  201. package/templates/.agents/rules/autonomy-decision.md +1 -1
  202. package/templates/.agents/rules/cloud-hostinger-autonomy.md +21 -0
  203. package/templates/.agents/rules/core.md +5 -4
  204. package/templates/.agents/rules/local-sqlite-storage.md +18 -0
  205. package/templates/.agents/rules/meta-mcp.md +21 -0
  206. package/templates/.agents/rules/workflow.md +1 -0
  207. package/templates/.agents/runtime/bin/zaip.mjs +305 -137
  208. package/templates/.agents/runtime/checksums.sha256 +2 -2
  209. package/templates/.agents/runtime/provenance.json +2 -2
  210. package/templates/.agents/skills/zaip-skill-api-to-mcp/SKILL.md +4 -0
  211. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +25 -9
  212. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +2 -2
  213. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +2 -2
  214. package/templates/.agents/skills/zaip-skill-change/references/observable-evidence.md +15 -0
  215. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +13 -5
  216. package/templates/.agents/skills/zaip-skill-data-analyst/SKILL.md +10 -5
  217. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +5 -4
  218. package/templates/.agents/skills/zaip-skill-frontend-launcher/SKILL.md +4 -3
  219. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +5 -3
  220. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +5 -5
  221. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +78 -13
  222. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +59 -0
  223. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/yaml-parser.mjs +157 -0
  224. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +11 -6
  225. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +17 -0
  226. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +7 -0
  227. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/autonomous-cloud-inputs.example.json +41 -0
  228. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/autonomous-runner.md +84 -0
  229. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/operational-contract.md +19 -0
  230. package/templates/.agents/skills/zaip-skill-local-credentials/SKILL.md +43 -0
  231. package/templates/.agents/skills/zaip-skill-local-credentials/agents/openai.yaml +6 -0
  232. package/templates/.agents/skills/zaip-skill-local-credentials/references/dotenv-resolution.md +47 -0
  233. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +8 -3
  234. package/templates/.agents/skills/zaip-skill-meta-ads/SKILL.md +16 -0
  235. package/templates/.agents/skills/zaip-skill-meta-ads/agents/openai.yaml +4 -0
  236. package/templates/.agents/skills/zaip-skill-meta-ads/references/setup.md +3 -0
  237. package/templates/.agents/skills/zaip-skill-meta-ads-setup/SKILL.md +24 -0
  238. package/templates/.agents/skills/zaip-skill-meta-ads-setup/agents/openai.yaml +4 -0
  239. package/templates/.agents/skills/zaip-skill-meta-ads-setup/references/diagnostics.md +13 -0
  240. package/templates/.agents/skills/zaip-skill-meta-ads-setup/references/official-sources.md +10 -0
  241. package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/SKILL.md +12 -0
  242. package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/agents/openai.yaml +4 -0
  243. package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/references/LICENSE +21 -0
  244. package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/references/upstream.md +77 -0
  245. package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/SKILL.md +12 -0
  246. package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/agents/openai.yaml +4 -0
  247. package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/references/LICENSE +21 -0
  248. package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/references/upstream.md +126 -0
  249. package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/SKILL.md +12 -0
  250. package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/agents/openai.yaml +4 -0
  251. package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/references/LICENSE +21 -0
  252. package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/references/upstream.md +67 -0
  253. package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/SKILL.md +12 -0
  254. package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/agents/openai.yaml +4 -0
  255. package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/references/LICENSE +21 -0
  256. package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/references/upstream.md +69 -0
  257. package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/SKILL.md +12 -0
  258. package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/agents/openai.yaml +4 -0
  259. package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/references/LICENSE +21 -0
  260. package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/references/upstream.md +79 -0
  261. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/SKILL.md +14 -0
  262. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/agents/openai.yaml +4 -0
  263. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/references/LICENSE +21 -0
  264. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/references/upstream.md +144 -0
  265. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/SKILL.md +12 -0
  266. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/agents/openai.yaml +4 -0
  267. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/references/LICENSE +21 -0
  268. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/references/upstream.md +83 -0
  269. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/SKILL.md +10 -0
  270. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/agents/openai.yaml +4 -0
  271. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/LICENSE +21 -0
  272. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/setup.md +11 -0
  273. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/upstream.md +55 -0
  274. package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/SKILL.md +12 -0
  275. package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/agents/openai.yaml +4 -0
  276. package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/references/LICENSE +21 -0
  277. package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/references/upstream.md +56 -0
  278. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +12 -7
  279. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +11 -4
  280. package/templates/.agents/skills/zaip-skill-tool-setup/SKILL.md +6 -4
  281. package/templates/.agents/skills/zaip-skill-tool-setup/references/codex-config.md +4 -2
  282. package/templates/.agents/skills/zaip-skill-tool-setup/references/secrets.md +1 -0
  283. package/templates/.agents/tools/catalog.yaml +6 -0
  284. package/templates/.agents/tools/cloud-runner-dns.mjs +28 -0
  285. package/templates/.agents/tools/cloud-runner-terraform.mjs +212 -0
  286. package/templates/.agents/tools/cloud-runner.integration.test.mjs +239 -0
  287. package/templates/.agents/tools/cloud-runner.mjs +786 -0
  288. package/templates/.agents/tools/cloud-runner.test.mjs +534 -0
  289. package/templates/.agents/tools/cloud-terraform-plan-policy.mjs +262 -0
  290. package/templates/.agents/tools/mcp/development/meta-devtools/README.md +14 -0
  291. package/templates/.agents/tools/mcp/development/meta-devtools/manifest.yaml +28 -0
  292. package/templates/.agents/tools/mcp/infra/cloudflare/manifest.yaml +2 -3
  293. package/templates/.agents/tools/mcp/infra/hostinger/manifest.yaml +1 -3
  294. package/templates/.agents/tools/mcp/marketing/meta-ads/README.md +15 -13
  295. package/templates/.agents/tools/mcp/marketing/meta-ads/manifest.yaml +15 -10
  296. package/templates/.agents/tools/profiles/development.yaml +3 -0
  297. package/templates/infra/terraform/.terraform.lock.hcl +42 -0
  298. package/templates/infra/terraform/README.md +31 -0
  299. package/templates/infra/terraform/backend.tf.json +13 -0
  300. package/templates/infra/terraform/deployment-inputs.example.yaml +22 -0
  301. package/templates/infra/terraform/fixtures/approved-targets.json +32 -0
  302. package/templates/infra/terraform/fixtures/plan-approved.json +67 -0
  303. package/templates/infra/terraform/main.tf +77 -0
  304. package/templates/infra/terraform/outputs.tf +20 -0
  305. package/templates/infra/terraform/terraform.tfvars.example +26 -0
  306. package/templates/infra/terraform/variables.tf +91 -0
  307. package/templates/infra/terraform/versions.tf +18 -0
  308. package/templates/scripts/validate-cloud-hostinger-contract.mjs +89 -0
  309. package/templates/scripts/validate-cloud-terraform-plan.mjs +1 -0
  310. package/templates/template-manifest.json +599 -167
  311. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BwnJpl02.js +0 -3
  312. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-C09KmlSw.js +0 -68
  313. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Dyo_wpL4.js +0 -2
  314. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-hPPfVGQv.css +0 -1
  315. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-stale-seed.ts +0 -50
@@ -1,11 +1,11 @@
1
1
  b146bd0c7c60b1ab43c4f71e0b1d2262c6df6da6f7053a0425f834ccb77a6b48 LICENSE
2
2
  bc02cba77e8d51e5c580f43668863dc868eda66f1ff663bfaa49fcf3ca16320e THIRD_PARTY_NOTICES.md
3
3
  64d23f858ef51b0f996e4966d4e27c0371b437e2d2787890b1f7ad22d4ec5663 VERSION
4
- 04b70f890aceaf3b1d0409e4446cd4315aa9ac24056b1abd9813d07444e212f7 bin/zaip.mjs
4
+ 09e8f6c1c5de52685f76c99301b4af83b78e3cbd30c4ab5495d1c8a33af22693 bin/zaip.mjs
5
5
  bed6ab1fda844209edc628c2a675021ad6acb9a2f7ecb7ae017b5a916712da24 manifest.json
6
6
  7f89219d7c567c82a51679ad136d84364bded7ac659492537e125d33b1d58a7a migrations/001-layout-v1.json
7
7
  5f8c48b286d0b44d8fbb57a9a5d009a8a500439aa3148d750b8f193f72995c9f migrations/002-layout-v2.json
8
8
  182a587dca8080f732cb387dbdeff4c12034a4a116efe35b4cd3c1c0a21ad10b pnpm-lock.sha256
9
- d5e403c33b3aa09c15601e652dd1a54d345d56e6df3259baee74e94db97f3486 provenance.json
9
+ 82f3eadf48498933aa6ccb00432070ede8129f983c40a9da697c6ffaf9a76a20 provenance.json
10
10
  4669f375688be830958d45269bb0f8dfe65daf8db677f72728c15dc89d42d820 sbom.cdx.json
11
11
  b3ffedf9e146be802a15b4009f33e031dec3071ca1525e12c67606fd964a3067 schemas/contracts.schema.json
@@ -6,6 +6,6 @@
6
6
  "source_origin": "zaip-aios:local-build",
7
7
  "lockfile_sha256": "382ebb27a2a951eb61280171c27116233762370d9093ab516caef216475ba4fc",
8
8
  "sbom_sha256": "4669f375688be830958d45269bb0f8dfe65daf8db677f72728c15dc89d42d820",
9
- "runtime_sha256": "270477b37c53af87a1f0e872ebdb7bc49c8c4e45bfec866086d9ad6e9d4d666c",
10
- "statement_sha256": "499227a810d2667f64d5a2eb51dd047e08b9a44d041fdb6bcc864093aa10f760"
9
+ "runtime_sha256": "0ea51822ffd133866110c2c37ff644952ce62c4899b53ae5827ad59406a57e24",
10
+ "statement_sha256": "d2342722cd5b397a93cb64136e808d35e5300f1d5ceb6cf90e3e22c0565f9a53"
11
11
  }
@@ -16,4 +16,8 @@ description: Design, scaffold, secure, test, and register a ZAIP-maintained MCP
16
16
  9. Implemente testes offline com fixtures sanitizadas, contratos de schema, erros, autorizacao e resistencia a prompt injection em dados remotos.
17
17
  10. Registre no catálogo como `disabled`; use `$zaip-skill-tool-setup` para configurar o Codex e fazer smoke test read-only.
18
18
 
19
+ ## Contrato mínimo Codex MCP
20
+
21
+ Todo servidor MCP criado do zero deve concluir o handshake `initialize` com instruções claras e capacidades declaradas antes de expor ferramentas. Implemente `tools/list` com nomes estáveis, descrição e schemas de entrada fechados; `tools/call` deve validar a entrada, aplicar a política de aprovação e responder em formato MCP, inclusive em erros. Para stdio, escreva exclusivamente mensagens JSON-RPC no stdout e envie logs, diagnóstico e progresso para stderr. Nunca escreva banners, texto livre ou segredos no stdout.
22
+
19
23
  Leia `references/security-contract.md` antes de implementar e `references/server-layout.md` ao criar arquivos.
@@ -5,18 +5,34 @@ description: Define and govern an evidence-backed brand platform, Brandbook, arc
5
5
 
6
6
  # Governar a marca
7
7
 
8
- ## Localização canônica
8
+ ## Artefatos e localização canônica
9
9
 
10
- Salve Brandbooks, plataformas de marca, decisões de identidade, arquétipos, escalas de diferencial semântico e materiais de governança em `.agents/branding/`. Todo Brandbook salvo como `.docx` deve ter, na mesma pasta e com o mesmo nome-base, uma fonte canônica `.md` com o conteúdo estratégico equivalente; mantenha os dois arquivos sincronizados a cada revisão. Use `.agents/branding/archive/` somente para versões substituídas. Não crie esses artefatos em `docs/`, na raiz do repositório ou em diretórios de outra disciplina.
10
+ Salve plataformas de marca, Brandbooks, decisões de identidade, arquétipos, escalas de diferencial semântico e materiais de governança em `.agents/branding/`. Use `.agents/branding/archive/` somente para versões substituídas. Não crie esses artefatos em `docs/`, na raiz do repositório ou em diretórios de outra disciplina.
11
11
 
12
- O arquivo central da área é `.agents/branding/brandbook.md`; atualize-o quando a decisão afetar a plataforma de marca. A versão Word correspondente é `.agents/branding/brandbook.docx`.
12
+ Há dois artefatos distintos:
13
13
 
14
- 1. Delimite objetivo, públicos, contexto de negócio, fontes e autoridade de aprovação. Classifique cada afirmação como evidência, hipótese ou decisão; não apresente hipótese como fato.
15
- 2. Construa ou atualize a plataforma: cultura, propósito, posicionamento, proposta de valor, promessa, diferenciais, atributos, personalidade, arquitetura de marca e pontos de contato. Para Brandbooks completos, use o framework de domínios em [referências do Brandbook](references/brandbook-framework.md).
16
- 3. Quando o trabalho incluir um Brandbook, mantenha uma fonte estratégica interna e derive uma versão externa somente com conteúdo autorizado. Preserve versão, proprietário, aprovadores, confidencialidade e histórico de decisão.
14
+ - A plataforma de marca progressiva é a base estratégica em Markdown, normalmente `.agents/branding/brand-platform.md`. Ela registra a descoberta e as decisões de propósito, posicionamento, arquitetura e identidade à medida que amadurecem. Não exige DOCX e não deve ser apresentada como um Brandbook completo.
15
+ - O Brandbook consolidado é o artefato oficial, completo e versionado. Sua fonte canônica é `.agents/branding/brandbook.md` e a versão Word correspondente é `.agents/branding/brandbook.docx`. Todo Brandbook salvo como `.docx` deve ter, na mesma pasta e com o mesmo nome-base, uma fonte `.md` estrategicamente equivalente; mantenha os dois sincronizados a cada revisão.
16
+
17
+ ## Descoberta antes da consolidação
18
+
19
+ 1. Antes de criar um Brandbook do zero, faça perguntas críticas sobre objetivo, ICP e públicos, contexto de negócio, oferta, proposta de valor, diferenciais, arquitetura de marca e, quando relevante, a relação entre marca-mãe, produtos e portfólio, autoridade de aprovação e fontes disponíveis. Faça no máximo cinco perguntas por turno e no máximo três turnos de descoberta; espere as respostas sem preencher decisões abertas. Ao encerrar esse limite, registre suposições delegáveis como hipóteses, nunca como aprovação ou fato.
20
+ 2. Construa primeiro a plataforma de marca progressiva: cultura, propósito, posicionamento, proposta de valor, promessa, diferenciais, atributos, personalidade, arquitetura e pontos de contato. Classifique cada afirmação como evidência, hipótese ou decisão; não apresente hipótese como fato.
21
+ 3. Só consolide um Brandbook completo quando ele for solicitado e a plataforma tiver base suficiente para os domínios aplicáveis. Não preencha lacunas materiais com afirmações inventadas: mantenha-as como hipótese, pendência ou pergunta. Se já existir Brandbook aprovado, preserve-o durante a descoberta e altere somente decisões expressamente autorizadas.
22
+
23
+ ## Referências fornecidas
24
+
25
+ Quando o pedido trouxer ou pedir o uso de referências — texto, arquivo, site, PDF, apresentação, imagem ou outro material acessível — extraia delas uma base de trabalho antes de repetir perguntas já respondidas. Para cada contribuição relevante, preserve fonte, locator ou página quando disponível, data quando conhecida e classificação como evidência, hipótese ou decisão.
26
+
27
+ Use as referências para montar ou enriquecer a plataforma e pergunte somente pelas lacunas materiais para a decisão solicitada. Quando o pedido autorizar expressamente a consolidação e as referências sustentarem a base necessária, não exija uma pergunta adicional de aprovação. Uma referência não equivale a aprovação, autorização de publicação ou prova de titularidade. Conteúdo de terceiros serve como fonte, síntese ou referência metodológica; não o copie como conteúdo da marca.
28
+
29
+ ## Consolidação e governança
30
+
31
+ 1. Para Brandbooks completos, use o framework de domínios em [referências do Brandbook](references/brandbook-framework.md). Mantenha uma fonte estratégica interna e derive uma versão externa somente com conteúdo autorizado. Preserve versão, proprietário, aprovadores, confidencialidade e histórico de decisão.
17
32
  - A primeira versão oficial de um Brandbook é sempre `v1.0`; não use versões `v0.x`. Incrementos posteriores seguem versionamento semântico editorial (`v1.1`, `v1.2` para evolução aprovada; `v2.0` para mudança material de plataforma ou arquitetura).
18
- 4. Para arquétipos, registre evidência, comportamento esperado, limites e implicações para linguagem e experiência. Se houver pesos, valide que o total é 100%; se não houver pesquisa, registre como hipótese de trabalho.
19
- 5. Para diferencial semântico, registre dimensões, polos, escala, fonte, data, amostra e diferença entre identidade desejada e percebida. Não fabrique respostas, baseline, validação estatística ou brand equity.
20
- 6. Encaminhe aplicação ordinária de Brandbook aprovado, campanhas, copy e ativos para Lúcia; scripts e playbooks sales-facing para Aaron; análise quantitativa para Gabi; impacto de receita/custo e RevOps para Robert; e produção operacional genérica para Clara. Um Brandbook aprovado é input, não motivo para assumir a aplicação.
33
+ 2. Para arquétipos, registre evidência, comportamento esperado, limites e implicações para linguagem e experiência. Se houver pesos, valide que o total é 100%; se não houver pesquisa, registre como hipótese de trabalho.
34
+ 3. Para diferencial semântico, registre dimensões, polos, escala, fonte, data, amostra e diferença entre identidade desejada e percebida. Não fabrique respostas, baseline, validação estatística ou brand equity.
35
+ 4. Encaminhe aplicação ordinária de Brandbook aprovado, campanhas, copy e ativos para Lúcia; scripts e playbooks sales-facing para Aaron; análise quantitativa para Gabi; impacto de receita/custo e RevOps para Robert; e produção operacional genérica para Clara. Um Brandbook aprovado é input, não motivo para assumir a aplicação.
36
+ 5. Não gere imagens, mockups ou outros ativos visuais sem solicitação explícita.
21
37
 
22
38
  Consulte [padrões de Brandbook](references/brandbook-standards.md) e o [framework de domínios](references/brandbook-framework.md) ao estruturar entregáveis internos ou externos.
@@ -1,6 +1,6 @@
1
1
  # Framework de domínios do Brandbook
2
2
 
3
- Use este framework para um Brandbook interno. Ele organiza a estratégia; não autoriza apresentar hipóteses como fato nem copiar o conteúdo de uma referência externa.
3
+ Use este framework somente para um Brandbook interno consolidado. A plataforma de marca progressiva antecede esse artefato e permanece em Markdown, sem obrigação de DOCX. O framework organiza a estratégia; não autoriza apresentar hipóteses como fato nem copiar o conteúdo de uma referência externa.
4
4
 
5
5
  ## Versionamento
6
6
 
@@ -8,7 +8,7 @@ Inicie todo Brandbook aprovado em `v1.0`. Use `v1.x` para complementos ou revis
8
8
 
9
9
  ## Formatos canônicos
10
10
 
11
- Para cada Brandbook, mantenha obrigatoriamente uma fonte estratégica em Markdown e uma versão Word com o mesmo nome-base na pasta `.agents/branding/`; por exemplo, `Brandbook v1.0.md` e `Brandbook v1.0.docx`. Atualize ambos na mesma alteração. O Markdown é a fonte de revisão Git-native; o DOCX é a versão de leitura e apresentação.
11
+ Para cada Brandbook, mantenha obrigatoriamente uma fonte estratégica em Markdown e uma versão Word com o mesmo nome-base na pasta `.agents/branding/`; por exemplo, `Brandbook v1.0.md` e `Brandbook v1.0.docx`. Atualize ambos na mesma alteração. O Markdown é a fonte de revisão Git-native; o DOCX é a versão de leitura e apresentação. Não aplique essa exigência à plataforma de marca progressiva.
12
12
 
13
13
  ## Fundação
14
14
 
@@ -1,6 +1,6 @@
1
1
  # Padrões de Brandbook e governança
2
2
 
3
- Use este roteiro quando o pedido exigir a plataforma ou o Brandbook da marca.
3
+ Use este roteiro quando o pedido exigir a plataforma ou o Brandbook da marca. Comece pelo diagnóstico e pela plataforma de marca progressiva; ela não é um Brandbook completo e não exige versão Word. Um Brandbook consolidado só é produzido quando solicitado e depois de haver base estratégica suficiente ou referências que a sustentem.
4
4
 
5
5
  ## Fonte estratégica interna
6
6
 
@@ -8,7 +8,7 @@ Registre os treze domínios: cultura da empresa e da marca; posicionamento e pla
8
8
 
9
9
  O Brandbook também registra controle do documento; história; mercado; público e personas; promessa e diferenciais; DNA, atributos e personalidade; tom de voz; arquitetura; identidade verbal e visual; evidências e decisões.
10
10
 
11
- Cada decisão material deve informar proprietário, aprovador, versão, data, evidência e classificação de confidencialidade. Conteúdo proprietário de terceiros serve como referência metodológica, nunca como conteúdo reutilizável.
11
+ Cada decisão material deve informar proprietário, aprovador, versão, data, evidência e classificação de confidencialidade. Referências fornecidas podem sustentar a plataforma quando forem extraídas com fonte e locator; elas não constituem aprovação nem autorização de publicação. Conteúdo proprietário de terceiros serve como referência metodológica, nunca como conteúdo reutilizável.
12
12
 
13
13
  ## Versão externa
14
14
 
@@ -74,6 +74,21 @@ zaip evidence record --id EVD-CENARIO --task TASK-ID --summary "alcance comprova
74
74
 
75
75
  O JSON usa `schema_version: 1`, `id`, `task_id`, `change_id`, `execution_id`, `run_id`, `acceptance_ids`, `proof_kind`, `state`, `scenario`, `expected`, `observed`, `observed_at`, `examiner_id`, `commit_sha`, `candidate_version`, `environment`, `visual`, `correlation_ids`, `locators`, `limitations`, `not_applicable_reason`, `pending_reason`, `dependency`, `resume_plan` e `attempts`. Consulte o schema e os exemplos testados em `packages/specs/src/assurance/artifacts.ts` e `assurance-contract.test.ts`; não invente campos V2. A versão candidata identifica o artefato efetivamente observado; o SHA Git continua sendo o vínculo exigido pelo assurance.
76
76
 
77
+ ## Preservar a captura local antes de referenciá-la
78
+
79
+ Quando uma captura real selecionada já foi examinada, preserve o arquivo temporário antes de usar seu locator na observação. O fluxo local copia exclusivamente uma imagem regular `.png`, `.jpg`, `.jpeg` ou `.webp`, sem seguir symlinks, para um caminho ignorado pelo Git e protegido contra substituição:
80
+
81
+ ```text
82
+ zaip evidence screenshot preserve --source ABSOLUTE_IMAGE --change CHG-ID --task TASK-ID --run RUN-ID --scenario rota-ou-cenario --state estado-observado --examined-by AGENT-OU-PESSOA --observed-at ISO-8601 --json
83
+ zaip evidence screenshot verify --evidence .local/evidences/c-HASH/t-HASH/r-HASH/rota-ou-cenario--estado-observado.png --json
84
+ ```
85
+
86
+ O resultado fornece locators relativos em `.local/evidences/c-<hash>/t-<hash>/r-<hash>/`, mantendo os IDs completos CHG/TASK/RUN/EXEC somente no sidecar de cada extensão (`.png.evidence.json`, por exemplo), junto ao SHA-256, bytes, examinador e horário observado. Os nomes de cenário e estado são slugs minúsculos Windows-safe de até 32 caracteres; o destino completo tem limite de 240 caracteres. Um destino existente falha e nunca é sobrescrito. Quando ausente, o comando cria somente o marcador `.local/.gitignore` com `*` e `!.gitignore`; se ele já existir, exige exatamente esse conteúdo e não o reescreve. A fonte pode permanecer temporária ou ser descartada somente depois da preservação e da verificação bem-sucedida.
87
+
88
+ O marcador existente aceita finais de linha LF ou CRLF, sem reescrita. `.local/evidences/` é histórico local persistente: não deve participar da limpeza de temporários ou caches. Capturas exploratórias continuam em `.temp` ou no temporário da ferramenta; somente as selecionadas e examinadas são preservadas. As imagens não acompanham clones do Git e precisam de backup local independente quando sua retenção for necessária.
89
+
90
+ Esse comando não abre uma UI, não certifica a origem da imagem, não examina pixels e não substitui `validation observe`, Validation ou Evidence. Registre URL, viewport, versão carregada, expectativa, resultado e limitações na observação; indique somente o locator preservado. Screenshot e hash sozinhos continuam insuficientes para provar comportamento, integração ou aprovação.
91
+
77
92
  `environment` descreve classe, identificador e versão. Estado `confirmed` exige versões observadas do candidato e do ambiente; sem elas, registre limitação/pendência, não um valor presumido. Integração confirmada exige `correlation_ids` do cenário; API ou persistência isoladas não exigem correlação artificial. Prova visual confirmada também exige `visual.url`, `viewport` no formato `1366x768`, `captured_at`, `loaded_version` igual a `candidate_version` e `examination`. Use URL base sem credenciais, query ou fragmento; registre filtros e estado relevantes no cenário sanitizado, nunca tokens de acesso. Preencha indisponibilidade com `null` nos campos permitidos, sem atribuir uma observação inexistente a produção.
78
93
 
79
94
  `validation record` também admite `failed` e `not_applicable` (este exige `--reason`); esses registros não alimentam Evidence aprovada. Informe `--executed-at` e `--asserted-outcome` nas novas entregas. A omissão desses campos conserva o comportamento legado e não demonstra que a CLI executou um teste naquele horário. Pendência de ferramenta usa `validation observe`, não `failed` de produto.
@@ -3,12 +3,18 @@ name: zaip-skill-dashboard-sqlite
3
3
  description: Rebuild and open the isolated SQLite dashboard comparison runtime.
4
4
  ---
5
5
 
6
- # Dashboard SQLite comparativo
6
+ # Dashboard SQLite persistente
7
7
 
8
- Use esta skill para o dashboard SQLite em `.agents/dashboard`. Ela reconstrói um snapshot descartável
9
- em `.local/dashboard-sqlite/read-model.sqlite`.
8
+ Use esta skill para o dashboard SQLite em `.agents/dashboard`. `.local/sqlite/` é o diretório
9
+ central por workspace para bancos SQLite gerenciados localmente; vários nomes estáveis podem ser
10
+ legítimos conforme seu propósito. O Dashboard usa exatamente
11
+ `.local/sqlite/zaip-aios-dashboard.sqlite`. Nunca crie cópias do Dashboard por porta, PID, hash
12
+ ou geração. WAL, SHM e JOURNAL são auxiliares normais do banco aberto. Fixtures descartáveis ficam
13
+ em `.local/sqlite/tests/<fixture>/` com limpeza automática. Workspaces isolados usam sua própria
14
+ `.local/sqlite/`; bancos internos de ferramentas externas seguem o armazenamento dessas ferramentas.
10
15
 
11
- 1. Na raiz do repositório, execute `node .agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs`.
16
+ 1. Prefira abrir o launcher: ele usa o banco existente e sincroniza os canônicos em segundo plano.
17
+ Para sincronização manual sem outro writer, execute `node .agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs`.
12
18
  2. Para regenerar os artefatos sem depender dos globs do workspace principal, execute
13
19
  `node .agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs`.
14
20
  3. Verifique a paridade de all-time/intervalos, zero conhecido e todo-desconhecido/null com
@@ -22,4 +28,6 @@ O banco é um read model dos registros e da configuração ZAIP. `daily_aggregat
22
28
  read model lifecycle diário e alimenta, via SQL, os fatos de primeiro fold de
23
29
  `operations?scope=quick` e `cost-monitor?scope=summary` (runs, tokens, custo e cobertura).
24
30
  A duração híbrida legada e os detalhes de entidades permanecem no projection/adapter compartilhado
25
- para preservar semântica. A API é somente leitura para que o snapshot não fique desatualizado.
31
+ para preservar semântica. Comandos suportados pela API gravam nos canônicos e renovam a projeção.
32
+ Valide `snapshot_state: current` após a sincronização, além da integridade do banco. Os auxiliares
33
+ WAL/SHM/JOURNAL são transacionais; não os trate como versões obsoletas nem os apague com banco aberto.
@@ -5,11 +5,16 @@ description: Analyze bounded datasets, diagnose metrics, and produce reproducibl
5
5
 
6
6
  # Analisar dados delimitados
7
7
 
8
- 1. Confirmar o dataset, período, unidade de análise, definições de métrica e decisão que a análise deve informar. Quando qualquer insumo não estiver disponível, registrar a limitação e não preencher a lacuna com suposição.
9
- 2. Inspecionar a qualidade antes da conclusão: cobertura, duplicidade, nulos, granularidade, filtros e proveniência. Separar dado observado, derivação determinística e inferência.
10
- 3. Declarar método reproduzível: arquivos ou fontes usados, filtros, transformações, agregações, fórmula e intervalo temporal. Executar checks ou testes proporcionais quando houver código analítico.
11
- 4. Reportar achados com incerteza, exceções e limites. Não converter indisponibilidade em zero, causalidade ou certeza; distinguir descrição, comparação e hipótese.
12
- 5. Produzir evidência vinculada aos Acceptance Criteria e retornar somente resultados sustentados pelo dataset delimitado. Escalar alterações de produto, dashboard ou esquema para o executor apropriado.
8
+ ## Descoberta e entrega progressivas
9
+
10
+ 1. Comece pelos datasets e referências acessíveis fornecidos — tabela, planilha, texto, site, PDF, PPT, arquivo ou imagem. Registre fonte, locator e classificação: dado observado, definição aprovada, derivação determinística, hipótese ou lacuna. Preserve datasets e artefatos aprovados; não invente datasets, métricas ou decisões.
11
+ 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 pelo briefing material: dataset, período, unidade de análise, definição de métrica e decisão que a análise deve informar. 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, registre a limitação e use somente hipóteses delegáveis, sem preencher lacunas ou inventar dados, métricas ou autoridade.
12
+ 3. Uma consulta bem delimitada com dataset, métrica e período suficientes deve ser respondida diretamente, sem questionário obrigatório ou plano analítico amplo.
13
+ 4. Aplique somente as partes necessárias ao escopo solicitado: `briefing` → `qualidade` → `análise` → `síntese`. Use Markdown para registrar briefing e síntese quando útil, sem substituir notebook, planilha ou outro formato solicitado. Identifique a análise em construção e consolide somente achados sustentados; mantenha a fonte central de dados e o artefato analítico central, referenciando-os em vez de duplicar tabelas, definições ou resultados.
14
+ 5. Inspecione a qualidade antes da conclusão: cobertura, duplicidade, nulos, granularidade, filtros e proveniência. Separe dado observado, derivação determinística e inferência.
15
+ 6. Declare método reproduzível: arquivos ou fontes usados, filtros, transformações, agregações, fórmula e intervalo temporal. Execute checks ou testes proporcionais quando houver código analítico.
16
+ 7. Reporte achados com incerteza, exceções e limites. Não converta indisponibilidade em zero, causalidade ou certeza; diferencie descrição, comparação e hipótese.
17
+ 8. Produza evidência vinculada aos Acceptance Criteria e retorne somente resultados sustentados pelo dataset delimitado. Escale alterações de produto, dashboard ou esquema para o executor apropriado.
13
18
 
14
19
  ## Casos de análise
15
20
 
@@ -18,10 +18,11 @@ Use esta skill somente quando o usuário pedir execução. `prepare` não autori
18
18
  9. Em cada `run usage`, leia `budget.context_refresh_required` e `budget.checkpoint_required`. O runtime grava o checkpoint sanitizado em `.local/checkpoints/`; quando sinalizado, reconstrua contexto somente de IDs ativos, diff e findings, descarte outputs brutos antigos e continue apenas com autoridade.
19
19
  10. Em falha operacional, use retry limitado; em falha lógica, crie repair/rework explícito. Nunca esconda uma tentativa.
20
20
  11. Cada tentativa usa uma Run raiz do `zaip-agent-orchestrator`; subagentes e fases materialmente distintas usam Sub-Runs relacionadas por `parent_run_id`. Cada Run/Sub-Run fixa agente, modelo e effort; retry técnico preserva a configuração e qualquer mudança deliberada abre outra chamada de agente.
21
- 12. Interaction read-only sem descendentes termina após a resposta, sem executor/finalizador. Para interaction com descendente delegado e para delivery, depois que todos os Sub-Runs de trabalho terminarem invoque `zaip-agent-finalizer` como último filho com propósito `finalization`. Não inicie novos filhos depois dele; auto-settlement nunca fecha interaction com descendente ativo. Isso também vale para `cancelled`: o orquestrador aplica a decisão Gui pela CLI; comandos diretos Task/SPEC/PRD nunca terminalizam. Ausência, interrupção ou falha do Gui deixa a Execution inconclusiva como `blocked`.
22
- 13. SPEC/PRD permanece `active` entre Runs filhas e só entra em verificação após todas as Tasks; a Run filha não entrega nem bloqueia automaticamente o pai.
23
- 14. Resolva execução no menor grão explicitado: Task executa um nó elegível, SPEC executa sua DAG interna e PRD executa todas as SPECs selecionadas. Nunca amplie Task para SPEC/PRD por inferência.
24
- 15. “Conclua a execução” ou “finalize a implementação” em macro ativo continua Tasks e gates até resultado verdadeiro; não força `deliver`. “Desenvolva/melhore/aprimore” interrompe execução implícita, registra diagnóstico e cria plano/rework antes de nova promoção.
21
+ 12. Para delegação Codex, Sub-Run é somente subagente nativo de colaboração (`spawn_agent`). `create_thread` e `fork_thread` criam chats independentes e só podem ocorrer por pedido explícito do usuário; nunca os use como Sub-Run, fallback, retry ou prova de delegação. Se delegação nativa estiver indisponível, relate a limitação em vez de criar chat independente. Nome de catálogo, `task_name`, título ou prompt não provam ancestralidade nativa. Antes de repetir a mesma delegação limitada, aguarde ou reutilize seu filho pendente; capture somente ancestralidade/metadados observados em resultados nativos de spawn/terminal do host ou eventos SubagentStart/SubagentStop.
22
+ 13. Interaction read-only sem descendentes termina após a resposta, sem executor/finalizador. Para interaction com descendente delegado e para delivery, depois que todos os Sub-Runs de trabalho terminarem invoque `zaip-agent-finalizer` como último filho com propósito `finalization`. Não inicie novos filhos depois dele; auto-settlement nunca fecha interaction com descendente ativo. Isso também vale para `cancelled`: o orquestrador aplica a decisão Gui pela CLI; comandos diretos Task/SPEC/PRD nunca terminalizam. Ausência, interrupção ou falha do Gui deixa a Execution inconclusiva como `blocked`.
23
+ 14. SPEC/PRD permanece `active` entre Runs filhas e só entra em verificação após todas as Tasks; a Run filha não entrega nem bloqueia automaticamente o pai.
24
+ 15. Resolva execução no menor grão explicitado: Task executa um nó elegível, SPEC executa sua DAG interna e PRD executa todas as SPECs selecionadas. Nunca amplie Task para SPEC/PRD por inferência.
25
+ 16. “Conclua a execução” ou “finalize a implementação” em macro ativo continua Tasks e gates até resultado verdadeiro; não força `deliver`. “Desenvolva/melhore/aprimore” interrompe execução implícita, registra diagnóstico e cria plano/rework antes de nova promoção.
25
26
 
26
27
  ## Paralelismo
27
28
 
@@ -13,9 +13,10 @@ description: Create and validate hidden Windows launchers for reliable local fro
13
13
  `packages/windows-launcher`; não crie backend somente para servir arquivos estáticos.
14
14
  4. Sirva somente em loopback. Use porta preferencial configurável, busca limitada e health endpoint
15
15
  com identidade do workspace.
16
- 5. Persista sessão sanitizada no diretório temporário, isolada por hash do workspace. Sob lock
17
- atômico, reutilize primeiro a sessão saudável e depois procure um runtime órfão reconhecível;
18
- abra nova porta apenas quando nenhum deles existir.
16
+ 5. Persista sessão sanitizada no diretório temporário, isolada por hash do workspace. O clique mais
17
+ recente deve vencer: use claim serializada, encerre e confirme o launcher/runtime anterior
18
+ reconhecido antes de criar o novo writer; se não puder encerrar, bloqueie a abertura. O navegador
19
+ comanda a vida da sessão por conexão SSE, com grace para reload/BFCache.
19
20
  6. Use `.agents/config/src/icon_zaip.png` como fonte canônica padrão em workspaces ZAIP, salvo
20
21
  identidade explicitamente definida pelo projeto. Valide formato e proporção, gere o `.ico`
21
22
  temporário e compile com `/win32icon`; não mantenha cópias derivadas sem necessidade.
@@ -20,8 +20,10 @@
20
20
  - Bind somente em `127.0.0.1`; nunca exponha em `0.0.0.0`.
21
21
  - Use health endpoint exclusivo com `kind` e hash estável do workspace.
22
22
  - Grave `workspace`, `workspaceKey`, `rootPid`, `port` e `createdAt` no diretório temporário.
23
- - Crie lock por operação atômica de filesystem, com timeout e recuperação de lock obsoleto.
24
- - Dentro do lock, valide a sessão e procure health compatível na faixa limitada antes de iniciar.
23
+ - Crie claim-lock curto e operação atômica para transferir ownership; o último clique encerra e
24
+ confirma o launcher/runtime anterior reconhecido antes de iniciar outro writer.
25
+ - Valide o PID como launcher próprio antes de encerrá-lo; falha no encerramento bloqueia a abertura.
26
+ - Use uma conexão SSE do navegador como lease da sessão, com grace suficiente para reload/BFCache.
25
27
  - Não considere uma porta ocupada como runtime próprio sem validar o marcador e o workspace.
26
28
  - Sirva somente arquivos dentro do build root, rejeitando URL malformada e path traversal.
27
29
  - Abra o navegador apenas após listen e sessão persistida; rotas hash podem ser abertas diretamente.
@@ -33,6 +35,6 @@
33
35
  genérico.
34
36
  2. Testes do servidor e do boundary de arquivos passam.
35
37
  3. Uma porta preferencial ocupada por outro processo é ignorada sem encerrá-lo.
36
- 4. Dois disparos do executável mantêm o mesmo `rootPid` e a mesma `port`.
38
+ 4. Dois disparos do executável deixam somente o `rootPid`/porta do segundo clique ativos.
37
39
  5. Existe somente um processo do runtime para o workspace.
38
40
  6. O artefato distribuído funciona em path com espaços e em instalação limpa.
@@ -53,10 +53,10 @@ The conversation and terminal deploy report are the authority record for Git-onl
53
53
 
54
54
  ## Prove folder-scoped SSH first
55
55
 
56
- From the repository root, select the explicit remote or `origin`, then run once:
56
+ From the repository root, read `.agents/config/project.yaml` immediately before deployment. Resolve `deploy.branch`; use `main` only when the file or key is absent. A malformed existing file or invalid branch is a terminal preflight failure. Never infer a target from the checked-out or upstream branch. Select the requested remote (default `origin`), then run once:
57
57
 
58
58
  ```powershell
59
- node .agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs --repository . --remote origin --branch demo
59
+ node .agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs --repository . --remote origin
60
60
  ```
61
61
 
62
62
  The preflight must prove that the push URL uses SSH, no process override is active, the effective `core.sshCommand` comes from repository-local or matching folder configuration, its private key exists, Git identity exists, and `git ls-remote` succeeds.
@@ -75,7 +75,7 @@ Run preflight once at the start of the authorized deployment. On failure, stop.
75
75
 
76
76
  ## Synchronize and publish each cycle
77
77
 
78
- Fetch the selected remote and current branch once per publication cycle, without SSH overrides. Compute ahead/behind against the fetched ref. When local is behind or diverged, apply the recorded bounded reconciliation strategy and continue after successful verification; stop only if it cannot be completed safely within the bounded repair cycles. Never reset or force.
78
+ Fetch the selected remote and configured branch once per publication cycle, without SSH overrides. Compute ahead/behind against `<selected remote>/<configured branch>`. When local is behind or diverged, apply the recorded bounded reconciliation strategy and continue after successful verification; stop only if it cannot be completed safely within the bounded repair cycles. Never reset or force.
79
79
 
80
80
  Commits created during Task execution use `[CODEX|CLAUDE] [P:XXXX] [S:XXXX] [T:XXXX] <Task title>`: the effective executing-agent prefix followed by compact lineage.
81
81
 
@@ -84,14 +84,14 @@ Commits created during Task execution use `[CODEX|CLAUDE] [P:XXXX] [S:XXXX] [T:X
84
84
 
85
85
  The effective provider is exclusively `CODEX` or `CLAUDE`; `AUTO` is not part of a Task subject. P/S/T blocks are emitted only when their evidence exists; a Task with no PRD or SPEC uses `[Task-first:XXXX]`, and an unattributed functional commit uses `[CODEX] <functional title>` without `ZAIP-Task`. The subject remains ≤96 characters and only its title may truncate at a word boundary. Complete available PRD, SPEC, Task, Change, and Execution IDs remain in `ZAIP-*` trailers. An explicit deploy may create only its evidenced functional commits, without broad staging, force, destructive reset, or squashing.
86
86
 
87
- Push once per publication cycle. With an upstream, use `git push`; for first publication, use `git push -u <remote> <branch>`. If there is no unpushed commit after the bounded reconciliation and functional-commit review, report a no-op.
87
+ Immediately before push, re-read the target with `node .agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs --repository . --resolve-branch`. If it changed since preflight, restart validation and synchronization for the new target. Push once per publication cycle with the explicit configured refspec: `git push <remote> HEAD:refs/heads/<configured branch>`. Do not use a bare `git push` or infer a target from upstream. If there is no unpushed commit after the bounded reconciliation and functional-commit review, report a no-op.
88
88
 
89
89
  - If push fails, treat it as terminal unless repository content caused a documented server-side rejection that can be repaired locally.
90
90
  - Never switch keys, accounts, remotes, or transport, and never pass SSH/config overrides or force options.
91
91
 
92
92
  ## Verify and monitor GitHub checks
93
93
 
94
- 1. After every push, compare `git rev-parse HEAD` with one `git ls-remote <remote> refs/heads/<branch>` result.
94
+ 1. After every push, compare `git rev-parse HEAD` with one `git ls-remote <remote> refs/heads/<configured branch>` result.
95
95
  2. Inspect required GitHub checks for that exact commit using an available authenticated GitHub CLI, API, connector, or browser session. Wait up to 20 minutes for terminal status and provide a concise progress update at least once per minute.
96
96
  3. If all required checks pass, confirm the remote hash, commit title, SSH identity source, key path, and worktree status.
97
97
  4. If a check fails, read the exact job and step logs before editing. Do not weaken or remove the check merely to obtain green status.
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { spawnSync } from "node:child_process";
4
- import { existsSync } from "node:fs";
4
+ import { existsSync, readFileSync } from "node:fs";
5
5
  import { homedir } from "node:os";
6
6
  import { dirname, isAbsolute, relative, resolve } from "node:path";
7
+ import { parseDocument } from "./yaml-parser.mjs";
7
8
 
8
9
  const options = parseArguments(process.argv.slice(2));
9
10
 
@@ -11,11 +12,24 @@ try {
11
12
  const requestedRepository = resolve(options.repository);
12
13
  const repository = git(requestedRepository, ["rev-parse", "--show-toplevel"]).trim();
13
14
  const gitDirectory = git(repository, ["rev-parse", "--absolute-git-dir"]).trim();
14
- const branch = git(repository, ["branch", "--show-current"]).trim();
15
- if (branch === "") fail("detached HEAD is not deployable");
16
- if (options.branch !== null && branch !== options.branch) {
17
- fail(`current branch ${branch} does not match required branch ${options.branch}`);
15
+ const configuredBranch = configuredDeployBranch(repository);
16
+ if (options.branch !== null && options.branch !== configuredBranch) {
17
+ fail(
18
+ `caller branch ${options.branch} conflicts with configured deploy.branch ${configuredBranch}`,
19
+ );
18
20
  }
21
+ if (options.resolveBranch) {
22
+ process.stdout.write(
23
+ `${JSON.stringify({ configured_branch: configuredBranch, push_refspec: `HEAD:refs/heads/${configuredBranch}` })}\n`,
24
+ );
25
+ process.exit(0);
26
+ }
27
+ const checkedOutBranch = git(repository, ["branch", "--show-current"]).trim();
28
+ if (checkedOutBranch === "") fail("detached HEAD is not deployable");
29
+ if (checkedOutBranch !== configuredBranch)
30
+ fail(
31
+ `checked out branch ${checkedOutBranch} does not match configured deploy.branch ${configuredBranch}`,
32
+ );
19
33
 
20
34
  for (const variable of ["GIT_SSH", "GIT_SSH_COMMAND"]) {
21
35
  if (process.env[variable]?.trim()) fail(`${variable} overrides folder-scoped Git SSH config`);
@@ -66,8 +80,9 @@ try {
66
80
  {
67
81
  status: "ready",
68
82
  repository,
69
- branch,
70
- required_branch: options.branch,
83
+ configured_branch: configuredBranch,
84
+ checked_out_branch: checkedOutBranch,
85
+ caller_branch: options.branch,
71
86
  upstream: upstream || null,
72
87
  remote: {
73
88
  name: options.remote,
@@ -98,10 +113,17 @@ try {
98
113
  }
99
114
 
100
115
  function parseArguments(arguments_) {
101
- const parsed = { repository: ".", remote: "origin", branch: null, timeout: 15_000 };
116
+ const parsed = {
117
+ repository: ".",
118
+ remote: "origin",
119
+ branch: null,
120
+ timeout: 15_000,
121
+ resolveBranch: false,
122
+ };
102
123
  for (let index = 0; index < arguments_.length; index += 1) {
103
124
  const argument = arguments_[index];
104
- if (argument === "--repository")
125
+ if (argument === "--resolve-branch") parsed.resolveBranch = true;
126
+ else if (argument === "--repository")
105
127
  parsed.repository = requiredValue(arguments_, ++index, argument);
106
128
  else if (argument === "--remote") parsed.remote = requiredValue(arguments_, ++index, argument);
107
129
  else if (argument === "--branch") parsed.branch = requiredValue(arguments_, ++index, argument);
@@ -109,7 +131,7 @@ function parseArguments(arguments_) {
109
131
  parsed.timeout = Number(requiredValue(arguments_, ++index, argument));
110
132
  } else if (argument === "--help") {
111
133
  process.stdout.write(
112
- "Usage: preflight.mjs [--repository PATH] [--remote NAME] [--branch NAME] [--timeout-ms 1000..60000]\n",
134
+ "Usage: preflight.mjs [--repository PATH] [--remote NAME] [--branch CONFIGURED_BRANCH] [--resolve-branch] [--timeout-ms 1000..60000]\n",
113
135
  );
114
136
  process.exit(0);
115
137
  } else fail(`unknown argument: ${argument}`);
@@ -117,12 +139,55 @@ function parseArguments(arguments_) {
117
139
  if (!Number.isInteger(parsed.timeout) || parsed.timeout < 1_000 || parsed.timeout > 60_000) {
118
140
  fail("--timeout-ms must be an integer from 1000 to 60000");
119
141
  }
120
- if (parsed.branch !== null && !/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(parsed.branch)) {
121
- fail("--branch must be a plain Git branch name");
122
- }
123
142
  return parsed;
124
143
  }
125
144
 
145
+ function configuredDeployBranch(repository) {
146
+ const configPath = resolve(repository, ".agents/config/project.yaml");
147
+ if (!existsSync(configPath)) return "main";
148
+ let document;
149
+ try {
150
+ document = parseDocument(readFileSync(configPath, "utf8"), { strict: true, uniqueKeys: true });
151
+ } catch (error) {
152
+ fail(
153
+ `project.yaml could not be read: ${error instanceof Error ? error.message : String(error)}`,
154
+ );
155
+ }
156
+ if (document.errors.length > 0) {
157
+ fail(`project.yaml is malformed: ${document.errors[0]?.message ?? "YAML parse error"}`);
158
+ }
159
+ const config = document.toJS();
160
+ if (config === null || typeof config !== "object" || Array.isArray(config)) {
161
+ fail("project.yaml must contain a mapping");
162
+ }
163
+ const deploy = config.deploy;
164
+ if (deploy === undefined) return "main";
165
+ if (deploy === null || typeof deploy !== "object" || Array.isArray(deploy)) {
166
+ fail("project.yaml deploy must be a mapping");
167
+ }
168
+ if (!("branch" in deploy)) return "main";
169
+ if (typeof deploy.branch !== "string" || deploy.branch.trim() === "") {
170
+ fail("project.yaml deploy.branch must be a non-empty Git branch name");
171
+ }
172
+ const branch = deploy.branch.trim();
173
+ if (!isValidBranch(repository, branch)) fail(`project.yaml deploy.branch is invalid: ${branch}`);
174
+ return branch;
175
+ }
176
+
177
+ function isValidBranch(repository, branch) {
178
+ if (
179
+ branch.startsWith("-") ||
180
+ branch.includes("..") ||
181
+ branch.includes("//") ||
182
+ branch.includes("@{")
183
+ )
184
+ return false;
185
+ return (
186
+ git(repository, ["check-ref-format", "--branch", branch], { allowFailure: true }).trim() ===
187
+ branch
188
+ );
189
+ }
190
+
126
191
  function requiredValue(arguments_, index, option) {
127
192
  const value = arguments_[index];
128
193
  if (!value || value.startsWith("--")) fail(`${option} requires a value`);
@@ -0,0 +1,59 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawnSync } from "node:child_process";
3
+ import { copyFileSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import test from "node:test";
7
+
8
+ test("standalone consumer resolves fresh project targets without node_modules", () => {
9
+ const root = mkdtempSync(join(tmpdir(), "zaip-deploy-target-"));
10
+ try {
11
+ assert.equal(
12
+ spawnSync("git", ["init", "-b", "codex/working", root], { windowsHide: true }).status,
13
+ 0,
14
+ );
15
+ const scripts = join(root, ".agents/skills/zaip-skill-github-deploy/scripts");
16
+ mkdirSync(scripts, { recursive: true });
17
+ mkdirSync(join(root, ".agents/config"), { recursive: true });
18
+ for (const file of ["preflight.mjs", "yaml-parser.mjs"])
19
+ copyFileSync(join(import.meta.dirname, file), join(scripts, file));
20
+ const run = (...args) =>
21
+ spawnSync(process.execPath, [join(scripts, "preflight.mjs"), "--repository", root, ...args], {
22
+ encoding: "utf8",
23
+ windowsHide: true,
24
+ env: { ...process.env, NODE_PATH: "" },
25
+ });
26
+ const target = () => {
27
+ const result = run("--resolve-branch");
28
+ assert.equal(result.status, 0, result.stderr);
29
+ return JSON.parse(result.stdout);
30
+ };
31
+ const config = (text) => writeFileSync(join(root, ".agents/config/project.yaml"), text);
32
+ assert.equal(target().configured_branch, "main");
33
+ config("project: { name: example }\n");
34
+ assert.equal(target().configured_branch, "main");
35
+ config("deploy: {}\n");
36
+ assert.equal(target().configured_branch, "main");
37
+ config("deploy:\n branch: 'release/production'\n");
38
+ assert.deepEqual(target(), {
39
+ configured_branch: "release/production",
40
+ push_refspec: "HEAD:refs/heads/release/production",
41
+ });
42
+ config("deploy: { branch: staging }\n");
43
+ assert.equal(target().configured_branch, "staging");
44
+ assert.match(run("--resolve-branch", "--branch", "main").stderr, /conflicts with configured/);
45
+ assert.match(run().stderr, /checked out branch codex\/working does not match/);
46
+ for (const branch of ["bad..branch", "bad.lock/child", ".hidden/child", "-option"]) {
47
+ config(`deploy: { branch: '${branch}' }\n`);
48
+ assert.match(run("--resolve-branch").stderr, /deploy.branch is invalid/);
49
+ }
50
+ config("deploy: { branch: release_ }\n");
51
+ assert.equal(target().configured_branch, "release_");
52
+ for (const source of ["deploy: [\n", "deploy: { branch: main, branch: staging }\n"]) {
53
+ config(source);
54
+ assert.match(run("--resolve-branch").stderr, /malformed/);
55
+ }
56
+ } finally {
57
+ rmSync(root, { recursive: true, force: true });
58
+ }
59
+ });