@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,134 @@
|
|
|
1
|
+
# Release notes contract
|
|
2
|
+
|
|
3
|
+
Every GitHub Release needs an agent-reviewed UTF-8 Markdown body that explains the delivered product
|
|
4
|
+
changes. GitHub's generated notes and a `Full Changelog` comparison are useful navigation aids only;
|
|
5
|
+
neither is an acceptable body on its own. The body opens with a Resumo section containing a short
|
|
6
|
+
plain-language paragraph or bullets before the categorized sections. Write in the project's language;
|
|
7
|
+
the validator's headings below use Brazilian Portuguese. A configured human-only review policy remains
|
|
8
|
+
mandatory where it applies.
|
|
9
|
+
|
|
10
|
+
## Build the reviewed source
|
|
11
|
+
|
|
12
|
+
1. Resolve the exact previous Release tag for the same product and channel, then resolve the exact
|
|
13
|
+
candidate commit SHA. Prove the tag is an ancestor of that candidate with git merge-base
|
|
14
|
+
--is-ancestor. Do not substitute the previous Git commit, a moving branch head, or a guessed
|
|
15
|
+
version. For a first release, record that there is no previous tag and inventory the initial
|
|
16
|
+
candidate explicitly with the initial mode.
|
|
17
|
+
2. Inventory the exact range before writing prose: `git diff --name-status <previous-tag>..<candidate-sha>`
|
|
18
|
+
and the corresponding commit messages. Read the meaningful diffs. This covers direct commits,
|
|
19
|
+
merge commits, and squashed pull requests without relying on PR titles. The file inventory is an
|
|
20
|
+
internal coverage aid, not a release-note dump.
|
|
21
|
+
3. Group files that implement one outcome into one topic. Deduplicate generated, template, lock, and
|
|
22
|
+
projection files behind their canonical user-facing improvement, but retain every changed file in
|
|
23
|
+
that topic's internal mapping. Do not omit a meaningful change because it is spread across files.
|
|
24
|
+
4. Write the body in UTF-8 Markdown. After Resumo, use only sections with content: Novidades (feat),
|
|
25
|
+
Correções (fix), Desempenho (perf), Alterações internas (refactor, build, ci, test, chore),
|
|
26
|
+
Segurança, Alterações incompatíveis e migrações, and Documentação. Each topic gets one concrete
|
|
27
|
+
bullet that states the outcome and affected capability, rather than a commit subject or a list of
|
|
28
|
+
paths. Conventional commits are useful input, never a substitute for reviewing the diff.
|
|
29
|
+
5. Keep an adjacent uncommitted-or-local release inventory JSON while publishing. It must state the
|
|
30
|
+
exact `from` tag, `to` SHA, every changed file, and one or more topics. Each topic has a category,
|
|
31
|
+
a unique bullet copied verbatim into the Markdown body, and the source files it covers. This makes
|
|
32
|
+
coverage mechanically checkable while keeping the published body readable.
|
|
33
|
+
|
|
34
|
+
Illustrative body (replace every example with observed facts):
|
|
35
|
+
|
|
36
|
+
```md
|
|
37
|
+
## Resumo
|
|
38
|
+
|
|
39
|
+
- A publicação agora entrega uma descrição revisada e verificável das melhorias.
|
|
40
|
+
|
|
41
|
+
## Novidades
|
|
42
|
+
|
|
43
|
+
- **Feature:** Releases now include grouped, reviewed summaries of every delivered capability.
|
|
44
|
+
|
|
45
|
+
## Documentação
|
|
46
|
+
|
|
47
|
+
- **Documentation:** The deploy guide now records the prior release range and validates the published body.
|
|
48
|
+
|
|
49
|
+
Full Changelog: [v2.4...v2.5](https://github.com/owner/repository/compare/v2.4...v2.5)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The optional comparison link belongs after the explanatory bullets. Do not use empty category headings,
|
|
53
|
+
placeholders, `TBD`, `N/A`, a single generic bullet, or a raw file/commit list as a substitute for the
|
|
54
|
+
summary.
|
|
55
|
+
|
|
56
|
+
Example inventory shape:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"from": "v2.4",
|
|
61
|
+
"to": "0123456789abcdef0123456789abcdef01234567",
|
|
62
|
+
"files": ["src/release-notes.ts", "docs/releases.md"],
|
|
63
|
+
"topics": [
|
|
64
|
+
{
|
|
65
|
+
"category": "feat",
|
|
66
|
+
"bullet": "- **Feature:** Releases now include grouped, reviewed summaries of every delivered capability.",
|
|
67
|
+
"files": ["src/release-notes.ts"]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"category": "docs",
|
|
71
|
+
"bullet": "- **Documentation:** The deploy guide now records the prior release range and validates the published body.",
|
|
72
|
+
"files": ["docs/releases.md"]
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Validate, publish, and read back
|
|
79
|
+
|
|
80
|
+
Use a local working path such as `.local/release-notes-<tag>.md` and
|
|
81
|
+
`.local/release-notes-<tag>.inventory.json`; never commit temporary release-note working files unless the
|
|
82
|
+
repository explicitly owns them. Before creating the Release, validate the actual Git range, inventory,
|
|
83
|
+
and reviewed body:
|
|
84
|
+
|
|
85
|
+
```powershell
|
|
86
|
+
node .agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.mjs --repository . --from <previous-tag> --to <candidate-sha> --notes-file .local/release-notes-<tag>.md --inventory-file .local/release-notes-<tag>.inventory.json
|
|
87
|
+
gh release create <tag> --repo <owner/repo> --target <candidate-sha> --title <title> --notes-file .local/release-notes-<tag>.md --prerelease --latest=false
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Read the release back after creation. Save the returned `body` as UTF-8 and run the same validator with
|
|
91
|
+
the same range and inventory. Also inspect the returned title, tag, target commit, prerelease state, and
|
|
92
|
+
URL. A mismatch, missing bullet, compare-only body, or incomplete inventory is a release failure that
|
|
93
|
+
must be corrected by editing the authorized Release body and reading it back again.
|
|
94
|
+
|
|
95
|
+
```powershell
|
|
96
|
+
gh release view <tag> --repo <owner/repo> --json body,name,tagName,targetCommitish,isPrerelease,url
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
For an initial release, invoke the validator with `--initial` instead of `--from`, and use null as
|
|
100
|
+
the inventory from value.
|
|
101
|
+
|
|
102
|
+
The validator proves UTF-8, a non-empty categorized structure, the exact immutable candidate range, and
|
|
103
|
+
one visible bullet plus an internal file mapping for every topic. It cannot prove that a bullet explains
|
|
104
|
+
a change well, that the grouping is useful, or that a sensitive detail is appropriate to disclose; the
|
|
105
|
+
agent must review those semantic judgments, with human review where a configured policy requires it.
|
|
106
|
+
Never include credentials, personal data, exploit instructions, or unapproved vulnerability details in a
|
|
107
|
+
public release body. Use the approved private security process when disclosure must be delayed or limited.
|
|
108
|
+
|
|
109
|
+
Record the prior tag, candidate SHA, reviewed notes path, inventory result, and published-body readback
|
|
110
|
+
in the delivery evidence. This contract changes the release description only; it does not authorize a
|
|
111
|
+
GitHub Release, a push, or npm publication.
|
|
112
|
+
|
|
113
|
+
## Completeness and reader impact
|
|
114
|
+
|
|
115
|
+
- Explain every meaningful created, edited, removed or deprecated topic, including documentation,
|
|
116
|
+
dependencies, CI and maintenance. Map `added` to Novidades, `changed` to Alterações internas,
|
|
117
|
+
and `removed` or `deprecated` to Alterações incompatíveis e migrações in the inventory. Put
|
|
118
|
+
incompatibilities first after Resumo when present. Distinguish observable behavior changes from
|
|
119
|
+
internal refactors in the bullet text.
|
|
120
|
+
- For each breaking change, removal or deprecation, describe who is affected, the migration or
|
|
121
|
+
replacement, and any confirmed deadline. Add Atualização and Limitações sections only when useful.
|
|
122
|
+
Do not invent compatibility, performance gains or successful tests.
|
|
123
|
+
- Reconcile reverted changes and intermediate fixes against the final diff; do not claim work that
|
|
124
|
+
was undone. Rebuild the inventory and notes if the candidate changes. Generated copies belong to
|
|
125
|
+
their canonical topic; mechanical noise may be grouped, without hiding a distinct improvement.
|
|
126
|
+
- Review the wording for both open-source users and private company audiences. Keep private links
|
|
127
|
+
accessible to their intended audience and remove sensitive internal details from public notes.
|
|
128
|
+
- Read back the published `body` and compare it with the reviewed UTF-8 file, in addition to running
|
|
129
|
+
the validator. The transport must preserve the prose, not just its structural validity. Verify the
|
|
130
|
+
tag's resolved SHA separately; `targetCommitish` may be a branch name.
|
|
131
|
+
|
|
132
|
+
Sources: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
133
|
+
[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), and
|
|
134
|
+
[GitHub release notes](https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes).
|
package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
2
|
+
import {
|
|
3
|
+
createHash,
|
|
4
|
+
createPrivateKey,
|
|
5
|
+
createPublicKey,
|
|
6
|
+
generateKeyPairSync,
|
|
7
|
+
sign,
|
|
8
|
+
verify,
|
|
9
|
+
} from "node:crypto";
|
|
10
|
+
import { existsSync } from "node:fs";
|
|
11
|
+
import { cp, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
12
|
+
import { dirname, join, resolve } from "node:path";
|
|
13
|
+
import { fileURLToPath } from "node:url";
|
|
14
|
+
import { parseArgs } from "node:util";
|
|
15
|
+
import { parseDocument } from "./yaml-parser.mjs";
|
|
16
|
+
|
|
17
|
+
const fail = (m) => {
|
|
18
|
+
throw new Error(m);
|
|
19
|
+
},
|
|
20
|
+
sha40 = /^[a-f0-9]{40}$/i,
|
|
21
|
+
tag = /^v\d+\.\d+$/;
|
|
22
|
+
const hash = async (p) =>
|
|
23
|
+
createHash("sha256")
|
|
24
|
+
.update(await readFile(p))
|
|
25
|
+
.digest("hex"),
|
|
26
|
+
json = async (p) => JSON.parse(await readFile(p, "utf8"));
|
|
27
|
+
const git = (cwd, args) =>
|
|
28
|
+
execFileSync("git", args, { cwd, encoding: "utf8", windowsHide: true }).trim();
|
|
29
|
+
const unsigned = (r) => {
|
|
30
|
+
const { signature, ...body } = r;
|
|
31
|
+
return Buffer.from(JSON.stringify(body));
|
|
32
|
+
};
|
|
33
|
+
const key = (x, label) => {
|
|
34
|
+
if (x.asymmetricKeyType !== "ed25519") fail(`${label} must be Ed25519`);
|
|
35
|
+
};
|
|
36
|
+
export function identity(repository, expected) {
|
|
37
|
+
const sha = git(repository, ["rev-parse", "HEAD"]).toLowerCase();
|
|
38
|
+
if (!sha40.test(sha) || sha !== expected.toLowerCase())
|
|
39
|
+
fail("repository SHA does not match requested SHA");
|
|
40
|
+
if (git(repository, ["status", "--porcelain"]) !== "") fail("repository must be clean");
|
|
41
|
+
return {
|
|
42
|
+
sha,
|
|
43
|
+
tree: git(repository, ["rev-parse", "HEAD^{tree}"]).toLowerCase(),
|
|
44
|
+
tree_sha256: createHash("sha256")
|
|
45
|
+
.update(execFileSync("git", ["ls-tree", "-r", "-z", sha], { cwd: repository }))
|
|
46
|
+
.digest("hex"),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export async function configuredBranch(repository, scope = "frontend") {
|
|
50
|
+
if (!["frontend", "backend"].includes(scope))
|
|
51
|
+
fail("consumer release scope must be frontend or backend");
|
|
52
|
+
const configPath = join(repository, ".agents", "config", "project.yaml");
|
|
53
|
+
if (!existsSync(configPath)) return "beta";
|
|
54
|
+
let document;
|
|
55
|
+
try {
|
|
56
|
+
document = parseDocument(await readFile(configPath, "utf8"), {
|
|
57
|
+
strict: true,
|
|
58
|
+
uniqueKeys: true,
|
|
59
|
+
});
|
|
60
|
+
} catch {
|
|
61
|
+
fail("project.yaml must contain a mapping");
|
|
62
|
+
}
|
|
63
|
+
if (document.errors.length) fail("project.yaml is invalid");
|
|
64
|
+
const config = document.toJS();
|
|
65
|
+
if (config === null || typeof config !== "object" || Array.isArray(config))
|
|
66
|
+
fail("project.yaml must contain a mapping");
|
|
67
|
+
const deploy = config.deploy;
|
|
68
|
+
if (deploy === undefined) return "beta";
|
|
69
|
+
if (deploy === null || typeof deploy !== "object" || Array.isArray(deploy))
|
|
70
|
+
fail("project.yaml deploy must be a mapping");
|
|
71
|
+
if (
|
|
72
|
+
!Object.keys(deploy).every((key) =>
|
|
73
|
+
[
|
|
74
|
+
"branch",
|
|
75
|
+
"production_branch",
|
|
76
|
+
"allow_production",
|
|
77
|
+
"frontend",
|
|
78
|
+
"backend",
|
|
79
|
+
"database",
|
|
80
|
+
].includes(key),
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
fail("project.yaml deploy has unsupported keys");
|
|
84
|
+
for (const key of ["frontend", "backend", "database"])
|
|
85
|
+
if (
|
|
86
|
+
deploy[key] !== undefined &&
|
|
87
|
+
(deploy[key] === null ||
|
|
88
|
+
typeof deploy[key] !== "object" ||
|
|
89
|
+
Array.isArray(deploy[key]) ||
|
|
90
|
+
!Object.keys(deploy[key]).every((nested) => nested === "branch"))
|
|
91
|
+
)
|
|
92
|
+
fail(`project.yaml deploy.${key} must be a branch mapping`);
|
|
93
|
+
const branch = deploy[scope]?.branch ?? deploy.branch ?? "beta";
|
|
94
|
+
if (typeof branch !== "string" || branch.trim() === "" || branch.trim() !== branch)
|
|
95
|
+
fail("project.yaml deploy branch must be a non-empty Git branch name");
|
|
96
|
+
if (branch.length > 255 || !/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(branch))
|
|
97
|
+
fail(`project.yaml deploy branch is invalid: ${branch}`);
|
|
98
|
+
return branch;
|
|
99
|
+
}
|
|
100
|
+
export function commands(value) {
|
|
101
|
+
if (
|
|
102
|
+
!Array.isArray(value) ||
|
|
103
|
+
!value.length ||
|
|
104
|
+
!value.every(
|
|
105
|
+
(x) =>
|
|
106
|
+
x &&
|
|
107
|
+
["node", "corepack", "npm", "pnpm"].includes(x.command) &&
|
|
108
|
+
Array.isArray(x.args) &&
|
|
109
|
+
x.args.every((a) => typeof a === "string") &&
|
|
110
|
+
(x.command === "node" || x.args.every((a) => /^[-A-Za-z0-9_./:@=*]+$/.test(a))),
|
|
111
|
+
)
|
|
112
|
+
)
|
|
113
|
+
fail("required_commands must use node or a supported package manager with safe string args");
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
116
|
+
export function commandInvocation(item, platform = process.platform) {
|
|
117
|
+
if (item.command === "node") return { command: process.execPath, args: item.args };
|
|
118
|
+
if (platform === "win32")
|
|
119
|
+
return {
|
|
120
|
+
command: process.env.ComSpec ?? "cmd.exe",
|
|
121
|
+
args: ["/d", "/s", "/c", `${item.command}.cmd`, ...item.args],
|
|
122
|
+
};
|
|
123
|
+
return { command: item.command, args: item.args };
|
|
124
|
+
}
|
|
125
|
+
export function run(list, cwd, label = "preparation") {
|
|
126
|
+
for (const item of commands(list)) {
|
|
127
|
+
const invocation = commandInvocation(item);
|
|
128
|
+
const result = spawnSync(invocation.command, invocation.args, {
|
|
129
|
+
cwd,
|
|
130
|
+
encoding: "utf8",
|
|
131
|
+
windowsHide: true,
|
|
132
|
+
shell: false,
|
|
133
|
+
});
|
|
134
|
+
if (result.error || result.status !== 0) fail(`${label} command failed: ${item.command}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export function policyFor(policy, caller) {
|
|
138
|
+
if (
|
|
139
|
+
policy?.schema_version !== 1 ||
|
|
140
|
+
policy.repository !== caller.repository ||
|
|
141
|
+
policy.configured_branch !== caller.branch ||
|
|
142
|
+
!tag.test(policy.github_version ?? "") ||
|
|
143
|
+
policy.github_version !== caller.githubVersion
|
|
144
|
+
)
|
|
145
|
+
fail("policy is not authorized for this GitHub caller");
|
|
146
|
+
const required = commands(policy.required_commands);
|
|
147
|
+
if (JSON.stringify(required) !== JSON.stringify(caller.commands))
|
|
148
|
+
fail("caller commands differ from policy required_commands");
|
|
149
|
+
return required;
|
|
150
|
+
}
|
|
151
|
+
export async function bootstrap({ trustStore, publicKey, keyId }) {
|
|
152
|
+
const parsedKey = createPublicKey(await readFile(publicKey));
|
|
153
|
+
key(parsedKey, "public key");
|
|
154
|
+
if (!/^[A-Za-z0-9._-]{1,64}$/.test(keyId)) fail("invalid key id");
|
|
155
|
+
const store = resolve(trustStore),
|
|
156
|
+
file = `${keyId}.pub.pem`;
|
|
157
|
+
await mkdir(store, { recursive: true });
|
|
158
|
+
await cp(resolve(publicKey), join(store, file));
|
|
159
|
+
await writeFile(
|
|
160
|
+
join(store, "trusted-github-release-keys.json"),
|
|
161
|
+
`${JSON.stringify({ schema_version: 1, keys: [{ key_id: keyId, file, sha256: await hash(join(store, file)) }] }, null, 2)}\n`,
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
export async function keygen({ privateKey, publicKey }) {
|
|
165
|
+
const privatePath = resolve(privateKey);
|
|
166
|
+
const publicPath = resolve(publicKey);
|
|
167
|
+
if (privatePath === publicPath) fail("private and public key paths must differ");
|
|
168
|
+
const pair = generateKeyPairSync("ed25519");
|
|
169
|
+
await mkdir(dirname(privatePath), { recursive: true });
|
|
170
|
+
await mkdir(dirname(publicPath), { recursive: true });
|
|
171
|
+
await writeFile(privatePath, pair.privateKey.export({ type: "pkcs8", format: "pem" }), {
|
|
172
|
+
encoding: "utf8",
|
|
173
|
+
flag: "wx",
|
|
174
|
+
mode: 0o600,
|
|
175
|
+
});
|
|
176
|
+
await writeFile(publicPath, pair.publicKey.export({ type: "spki", format: "pem" }), {
|
|
177
|
+
encoding: "utf8",
|
|
178
|
+
flag: "wx",
|
|
179
|
+
mode: 0o644,
|
|
180
|
+
});
|
|
181
|
+
return { privateKey: privatePath, publicKey: publicPath };
|
|
182
|
+
}
|
|
183
|
+
export async function prepare(input) {
|
|
184
|
+
if (!sha40.test(input.sha) || !tag.test(input.githubVersion))
|
|
185
|
+
fail("SHA and GitHub version vN.N are required");
|
|
186
|
+
const repository = resolve(input.repository),
|
|
187
|
+
branch = await configuredBranch(repository, input.scope ?? "frontend");
|
|
188
|
+
if (branch !== input.branch || git(repository, ["branch", "--show-current"]) !== branch)
|
|
189
|
+
fail("checked out branch does not match configured branch");
|
|
190
|
+
const policyDigest = await hash(input.policy),
|
|
191
|
+
before = identity(repository, input.sha),
|
|
192
|
+
required = policyFor(await json(input.policy), input);
|
|
193
|
+
run(required, repository);
|
|
194
|
+
const after = identity(repository, input.sha);
|
|
195
|
+
if (policyDigest !== (await hash(input.policy))) fail("policy changed during preparation");
|
|
196
|
+
if (JSON.stringify(before) !== JSON.stringify(after))
|
|
197
|
+
fail("repository identity changed during preparation");
|
|
198
|
+
const privateKey = createPrivateKey(await readFile(input.privateKey));
|
|
199
|
+
key(privateKey, "private key");
|
|
200
|
+
const clock = Date.now(),
|
|
201
|
+
issued_at = new Date(clock).toISOString(),
|
|
202
|
+
expires_at = new Date(clock + 7 * 86400000).toISOString(),
|
|
203
|
+
receipt = {
|
|
204
|
+
schema_version: 1,
|
|
205
|
+
algorithm: "ed25519",
|
|
206
|
+
key_id: input.keyId,
|
|
207
|
+
issued_at,
|
|
208
|
+
expires_at,
|
|
209
|
+
repository: input.repository,
|
|
210
|
+
configured_branch: branch,
|
|
211
|
+
github_version: input.githubVersion,
|
|
212
|
+
candidate: after,
|
|
213
|
+
policy_sha256: policyDigest,
|
|
214
|
+
required_commands: required,
|
|
215
|
+
};
|
|
216
|
+
const signed = {
|
|
217
|
+
...receipt,
|
|
218
|
+
signature: sign(null, unsigned(receipt), privateKey).toString("base64"),
|
|
219
|
+
};
|
|
220
|
+
await mkdir(resolve(input.outputDir), { recursive: true });
|
|
221
|
+
const receiptPath = join(resolve(input.outputDir), "consumer-github-release-receipt.json");
|
|
222
|
+
await writeFile(receiptPath, `${JSON.stringify(signed, null, 2)}\n`);
|
|
223
|
+
return { receiptPath, receipt: signed };
|
|
224
|
+
}
|
|
225
|
+
export async function verifyPreparation(input) {
|
|
226
|
+
const receipt = await json(input.receipt),
|
|
227
|
+
repository = resolve(input.repository),
|
|
228
|
+
branch = await configuredBranch(repository, input.scope ?? "frontend"),
|
|
229
|
+
current = identity(repository, input.sha),
|
|
230
|
+
required = policyFor(await json(input.policy), input),
|
|
231
|
+
now = Date.now(),
|
|
232
|
+
issued = Date.parse(receipt.issued_at),
|
|
233
|
+
expires = Date.parse(receipt.expires_at);
|
|
234
|
+
if (
|
|
235
|
+
!Number.isFinite(issued) ||
|
|
236
|
+
!Number.isFinite(expires) ||
|
|
237
|
+
issued > now + 300000 ||
|
|
238
|
+
now - issued > 7 * 86400000 ||
|
|
239
|
+
expires <= now ||
|
|
240
|
+
expires > issued + 7 * 86400000 ||
|
|
241
|
+
!tag.test(input.githubVersion) ||
|
|
242
|
+
branch !== input.branch ||
|
|
243
|
+
receipt.schema_version !== 1 ||
|
|
244
|
+
receipt.algorithm !== "ed25519" ||
|
|
245
|
+
receipt.repository !== input.repository ||
|
|
246
|
+
receipt.configured_branch !== branch ||
|
|
247
|
+
receipt.github_version !== input.githubVersion ||
|
|
248
|
+
JSON.stringify(receipt.candidate) !== JSON.stringify(current) ||
|
|
249
|
+
JSON.stringify(receipt.required_commands) !== JSON.stringify(required) ||
|
|
250
|
+
receipt.policy_sha256 !== (await hash(input.policy))
|
|
251
|
+
)
|
|
252
|
+
fail("receipt GitHub identity, expiry or policy mismatch");
|
|
253
|
+
const trust = await json(join(resolve(input.trustStore), "trusted-github-release-keys.json")),
|
|
254
|
+
entry = trust.keys?.find((x) => x.key_id === receipt.key_id);
|
|
255
|
+
if (!entry) fail("receipt key is not trusted");
|
|
256
|
+
const keyPath = join(resolve(input.trustStore), entry.file);
|
|
257
|
+
if (entry.sha256 !== (await hash(keyPath))) fail("trusted key digest mismatch");
|
|
258
|
+
const publicKey = createPublicKey(await readFile(keyPath));
|
|
259
|
+
key(publicKey, "trusted public key");
|
|
260
|
+
if (!verify(null, unsigned(receipt), publicKey, Buffer.from(receipt.signature, "base64")))
|
|
261
|
+
fail("receipt signature is invalid");
|
|
262
|
+
return receipt;
|
|
263
|
+
}
|
|
264
|
+
export async function guardedPush(input, runner = null) {
|
|
265
|
+
const prepared = await prepare(input);
|
|
266
|
+
await verifyPreparation({ ...input, receipt: prepared.receiptPath });
|
|
267
|
+
const remote = input.remote ?? "origin";
|
|
268
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(remote)) fail("invalid Git remote name");
|
|
269
|
+
const repository = resolve(input.repository),
|
|
270
|
+
source = git(repository, ["remote", "get-url", "--push", remote]),
|
|
271
|
+
refspec = `${input.sha}:refs/heads/${input.branch}`;
|
|
272
|
+
if (
|
|
273
|
+
source !== input.remoteUrl ||
|
|
274
|
+
git(repository, ["rev-parse", "HEAD"]).toLowerCase() !== input.sha.toLowerCase()
|
|
275
|
+
)
|
|
276
|
+
fail("push remote or HEAD changed after verification");
|
|
277
|
+
const preflight = {
|
|
278
|
+
phase: "preflight",
|
|
279
|
+
repository,
|
|
280
|
+
remote,
|
|
281
|
+
branch: input.branch,
|
|
282
|
+
scope: input.scope ?? "frontend",
|
|
283
|
+
};
|
|
284
|
+
if (runner) runner(preflight);
|
|
285
|
+
else
|
|
286
|
+
execFileSync(
|
|
287
|
+
process.execPath,
|
|
288
|
+
[
|
|
289
|
+
join(dirname(fileURLToPath(import.meta.url)), "preflight.mjs"),
|
|
290
|
+
"--repository",
|
|
291
|
+
repository,
|
|
292
|
+
"--remote",
|
|
293
|
+
remote,
|
|
294
|
+
"--branch",
|
|
295
|
+
input.branch,
|
|
296
|
+
"--scope",
|
|
297
|
+
preflight.scope,
|
|
298
|
+
],
|
|
299
|
+
{ cwd: repository, stdio: "inherit", windowsHide: true },
|
|
300
|
+
);
|
|
301
|
+
if (git(repository, ["rev-parse", "HEAD"]).toLowerCase() !== input.sha.toLowerCase())
|
|
302
|
+
fail("HEAD changed after preflight");
|
|
303
|
+
if (runner) runner({ phase: "push", repository, remote, refspec });
|
|
304
|
+
else
|
|
305
|
+
execFileSync("git", ["push", remote, refspec], {
|
|
306
|
+
cwd: repository,
|
|
307
|
+
stdio: "inherit",
|
|
308
|
+
windowsHide: true,
|
|
309
|
+
});
|
|
310
|
+
return { ...prepared, refspec };
|
|
311
|
+
}
|
|
312
|
+
const opts = {
|
|
313
|
+
repository: { type: "string" },
|
|
314
|
+
sha: { type: "string" },
|
|
315
|
+
branch: { type: "string" },
|
|
316
|
+
scope: { type: "string", default: "frontend" },
|
|
317
|
+
remote: { type: "string", default: "origin" },
|
|
318
|
+
"remote-url": { type: "string" },
|
|
319
|
+
"github-version": { type: "string" },
|
|
320
|
+
policy: { type: "string" },
|
|
321
|
+
"trust-store": { type: "string" },
|
|
322
|
+
"private-key": { type: "string" },
|
|
323
|
+
"public-key": { type: "string" },
|
|
324
|
+
"key-id": { type: "string" },
|
|
325
|
+
"output-dir": { type: "string" },
|
|
326
|
+
receipt: { type: "string" },
|
|
327
|
+
"commands-json": { type: "string" },
|
|
328
|
+
};
|
|
329
|
+
async function main() {
|
|
330
|
+
const [action] = process.argv.slice(2),
|
|
331
|
+
{ values } = parseArgs({ options: opts, strict: true, allowPositionals: true }),
|
|
332
|
+
need = (n) => values[n] ?? fail(`--${n} is required`);
|
|
333
|
+
if (action === "bootstrap")
|
|
334
|
+
return bootstrap({
|
|
335
|
+
trustStore: need("trust-store"),
|
|
336
|
+
publicKey: need("public-key"),
|
|
337
|
+
keyId: need("key-id"),
|
|
338
|
+
});
|
|
339
|
+
if (action === "keygen")
|
|
340
|
+
return keygen({
|
|
341
|
+
privateKey: need("private-key"),
|
|
342
|
+
publicKey: need("public-key"),
|
|
343
|
+
});
|
|
344
|
+
const common = {
|
|
345
|
+
repository: need("repository"),
|
|
346
|
+
sha: need("sha"),
|
|
347
|
+
branch: need("branch"),
|
|
348
|
+
scope: values.scope,
|
|
349
|
+
githubVersion: need("github-version"),
|
|
350
|
+
policy: need("policy"),
|
|
351
|
+
trustStore: values["trust-store"],
|
|
352
|
+
commands: JSON.parse(need("commands-json")),
|
|
353
|
+
};
|
|
354
|
+
if (action === "prepare") {
|
|
355
|
+
const r = await prepare({
|
|
356
|
+
...common,
|
|
357
|
+
outputDir: need("output-dir"),
|
|
358
|
+
privateKey: need("private-key"),
|
|
359
|
+
keyId: need("key-id"),
|
|
360
|
+
});
|
|
361
|
+
process.stdout.write(`${JSON.stringify({ valid: true, receipt: r.receiptPath })}\n`);
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
if (action === "verify") {
|
|
365
|
+
await verifyPreparation({ ...common, receipt: need("receipt") });
|
|
366
|
+
process.stdout.write('{"valid":true}\n');
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
if (action === "guarded-push") {
|
|
370
|
+
const r = await guardedPush({
|
|
371
|
+
...common,
|
|
372
|
+
outputDir: need("output-dir"),
|
|
373
|
+
privateKey: need("private-key"),
|
|
374
|
+
keyId: need("key-id"),
|
|
375
|
+
remote: values.remote,
|
|
376
|
+
remoteUrl: need("remote-url"),
|
|
377
|
+
});
|
|
378
|
+
process.stdout.write(
|
|
379
|
+
`${JSON.stringify({ valid: true, pushed: true, receipt: r.receiptPath, refspec: r.refspec })}\n`,
|
|
380
|
+
);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
fail("Usage: consumer-release-preparation.mjs bootstrap|keygen|prepare|verify|guarded-push");
|
|
384
|
+
}
|
|
385
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url))
|
|
386
|
+
main().catch((error) => {
|
|
387
|
+
process.stderr.write(`${error.message}\n`);
|
|
388
|
+
process.exitCode = 1;
|
|
389
|
+
});
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
import {
|
|
8
|
+
bootstrap,
|
|
9
|
+
commandInvocation,
|
|
10
|
+
configuredBranch,
|
|
11
|
+
guardedPush,
|
|
12
|
+
keygen,
|
|
13
|
+
prepare,
|
|
14
|
+
run,
|
|
15
|
+
verifyPreparation,
|
|
16
|
+
} from "./consumer-release-preparation.mjs";
|
|
17
|
+
|
|
18
|
+
const git = (cwd, ...args) => execFileSync("git", args, { cwd, encoding: "utf8" }).trim();
|
|
19
|
+
|
|
20
|
+
test("resolves only the selected application scope from nested deploy configuration", async () => {
|
|
21
|
+
const root = await mkdtemp(join(tmpdir(), "zaip-consumer-config-"));
|
|
22
|
+
try {
|
|
23
|
+
const repo = join(root, "repo");
|
|
24
|
+
await mkdir(join(repo, ".agents", "config"), { recursive: true });
|
|
25
|
+
await writeFile(
|
|
26
|
+
join(repo, ".agents", "config", "project.yaml"),
|
|
27
|
+
[
|
|
28
|
+
"deploy:",
|
|
29
|
+
" branch: beta",
|
|
30
|
+
" frontend:",
|
|
31
|
+
" branch: main",
|
|
32
|
+
" backend:",
|
|
33
|
+
" branch: beta",
|
|
34
|
+
" database:",
|
|
35
|
+
" branch: beta",
|
|
36
|
+
"",
|
|
37
|
+
].join("\n"),
|
|
38
|
+
);
|
|
39
|
+
assert.equal(await configuredBranch(repo), "main");
|
|
40
|
+
assert.equal(await configuredBranch(repo, "backend"), "beta");
|
|
41
|
+
await assert.rejects(() => configuredBranch(repo, "database"), /frontend or backend/);
|
|
42
|
+
await writeFile(join(repo, ".agents", "config", "project.yaml"), "project: consumer\n");
|
|
43
|
+
assert.equal(await configuredBranch(repo), "beta");
|
|
44
|
+
} finally {
|
|
45
|
+
await rm(root, { recursive: true, force: true });
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("GitHub-only guard binds parsed config, policy, receipt expiry and fixed refspec", async () => {
|
|
50
|
+
const root = await mkdtemp(join(tmpdir(), "zaip-consumer-"));
|
|
51
|
+
try {
|
|
52
|
+
const repo = join(root, "repo");
|
|
53
|
+
await mkdir(join(repo, ".agents", "config"), { recursive: true });
|
|
54
|
+
git(repo, "init", "--quiet");
|
|
55
|
+
git(repo, "checkout", "-qb", "main");
|
|
56
|
+
git(repo, "config", "user.email", "x@y.invalid");
|
|
57
|
+
git(repo, "config", "user.name", "x");
|
|
58
|
+
git(repo, "remote", "add", "origin", "ssh://git@example.invalid/consumer.git");
|
|
59
|
+
await writeFile(
|
|
60
|
+
join(repo, ".agents", "config", "project.yaml"),
|
|
61
|
+
"deploy:\n branch: beta\n frontend:\n branch: main\n backend:\n branch: beta\n database:\n branch: beta\n",
|
|
62
|
+
);
|
|
63
|
+
await writeFile(join(repo, "README.md"), "x");
|
|
64
|
+
git(repo, "add", ".");
|
|
65
|
+
git(repo, "commit", "--quiet", "-m", "x");
|
|
66
|
+
const priv = join(root, "k.pem");
|
|
67
|
+
const pub = join(root, "k.pub");
|
|
68
|
+
const policy = join(root, "policy.json");
|
|
69
|
+
const trust = join(root, "trust");
|
|
70
|
+
const out = join(root, "out");
|
|
71
|
+
const sha = git(repo, "rev-parse", "HEAD");
|
|
72
|
+
const required = [{ command: "node", args: ["-e", "process.exit(0)"] }];
|
|
73
|
+
const input = {
|
|
74
|
+
repository: repo,
|
|
75
|
+
sha,
|
|
76
|
+
branch: "main",
|
|
77
|
+
scope: "frontend",
|
|
78
|
+
githubVersion: "v1.2",
|
|
79
|
+
policy,
|
|
80
|
+
trustStore: trust,
|
|
81
|
+
commands: required,
|
|
82
|
+
outputDir: out,
|
|
83
|
+
privateKey: priv,
|
|
84
|
+
keyId: "consumer",
|
|
85
|
+
remoteUrl: "ssh://git@example.invalid/consumer.git",
|
|
86
|
+
};
|
|
87
|
+
await keygen({ privateKey: priv, publicKey: pub });
|
|
88
|
+
await writeFile(
|
|
89
|
+
policy,
|
|
90
|
+
JSON.stringify({
|
|
91
|
+
schema_version: 1,
|
|
92
|
+
repository: repo,
|
|
93
|
+
configured_branch: "main",
|
|
94
|
+
github_version: "v1.2",
|
|
95
|
+
required_commands: required,
|
|
96
|
+
}),
|
|
97
|
+
);
|
|
98
|
+
await bootstrap({ trustStore: trust, publicKey: pub, keyId: "consumer" });
|
|
99
|
+
const prepared = await prepare(input);
|
|
100
|
+
await verifyPreparation({ ...input, receipt: prepared.receiptPath });
|
|
101
|
+
const calls = [];
|
|
102
|
+
await guardedPush(input, (value) => calls.push(value));
|
|
103
|
+
assert.deepEqual(
|
|
104
|
+
calls.map((value) => value.phase),
|
|
105
|
+
["preflight", "push"],
|
|
106
|
+
);
|
|
107
|
+
assert.equal(calls[1].refspec, sha + ":refs/heads/main");
|
|
108
|
+
await assert.rejects(
|
|
109
|
+
() => prepare({ ...input, commands: [{ command: "node", args: ["-e", "process.exit(2)"] }] }),
|
|
110
|
+
/differ/,
|
|
111
|
+
);
|
|
112
|
+
await writeFile(join(repo, "dirty"), "x");
|
|
113
|
+
await assert.rejects(
|
|
114
|
+
() => verifyPreparation({ ...input, receipt: prepared.receiptPath }),
|
|
115
|
+
/clean/,
|
|
116
|
+
);
|
|
117
|
+
await rm(join(repo, "dirty"));
|
|
118
|
+
await writeFile(policy, "{}");
|
|
119
|
+
await assert.rejects(() => verifyPreparation({ ...input, receipt: prepared.receiptPath }));
|
|
120
|
+
} finally {
|
|
121
|
+
await rm(root, { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test("runs corepack through the Windows command wrapper without arbitrary shell input", () => {
|
|
126
|
+
const invocation = commandInvocation({ command: "corepack", args: ["--version"] }, "win32");
|
|
127
|
+
assert.match(invocation.command, /cmd\.exe$/i);
|
|
128
|
+
assert.deepEqual(invocation.args, ["/d", "/s", "/c", "corepack.cmd", "--version"]);
|
|
129
|
+
run([{ command: "corepack", args: ["--version"] }], process.cwd(), "corepack");
|
|
130
|
+
assert.throws(
|
|
131
|
+
() => run([{ command: "corepack", args: ["--version;whoami"] }], process.cwd()),
|
|
132
|
+
/supported package manager/,
|
|
133
|
+
);
|
|
134
|
+
});
|