@zaip-ai/cli 3.3.0 → 3.5.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/dist/services/adapters.d.ts +1 -1
- package/dist/services/adapters.d.ts.map +1 -1
- package/dist/services/adapters.js +4 -3
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/agent-catalog-upgrade.d.ts +3 -0
- package/dist/services/agent-catalog-upgrade.d.ts.map +1 -0
- package/dist/services/agent-catalog-upgrade.js +35 -0
- package/dist/services/agent-catalog-upgrade.js.map +1 -0
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +22 -22
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/install-template-policy.d.ts +3 -0
- package/dist/services/install-template-policy.d.ts.map +1 -0
- package/dist/services/install-template-policy.js +21 -0
- package/dist/services/install-template-policy.js.map +1 -0
- package/dist/services/logger.test.js +12 -2
- package/dist/services/logger.test.js.map +1 -1
- package/dist/services/sqlite-bootstrap.d.ts +1 -0
- package/dist/services/sqlite-bootstrap.d.ts.map +1 -1
- package/dist/services/sqlite-bootstrap.js +10 -1
- package/dist/services/sqlite-bootstrap.js.map +1 -1
- package/package.json +2 -2
- package/templates/.agents/config/agents/discovery.json +1 -1
- package/templates/.agents/dashboard/.zaip-managed.json +286 -126
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-BBFDrn64.js → CostCalculationGuidePage-C5NgEcVh.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cd-qo9w7.js → DashboardHelpDialog-CCMVnkkI.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-J7L5m8lk.js → PricingSettingsDialog-CGYcJ5EB.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{ProjectSettingsPage-B9GWkEyN.css → ProjectSettingsPage-CQMhvzvJ.css} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-D46WWIKr.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-BzVtGLWS.js → TraceabilityWorkspace-BKBpJyLh.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{cost-monitor-PoJA2PI1.css → cost-monitor-BsMfGfQi.css} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-j3aUYH5G.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-CWzf_RiP.js → icons-vendor-x8xxL9yW.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Bas2TVju.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-CxrG_wRI.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-CtHdbZk3.js → react-vendor-CNOXIJHN.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-BKrDH2TR.js → traceability-CcpbpT1s.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +7 -7
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +12 -1
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsCard.tsx +5 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsField.tsx +21 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +12 -1
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +16 -28
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +25 -4
- package/templates/.agents/dashboard/apps/frontend/src/WorkspaceStatus.test.tsx +51 -0
- package/templates/.agents/dashboard/apps/frontend/src/WorkspaceStatus.tsx +39 -0
- package/templates/.agents/dashboard/apps/frontend/src/app-work-board-options.ts +41 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-runtime-status.ts +25 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-copy.ts +13 -4
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +25 -1
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-workspace.css +28 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +39 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +5 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.test.ts +140 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +28 -41
- package/templates/.agents/dashboard/apps/frontend/src/use-runtime-status.ts +38 -0
- package/templates/.agents/dashboard/apps/frontend/src/workspace-status.css +20 -0
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +25 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +17 -19
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +13 -167
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +2 -9
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +8 -8
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +29 -52
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.test.ts +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +2 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +4 -27
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +2 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +4 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/agent-model-presentation.test.ts +26 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-embedded.css +7 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-loaders.ts +173 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-props.ts +47 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +1 -7
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-page-range.ts +3 -9
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +44 -83
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +11 -111
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +47 -181
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +63 -91
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/cost-monitor-unavailable.test.ts +55 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/cost-summary-duration.test.ts +189 -0
- package/templates/.agents/dashboard/modules/operations/package.json +1 -1
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsEntityFilters.tsx +82 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +22 -31
- package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.test.tsx +13 -1
- package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.tsx +16 -3
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +11 -27
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +44 -193
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportColumns.ts +186 -0
- package/templates/.agents/dashboard/modules/operations/src/react/export/excel-agent-participations.test.ts +28 -0
- package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +2 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-export-duration.ts +13 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-filter-panel.css +4 -0
- package/templates/.agents/dashboard/modules/operations/src/react/use-operation-filter-feedback.ts +18 -0
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +11 -0
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +10 -2
- package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +1 -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/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 +395 -341
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +346 -294
- package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +2 -1
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +42 -8
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +395 -341
- package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.test.ts +95 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +102 -12
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +2 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +75 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +10 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-lifecycle-diagnostics.ts +50 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-macro-population.test.ts +165 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-page-filters.ts +65 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +111 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +53 -63
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +19 -5
- package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.ts +11 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +16 -9
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +46 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +10 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +4 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +43 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +46 -11
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-filter-matrix.test.ts +188 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-summary-details.test.ts +85 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-summary-details.ts +147 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +64 -54
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-macro-classification.test.ts +172 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +2 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.test.ts +7 -7
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.ts +2 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-period-averages.ts +10 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-pricing-provenance.test.ts +39 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +18 -82
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-cached-cost-page.ts +169 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-developer.ts +205 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +13 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +22 -23
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +42 -209
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +18 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +9 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +76 -83
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +25 -161
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical.ts +20 -47
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +2 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +16 -16
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +47 -22
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +3 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +11 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-rebuild-result.ts +15 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +4 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +15 -56
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-macro-classification.ts +48 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-summary-cursor.ts +15 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-token-active-allocation.ts +46 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-work-stages.ts +60 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +5 -1
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-claims.test.mjs +7 -1
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +17 -2
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-ownership.mjs +65 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-ownership.test.mjs +72 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +32 -9
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +39 -45
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +5 -2
- package/templates/.agents/dashboard/packages/ui/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +1 -18
- package/templates/.agents/dashboard/tests/e2e/specs/export-row-identity.spec.ts +20 -0
- package/templates/.agents/dashboard/tests/e2e/specs/export-row-identity.ts +20 -0
- package/templates/.agents/design/.zaip-managed.json +105 -69
- package/templates/.agents/design/apps/catalog/dist/assets/index-0W0Gj_Gs.css +1 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-32GZO95T.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/{index-D_lfqoyx.js → index-BP8IxOxt.js} +3 -3
- package/templates/.agents/design/apps/catalog/dist/assets/index-D1JaPXfV.css +1 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-D2miO4-O.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/{index-BOjCcUaU.js → index-QJsgr9Ht.js} +3 -3
- package/templates/.agents/design/apps/catalog/dist/assets/{index-CqtYXZfV.js → index-mvD5mwcC.js} +3 -3
- package/templates/.agents/design/apps/catalog/dist/index.html +2 -2
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-BJ8b4xZr.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{Color-6AOWCN3U-Cm-yJJz_.js → Color-6AOWCN3U-CQLHzznn.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-kxWwSKin.js +146 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DashboardFilters.stories-Chm_dXV7.js +9 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DashboardFiltersSpecimen-9CaCbGIZ.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-ED52wFjY.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{DocsRenderer-JROSPFPF-Belk4jRr.js → DocsRenderer-JROSPFPF-BcLgM80v.js} +4 -4
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/Primitives-DV6Bpudf.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{WithTooltip-7X4HQR7L-DoPvjkS1.js → WithTooltip-7X4HQR7L-BKNiAz_E.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/WorkspaceStatus.stories-BL19HGOo.js +17 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/WorkspaceStatusSpecimen-DQnSS6s9.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-DRQKCCAG-B1itKXEN.js → chunk-DRQKCCAG-DZBcXL-p.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-W22LQPXL-C-Eb5SPY.js → chunk-W22LQPXL-CF3y2mfo.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{components-DnyKLwhj.js → components-BVjxMRGq.js} +5 -5
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-Do9sjqiW.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/iframe-0W0Gj_Gs.css +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{iframe-DcXBsFPz.js → iframe-CTWGZcEe.js} +4 -4
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{react-18-CRM89QRf.js → react-18-B9_a4mHb.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-NrUxok8K.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{syntaxhighlighter-YFXUGROL-B03jQGTF.js → syntaxhighlighter-YFXUGROL-F_p8E2xc.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{theming-4ZyufAga.js → theming-fbSD9ZLF.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/iframe.html +2 -2
- package/templates/.agents/design/apps/catalog/dist/storybook/index.json +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/sb-addons/a11y-2/manager-bundle.js +3 -3
- package/templates/.agents/design/apps/catalog/dist/storybook/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +3 -3
- package/templates/.agents/design/apps/catalog/package.json +1 -1
- package/templates/.agents/design/apps/catalog/src/components/DashboardFiltersSpecimen.tsx +61 -0
- package/templates/.agents/design/apps/catalog/src/components/Primitives.tsx +24 -0
- package/templates/.agents/design/apps/catalog/src/components/StackVersionFieldSpecimen.tsx +70 -0
- package/templates/.agents/design/apps/catalog/src/components/WorkspaceStatusSpecimen.tsx +42 -0
- package/templates/.agents/design/apps/catalog/src/design-contract.test.ts +27 -13
- package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +52 -0
- package/templates/.agents/design/apps/catalog/src/pages/DesignSystemPage.tsx +15 -1
- package/templates/.agents/design/apps/catalog/src/stories/Components.stories.tsx +32 -0
- package/templates/.agents/design/apps/catalog/src/stories/DashboardFilters.stories.tsx +7 -0
- package/templates/.agents/design/apps/catalog/src/stories/WorkspaceStatus.stories.tsx +12 -0
- package/templates/.agents/design/apps/catalog/src/styles/components.css +84 -3
- package/templates/.agents/design/apps/catalog/src/styles/stack-version-field.css +17 -0
- package/templates/.agents/design/apps/catalog/src/styles.css +2 -0
- package/templates/.agents/design/packages/local-runtime/package.json +1 -1
- package/templates/.agents/design/tokens.json +32 -0
- package/templates/.agents/requirements/autonomous-assurance.md +1 -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 +1 -1
- 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 +9 -3
- 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 +1 -1
- package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
- package/templates/.agents/rules/autonomy-decision.md +1 -0
- package/templates/.agents/rules/workflow.md +2 -2
- package/templates/.agents/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +27 -26
- package/templates/.agents/runtime/checksums.sha256 +5 -5
- package/templates/.agents/runtime/manifest.json +1 -1
- package/templates/.agents/runtime/provenance.json +4 -4
- package/templates/.agents/runtime/sbom.cdx.json +1 -1
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +13 -0
- package/templates/.agents/skills/zaip-skill-execution/references/autonomous-continuation.md +17 -0
- package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +2 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -6
- package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +1 -1
- package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +11 -9
- package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +2 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +1 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +9 -1
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +23 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +2 -6
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +15 -1
- package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-prd/SKILL.md +3 -3
- package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +11 -8
- package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +13 -12
- package/templates/.agents/skills/zaip-skill-setup/SKILL.md +17 -2
- package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +1 -1
- package/templates/.agents/skills/zaip-skill-spec/SKILL.md +2 -2
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/template-manifest.json +445 -245
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BpsAFy0g.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor--iPcnZdx.js +0 -68
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Cmlx8OYH.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DfdlGa7c.js +0 -2
- package/templates/.agents/design/apps/catalog/dist/assets/index-BEmIE7WE.css +0 -1
- package/templates/.agents/design/apps/catalog/dist/assets/index-BJV597iq.js +0 -72
- package/templates/.agents/design/apps/catalog/dist/assets/index-B_WhrCZe.js +0 -72
- package/templates/.agents/design/apps/catalog/dist/assets/index-CqqYWY2f.js +0 -9
- package/templates/.agents/design/apps/catalog/dist/assets/index-D9pj7Jlf.js +0 -9
- package/templates/.agents/design/apps/catalog/dist/assets/index-i_PO2k9R.js +0 -9
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-Cstn1UwA.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-D1WopB2L.js +0 -137
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DQ9PJ3N3.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-D0OSgxWz.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/iframe-BEmIE7WE.css +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-C3tkVMIp.js +0 -1
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { type FormEvent,
|
|
1
|
+
import { type FormEvent, useCallback, useEffect, useState } from "react";
|
|
2
2
|
import type {
|
|
3
3
|
DashboardApiClient,
|
|
4
4
|
ProjectConfigSettings,
|
|
5
5
|
ProjectOverview,
|
|
6
6
|
} from "./dashboard-api.js";
|
|
7
7
|
import { StackComponentEditor, StackVersions } from "./ProjectStackEditor.js";
|
|
8
|
+
import { ProjectSettingsCard as SettingsCard } from "./ProjectSettingsCard.js";
|
|
9
|
+
import { ProjectSettingsField as Field } from "./ProjectSettingsField.js";
|
|
8
10
|
import {
|
|
9
11
|
type InstallationDimensionStatus,
|
|
10
12
|
projectInstallationStatus,
|
|
@@ -25,7 +27,9 @@ import {
|
|
|
25
27
|
} from "./project-settings-model.js";
|
|
26
28
|
import "./project-settings-page.css";
|
|
27
29
|
import "./project-stack-versions.css";
|
|
30
|
+
import "./project-settings-workspace.css";
|
|
28
31
|
import { AutonomySettings } from "./AutonomySettings.js";
|
|
32
|
+
import { useRuntimeStatus } from "./use-runtime-status.js";
|
|
29
33
|
|
|
30
34
|
export function ProjectSettingsPage({
|
|
31
35
|
api,
|
|
@@ -46,6 +50,7 @@ export function ProjectSettingsPage({
|
|
|
46
50
|
const [error, setError] = useState<string | null>(null);
|
|
47
51
|
const [notice, setNotice] = useState<string | null>(null);
|
|
48
52
|
const [installationToastVisible, setInstallationToastVisible] = useState(false);
|
|
53
|
+
const runtime = useRuntimeStatus();
|
|
49
54
|
const installation = overview === null ? null : projectInstallationStatus(overview);
|
|
50
55
|
|
|
51
56
|
const loadProjectSettings = useCallback(async () => {
|
|
@@ -219,6 +224,16 @@ export function ProjectSettingsPage({
|
|
|
219
224
|
|
|
220
225
|
<div className="project-settings-grid">
|
|
221
226
|
<SettingsCard className="is-wide project-identity-card" title={text.identity}>
|
|
227
|
+
<Field
|
|
228
|
+
className="project-settings-workspace-field"
|
|
229
|
+
hint={text.workspacePathHint}
|
|
230
|
+
label={text.workspacePath}
|
|
231
|
+
>
|
|
232
|
+
<code className="project-settings-workspace-path">
|
|
233
|
+
{runtime.status?.workspace ??
|
|
234
|
+
(runtime.unavailable ? text.workspacePathUnavailable : text.workspacePathLoading)}
|
|
235
|
+
</code>
|
|
236
|
+
</Field>
|
|
222
237
|
<Field label="Schema">
|
|
223
238
|
<input readOnly value={config.schema_version} />
|
|
224
239
|
</Field>
|
|
@@ -599,33 +614,6 @@ function installationStateLabel(state: InstallationDimensionStatus["state"], loc
|
|
|
599
614
|
return text.unknown;
|
|
600
615
|
}
|
|
601
616
|
|
|
602
|
-
function SettingsCard({
|
|
603
|
-
children,
|
|
604
|
-
className = "",
|
|
605
|
-
title,
|
|
606
|
-
}: {
|
|
607
|
-
children: ReactNode;
|
|
608
|
-
className?: string;
|
|
609
|
-
title: string;
|
|
610
|
-
}) {
|
|
611
|
-
return (
|
|
612
|
-
<section className={`project-settings-card ${className}`}>
|
|
613
|
-
<h2>{title}</h2>
|
|
614
|
-
<div className="project-settings-fields">{children}</div>
|
|
615
|
-
</section>
|
|
616
|
-
);
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
function Field({ children, hint, label }: { children: ReactNode; hint?: string; label: string }) {
|
|
620
|
-
return (
|
|
621
|
-
<div className="project-settings-field">
|
|
622
|
-
<span>{label}</span>
|
|
623
|
-
{children}
|
|
624
|
-
{hint ? <small>{hint}</small> : null}
|
|
625
|
-
</div>
|
|
626
|
-
);
|
|
627
|
-
}
|
|
628
|
-
|
|
629
617
|
function Toggle({
|
|
630
618
|
checked,
|
|
631
619
|
hint,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ProjectOverview } from "./dashboard-api.js";
|
|
2
2
|
import {
|
|
3
|
+
acceptsDescriptiveVersion,
|
|
3
4
|
type StackComponentId,
|
|
4
5
|
type StackComponentsDraft,
|
|
5
6
|
stackComponentDefinitions,
|
|
@@ -74,7 +75,9 @@ export function StackComponentEditor({
|
|
|
74
75
|
<div className="project-stack-table-head" aria-hidden="true">
|
|
75
76
|
<span>Item</span>
|
|
76
77
|
<span>{locale === "pt-BR" ? "Tecnologia" : "Technology"}</span>
|
|
77
|
-
<span>
|
|
78
|
+
<span>
|
|
79
|
+
{locale === "pt-BR" ? "Versão atual / referência" : "Current version / reference"}
|
|
80
|
+
</span>
|
|
78
81
|
<span>
|
|
79
82
|
{locale === "pt-BR" ? "Pacote / imagem / serviço" : "Package / image / service"}
|
|
80
83
|
</span>
|
|
@@ -92,9 +95,27 @@ export function StackComponentEditor({
|
|
|
92
95
|
onChange={(event) => update(definition.id, "name", event.target.value)}
|
|
93
96
|
/>
|
|
94
97
|
<input
|
|
95
|
-
aria-label={`${componentLabels[definition.id].pt}:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
+
aria-label={`${componentLabels[definition.id].pt}: ${
|
|
99
|
+
acceptsDescriptiveVersion(definition.id)
|
|
100
|
+
? "versão atual ou referência"
|
|
101
|
+
: "versão exata"
|
|
102
|
+
}`}
|
|
103
|
+
className={
|
|
104
|
+
acceptsDescriptiveVersion(definition.id) ? "is-reference-value" : undefined
|
|
105
|
+
}
|
|
106
|
+
inputMode={acceptsDescriptiveVersion(definition.id) ? "text" : "decimal"}
|
|
107
|
+
placeholder={
|
|
108
|
+
acceptsDescriptiveVersion(definition.id)
|
|
109
|
+
? locale === "pt-BR"
|
|
110
|
+
? "Serviço em nuvem"
|
|
111
|
+
: "Cloud service"
|
|
112
|
+
: "x.y.z"
|
|
113
|
+
}
|
|
114
|
+
title={
|
|
115
|
+
acceptsDescriptiveVersion(definition.id)
|
|
116
|
+
? components[definition.id].version
|
|
117
|
+
: undefined
|
|
118
|
+
}
|
|
98
119
|
value={components[definition.id].version}
|
|
99
120
|
onChange={(event) => update(definition.id, "version", event.target.value)}
|
|
100
121
|
/>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
2
|
+
import { renderToStaticMarkup } from "react-dom/server";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { WorkspaceStatus } from "./WorkspaceStatus.js";
|
|
5
|
+
|
|
6
|
+
describe("workspace diagnostics", () => {
|
|
7
|
+
it("does not render a global workspace banner when the runtime is healthy", () => {
|
|
8
|
+
const html = renderToStaticMarkup(
|
|
9
|
+
createElement(WorkspaceStatus, {
|
|
10
|
+
status: {
|
|
11
|
+
workspace: "C:/projects/zaip-growth",
|
|
12
|
+
workspace_name: "zaip-growth",
|
|
13
|
+
workspaceKey: "growth",
|
|
14
|
+
status: "ok",
|
|
15
|
+
lifecycle_manifest_state: "initialized",
|
|
16
|
+
},
|
|
17
|
+
}),
|
|
18
|
+
);
|
|
19
|
+
expect(html).toBe("");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it.each([
|
|
23
|
+
"missing",
|
|
24
|
+
"invalid",
|
|
25
|
+
] as const)("keeps the %s lifecycle warning without exposing the served path", (state) => {
|
|
26
|
+
const html = renderToStaticMarkup(
|
|
27
|
+
createElement(WorkspaceStatus, {
|
|
28
|
+
status: {
|
|
29
|
+
workspace: "C:/projects/zaip-growth",
|
|
30
|
+
workspace_name: "zaip-growth",
|
|
31
|
+
workspaceKey: "growth",
|
|
32
|
+
status: "degraded",
|
|
33
|
+
lifecycle_manifest_state: state,
|
|
34
|
+
},
|
|
35
|
+
}),
|
|
36
|
+
);
|
|
37
|
+
expect(html).not.toContain("C:/projects/zaip-growth");
|
|
38
|
+
expect(html).not.toContain("zaip-growth");
|
|
39
|
+
if (state === "missing") expect(html).toContain("Lifecycle não inicializado");
|
|
40
|
+
if (state === "invalid") expect(html).toContain("Manifesto do lifecycle inválido");
|
|
41
|
+
expect(html).toContain("manifest rebuild --confirm-full-scan");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("keeps unknown health explicit", () => {
|
|
45
|
+
const html = renderToStaticMarkup(
|
|
46
|
+
createElement(WorkspaceStatus, { status: null, unavailable: true }),
|
|
47
|
+
);
|
|
48
|
+
expect(html).toContain("Não foi possível consultar a saúde do Dashboard");
|
|
49
|
+
expect(html).not.toContain("Workspace indisponível");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { DashboardRuntimeStatus } from "./dashboard-runtime-status.js";
|
|
2
|
+
import "./workspace-status.css";
|
|
3
|
+
|
|
4
|
+
export function WorkspaceStatus({
|
|
5
|
+
status,
|
|
6
|
+
unavailable = false,
|
|
7
|
+
}: {
|
|
8
|
+
status: DashboardRuntimeStatus | null;
|
|
9
|
+
unavailable?: boolean;
|
|
10
|
+
}) {
|
|
11
|
+
const manifest = status?.lifecycle_manifest_state;
|
|
12
|
+
if (manifest === "initialized" && status?.status === "ok" && !unavailable) return null;
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<aside className="workspace-status" aria-label="Saúde do Dashboard">
|
|
16
|
+
{manifest === "missing" || manifest === "invalid" ? (
|
|
17
|
+
<div className="workspace-status__warning" role="alert">
|
|
18
|
+
<strong>
|
|
19
|
+
{manifest === "missing"
|
|
20
|
+
? "Lifecycle não inicializado"
|
|
21
|
+
: "Manifesto do lifecycle inválido"}
|
|
22
|
+
</strong>
|
|
23
|
+
<p>Os dados deste workspace estão indisponíveis. Na pasta do projeto, execute:</p>
|
|
24
|
+
<code>node .agents/runtime/bin/zaip.mjs manifest rebuild --confirm-full-scan</code>
|
|
25
|
+
</div>
|
|
26
|
+
) : status?.status === "degraded" || unavailable ? (
|
|
27
|
+
<p className="workspace-status__warning" role="status">
|
|
28
|
+
{unavailable
|
|
29
|
+
? "Não foi possível consultar a saúde do Dashboard. Tentando novamente…"
|
|
30
|
+
: "Dashboard degradado: a atualização dos dados ou da telemetria requer atenção."}
|
|
31
|
+
</p>
|
|
32
|
+
) : (
|
|
33
|
+
<p className="workspace-status__warning" role="status">
|
|
34
|
+
Identificando a saúde do Dashboard…
|
|
35
|
+
</p>
|
|
36
|
+
)}
|
|
37
|
+
</aside>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { OperationsProjection } from "@zaip-ai/dashboard-operations/contracts";
|
|
2
|
+
import type { Dispatch, RefObject, SetStateAction } from "react";
|
|
3
|
+
import type {
|
|
4
|
+
BoardStageState,
|
|
5
|
+
OverviewClassificationPages,
|
|
6
|
+
OverviewStatusPages,
|
|
7
|
+
} from "./AppWorkBoard.js";
|
|
8
|
+
import type {
|
|
9
|
+
DashboardApiClient,
|
|
10
|
+
OperationsBoardPage,
|
|
11
|
+
OperationsPageFilters,
|
|
12
|
+
WorkBoardStage,
|
|
13
|
+
} from "./dashboard-api.js";
|
|
14
|
+
import type { OperationsPeriodState } from "./operations-period.js";
|
|
15
|
+
|
|
16
|
+
type StateSetter<T> = Dispatch<SetStateAction<T>>;
|
|
17
|
+
|
|
18
|
+
export interface AppWorkBoardOptions {
|
|
19
|
+
api: DashboardApiClient;
|
|
20
|
+
boardAbortControllersRef: RefObject<Map<WorkBoardStage, AbortController>>;
|
|
21
|
+
boardFilterKeyRef: RefObject<string>;
|
|
22
|
+
boardFiltersRef: RefObject<OperationsPageFilters>;
|
|
23
|
+
boardInFlightRef: RefObject<Set<WorkBoardStage>>;
|
|
24
|
+
boardInitialPageRef: RefObject<Set<WorkBoardStage>>;
|
|
25
|
+
boardLoadedRef: RefObject<Partial<Record<WorkBoardStage, number>>>;
|
|
26
|
+
boardRequestVersionRef: RefObject<number>;
|
|
27
|
+
dashboardView: "operations" | "cost-monitor" | "traceability" | null;
|
|
28
|
+
operations: OperationsProjection | null;
|
|
29
|
+
operationsPeriod: OperationsPeriodState;
|
|
30
|
+
operationsPeriodRef: RefObject<OperationsPeriodState>;
|
|
31
|
+
overviewStatusInFlightRef: RefObject<Set<string>>;
|
|
32
|
+
quickOverviewMetricsRef: RefObject<OperationsProjection["summary"]["overview_metrics"]>;
|
|
33
|
+
setBoardKindTotals: StateSetter<
|
|
34
|
+
Partial<Record<WorkBoardStage, OperationsBoardPage["totals_by_kind"]>>
|
|
35
|
+
>;
|
|
36
|
+
setBoardStates: StateSetter<Partial<Record<WorkBoardStage, BoardStageState>>>;
|
|
37
|
+
setBoardTotals: StateSetter<Partial<Record<WorkBoardStage, number>>>;
|
|
38
|
+
setOperations: StateSetter<OperationsProjection | null>;
|
|
39
|
+
setOverviewClassificationPages: StateSetter<OverviewClassificationPages>;
|
|
40
|
+
setOverviewStatusPages: StateSetter<OverviewStatusPages>;
|
|
41
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface DashboardRuntimeStatus {
|
|
2
|
+
workspace: string;
|
|
3
|
+
workspace_name: string;
|
|
4
|
+
workspaceKey: string;
|
|
5
|
+
status: "ok" | "degraded";
|
|
6
|
+
lifecycle_manifest_state: "initialized" | "missing" | "invalid";
|
|
7
|
+
active_capture_failure?: { code: string } | null;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function readDashboardRuntimeStatus(
|
|
11
|
+
signal: AbortSignal,
|
|
12
|
+
): Promise<DashboardRuntimeStatus> {
|
|
13
|
+
const response = await fetch("/api/v2/health", { cache: "no-store", signal });
|
|
14
|
+
const value = await response.json();
|
|
15
|
+
// A degraded response is useful diagnostic data, including HTTP 503.
|
|
16
|
+
if (
|
|
17
|
+
value?.kind !== "zaip-dashboard-sqlite-runtime" ||
|
|
18
|
+
typeof value.workspace !== "string" ||
|
|
19
|
+
typeof value.workspace_name !== "string" ||
|
|
20
|
+
!["initialized", "missing", "invalid"].includes(value.lifecycle_manifest_state)
|
|
21
|
+
) {
|
|
22
|
+
throw new Error("Identidade do Dashboard indisponível");
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
@@ -15,6 +15,10 @@ export const projectSettingsCopy = {
|
|
|
15
15
|
framework: "Framework ZAIP-AIOS",
|
|
16
16
|
frameworkHint: "Ativa ou desativa o framework para este projeto.",
|
|
17
17
|
identity: "Identidade do projeto",
|
|
18
|
+
workspacePath: "Caminho do projeto",
|
|
19
|
+
workspacePathHint: "Pasta local usada por esta instância do Dashboard.",
|
|
20
|
+
workspacePathLoading: "Identificando caminho…",
|
|
21
|
+
workspacePathUnavailable: "Caminho indisponível",
|
|
18
22
|
stack: "Stack e linguagens",
|
|
19
23
|
execution: "Execução",
|
|
20
24
|
assurance: "Assurance",
|
|
@@ -57,8 +61,9 @@ export const projectSettingsCopy = {
|
|
|
57
61
|
available: "Criado",
|
|
58
62
|
artifactUnavailable: "Ainda não criado",
|
|
59
63
|
componentGuide:
|
|
60
|
-
"Preencha cada responsabilidade separadamente.
|
|
61
|
-
versionHint:
|
|
64
|
+
"Preencha cada responsabilidade separadamente. Use a versão exata do software e, para serviços em nuvem ou hospedagem, informe Serviço em nuvem.",
|
|
65
|
+
versionHint:
|
|
66
|
+
"Software: 22.16.0 ou 17.6, sem prefixos (^, ~, >=). Serviço gerenciado: Serviço em nuvem. Hospedagem: Serviço em nuvem.",
|
|
62
67
|
referenceHint:
|
|
63
68
|
"Ex.: npm:hono, docker:node:22.16.0-bookworm-slim, service:supabase ou provider:cloudflare-pages.",
|
|
64
69
|
overrides: "Opções avançadas (JSON)",
|
|
@@ -103,6 +108,10 @@ export const projectSettingsCopy = {
|
|
|
103
108
|
framework: "ZAIP-AIOS framework",
|
|
104
109
|
frameworkHint: "Enable or disable the framework for this project.",
|
|
105
110
|
identity: "Project identity",
|
|
111
|
+
workspacePath: "Project path",
|
|
112
|
+
workspacePathHint: "Local folder used by this Dashboard instance.",
|
|
113
|
+
workspacePathLoading: "Identifying path…",
|
|
114
|
+
workspacePathUnavailable: "Path unavailable",
|
|
106
115
|
stack: "Stack and languages",
|
|
107
116
|
execution: "Execution",
|
|
108
117
|
assurance: "Assurance",
|
|
@@ -145,9 +154,9 @@ export const projectSettingsCopy = {
|
|
|
145
154
|
available: "Created",
|
|
146
155
|
artifactUnavailable: "Not created yet",
|
|
147
156
|
componentGuide:
|
|
148
|
-
"Fill each responsibility separately.
|
|
157
|
+
"Fill each responsibility separately. Use an exact software version and, for cloud services or hosting, enter Cloud service.",
|
|
149
158
|
versionHint:
|
|
150
|
-
"
|
|
159
|
+
"Software: 22.16.0 or 17.6, without prefixes (^, ~, >=). Managed service: Cloud service. Hosting: Cloud service.",
|
|
151
160
|
referenceHint:
|
|
152
161
|
"E.g. npm:hono, docker:node:22.16.0-bookworm-slim, service:supabase, or provider:cloudflare-pages.",
|
|
153
162
|
overrides: "Advanced options (JSON)",
|
|
@@ -34,6 +34,18 @@ export type StackComponentId = (typeof stackComponentDefinitions)[number]["id"];
|
|
|
34
34
|
export type StackComponentDraft = { name: string; version: string; reference: string };
|
|
35
35
|
export type StackComponentsDraft = Record<StackComponentId, StackComponentDraft>;
|
|
36
36
|
|
|
37
|
+
const descriptiveVersionComponentIds = new Set<StackComponentId>([
|
|
38
|
+
"database",
|
|
39
|
+
"auth_storage",
|
|
40
|
+
"backend_hosting",
|
|
41
|
+
"frontend_hosting",
|
|
42
|
+
"site_hosting",
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
export function acceptsDescriptiveVersion(id: StackComponentId): boolean {
|
|
46
|
+
return descriptiveVersionComponentIds.has(id);
|
|
47
|
+
}
|
|
48
|
+
|
|
37
49
|
export function projectSettingsDraft(config: ProjectConfigSettings): {
|
|
38
50
|
components: StackComponentsDraft;
|
|
39
51
|
otherOverrides: string;
|
|
@@ -110,11 +122,23 @@ export function buildProjectSettingsPayload(
|
|
|
110
122
|
} = parsed;
|
|
111
123
|
for (const definition of stackComponentDefinitions) {
|
|
112
124
|
const version = components[definition.id].version.trim();
|
|
113
|
-
if (
|
|
125
|
+
if (
|
|
126
|
+
version !== "" &&
|
|
127
|
+
!acceptsDescriptiveVersion(definition.id) &&
|
|
128
|
+
!/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(version)
|
|
129
|
+
) {
|
|
114
130
|
throw new Error(
|
|
115
131
|
`A versão de ${components[definition.id].name || definition.defaultName} deve ser exata, como 22.16.0 ou 17.6, sem ^, ~, >= ou latest.`,
|
|
116
132
|
);
|
|
117
133
|
}
|
|
134
|
+
if (
|
|
135
|
+
acceptsDescriptiveVersion(definition.id) &&
|
|
136
|
+
(version.length > 120 || /[\r\n]/.test(version))
|
|
137
|
+
) {
|
|
138
|
+
throw new Error(
|
|
139
|
+
`A referência de ${components[definition.id].name || definition.defaultName} deve ter uma única linha com até 120 caracteres.`,
|
|
140
|
+
);
|
|
141
|
+
}
|
|
118
142
|
}
|
|
119
143
|
const normalized = Object.fromEntries(
|
|
120
144
|
stackComponentDefinitions.map((definition) => [
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
.project-settings-workspace-path {
|
|
2
|
+
display: block;
|
|
3
|
+
min-width: 0;
|
|
4
|
+
padding: 10px 12px;
|
|
5
|
+
border: 1px solid #cbd7e5;
|
|
6
|
+
border-radius: 12px;
|
|
7
|
+
background: #f8fafc;
|
|
8
|
+
overflow-wrap: anywhere;
|
|
9
|
+
color: #0f172a;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.project-settings-workspace-field {
|
|
13
|
+
grid-column: 1 / -1;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.project-stack-row input.is-reference-value {
|
|
17
|
+
border-color: #9edcf2;
|
|
18
|
+
background-color: #effaff;
|
|
19
|
+
color: #075985;
|
|
20
|
+
font-weight: 650;
|
|
21
|
+
-webkit-text-fill-color: #075985;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.project-stack-row input.is-reference-value:hover,
|
|
25
|
+
.project-stack-row input.is-reference-value:focus-visible {
|
|
26
|
+
border-color: #00b0f0;
|
|
27
|
+
background-color: #f5fcff;
|
|
28
|
+
}
|
|
@@ -111,6 +111,45 @@ describe("project settings form mapping", () => {
|
|
|
111
111
|
).toThrow("deve ser exata");
|
|
112
112
|
});
|
|
113
113
|
|
|
114
|
+
it("accepts descriptive references only for managed services and hosting", () => {
|
|
115
|
+
const components = projectSettingsDraft(config).components;
|
|
116
|
+
const payload = buildProjectSettingsPayload(
|
|
117
|
+
config,
|
|
118
|
+
{
|
|
119
|
+
...components,
|
|
120
|
+
database: { ...components.database, version: "Serviço em nuvem" },
|
|
121
|
+
auth_storage: { ...components.auth_storage, version: "Serviço em nuvem" },
|
|
122
|
+
backend_hosting: {
|
|
123
|
+
...components.backend_hosting,
|
|
124
|
+
version: "Serviço em nuvem",
|
|
125
|
+
},
|
|
126
|
+
frontend_hosting: { ...components.frontend_hosting, version: "Serviço em nuvem" },
|
|
127
|
+
site_hosting: { ...components.site_hosting, version: "Serviço em nuvem" },
|
|
128
|
+
},
|
|
129
|
+
"{}",
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
expect(payload.stack.overrides.components).toMatchObject({
|
|
133
|
+
database: { version: "Serviço em nuvem" },
|
|
134
|
+
auth_storage: { version: "Serviço em nuvem" },
|
|
135
|
+
backend_hosting: {
|
|
136
|
+
version: "Serviço em nuvem",
|
|
137
|
+
},
|
|
138
|
+
frontend_hosting: { version: "Serviço em nuvem" },
|
|
139
|
+
site_hosting: { version: "Serviço em nuvem" },
|
|
140
|
+
});
|
|
141
|
+
expect(() =>
|
|
142
|
+
buildProjectSettingsPayload(
|
|
143
|
+
config,
|
|
144
|
+
{
|
|
145
|
+
...components,
|
|
146
|
+
backend_api: { ...components.backend_api, version: "Serviço em nuvem" },
|
|
147
|
+
},
|
|
148
|
+
"{}",
|
|
149
|
+
),
|
|
150
|
+
).toThrow("deve ser exata");
|
|
151
|
+
});
|
|
152
|
+
|
|
114
153
|
it("keeps observability and on-demand testing tools editable with pinned-or-empty versions", () => {
|
|
115
154
|
const configured = {
|
|
116
155
|
...config,
|
|
@@ -334,8 +334,8 @@ describe("atomic Cost snapshot loading", () => {
|
|
|
334
334
|
expect(boardHydration).toContain(
|
|
335
335
|
"await Promise.all(batch.map((stage) => loadMoreBoard(stage)))",
|
|
336
336
|
);
|
|
337
|
-
expect(boardHydration).toContain("window.requestIdleCallback(() => void hydrateBoard())");
|
|
338
337
|
expect(boardHydration).toContain("window.setTimeout(() => void hydrateBoard(), 0)");
|
|
338
|
+
expect(boardHydration).not.toContain("window.requestIdleCallback");
|
|
339
339
|
expect(boardHydration).toContain("!boardInitialPageRef.current.has(stage)");
|
|
340
340
|
expect(boardHydration).toContain("boardInitialPageRef.current.add(stage)");
|
|
341
341
|
expect(boardHydration).toContain("!boardInFlightRef.current.has(stage)");
|
|
@@ -134,6 +134,10 @@ export async function loadSqliteCostRunPage(api: DashboardApiClient, request: Co
|
|
|
134
134
|
...(filters?.agent ? { agent: filters.agent } : {}),
|
|
135
135
|
...(filters?.phase ? { phase: filters.phase } : {}),
|
|
136
136
|
...(filters?.status ? { status: filters.status } : {}),
|
|
137
|
+
...(filters?.priority ? { priority: filters.priority } : {}),
|
|
138
|
+
...(filters?.risk ? { risk: filters.risk } : {}),
|
|
139
|
+
...(filters?.origin ? { origin: filters.origin } : {}),
|
|
140
|
+
...(filters?.workType ? { workType: filters.workType } : {}),
|
|
137
141
|
},
|
|
138
142
|
signal,
|
|
139
143
|
);
|
|
@@ -360,7 +364,7 @@ export function useAppCostLoaders(api: DashboardApiClient) {
|
|
|
360
364
|
{
|
|
361
365
|
offset,
|
|
362
366
|
limit,
|
|
363
|
-
...(query
|
|
367
|
+
...(filters.query || query ? { query: filters.query || query } : {}),
|
|
364
368
|
...(filters.provider ? { provider: filters.provider } : {}),
|
|
365
369
|
...(filters.model ? { model: filters.model } : {}),
|
|
366
370
|
...(filters.agent ? { agent: filters.agent } : {}),
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import type { OperationsProjection } from "@zaip-ai/dashboard-operations/contracts";
|
|
3
|
+
import type { DashboardApiClient, OperationsPageFilters, WorkBoardStage } from "./dashboard-api.js";
|
|
4
|
+
import type { OperationsPeriodState } from "./operations-period.js";
|
|
5
|
+
import { useAppWorkBoard } from "./use-app-work-board.js";
|
|
6
|
+
|
|
7
|
+
const effects = vi.hoisted(() => [] as Array<() => void | (() => void)>);
|
|
8
|
+
|
|
9
|
+
// Exercise the hook's actual request and reset logic while retaining direct
|
|
10
|
+
// control of the deferred effect callback that races with a filter reset.
|
|
11
|
+
vi.mock("react", async (importOriginal) => ({
|
|
12
|
+
...(await importOriginal<typeof import("react")>()),
|
|
13
|
+
useCallback: <T>(callback: T) => callback,
|
|
14
|
+
useEffect: (effect: () => void | (() => void)) => effects.push(effect),
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
const filters: OperationsPageFilters = {
|
|
18
|
+
query: "",
|
|
19
|
+
status: "",
|
|
20
|
+
risk: "",
|
|
21
|
+
origin: "",
|
|
22
|
+
kind: "",
|
|
23
|
+
};
|
|
24
|
+
const operationsPeriod: OperationsPeriodState = {
|
|
25
|
+
preset: "all",
|
|
26
|
+
range: { start: "2026-08-01", end: "2026-08-31" },
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
function boardPage(stage: WorkBoardStage) {
|
|
30
|
+
return {
|
|
31
|
+
stage,
|
|
32
|
+
offset: 0,
|
|
33
|
+
total: 0,
|
|
34
|
+
totals_by_kind: { all: 0, task: 0, "standalone-task": 0, prd: 0, spec: 0 },
|
|
35
|
+
prds: [],
|
|
36
|
+
specs: [],
|
|
37
|
+
tasks: [],
|
|
38
|
+
changes: [],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function setup() {
|
|
43
|
+
const operationsBoard = vi.fn<DashboardApiClient["operationsBoard"]>(async (_period, stage) =>
|
|
44
|
+
boardPage(stage),
|
|
45
|
+
);
|
|
46
|
+
const api = { operationsBoard } as unknown as DashboardApiClient;
|
|
47
|
+
let operations = {
|
|
48
|
+
prds: [],
|
|
49
|
+
specs: [],
|
|
50
|
+
tasks: [],
|
|
51
|
+
changes: [],
|
|
52
|
+
summary: {},
|
|
53
|
+
} as unknown as OperationsProjection;
|
|
54
|
+
const boardInitialPageRef = { current: new Set<WorkBoardStage>() };
|
|
55
|
+
const boardRequestVersionRef = { current: 0 };
|
|
56
|
+
const setOperations = (
|
|
57
|
+
update:
|
|
58
|
+
| OperationsProjection
|
|
59
|
+
| null
|
|
60
|
+
| ((current: OperationsProjection | null) => OperationsProjection | null),
|
|
61
|
+
) => {
|
|
62
|
+
operations = (
|
|
63
|
+
typeof update === "function" ? update(operations) : update
|
|
64
|
+
) as OperationsProjection;
|
|
65
|
+
};
|
|
66
|
+
const render = () =>
|
|
67
|
+
useAppWorkBoard({
|
|
68
|
+
api,
|
|
69
|
+
boardAbortControllersRef: { current: new Map() },
|
|
70
|
+
boardFilterKeyRef: { current: "||||" },
|
|
71
|
+
boardFiltersRef: { current: filters },
|
|
72
|
+
boardInFlightRef: { current: new Set() },
|
|
73
|
+
boardInitialPageRef,
|
|
74
|
+
boardLoadedRef: { current: {} },
|
|
75
|
+
boardRequestVersionRef,
|
|
76
|
+
dashboardView: "operations",
|
|
77
|
+
operations,
|
|
78
|
+
operationsPeriod,
|
|
79
|
+
operationsPeriodRef: { current: operationsPeriod },
|
|
80
|
+
overviewStatusInFlightRef: { current: new Set() },
|
|
81
|
+
quickOverviewMetricsRef: { current: undefined },
|
|
82
|
+
setBoardKindTotals: vi.fn() as never,
|
|
83
|
+
setBoardStates: vi.fn() as never,
|
|
84
|
+
setBoardTotals: vi.fn() as never,
|
|
85
|
+
setOperations,
|
|
86
|
+
setOverviewClassificationPages: vi.fn() as never,
|
|
87
|
+
setOverviewStatusPages: vi.fn() as never,
|
|
88
|
+
});
|
|
89
|
+
return { boardInitialPageRef, operationsBoard, render };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
beforeEach(() => {
|
|
93
|
+
effects.length = 0;
|
|
94
|
+
vi.useFakeTimers();
|
|
95
|
+
vi.stubGlobal("window", { setTimeout, clearTimeout, requestIdleCallback: undefined });
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
afterEach(() => {
|
|
99
|
+
vi.unstubAllGlobals();
|
|
100
|
+
vi.useRealTimers();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe("work board hydration generation", () => {
|
|
104
|
+
it("hydrates the visible board when requestIdleCallback never runs", async () => {
|
|
105
|
+
const requestIdleCallback = vi.fn(() => 1);
|
|
106
|
+
vi.stubGlobal("window", {
|
|
107
|
+
setTimeout,
|
|
108
|
+
clearTimeout,
|
|
109
|
+
requestIdleCallback,
|
|
110
|
+
cancelIdleCallback: vi.fn(),
|
|
111
|
+
});
|
|
112
|
+
const { boardInitialPageRef, operationsBoard, render } = setup();
|
|
113
|
+
render();
|
|
114
|
+
const effect = effects[0];
|
|
115
|
+
if (effect === undefined) throw new Error("expected visible board hydration effect");
|
|
116
|
+
const cleanup = effect();
|
|
117
|
+
|
|
118
|
+
await vi.runAllTimersAsync();
|
|
119
|
+
|
|
120
|
+
expect(requestIdleCallback).not.toHaveBeenCalled();
|
|
121
|
+
expect(operationsBoard).toHaveBeenCalledTimes(9);
|
|
122
|
+
expect(boardInitialPageRef.current.size).toBe(9);
|
|
123
|
+
cleanup?.();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("does not let an older scheduled callback consume the reset board generation", async () => {
|
|
127
|
+
const { boardInitialPageRef, operationsBoard, render } = setup();
|
|
128
|
+
const board = render();
|
|
129
|
+
const staleEffect = effects[0];
|
|
130
|
+
if (staleEffect === undefined) throw new Error("expected initial board hydration effect");
|
|
131
|
+
const cleanup = staleEffect();
|
|
132
|
+
|
|
133
|
+
board.loadFilteredBoard({ ...filters, kind: "task" });
|
|
134
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
135
|
+
|
|
136
|
+
expect(operationsBoard).not.toHaveBeenCalled();
|
|
137
|
+
expect(boardInitialPageRef.current).toEqual(new Set());
|
|
138
|
+
cleanup?.();
|
|
139
|
+
});
|
|
140
|
+
});
|