@zaip-ai/cli 2.2.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -13
- package/dist/services/adapters.d.ts +1 -1
- package/dist/services/adapters.d.ts.map +1 -1
- package/dist/services/adapters.js +26 -9
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/agent-adapters.js +37 -18
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-discovery.d.ts +27 -0
- package/dist/services/agent-discovery.d.ts.map +1 -0
- package/dist/services/agent-discovery.js +73 -0
- package/dist/services/agent-discovery.js.map +1 -0
- package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
- package/dist/services/codex-conversation-lifecycle-hook.js +164 -24
- package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
- package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
- package/dist/services/codex-pre-tool-hook-template.js +146 -72
- package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
- package/dist/services/codex-rules.d.ts +1 -1
- package/dist/services/codex-rules.d.ts.map +1 -1
- package/dist/services/codex-rules.js +3 -3
- package/dist/services/codex-subagent-hook-template.d.ts +1 -1
- package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
- package/dist/services/codex-subagent-hook-template.js +117 -66
- package/dist/services/codex-subagent-hook-template.js.map +1 -1
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +65 -7
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/logger.js +1 -1
- package/dist/services/logger.js.map +1 -1
- package/dist/services/logger.test.js +22 -1
- package/dist/services/logger.test.js.map +1 -1
- package/dist/services/runtime-template.test.js +153 -1
- package/dist/services/runtime-template.test.js.map +1 -1
- package/dist/services/transactional-files.d.ts.map +1 -1
- package/dist/services/transactional-files.js +59 -14
- package/dist/services/transactional-files.js.map +1 -1
- package/package.json +1 -1
- package/templates/.agents/.env.example +9 -3
- package/templates/.agents/README-ENG.md +101 -15
- package/templates/.agents/README.md +102 -17
- package/templates/.agents/architecture/software-architecture.md +1 -59
- package/templates/.agents/branding/brandbook.md +3 -0
- package/templates/.agents/config/agents/catalog.yaml +25 -10
- package/templates/.agents/config/agents/discovery.json +319 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +3 -3
- package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +3 -3
- package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +12 -9
- package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +3 -3
- package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +2 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +3 -3
- package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +13 -10
- package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +3 -3
- package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +3 -3
- package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -1
- package/templates/.agents/config/pricing/models.json +9 -5
- package/templates/.agents/config/project.yaml +22 -2
- package/templates/.agents/dashboard/.zaip-managed.json +530 -138
- package/templates/.agents/dashboard/README.md +16 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-CEDZjl4V.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-DaSllaJp.js → DashboardHelpDialog-TnrL1ZyZ.js} +967 -578
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-DjQpBqGU.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-B9GWkEyN.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BAvLPAee.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BQZXUnQu.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-06__WZco.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-Basaw1NR.js +824 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-TPUT2IUt.js → icons-vendor-DEmo6Tn2.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-BQe3zTvL.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-Ct48XHGL.js → react-vendor-CadYsm83.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-Bh1tDfsg.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BzKK8kK3.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +3 -1264
- package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +368 -0
- package/templates/.agents/dashboard/apps/frontend/src/AutonomySettings.tsx +82 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +130 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +206 -157
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +3 -1
- package/templates/.agents/dashboard/apps/frontend/src/__tests__/app-composition-support.ts +12 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-monitor-population.test.tsx +149 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +9 -7
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +152 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +19 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +50 -154
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-app-shell.tsx +33 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.test.ts +54 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.ts +48 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.test.ts +37 -43
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +9 -251
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-project-overview.ts +35 -2
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-retry.ts +17 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-setup-route.ts +29 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.test.ts +51 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.ts +68 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +38 -2
- package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +19 -4
- package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +5 -3
- package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +2 -2
- package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.test.ts +137 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.ts +66 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-copy.ts +181 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +11 -1
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +102 -51
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-state.css +55 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +14 -2
- package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.test.ts +36 -0
- package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.ts +30 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +2 -5
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +31 -20
- package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.ts +1 -2
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +6 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +2 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +9 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +3 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-task-pagination.ts +66 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +397 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +782 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-snapshot-notice.tsx +49 -0
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/complete-cost-average.test.ts +73 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +9 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/period-averages.ts +60 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperPanelSlot.tsx +16 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +459 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +8 -22
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +27 -17
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +64 -189
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorRunDialog.tsx +20 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostPeriodAverageCards.tsx +32 -8
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-hides-calls-that-have-no-collected.test.ts +80 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +455 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +18 -525
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +32 -508
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-export-sources.ts +74 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-actions.ts +19 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +49 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +3 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-formatters.ts +115 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +1 -42
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +2 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test-fixtures.ts +2 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +3 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +8 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
- package/templates/.agents/dashboard/modules/operations/package.json +1 -1
- package/templates/.agents/dashboard/modules/operations/src/contracts.ts +4 -0
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTableBadges.tsx +34 -0
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +8 -38
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview-keeps-structure-classes-mutually-exclusive.test.ts +244 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +66 -3
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +98 -276
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +105 -276
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewCharts.tsx +171 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewPanels.tsx +64 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +9 -17
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +3 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OverviewCostKpi.tsx +46 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +2 -1
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +28 -1
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +11 -4
- package/templates/.agents/dashboard/modules/operations/src/react/index.ts +1 -0
- package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +2 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +8 -4
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +34 -22
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +3 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +21 -2
- package/templates/.agents/dashboard/modules/operations/src/react/overview-cost-card.test.tsx +89 -0
- package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-format.ts +32 -0
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +3 -3
- package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +2 -1
- package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
- package/templates/.agents/dashboard/packages/branding/package.json +1 -1
- package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
- package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
- package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1625 -1613
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1592 -1582
- package/templates/.agents/dashboard/packages/local-runtime/package.json +3 -2
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +22 -28
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1625 -1614
- package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +25 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.test.ts +142 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.ts +190 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +118 -8
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +92 -36
- package/templates/.agents/dashboard/packages/local-runtime/src/projection-refresh-diagnostics.ts +35 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.test.ts +91 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.ts +24 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +168 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-dual-reads-manifest-summaries-without-losing.test.ts +344 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-hono-security.test.ts +17 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-http-contracts.ts +31 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-routes.ts +364 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +461 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +78 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-route-context.ts +13 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +94 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +62 -12
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +44 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +22 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -21
- package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.test.ts +97 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +10 -13
- package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-view-allowlist.test.ts +25 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-trace-routes.ts +56 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-traceability-index.test.ts +84 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +2 -30
- package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +6 -23
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +2 -330
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +87 -1060
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-dimension-facts.test.ts +12 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-file-index.test.ts +69 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +3 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-force-canonical.test.ts +3 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-refresh.test.ts +2 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-first-fold.ts +78 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +570 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-runs.ts +600 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-period-averages.ts +46 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-provider-alias-parity.test.ts +50 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +269 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-context.ts +32 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +244 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +303 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +547 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +360 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +169 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +493 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-temporal-dimension.ts +134 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-timing.ts +299 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +692 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +763 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-does-not-convert-delayed-historical-finalizer.test.ts +706 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +762 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-keeps-orphan-telemetry-out-kanban-without.test.ts +710 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-marks-token-cost-telemetry-unavailable-when.test.ts +618 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +764 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuilds-disposable-snapshot-serves-zaip-records.test.ts +276 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +193 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +54 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +7 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-types.ts +123 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +5 -2806
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +17 -6930
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-risk-population.test.ts +98 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +390 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +413 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-seed.test.ts +2 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/verify-project-settings.mjs +57 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +4 -3
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-build.mjs +195 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.test.mjs +2 -7
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-logging.mjs +35 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-navigation.mjs +114 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-paths.mjs +90 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +89 -418
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +22 -12
- package/templates/.agents/dashboard/packages/ui/package.json +1 -1
- package/templates/.agents/dashboard/scripts/qualify-observability.mjs +130 -0
- package/templates/.agents/dashboard/scripts/verify-autonomy-settings.mjs +175 -0
- package/templates/.agents/dashboard/scripts/verify-observability.mjs +254 -0
- package/templates/.agents/dashboard/scripts/verify-project-setup.mjs +64 -0
- package/templates/.agents/dashboard/tests/e2e/lease-global-setup.ts +37 -0
- package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +9 -4
- package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-period-transition.spec.ts +22 -1
- package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +17 -8
- package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +47 -6
- package/templates/.agents/dashboard/tests/e2e/specs/lease-lifetime.spec.ts +14 -0
- package/templates/.agents/dashboard/tests/observability-fixture.mjs +200 -0
- package/templates/.agents/design/.zaip-managed.json +86 -42
- package/templates/.agents/design/DESIGN.md +2 -186
- package/templates/.agents/design/README.md +12 -2
- package/templates/.agents/design/apps/catalog/dist/assets/index-BJV597iq.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-BOjCcUaU.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-B_WhrCZe.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-CqtYXZfV.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-D_lfqoyx.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-i_PO2k9R.js +9 -0
- package/templates/.agents/design/apps/catalog/dist/index.html +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-Cstn1UwA.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{Color-6AOWCN3U-B-kAgAjB.js → Color-6AOWCN3U-Cm-yJJz_.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-D1WopB2L.js +137 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DQ9PJ3N3.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{DocsRenderer-JROSPFPF-BVN7xHtv.js → DocsRenderer-JROSPFPF-Belk4jRr.js} +4 -4
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{WithTooltip-7X4HQR7L-CDHtKYkz.js → WithTooltip-7X4HQR7L-DoPvjkS1.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-DRQKCCAG-D6AsDkMK.js → chunk-DRQKCCAG-B1itKXEN.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-W22LQPXL-B4m5uloN.js → chunk-W22LQPXL-C-Eb5SPY.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{components-CN8YyTUg.js → components-DnyKLwhj.js} +5 -5
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-D0OSgxWz.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{iframe-9yZfIsdT.js → iframe-DcXBsFPz.js} +3 -3
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{react-18-BoCSnq6H.js → react-18-CRM89QRf.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-C3tkVMIp.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{syntaxhighlighter-YFXUGROL-Bnn_nMwJ.js → syntaxhighlighter-YFXUGROL-B03jQGTF.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{theming-DS_ue2sb.js → theming-4ZyufAga.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/iframe.html +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/index.json +1 -1
- package/templates/.agents/design/apps/catalog/package.json +2 -2
- package/templates/.agents/design/apps/catalog/src/components/AutonomySpecimen.tsx +15 -0
- package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.test.tsx +19 -0
- package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.tsx +45 -0
- package/templates/.agents/design/apps/catalog/src/components/EstimatedCostSpecimen.tsx +48 -0
- package/templates/.agents/design/apps/catalog/src/components/ProjectStatusSpecimen.tsx +169 -0
- package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +55 -0
- package/templates/.agents/design/apps/catalog/src/stories/Components.stories.tsx +60 -0
- package/templates/.agents/design/packages/local-runtime/package.json +1 -1
- package/templates/.agents/growth/strategy.md +3 -0
- package/templates/.agents/marketing/strategy.md +3 -0
- package/templates/.agents/requirements/autonomous-assurance.md +2 -1
- package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
- package/templates/.agents/requirements/comparative-audit.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/dashboard-launch.md +1 -1
- package/templates/.agents/requirements/data-export.md +1 -1
- package/templates/.agents/requirements/design-system.md +13 -4
- package/templates/.agents/requirements/execution-engine.md +1 -1
- package/templates/.agents/requirements/kanban-dashboard.md +1 -1
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +4 -2
- package/templates/.agents/requirements/software-architecture.md +1 -1
- package/templates/.agents/requirements/strategic-improvements.md +1 -1
- package/templates/.agents/requirements/work-lifecycle.md +6 -6
- package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
- package/templates/.agents/rules/architecture.md +2 -0
- package/templates/.agents/rules/astra-diagnostic.md +3 -1
- package/templates/.agents/rules/autonomy-decision.md +12 -2
- package/templates/.agents/rules/cloud-hostinger-autonomy.md +2 -0
- package/templates/.agents/rules/context.md +2 -1
- package/templates/.agents/rules/core.md +15 -4
- package/templates/.agents/rules/design-system-central-contract.md +17 -0
- package/templates/.agents/rules/evolution.md +3 -1
- package/templates/.agents/rules/frontend-lite.md +3 -1
- package/templates/.agents/rules/local-sqlite-storage.md +2 -2
- package/templates/.agents/rules/meta-mcp.md +3 -1
- package/templates/.agents/rules/model-orchestration.md +1 -1
- package/templates/.agents/rules/run-lifecycle-closure.md +11 -7
- package/templates/.agents/rules/security.md +3 -1
- package/templates/.agents/rules/specialist-routing.md +3 -1
- package/templates/.agents/rules/text-writing-utf8.md +1 -1
- package/templates/.agents/rules/workflow.md +7 -5
- package/templates/.agents/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +821 -516
- package/templates/.agents/runtime/checksums.sha256 +6 -6
- package/templates/.agents/runtime/manifest.json +1 -1
- package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
- package/templates/.agents/runtime/provenance.json +5 -5
- package/templates/.agents/runtime/sbom.cdx.json +3 -3
- package/templates/.agents/sales/playbook.md +3 -0
- package/templates/.agents/skills/zaip-aios/SKILL.md +5 -3
- package/templates/.agents/skills/zaip-skill-adapt-stack/SKILL.md +1 -0
- package/templates/.agents/skills/zaip-skill-api-contracts/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-api-contracts/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-application-observability/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-application-observability/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-application-observability/references/signal-design.md +3 -0
- package/templates/.agents/skills/zaip-skill-application-readiness/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-application-readiness/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-application-readiness/references/evidence-matrix.md +3 -0
- package/templates/.agents/skills/zaip-skill-architecture-design/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-architecture-design/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-async-jobs/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-async-jobs/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/references/data-access-paths.md +9 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/references/worker-scenario.md +5 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/scripts/worker-contract.test.mjs +27 -0
- package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-author-skills/references/engineering-skill-index.md +9 -0
- package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +5 -3
- package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
- package/templates/.agents/skills/zaip-skill-backend/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-backend/references/deployment-environments.md +75 -0
- package/templates/.agents/skills/zaip-skill-backend/references/supabase-migration-contract.md +23 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-cache-strategy/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-cache-strategy/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-cloud-engineering/SKILL.md +7 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/SKILL.md +37 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/agents/openai.yaml +6 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workers-static-assets.md +26 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workflow-templates.md +71 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/scripts/cloudflare-github-deploy-contract.test.mjs +77 -0
- package/templates/.agents/skills/zaip-skill-config/SKILL.md +21 -11
- package/templates/.agents/skills/zaip-skill-config/agents/openai.yaml +2 -2
- package/templates/.agents/skills/zaip-skill-container-runtime/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-container-runtime/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-context/SKILL.md +6 -1
- package/templates/.agents/skills/zaip-skill-context/references/prd-spec-task-handoff.md +10 -0
- package/templates/.agents/skills/zaip-skill-context/references/rule-selection.md +20 -0
- package/templates/.agents/skills/zaip-skill-cqrs/SKILL.md +1 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/SKILL.md +18 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/references/audit-contract.md +94 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.mjs +185 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.test.mjs +101 -0
- package/templates/.agents/skills/zaip-skill-data-modeling/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-data-modeling/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/SKILL.md +20 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/references/manual-mode.md +15 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/references/promotion-example.md +5 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.mjs +145 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.test.mjs +178 -0
- package/templates/.agents/skills/zaip-skill-dependency-upgrade/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-dependency-upgrade/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-deployment-pipeline/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-deployment-pipeline/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-deployment-pipeline/references/runtime-shapes.md +3 -0
- package/templates/.agents/skills/zaip-skill-design-system/SKILL.md +20 -9
- package/templates/.agents/skills/zaip-skill-dev-environment/SKILL.md +16 -0
- package/templates/.agents/skills/zaip-skill-dev-environment/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-dev-environment/references/inventory-contract.md +7 -0
- package/templates/.agents/skills/zaip-skill-dev-environment/scripts/inventory.mjs +77 -0
- package/templates/.agents/skills/zaip-skill-disaster-recovery/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-disaster-recovery/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-disaster-recovery/references/recovery-scope.md +3 -0
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +31 -8
- package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +7 -0
- package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +18 -8
- package/templates/.agents/skills/zaip-skill-external-integrations/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-external-integrations/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-frontend-componentization/SKILL.md +44 -0
- package/templates/.agents/skills/zaip-skill-frontend-componentization/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-frontend-data-flows/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-frontend-data-flows/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/SKILL.md +36 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/references/cloudflare-pages.md +33 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/references/github.md +63 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/references/hostinger-vps.md +55 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/references/npm.md +30 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/check-skill.mjs +55 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.mjs +61 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.test.mjs +128 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-ssh.integration.test.mjs +106 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +42 -76
- package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +135 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/references/github-release-workflow-template.md +31 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/references/release-gate-matrix.md +24 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +44 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/references/release-notes.md +134 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +389 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +134 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +25 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness-api.test.mjs +134 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.mjs +98 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.test.mjs +25 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.mjs +159 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.test.mjs +160 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +149 -12
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +64 -5
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/release-notes-coverage.test.mjs +126 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.mjs +78 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.test.mjs +51 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.mjs +184 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.test.mjs +109 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +18 -10
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +3 -4
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/aws-cli-terraform.md +62 -0
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/guia-iniciante-hostinger-vps.md +183 -0
- package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/references/scaffold-contract.md +9 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/helpers.test.mjs +121 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/scaffold.mjs +169 -0
- package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +3 -1
- package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-performance-engineering/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-performance-engineering/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-prd/SKILL.md +3 -1
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +1 -0
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +26 -9
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +39 -13
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +1 -0
- package/templates/.agents/skills/zaip-skill-refactor-landing-page/SKILL.md +66 -0
- package/templates/.agents/skills/zaip-skill-refactor-landing-page/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-refactor-landing-page/references/behavioral-dry-run.md +23 -0
- package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +38 -1
- package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +122 -0
- package/templates/.agents/skills/zaip-skill-review/SKILL.md +1 -0
- package/templates/.agents/skills/zaip-skill-rules/SKILL.md +3 -3
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-setup/SKILL.md +21 -21
- package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +2 -2
- package/templates/.agents/skills/zaip-skill-spec/SKILL.md +3 -2
- package/templates/.agents/skills/zaip-skill-storage-uploads/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-storage-uploads/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-systematic-debugging/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-systematic-debugging/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-task/SKILL.md +16 -7
- package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +25 -0
- package/templates/.agents/skills/zaip-skill-test-data/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-test-data/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-test-data/scripts/generate.mjs +72 -0
- package/templates/.agents/skills/zaip-skill-testing-strategy/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-testing-strategy/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-testing-strategy/references/example-map.md +3 -0
- package/templates/.agents/skills/zaip-skill-tool-setup/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-website-readiness/SKILL.md +8 -0
- package/templates/.agents/zaip-aios/INDEX.md +9 -1
- package/templates/.agents/zaip-aios/README.md +23 -2
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/.agents/zaip-aios/guides/01-primeiros-passos.md +5 -1
- package/templates/.agents/zaip-aios/guides/03-tasks.md +15 -2
- package/templates/.agents/zaip-aios/guides/04-specs.md +13 -0
- package/templates/.agents/zaip-aios/guides/05-prds.md +13 -0
- package/templates/.agents/zaip-aios/guides/06-execucao.md +19 -4
- package/templates/.agents/zaip-aios/guides/07-revisao-e-validacao.md +14 -0
- package/templates/.agents/zaip-aios/guides/08-contexto-e-tokens.md +4 -3
- package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +17 -9
- package/templates/.agents/zaip-aios/guides/10-seguranca.md +11 -1
- package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +69 -0
- package/templates/.agents/zaip-aios/guides/12-instalacao-e-upgrade.md +9 -4
- package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +7 -1
- package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +18 -0
- package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +54 -3
- package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +10 -2
- package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +186 -5
- package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +26 -18
- package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +18 -2
- package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +14 -2
- package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +190 -489
- package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +61 -13
- package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +18 -0
- package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +18 -1
- package/templates/scripts/validate-cloud-hostinger-contract.mjs +34 -0
- package/templates/template-manifest.json +1229 -329
- package/templates/.agents/branding/.gitkeep +0 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-snUCQYTC.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-BPtVUGgs.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-GgzpZ_PY.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BCvZFMEf.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +0 -68
- package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-CLJ0lT9v.js +0 -231
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-_MEktQNM.js +0 -2
- package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BDe4_Ubl.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-BWY-80s4.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-Be2mDUQj.js +0 -27
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DRx9blDs.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-EwuTh8Zk.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-DyL61NPT.js +0 -1
- package/templates/.agents/growth/.gitkeep +0 -0
- package/templates/.agents/marketing/.gitkeep +0 -0
- 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
|
+
}
|
package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.test.mjs
ADDED
|
@@ -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
|
+
}
|
|
@@ -12,3 +12,5 @@ description: Guide data-driven growth strategy, RevOps decisions, experiments, a
|
|
|
12
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.
|
|
13
13
|
|
|
14
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.
|
|
15
|
+
|
|
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.
|
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: zaip-skill-hostinger-cloudflare-terraform
|
|
3
|
-
description: Operate
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
15
|
-
5.
|
|
16
|
-
6.
|
|
17
|
-
7.
|
|
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.
|
package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
interface:
|
|
2
|
-
display_name: "Terraform Cloudflare Hostinger"
|
|
3
|
-
short_description: "
|
|
4
|
-
default_prompt: "Use $zaip-skill-hostinger-cloudflare-terraform para validar alvos, state e uma operacao Terraform Cloudflare/Hostinger com
|
|
2
|
+
display_name: "Terraform Cloudflare Hostinger e AWS"
|
|
3
|
+
short_description: "Prepara AWS e opera Terraform Cloudflare/Hostinger delimitados"
|
|
4
|
+
default_prompt: "Use $zaip-skill-hostinger-cloudflare-terraform para validar alvos, state e uma operacao Terraform Cloudflare/Hostinger, ou preparar AWS CLI/Terraform com conta, regiao, profile e roles explicitamente delimitados."
|
|
5
5
|
policy:
|
|
6
6
|
allow_implicit_invocation: true
|
|
7
|
-
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Contrato AWS CLI e Terraform
|
|
2
|
+
|
|
3
|
+
Use este procedimento somente quando a Task AWS ativa e o contrato de infraestrutura declararem explicitamente a conta AWS, a região, o profile de origem, a role alvo quando aplicável, e os recursos Terraform autorizados. Ele prepara um ambiente e produz um plano revisável. A autorização explícita da Task AWS ativa pode cobrir bootstrap e provisionamento somente dos recursos delimitados com AWS CLI/Terraform e o plano salvo revisado; ela não autoriza publicar aplicação nem ampliar conta, região ou role.
|
|
4
|
+
|
|
5
|
+
## Identidade e escopo
|
|
6
|
+
|
|
7
|
+
Registre nomes e ARNs, nunca credenciais, cache SSO, tokens STS, `backend-config`, state, plano binário/JSON ou seu conteúdo. O contrato AWS precisa conter:
|
|
8
|
+
|
|
9
|
+
| Campo | Exigência |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Conta | `account_id` de doze dígitos, correspondente à identidade STS observada para cada principal usado. |
|
|
12
|
+
| Região | Uma região explícita para backend e provider; não herdar o profile ou região padrão do computador. |
|
|
13
|
+
| Profile de origem | Nome explícito do profile configurado por SSO ou credencial local já autorizada. |
|
|
14
|
+
| Principal do backend | Profile/role e conta que executam `terraform init` e acessam o bucket S3 de state. |
|
|
15
|
+
| Principal do provider | Profile/role e conta que o provider AWS usa para ler, planejar ou alterar recursos. |
|
|
16
|
+
| Role assumida | ARN, conta destino, política de menor privilégio, duração de sessão e external ID quando o trust policy exigir. |
|
|
17
|
+
| Backend | Bucket, key, região, versionamento, recuperação e política IAM delimitados. |
|
|
18
|
+
|
|
19
|
+
Um profile autenticado não autoriza a conta inteira. Um ARN novo, região nova, bucket/state key novo, role nova ou qualquer recurso faturável fora da Task exige escopo atualizado.
|
|
20
|
+
|
|
21
|
+
## Autenticação AWS CLI
|
|
22
|
+
|
|
23
|
+
SSO é o método preferível. Quando for o método autorizado, configurar somente o profile declarado:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
aws configure sso --profile PERFIL_ORIGEM
|
|
27
|
+
aws sso login --profile PERFIL_ORIGEM
|
|
28
|
+
aws sts get-caller-identity --profile PERFIL_ORIGEM --region REGIAO
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Profile existente, OIDC ou uma role já autorizada também são válidos quando sua identidade STS verificada corresponde ao contrato. Confirme que o `Account` retornado corresponde ao `account_id` e registre somente conta, ARN sanitizado e momento. Não use `default` implicitamente. Para provider ou backend que assumem outra role, prefira profile com `role_arn` e `source_profile`, ou OIDC. Se `aws sts assume-role` for inevitável, declare `--role-arn`, `--role-session-name` e `--duration-seconds`, e nunca imprima, registre ou injete seu stdout de credenciais. Verifique a identidade obtida para cada principal; a credencial de backend não pode ser reutilizada como prova da role do provider, nem o contrário.
|
|
32
|
+
|
|
33
|
+
O profile e as credenciais de sessão ficam no armazenamento local do AWS CLI, fora do repositório. Nunca copie valores de `~/.aws`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` ou `AWS_SESSION_TOKEN` para `.env`, arquivos Terraform, logs ou evidências.
|
|
34
|
+
|
|
35
|
+
## Backend remoto S3
|
|
36
|
+
|
|
37
|
+
Para Terraform >= 1.10, o backend S3 deve declarar bucket, key e região aprovados, `encrypt = true` e `use_lockfile = true`. O bucket deve ter versionamento e recuperação definidos; o principal de backend recebe somente as permissões necessárias ao objeto de state e ao arquivo `.tflock`. Não criar configuração nova com locking DynamoDB.
|
|
38
|
+
|
|
39
|
+
`backend-config` sem segredo pode ser versionado; passe dados secretos somente por arquivo local ignorado ou variáveis de ambiente efêmeras do processo. Não rastreie segredos, state, lockfile remoto, plano binário ou JSON de plano. O comando `terraform init` deve usar a identidade do backend; a configuração `provider "aws"`/`assume_role` deve usar a identidade do provider, declarada e verificada separadamente.
|
|
40
|
+
|
|
41
|
+
## Bootstrap AWS de ambiente zero
|
|
42
|
+
|
|
43
|
+
`terraform init` configura e acessa um backend já existente; ele **não cria o bucket S3**. Quando não houver ambiente AWS anterior, uma Task AWS explicitamente autorizada pode executar um bootstrap separado, com AWS CLI/Terraform e apenas contra o `account_id`, região, principal de backend, bucket e key declarados no contrato. Esse bootstrap não lê nem requer o contrato operacional, runner, conta Cloudflare/Hostinger, VPS ou SSH.
|
|
44
|
+
|
|
45
|
+
Antes de criar, confirme a identidade STS do principal de backend, a conta, a região e que o bucket aprovado ainda não existe. Crie somente o bucket aprovado e configure: versionamento, recuperação documentada e testável (por exemplo retenção/backup e restauração de versão), criptografia do bucket/state, IAM mínimo para o objeto state e `.tflock`, e `use_lockfile = true` no backend Terraform. Registre apenas os nomes/ARNs sanitizados, configurações não secretas, o resultado e a prova de recuperação; nunca state, tokens ou saída de credenciais. Não use DynamoDB para novo locking.
|
|
46
|
+
|
|
47
|
+
Depois do bootstrap, inicialize o backend com a identidade de backend, revise o lock gerado e somente então execute `terraform init -lockfile=readonly`. O bootstrap não amplia o contrato para recursos de aplicação ou provider. A Task AWS ativa pode cobrir esses recursos somente quando o contrato os delimita e existe plano salvo revisado; não exija uma Task nova ou confirmação repetida para esse mesmo mandato.
|
|
48
|
+
|
|
49
|
+
## Ciclo Terraform
|
|
50
|
+
|
|
51
|
+
1. Verificar profile, conta e região do backend via STS. Sem lockfile, fazer bootstrap com `terraform init`, revisar o lock gerado e só então usar `terraform init -lockfile=readonly`.
|
|
52
|
+
2. Verificar profile, role e conta do provider via STS; rodar `terraform fmt -check`, `terraform validate` e `terraform plan -out` em diretório local ignorado.
|
|
53
|
+
3. Revisar o plano, guardar apenas seu hash, versão do Terraform/providers, conta/região/roles sanitizadas e o resultado da política.
|
|
54
|
+
4. Na Task AWS ativa e explicitamente autorizada, `terraform apply` só consome o plano salvo cuja hash foi revisada. A execução AWS CLI/Terraform deve validar contrato, identidades, targets e hash de plano; o `cloud-runner.mjs` Cloudflare/Hostinger não pode ser apresentado como suporte AWS.
|
|
55
|
+
|
|
56
|
+
Se autenticação, STS, init ou plano falhar, pare e registre diagnóstico sanitizado. Não faça fallback para outra conta/profile/role, nem repita mutações de provider sem reconciliação.
|
|
57
|
+
|
|
58
|
+
## Fontes oficiais
|
|
59
|
+
|
|
60
|
+
- [AWS CLI SSO](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html)
|
|
61
|
+
- [Backend S3 do Terraform](https://developer.hashicorp.com/terraform/language/backend/s3)
|
|
62
|
+
- [Boas práticas AWS para backend Terraform](https://docs.aws.amazon.com/prescriptive-guidance/latest/terraform-aws-provider-best-practices/backend.html)
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Guia bem mastigado: VPS Hostinger, SSH, Codex e Terraform
|
|
2
|
+
|
|
3
|
+
Uma **VPS** é um computador Linux alugado; **CPU**, **RAM** e **disco** são sua velocidade, memória e espaço. **SSH** é a conexão segura do seu computador para esse Linux. **Terraform** descreve infraestrutura em arquivos; seu **state** é o registro privado do que ele já administra.
|
|
4
|
+
|
|
5
|
+
Este guia escolhe a próxima etapa pelo ponto em que a pessoa está. O Codex pode explicar, preparar arquivos locais e validar leitura autorizada, mas não compra, não cria token, não aplica Terraform e não faz deploy sem o escopo da Task. Quando plano, portas e alvos já forem autorizados, ele segue sem pedir a mesma autorização a cada etapa.
|
|
6
|
+
|
|
7
|
+
## Primeiro: onde você está agora?
|
|
8
|
+
|
|
9
|
+
1. **Sem VPS:** comece na etapa 1.
|
|
10
|
+
2. **VPS comprada, sem SSH:** comece na etapa 3.
|
|
11
|
+
3. **SSH funcionou duas vezes e a fingerprint foi conferida:** comece na etapa 5.
|
|
12
|
+
|
|
13
|
+
Se ainda faltar contexto, faça somente estas perguntas: qual aplicação e público? qual teto mensal e quanto pode pagar agora? é uma prova pequena ou a arquitetura aprovada de duas VPS? Reuse fatos já conhecidos e avance automaticamente quando a próxima ação for do Codex e já estiver autorizada.
|
|
14
|
+
|
|
15
|
+
## 1. Orçamento, tamanho e desenho
|
|
16
|
+
|
|
17
|
+
**Você faz:** defina um teto que inclua VPS, domínio, backup, serviços externos, impostos e renovação. No checkout, o preço “por mês” pode ser o total antecipado dividido pelos meses. Anote total debitado hoje, período contratado e renovação.
|
|
18
|
+
|
|
19
|
+
Exemplo fictício, apenas para aprender a comparar:
|
|
20
|
+
|
|
21
|
+
| Escolha | Mensal equivalente | Débito agora | Renovação mensal equivalente | Conferir |
|
|
22
|
+
| --- | ---: | ---: | ---: | --- |
|
|
23
|
+
| Teste, 12 meses | R$ 35 | R$ 420 | R$ 70 | imposto, domínio, backup |
|
|
24
|
+
| Serviço pequeno, 24 meses | R$ 60 | R$ 1.440 | R$ 145 | custo de 2 VPS, se aplicável |
|
|
25
|
+
|
|
26
|
+
Comece com 30–50% de folga de RAM e disco para picos, logs e atualizações. É estimativa, não promessa: meça por alguns dias antes de aumentar.
|
|
27
|
+
|
|
28
|
+
| Caso | Hipótese | Avaliar primeiro | Aumentar quando |
|
|
29
|
+
| --- | --- | --- | --- |
|
|
30
|
+
| Aplicação simples | site/API leve, sem worker contínuo ou banco pesado local | 1–2 vCPU, 4–8 GB RAM, 50–100 GB NVMe | uso sustentado, disco abaixo de 30% livre ou lentidão medida |
|
|
31
|
+
| App + workers + observabilidade | API, tarefas de fundo, métricas e logs | 2–4 vCPU, 8–16 GB RAM, 100–200 GB NVMe | fila cresce, RAM troca para disco ou volume enche |
|
|
32
|
+
| `autonomous-cloud` aprovado | VPS 1 pública + VPS 2 privada | dimensionar e orçar **cada** VPS | nunca reduzir a uma VPS sem novo contrato |
|
|
33
|
+
|
|
34
|
+
Uma prova pequena pode propor uma VPS em um contrato futuro próprio. O contrato `autonomous-cloud` deste projeto exige VPS 1 como entrada pública e VPS 2 como aplicação privada; Cloudflare controla DNS/edge e Hostinger apenas as VPS.
|
|
35
|
+
|
|
36
|
+
**Codex faz:** registra as premissas e compara opções, sem inventar preço/capacidade. **Sucesso:** objetivo, região, teto e desenho estão escritos. **Próxima ação:** abrir a página da VPS e anotar checkout, sem pagar. **Retomar:** “retomar orçamento” com plano, período, total e renovação.
|
|
37
|
+
|
|
38
|
+
## 2. Comprar no hPanel
|
|
39
|
+
|
|
40
|
+
**Você faz no navegador:**
|
|
41
|
+
|
|
42
|
+
1. Abra [VPS da Hostinger](https://www.hostinger.com/br/servidor-vps) e prefira a experiência divulgada como VPS gerenciada por IA: hPanel, Terminal Web e Kodee reduzem o atrito inicial.
|
|
43
|
+
2. Escolha plano e período. Veja o total antes de prosseguir; promoção não é previsão de renovação.
|
|
44
|
+
3. Escolha região próxima ao público e um Linux estável suportado pelo projeto. Sem exigência diferente, Ubuntu LTS é uma escolha comum para Docker.
|
|
45
|
+
4. Revise plano, período, região, SO, total, impostos e renovação. Só então faça o pagamento.
|
|
46
|
+
|
|
47
|
+
“Gerenciada por IA” não é administração terceirizada: continua uma VPS KVM com root SSH, API e responsabilidade sua por sistema, aplicação e dados. Trocar/reinstalar o SO apaga dados e snapshots; não é recuperação casual.
|
|
48
|
+
|
|
49
|
+
**Codex faz:** confere escolhas contra a Task; não usa cartão. API/MCP são opcionais e não servem para o primeiro SSH. **Sucesso:** hPanel mostra nome/ID, região, IP e SO. **Próxima ação:** em **VPS > Manage > Overview**, anote usuário, IP e porta SSH. **Retomar:** envie dados não secretos ou um screenshot recortado/sem pagamento e segredos.
|
|
50
|
+
|
|
51
|
+
## 3. Criar a chave SSH no Windows
|
|
52
|
+
|
|
53
|
+
**LOCAL** é PowerShell no seu Windows. **SERVIDOR** é Terminal Web confiável do hPanel ou SSH autenticado. Nunca rode comando LOCAL no servidor, nem copie chave privada para ele.
|
|
54
|
+
|
|
55
|
+
**Você faz no PowerShell normal (LOCAL):**
|
|
56
|
+
|
|
57
|
+
1. Confirme o cliente SSH:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
ssh -V
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
2. Veja se pasta/chave existem; não sobrescreva uma chave:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
Test-Path "$env:USERPROFILE\.ssh"
|
|
67
|
+
Test-Path "$env:USERPROFILE\.ssh\zaip_hostinger"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Se a pasta não existir:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
New-Item -ItemType Directory -Path "$env:USERPROFILE\.ssh"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
3. Somente se o segundo teste for `False`, crie a chave. Quando pedir frase secreta, guarde-a localmente:
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
ssh-keygen -t ed25519 -a 64 -f "$env:USERPROFILE\.ssh\zaip_hostinger" -C "zaip-hostinger"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
4. Exiba **somente** a chave pública; o arquivo sem `.pub` é privado:
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
Get-Content "$env:USERPROFILE\.ssh\zaip_hostinger.pub"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
5. No hPanel: **VPS > Manage > Settings > SSH keys > Add**. Cole a linha pública, dê nome e salve.
|
|
89
|
+
|
|
90
|
+
6. Só se necessário, em **PowerShell como Administrador**, ative o serviço:
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
Get-Service ssh-agent | Set-Service -StartupType Automatic
|
|
94
|
+
Start-Service ssh-agent
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Feche o administrador. No PowerShell normal do mesmo usuário que usará SSH/Codex:
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
ssh-add "$env:USERPROFILE\.ssh\zaip_hostinger"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Codex faz:** orienta comandos e guarda no máximo o caminho local, nunca chave privada, frase secreta ou token. O `ssh-agent` deve ser da mesma conta/ambiente: PowerShell não prova WSL, cloud ou outra conta. **Sucesso:** painel mostra a chave pública e a privada continua local. **Próxima ação:** conferir identidade do servidor. **Retomar:** envie status/erro sanitizado; chave pública e fingerprint podem ser compartilhadas, privada/frase/token não.
|
|
104
|
+
|
|
105
|
+
## 4. Conferir identidade e entrar duas vezes
|
|
106
|
+
|
|
107
|
+
**Você faz:**
|
|
108
|
+
|
|
109
|
+
1. Em **VPS > Manage > Overview**, copie usuário, IP e porta. Não adivinhe `root` ou porta 22.
|
|
110
|
+
2. Abra Terminal Web no hPanel. No **SERVIDOR**, rode:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Anote algoritmo e fingerprint.
|
|
117
|
+
3. No **LOCAL**, substitua os dados observados:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
ssh -p PORTA -i "$env:USERPROFILE\.ssh\zaip_hostinger" USUARIO@IP
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
4. Aceite com `yes` somente se algoritmo e fingerprint coincidirem com o Terminal Web. Se divergir, responda `no` e pare.
|
|
124
|
+
5. Rode `exit` e conecte uma segunda vez antes de alterar firewall, senha ou SSH.
|
|
125
|
+
|
|
126
|
+
**Codex faz:** só fixa a identidade após comparação por canal confiável; `ssh-keyscan` sozinho não autentica servidor. **Sucesso:** duas conexões com a mesma fingerprint. **Próxima ação:** se o Codex tiver permissão, peça a ele uma verificação de leitura; senão reporte o sucesso. **Retomar:** se a fingerprint mudou, não apague `known_hosts`; investigue primeiro no Terminal Web.
|
|
127
|
+
|
|
128
|
+
## 5. Preparar o Codex para leitura segura
|
|
129
|
+
|
|
130
|
+
**Você faz:** abra o projeto local correto no Codex e forneça apenas alvo não secreto: alias SSH ou usuário/IP/porta, caminho local da chave e fingerprint confirmada pelos campos previstos na Task. Peça: “Verifique o executor SSH disponível, a compatibilidade da minha chave e, se compatível e autorizado, faça o teste de leitura permitido sem alterar o servidor”. No popup, confira ferramenta e alvo exatos antes de aprovar. Se for útil, envie erro sanitizado ou screenshot recortado, nunca pagamento, token, chave privada ou frase secreta.
|
|
131
|
+
|
|
132
|
+
Uma aprovação `never` não libera rede. Permissões gerenciadas não podem ser burladas. Não combine `default_permissions` com `sandbox_mode` ou `sandbox_workspace_write`, não crie acesso global total e não presuma que local, WSL e cloud têm a mesma rede/chave.
|
|
133
|
+
|
|
134
|
+
**Antes do teste pelo runner:** o SSH humano padrão acima pode usar sua chave criptografada e `ssh-agent`. O runner autônomo é diferente: ele aceita somente caminho de chave dentro da raiz do projeto, desativa `IdentityAgent`, usa modo não interativo e não lê sua chave em `%USERPROFILE%\.ssh`; a operação `hostinger:ssh:read` executa somente `uname -s`. Portanto uma chave criptografada externa que funciona no PowerShell **não** deixa o runner pronto. Primeiro o Codex inspeciona essas capacidades e o contrato. Se não existir uma identidade não interativa, protegida e autorizada dentro da raiz, o pré-requisito do runner está pendente; não copie a chave, não remova a frase secreta e não contorne o contrato.
|
|
135
|
+
|
|
136
|
+
### Opção avançada: chave exclusiva para o runner
|
|
137
|
+
|
|
138
|
+
Use isto somente se você aceitar uma credencial sem frase secreta para execução não assistida. Nunca retire a frase da sua chave pessoal nem a copie.
|
|
139
|
+
|
|
140
|
+
1. O Codex confirma `git check-ignore` para `.local/ssh`, permissões/ACL do disco, o host, usuário de deploy e comandos de leitura permitidos.
|
|
141
|
+
2. Ele cria uma **nova** chave de automação em `.local/ssh`, com ACL limitada ao usuário local e disco local criptografado; ela nunca entra em Git ou chat.
|
|
142
|
+
3. Você adiciona somente a nova `.pub` no hPanel ou em `authorized_keys` do usuário de deploy restrito e mantém seu login humano como recuperação.
|
|
143
|
+
4. O Codex testa o runner em modo somente leitura; só então uma Task autorizada pode ampliar o uso.
|
|
144
|
+
|
|
145
|
+
Se política do host proibir essa chave ou você não aceitar o risco, registre essa escolha e pare: não há atalho. O bootstrap desse usuário/chave é separado do endurecimento de produção.
|
|
146
|
+
|
|
147
|
+
**Codex faz:** lê configuração efetiva e relata filesystem, rede e ferramentas disponíveis. Para Hostinger/Cloudflare autorizados, usa somente `node .agents/tools/cloud-runner.mjs`, que valida alvo, credencial de origem e fingerprint; hash de plano é exigido apenas para Terraform e hash de script apenas para configuração SSH. Se bloqueado, devolve a mensagem sanitizada exata e a rota suportada, sem atalho. **Sucesso:** o runner conclui `hostinger:ssh:read` no alvo/fingerprint aprovados; não expõe stdout de `uname` nem comprova hostname, `id` ou aplicação. Bloqueio é diagnóstico, não acesso bem-sucedido. **Próxima ação:** aprove apenas o popup previsto ou resolva o pré-requisito informado. **Retomar:** “verificar prontidão SSH” permanece somente leitura e não conecta sem contrato/autorização.
|
|
148
|
+
|
|
149
|
+
## 6. API/MCP, firewall e configuração
|
|
150
|
+
|
|
151
|
+
**Você faz:** token não é necessário para SSH. Apenas se houver Task de automação: **hPanel > API** ou **Dev tools > API > Generate API token**, escolha nome/expiração, gere e guarde localmente em `.env` ignorado. Confirme na interface atual o menor escopo; não suponha token limitado a uma VPS. Nunca cole token no chat, Git, Terraform ou state. Após duas conexões, aprove as portas: web costuma precisar 80/443 no ingress aprovado e SSH administrativo limitado; Redis, banco, filas, exporters e painéis ficam privados.
|
|
152
|
+
|
|
153
|
+
**Codex faz:** prepara Docker/Compose, volumes, usuários, atualização, firewall, logs, healthchecks, limites e rollback. O padrão é Terraform local/runner aprovado e VPS para aplicação; Terraform remoto é tecnicamente possível quando o contrato o declara, protege e justifica. Na arquitetura de duas VPS, prepara transporte privado autenticado VPS 1 → VPS 2. **Sucesso:** há plano de portas, backup e rollback. **Próxima ação:** aprove portas se ainda não estiverem no escopo. **Retomar:** após queda, reconcilie antes de repetir escrita.
|
|
154
|
+
|
|
155
|
+
## 7. Terraform sem VPS duplicada
|
|
156
|
+
|
|
157
|
+
**Você faz:** compra manualmente. Se VPS já existe, forneça ID aprovado para adoção/importação; não peça criação “só para testar”. Pare se plano mostrar VPS/DNS/custo inesperado.
|
|
158
|
+
|
|
159
|
+
**Codex faz:** bloqueia versões de provider, separa state do Git e usa ambiente local/HCP ou backend já aprovado. Não pede JSON de bucket ao leigo. Para S3, backend usa `bucket`, `key`, `region`, `encrypt = true` e `use_lockfile = true`; `terraform init` conecta ao backend existente, não cria bucket. R2 não tem versionamento nativo e exige snapshots/backup protegido e restauração testada. Antes de escrita: `fmt`, `validate`, `plan -out`, revisão do plano salvo e `apply` apenas do arquivo/hash aprovado. Nunca `-lock=false`. **Sucesso:** plano com hash sem segredo e importação ligada à VPS comprada. **Próxima ação:** aprove mudança no escopo quando necessário. **Retomar:** timeout pode criar recurso; consulte provider/state, reconcilie e só então replaineje.
|
|
160
|
+
|
|
161
|
+
## 8. Provar que está rodando
|
|
162
|
+
|
|
163
|
+
**Você faz:** defina domínio, manutenção e responsável por backup. Container iniciado não prova serviço pronto.
|
|
164
|
+
|
|
165
|
+
**Codex faz:** configura DNS Cloudflare, TLS, imagens/digests aprovados, segredos externos, healthchecks, logs e monitoramento. Na topologia aprovada, verifica VPS 1 → VPS 2, isolamento beta/produção e recusa pública de portas privadas. Faz reboot controlado e lê logs. Restaurar pelo painel sobrescreve servidor: teste em cópia/destino isolado; produção só com manutenção autorizada, backup atual e retorno. **Sucesso:** DNS/TLS, endpoint, reboot, logs, backup/restauração segura e portas privadas estão comprovados. **Próxima ação:** escolha frequência de custo, atualização e restore. **Retomar:** peça health, backup, portas e custo com evidência; sem execução observada, o resultado é local/estático.
|
|
166
|
+
|
|
167
|
+
## Problemas comuns
|
|
168
|
+
|
|
169
|
+
| Sintoma | Causa provável | Ação segura |
|
|
170
|
+
| --- | --- | --- |
|
|
171
|
+
| `Permission denied (publickey)` | usuário/chave errados ou agente de outra conta | confira Overview e SSH keys; rode `ssh-add` no PowerShell normal; não envie chave privada |
|
|
172
|
+
| Timeout | IP/porta errados, VPS desligada ou firewall | confira Overview/Terminal Web; não abra portas amplas por tentativa |
|
|
173
|
+
| `REMOTE HOST IDENTIFICATION HAS CHANGED` | host mudou ou há risco | pare e compare fingerprint no Terminal Web antes de remover entrada local |
|
|
174
|
+
| erro do agent | serviço não roda no mesmo usuário | configure serviço se preciso como administrador, depois `ssh-add` no usuário normal |
|
|
175
|
+
| Terraform cria VPS comprada | não está no state | pare, confira ID e importe/adote |
|
|
176
|
+
| lock Terraform | outra execução usa state ou falhou | espere/verifique dono e reconcilie; nunca use `-lock=false` |
|
|
177
|
+
|
|
178
|
+
## Fontes oficiais
|
|
179
|
+
|
|
180
|
+
- [VPS Hostinger](https://www.hostinger.com/br/servidor-vps), [dashboard hPanel](https://www.hostinger.com/support/5726606-how-to-use-the-vps-dashboard-in-hostinger/) e [chaves SSH](https://www.hostinger.com/support/4792364-how-to-use-ssh-keys-at-hostinger-vps/)
|
|
181
|
+
- [Conexão SSH](https://support.hostinger.com/en/articles/5723772-how-to-connect-to-your-vps-via-ssh), [troca de SO](https://www.hostinger.com/support/4965922-how-to-change-the-operating-system-of-your-vps-at-hostinger/) e [backup/restauração](https://support.hostinger.com/en/articles/1583232-how-to-back-up-or-restore-a-vps)
|
|
182
|
+
- [Provider Terraform Hostinger](https://raw.githubusercontent.com/hostinger/terraform-provider-hostinger/master/docs/resources/vps.md), [OpenSSH no Windows](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement)
|
|
183
|
+
- [Configuração](https://learn.chatgpt.com/docs/config-file/config-reference), [segurança](https://learn.chatgpt.com/docs/agent-approvals-security), [permissões do Codex](https://learn.chatgpt.com/docs/permissions), [backend](https://developer.hashicorp.com/terraform/language/backend) e [locking Terraform](https://developer.hashicorp.com/terraform/language/state/locking)
|
|
@@ -12,3 +12,5 @@ description: Plan evidence-grounded marketing strategy, copy, campaigns, assets,
|
|
|
12
12
|
- Para estratégia, planejamento de campanha ou entrega persistente, carregue [o fluxo progressivo](references/extended-workflow.md). Artefatos aprovados vivem em `.agents/marketing/`; `strategy.md` centraliza decisões estratégicas sem duplicação.
|
|
13
13
|
|
|
14
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.
|
|
15
|
+
|
|
16
|
+
Para copy pontual, resumo salvo ou organização simples de contexto com fontes fornecidas, use o [perfil editorial `lite`](../zaip-skill-task/SKILL.md#assurance-proporcional): selecione `--risk lite` somente quando o impacto for baixo e não houver código, configuração, ação externa, informação sensível, estratégia crítica ou decisão de marca nova.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zaip-skill-module-scaffold
|
|
3
|
+
description: Scaffold a safe minimal application module from the declared ZAIP profile and preserve existing work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Scaffold a module
|
|
7
|
+
|
|
8
|
+
Use when a capability needs a new module shell, not to overwrite an existing implementation.
|
|
9
|
+
|
|
10
|
+
1. Read `.agents/config/project.yaml` and verify that the profile declares a supported relative modules path.
|
|
11
|
+
2. Run `node .agents/skills/zaip-skill-module-scaffold/scripts/scaffold.mjs <name> [--root <root>] [--dry-run]`; read its grammar before automation.
|
|
12
|
+
3. The scaffold rejects traversal, absolute paths, Windows reserved names, case collisions, and paths that resolve through a junction outside the root.
|
|
13
|
+
4. It is idempotent for identical generated files and refuses partial or divergent files; resolve those edits manually with their owner.
|
|
14
|
+
5. Keep the generated domain/application shell free of database and framework imports. Add adapters only after a bounded contract exists and validate the module with its declared test command.
|