@zaip-ai/cli 1.0.8 → 1.3.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 +1 -1
- package/dist/services/adapters.d.ts +1 -1
- package/dist/services/adapters.js +1 -1
- package/dist/services/agent-adapters.js +2 -2
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-adapters.test.js +5 -0
- package/dist/services/agent-adapters.test.js.map +1 -1
- package/dist/services/logger.test.js +2 -2
- package/dist/services/runtime-template.test.js +6 -6
- package/dist/services/template-manifest.d.ts.map +1 -1
- package/dist/services/template-manifest.js +5 -0
- package/dist/services/template-manifest.js.map +1 -1
- package/package.json +1 -1
- package/templates/.agents/architecture/software-architecture.md +131 -0
- package/templates/.agents/branding/brandbook.docx +0 -0
- package/templates/.agents/branding/brandbook.md +60 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -1
- package/templates/.agents/dashboard/.tmp-run-list.json +254 -0
- package/templates/.agents/dashboard/.zaip-managed.json +252 -136
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-Z60df2r-.js → CostCalculationGuidePage-DxR_pgSV.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-4jZLTWE_.js +2156 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-Coc6pA-1.js → PricingSettingsDialog-CKcsqb-r.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-DmmJD2Th.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BwtitWa_.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-N5Csr0RP.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DFBuc_qp.js → icons-vendor-C0fj2uU9.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-C4aIB1PV.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-CCQOHdVI.js → react-vendor-BEsJ-FYH.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-pC2_0J8x.js → traceability-B6y6Gw12.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +5 -5
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +204 -32
- package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +11 -11
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +14 -7
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +4 -2
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +3 -1
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +14 -11
- package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +19 -4
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +24 -2
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +22 -1
- package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +3 -1
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +36 -26
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +2 -2
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +40 -6
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +39 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +89 -23
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +219 -29
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +61 -7
- package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +3 -6
- package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +2 -2
- package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +3 -4
- package/templates/.agents/dashboard/apps/frontend/vite.config.ts +4 -1
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +89 -19
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +31 -16
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +43 -14
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +5 -5
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +67 -42
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +115 -39
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +188 -38
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +75 -17
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +147 -58
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +5 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +2 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +2 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +18 -7
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +95 -9
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +29 -17
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +0 -24
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +225 -424
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +24 -15
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +6 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-monitor-projection-agents.test.ts +31 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-summary-projection-duration.test.ts +414 -0
- package/templates/.agents/dashboard/modules/operations/package.json +1 -1
- package/templates/.agents/dashboard/modules/operations/src/contracts.ts +26 -23
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +31 -11
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +3 -1
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +51 -21
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +47 -5
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +1 -4
- package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +32 -10
- package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +9 -3
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +13 -5
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +12 -4
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +1 -4
- package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +1 -2
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +385 -4
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +481 -61
- package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +14 -1
- package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +4 -4
- package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +6 -4
- package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +4 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +1 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +1 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +46 -6
- package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +1 -4
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +82 -6
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +2 -1
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +1 -1
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +19 -7
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +4 -1
- package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +11 -5
- 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/contracts/src/index.ts +1 -0
- package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +152 -149
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs.metafile.json +7333 -0
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +149 -146
- package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +15 -7
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +44 -13
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +5 -2
- package/templates/.agents/dashboard/packages/local-runtime/scripts/source-size-runtime-scripts/sqlite-read-model-fixture.mjs +397 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +472 -145
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +15 -3
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +129 -31
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +153 -150
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +6 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +3 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +55 -16
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +23 -13
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +19 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +7 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +132 -9
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +126 -60
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +16 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +1861 -350
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +1218 -352
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +119 -42
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +45 -20
- 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.spec.ts +7 -5
- package/templates/.agents/design/.zaip-managed.json +3 -3
- package/templates/.agents/design/apps/catalog/package.json +1 -1
- package/templates/.agents/design/packages/local-runtime/package.json +1 -1
- package/templates/.agents/growth/estrategia-bootstrap-90-dias.md +169 -0
- package/templates/.agents/growth/strategy.md +27 -0
- package/templates/.agents/marketing/estrategia-marketing-zaip-90-dias.md +197 -0
- package/templates/.agents/marketing/strategy.md +29 -0
- package/templates/.agents/requirements/autonomous-assurance.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 +1 -1
- 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/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +30 -29
- 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 +32 -0
- package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
- package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +9 -2
- package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +39 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +1 -1
- package/templates/.agents/skills/zaip-skill-enforce-architecture/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +6 -0
- package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +6 -0
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +39 -82
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +13 -8
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +44 -14
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +19 -9
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +29 -5
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +6 -0
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +28 -5
- package/templates/.agents/zaip-aios/INDEX.md +10 -0
- package/templates/.agents/zaip-aios/README.md +2 -1
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
- package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +72 -0
- package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +330 -0
- package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +52 -0
- package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +69 -0
- package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +483 -0
- package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +85 -0
- package/templates/.agents/zaip-aios/guides/25-fontes-de-precos-openai.md +18 -0
- package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +44 -0
- package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +167 -0
- package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +144 -0
- package/templates/.agents/zaip-aios/guides/assets/diagrams/lifecycles-task-spec-prd.png +0 -0
- package/templates/.agents/zaip-aios/guides/assets/diagrams/prd-lifecycle.png +0 -0
- package/templates/.agents/zaip-aios/guides/assets/diagrams/spec-lifecycle.png +0 -0
- package/templates/.agents/zaip-aios/guides/assets/diagrams/task-lifecycle.png +0 -0
- package/templates/template-manifest.json +313 -177
- package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-Cs6dzDmW.js +0 -1505
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +0 -68
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +0 -2
|
@@ -38,7 +38,10 @@ export const maxPortAttempts = 25;
|
|
|
38
38
|
export const runtimeKind = "zaip-dashboard-sqlite-runtime";
|
|
39
39
|
const packageRoot = dirname(fileURLToPath(import.meta.url));
|
|
40
40
|
export const workspaceRoot = resolve(packageRoot, "../../../..");
|
|
41
|
-
export const workspaceKey = createHash("sha256")
|
|
41
|
+
export const workspaceKey = createHash("sha256")
|
|
42
|
+
.update(`${workspaceRoot}:dashboard-sqlite`)
|
|
43
|
+
.digest("hex")
|
|
44
|
+
.slice(0, 16);
|
|
42
45
|
export const sessionDirectory = join(tmpdir(), "zaip-aios", `dashboard-sqlite-${workspaceKey}`);
|
|
43
46
|
export const sessionPath = join(sessionDirectory, "dashboard-sqlite-session.json");
|
|
44
47
|
export const portRegistryPath = join(sessionDirectory, "dashboard-sqlite-ports.json");
|
|
@@ -283,9 +286,18 @@ async function runSqliteBuild(target) {
|
|
|
283
286
|
const command = process.execPath;
|
|
284
287
|
const args = frontend
|
|
285
288
|
? [resolve(workspaceRoot, "node_modules/vite/bin/vite.js"), "build"]
|
|
286
|
-
: [
|
|
289
|
+
: [
|
|
290
|
+
resolve(
|
|
291
|
+
workspaceRoot,
|
|
292
|
+
".agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs",
|
|
293
|
+
),
|
|
294
|
+
];
|
|
287
295
|
const output = await new Promise((resolveBuild, rejectBuild) => {
|
|
288
|
-
const child = spawn(command, args, {
|
|
296
|
+
const child = spawn(command, args, {
|
|
297
|
+
cwd: frontend ? resolve(workspaceRoot, ".agents/dashboard/apps/frontend") : packageRoot,
|
|
298
|
+
windowsHide: true,
|
|
299
|
+
stdio: "pipe",
|
|
300
|
+
});
|
|
289
301
|
let outputText = "";
|
|
290
302
|
const appendOutput = (chunk) => {
|
|
291
303
|
outputText = `${outputText}${chunk}`.slice(-8_000);
|
|
@@ -299,7 +311,9 @@ async function runSqliteBuild(target) {
|
|
|
299
311
|
if (code === 0) resolveBuild();
|
|
300
312
|
else
|
|
301
313
|
rejectBuild(
|
|
302
|
-
new Error(
|
|
314
|
+
new Error(
|
|
315
|
+
`SQLite dashboard ${target} build failed (${code}): ${formatLauncherError(outputText)}`,
|
|
316
|
+
),
|
|
303
317
|
);
|
|
304
318
|
});
|
|
305
319
|
});
|
|
@@ -544,7 +558,11 @@ export async function startDashboardLaunchPage(port) {
|
|
|
544
558
|
redirectUrl = target;
|
|
545
559
|
},
|
|
546
560
|
setProgress: (next) => {
|
|
547
|
-
progress = {
|
|
561
|
+
progress = {
|
|
562
|
+
...progress,
|
|
563
|
+
...next,
|
|
564
|
+
percent: Math.max(progress.percent, next.percent ?? progress.percent),
|
|
565
|
+
};
|
|
548
566
|
},
|
|
549
567
|
waitForRedirect: async (timeoutMs = 1_500) =>
|
|
550
568
|
Promise.race([redirectObserved, delay(timeoutMs).then(() => false)]),
|
|
@@ -628,7 +646,13 @@ export async function previousDashboardSessions({
|
|
|
628
646
|
workspaceKey,
|
|
629
647
|
});
|
|
630
648
|
}
|
|
631
|
-
async function startDashboardServer(
|
|
649
|
+
async function startDashboardServer(
|
|
650
|
+
serverPath,
|
|
651
|
+
token,
|
|
652
|
+
excludedPorts,
|
|
653
|
+
initialPort = null,
|
|
654
|
+
onProgress = () => {},
|
|
655
|
+
) {
|
|
632
656
|
const failures = [];
|
|
633
657
|
for (let attempt = 1; attempt <= maxServerStartAttempts; attempt += 1) {
|
|
634
658
|
const port =
|
|
@@ -677,15 +701,31 @@ async function startDashboardServer(serverPath, token, excludedPorts, initialPor
|
|
|
677
701
|
onProgress({
|
|
678
702
|
percent: event.percent,
|
|
679
703
|
phase: "Configurando o banco SQLite local",
|
|
680
|
-
detail:
|
|
704
|
+
detail:
|
|
705
|
+
"Esta é a instalação/atualização da cópia local descartável; nenhum servidor externo é instalado.",
|
|
681
706
|
});
|
|
682
707
|
if (event?.event === "dashboard_sqlite_startup_phase" && event.phase === "main_entered")
|
|
683
|
-
onProgress({
|
|
708
|
+
onProgress({
|
|
709
|
+
percent: 50,
|
|
710
|
+
phase: "Lendo os registros do projeto",
|
|
711
|
+
detail: "Preparando o read model SQLite local.",
|
|
712
|
+
});
|
|
684
713
|
if (event?.event === "dashboard_sqlite_read_model") snapshotCache = event.cache;
|
|
685
714
|
if (event?.event === "dashboard_sqlite_read_model")
|
|
686
|
-
onProgress({
|
|
715
|
+
onProgress({
|
|
716
|
+
percent: 82,
|
|
717
|
+
phase: "Banco local pronto",
|
|
718
|
+
detail:
|
|
719
|
+
event.cache === "rebuilt"
|
|
720
|
+
? "O read model SQLite foi reconstruído para os dados atuais."
|
|
721
|
+
: "Uma cópia local do read model foi preparada.",
|
|
722
|
+
});
|
|
687
723
|
if (event?.event === "dashboard_sqlite_startup_phase" && event.phase === "listening")
|
|
688
|
-
onProgress({
|
|
724
|
+
onProgress({
|
|
725
|
+
percent: 88,
|
|
726
|
+
phase: "Iniciando a interface",
|
|
727
|
+
detail: "Verificando saúde e disponibilidade dos dados.",
|
|
728
|
+
});
|
|
689
729
|
} catch {
|
|
690
730
|
// Only structured startup telemetry affects the user-facing progress.
|
|
691
731
|
}
|
|
@@ -707,10 +747,15 @@ async function startDashboardServer(serverPath, token, excludedPorts, initialPor
|
|
|
707
747
|
await removeGeneratedReadModel(dbPath);
|
|
708
748
|
const detail = stripTerminalControlCodes(stderr)
|
|
709
749
|
.split("\n")
|
|
710
|
-
.filter(
|
|
750
|
+
.filter(
|
|
751
|
+
(line) =>
|
|
752
|
+
!line.includes("ExperimentalWarning") && !line.includes("node --trace-warnings"),
|
|
753
|
+
)
|
|
711
754
|
.join("\n")
|
|
712
755
|
.trim();
|
|
713
|
-
failures.push(
|
|
756
|
+
failures.push(
|
|
757
|
+
`porta ${port}: ${error.message}${detail ? ` — ${formatLauncherError(detail, 600)}` : ""}`,
|
|
758
|
+
);
|
|
714
759
|
appendLauncherLog(
|
|
715
760
|
`Dashboard start attempt ${attempt} failed on port ${port}: ${error.message}`,
|
|
716
761
|
);
|
|
@@ -744,33 +789,42 @@ async function removeGeneratedReadModel(candidate) {
|
|
|
744
789
|
if (attempt < 20) await delay(250);
|
|
745
790
|
}
|
|
746
791
|
}
|
|
747
|
-
appendLauncherLog(
|
|
792
|
+
appendLauncherLog(
|
|
793
|
+
`Could not remove closed SQLite read model after retries: ${resolvedCandidate}`,
|
|
794
|
+
);
|
|
748
795
|
return false;
|
|
749
796
|
}
|
|
750
797
|
function refreshSnapshotSeedInBackground() {
|
|
751
|
-
const refreshPath = resolve(
|
|
798
|
+
const refreshPath = resolve(
|
|
799
|
+
sqliteReadModelDirectory,
|
|
800
|
+
`refresh-${process.pid}-${randomBytes(4).toString("hex")}.sqlite`,
|
|
801
|
+
);
|
|
752
802
|
const refreshStatusPath = join(sessionDirectory, "dashboard-sqlite-refresh.json");
|
|
753
803
|
const refreshLogPath = join(sessionDirectory, "dashboard-sqlite-refresh.log");
|
|
754
804
|
mkdirSync(sessionDirectory, { recursive: true });
|
|
755
805
|
const refreshLogDescriptor = openSync(refreshLogPath, "a");
|
|
756
806
|
let worker;
|
|
757
807
|
try {
|
|
758
|
-
worker = spawn(
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
808
|
+
worker = spawn(
|
|
809
|
+
process.execPath,
|
|
810
|
+
[resolve(packageRoot, "scripts/rebuild-sqlite-read-model.mjs")],
|
|
811
|
+
{
|
|
812
|
+
cwd: workspaceRoot,
|
|
813
|
+
env: {
|
|
814
|
+
...process.env,
|
|
815
|
+
ZAIP_SQLITE_DB_PATH: refreshPath,
|
|
816
|
+
ZAIP_SQLITE_PREFER_LAST_VALID_SEED: "0",
|
|
817
|
+
ZAIP_DASHBOARD_LAUNCH_PROGRESS: "0",
|
|
818
|
+
ZAIP_SQLITE_REFRESH_CLEANUP: "1",
|
|
819
|
+
ZAIP_SQLITE_CACHE_DIR: sqliteSnapshotCacheDirectory,
|
|
820
|
+
},
|
|
821
|
+
// A detached worker keeps its own append-only evidence file. Pipes can
|
|
822
|
+
// disappear with a fast launcher exit and silently abort the refresh.
|
|
823
|
+
stdio: ["ignore", refreshLogDescriptor, refreshLogDescriptor],
|
|
824
|
+
detached: true,
|
|
825
|
+
windowsHide: true,
|
|
767
826
|
},
|
|
768
|
-
|
|
769
|
-
// disappear with a fast launcher exit and silently abort the refresh.
|
|
770
|
-
stdio: ["ignore", refreshLogDescriptor, refreshLogDescriptor],
|
|
771
|
-
detached: true,
|
|
772
|
-
windowsHide: true,
|
|
773
|
-
});
|
|
827
|
+
);
|
|
774
828
|
} finally {
|
|
775
829
|
closeSync(refreshLogDescriptor);
|
|
776
830
|
}
|
|
@@ -783,11 +837,17 @@ function refreshSnapshotSeedInBackground() {
|
|
|
783
837
|
}).catch(() => {});
|
|
784
838
|
worker.once("error", (error) => {
|
|
785
839
|
appendLauncherLog(`Background SQLite seed refresh failed to start: ${error.message}`);
|
|
786
|
-
void writeJsonAtomic(refreshStatusPath, {
|
|
840
|
+
void writeJsonAtomic(refreshStatusPath, {
|
|
841
|
+
status: "failed",
|
|
842
|
+
error: error.message,
|
|
843
|
+
finishedAt: new Date().toISOString(),
|
|
844
|
+
}).catch(() => {});
|
|
787
845
|
});
|
|
788
846
|
worker.once("exit", (code) => {
|
|
789
847
|
const status = code === 0 ? "completed" : "failed";
|
|
790
|
-
appendLauncherLog(
|
|
848
|
+
appendLauncherLog(
|
|
849
|
+
`Background SQLite seed refresh ${status} (${code ?? "unknown"}); inspect ${refreshLogPath}.`,
|
|
850
|
+
);
|
|
791
851
|
void writeJsonAtomic(refreshStatusPath, {
|
|
792
852
|
status,
|
|
793
853
|
exitCode: code ?? null,
|
|
@@ -796,7 +856,9 @@ function refreshSnapshotSeedInBackground() {
|
|
|
796
856
|
}).catch(() => {});
|
|
797
857
|
});
|
|
798
858
|
worker.unref();
|
|
799
|
-
appendLauncherLog(
|
|
859
|
+
appendLauncherLog(
|
|
860
|
+
`Started background SQLite seed refresh at ${refreshPath}; cache ${sqliteSnapshotCacheDirectory}; worker log ${refreshLogPath}.`,
|
|
861
|
+
);
|
|
800
862
|
}
|
|
801
863
|
async function writeLauncherStatus(status, message = "") {
|
|
802
864
|
const path = process.env.ZAIP_LAUNCH_STATUS;
|
|
@@ -806,7 +868,15 @@ async function writeLauncherStatus(status, message = "") {
|
|
|
806
868
|
await rename(temporaryPath, path);
|
|
807
869
|
}
|
|
808
870
|
function phaseTiming(phase, startedAt, details = {}) {
|
|
809
|
-
appendLauncherLog(
|
|
871
|
+
appendLauncherLog(
|
|
872
|
+
JSON.stringify({
|
|
873
|
+
event: "dashboard_sqlite_phase",
|
|
874
|
+
phase,
|
|
875
|
+
elapsed_ms: Date.now() - startedAt,
|
|
876
|
+
launcher_pid: process.pid,
|
|
877
|
+
...details,
|
|
878
|
+
}),
|
|
879
|
+
);
|
|
810
880
|
}
|
|
811
881
|
async function main() {
|
|
812
882
|
let ownedChild = null;
|
|
@@ -827,7 +897,8 @@ async function main() {
|
|
|
827
897
|
launchPage.setProgress({
|
|
828
898
|
percent: 10,
|
|
829
899
|
phase: "Validando pré-requisitos locais",
|
|
830
|
-
detail:
|
|
900
|
+
detail:
|
|
901
|
+
"Verificando Node.js 22 e o suporte a node:sqlite; isto não instala um banco de dados.",
|
|
831
902
|
});
|
|
832
903
|
await assertDashboardPrerequisites();
|
|
833
904
|
launchPage.setProgress({
|
|
@@ -853,7 +924,9 @@ async function main() {
|
|
|
853
924
|
expectedSnapshotState: "current",
|
|
854
925
|
});
|
|
855
926
|
if (reusable !== null) {
|
|
856
|
-
appendLauncherLog(
|
|
927
|
+
appendLauncherLog(
|
|
928
|
+
`Reused healthy compatible dashboard session on port ${reusable.port}, PID ${reusable.serverPid ?? "unknown"}.`,
|
|
929
|
+
);
|
|
857
930
|
await redirectLaunchPage(launchPage, dashboardUrl(reusable.port, reusable.token));
|
|
858
931
|
launchPage = null;
|
|
859
932
|
await writeLauncherStatus("ok");
|
|
@@ -883,17 +956,21 @@ async function main() {
|
|
|
883
956
|
try {
|
|
884
957
|
launchPage.setProgress({
|
|
885
958
|
percent: 92,
|
|
886
|
-
phase:
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
959
|
+
phase:
|
|
960
|
+
snapshotCache === "stale_seed" ? "Abrindo snapshot local validado" : "Dashboard pronto",
|
|
961
|
+
detail:
|
|
962
|
+
snapshotCache === "stale_seed"
|
|
963
|
+
? "Os dados canônicos estão sendo atualizados em segundo plano para a próxima abertura."
|
|
964
|
+
: "Validando saúde e dados iniciais antes de abrir a tela principal.",
|
|
890
965
|
});
|
|
891
966
|
if (snapshotCache === "stale_seed") await delay(350);
|
|
892
|
-
await redirectLaunchPage(
|
|
967
|
+
await redirectLaunchPage(
|
|
968
|
+
launchPage,
|
|
969
|
+
dashboardUrl(port, token, snapshotCache === "stale_seed"),
|
|
970
|
+
);
|
|
893
971
|
phaseTiming("handoff_complete", launchStartedAt, { server_pid: child.pid, port });
|
|
894
972
|
launchPage = null;
|
|
895
|
-
if (snapshotCache === "stale_seed")
|
|
896
|
-
refreshSnapshotSeedInBackground();
|
|
973
|
+
if (snapshotCache === "stale_seed") refreshSnapshotSeedInBackground();
|
|
897
974
|
currentSession = {
|
|
898
975
|
kind: runtimeKind,
|
|
899
976
|
workspace: workspaceRoot,
|
|
@@ -5,8 +5,8 @@ import { tmpdir } from "node:os";
|
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { afterEach, describe, expect, it } from "vitest";
|
|
7
7
|
import {
|
|
8
|
-
browserLaunchCommands,
|
|
9
8
|
assertDashboardPrerequisites,
|
|
9
|
+
browserLaunchCommands,
|
|
10
10
|
findAvailablePort,
|
|
11
11
|
findAvailablePortWithFallback,
|
|
12
12
|
findReusableDashboardSession,
|
|
@@ -59,7 +59,7 @@ describe("dashboard executable session", () => {
|
|
|
59
59
|
|
|
60
60
|
expect(source).toContain("export async function assertDashboardPrerequisites()");
|
|
61
61
|
expect(source).toContain('await import("node:sqlite")');
|
|
62
|
-
expect(source).not.toContain(
|
|
62
|
+
expect(source).not.toContain('builtinModules.includes("node:sqlite")');
|
|
63
63
|
expect(source).toContain("Node.js 22 ou superior");
|
|
64
64
|
expect(source.indexOf("await openBrowser(dashboardUrl(launchPort, token))")).toBeLessThan(
|
|
65
65
|
source.indexOf("await assertDashboardPrerequisites();"),
|
|
@@ -78,8 +78,12 @@ describe("dashboard executable session", () => {
|
|
|
78
78
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
79
79
|
expect(source).toContain("expectedBuildSignature: buildSignature,");
|
|
80
80
|
expect(source).toContain('expectedSnapshotState: "current",');
|
|
81
|
-
expect(source).toContain(
|
|
82
|
-
|
|
81
|
+
expect(source).toContain(
|
|
82
|
+
"Reused healthy compatible dashboard session on port ${reusable.port}",
|
|
83
|
+
);
|
|
84
|
+
expect(source).toContain(
|
|
85
|
+
"await redirectLaunchPage(launchPage, dashboardUrl(reusable.port, reusable.token));",
|
|
86
|
+
);
|
|
83
87
|
expect(source).toContain("const previousSessions = await previousDashboardSessions();");
|
|
84
88
|
const excludedPorts = source.slice(
|
|
85
89
|
source.indexOf("const excludedPorts = new Set(["),
|
|
@@ -94,10 +98,10 @@ describe("dashboard executable session", () => {
|
|
|
94
98
|
const lock = source.indexOf("await withLauncherLock(async () => {");
|
|
95
99
|
const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
|
|
96
100
|
const freshness = source.indexOf("const buildSignature = await ensureFreshDashboardBuild();");
|
|
97
|
-
const server = source.indexOf(
|
|
98
|
-
|
|
99
|
-
"await redirectLaunchPage(launchPage, dashboardUrl(port, token, snapshotCache === \"stale_seed\"));",
|
|
101
|
+
const server = source.indexOf(
|
|
102
|
+
"const { child, port, dbPath, snapshotCache } = await startDashboardServer(",
|
|
100
103
|
);
|
|
104
|
+
const redirectAfterServer = source.indexOf("await redirectLaunchPage(", server);
|
|
101
105
|
|
|
102
106
|
expect(lock).toBeGreaterThan(-1);
|
|
103
107
|
expect(preparation).toBeLessThan(lock);
|
|
@@ -108,7 +112,10 @@ describe("dashboard executable session", () => {
|
|
|
108
112
|
|
|
109
113
|
it("reports readiness failures as actionable without retrying a build storm", async () => {
|
|
110
114
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
111
|
-
const wait = source.slice(
|
|
115
|
+
const wait = source.slice(
|
|
116
|
+
source.indexOf("async function waitForDashboard"),
|
|
117
|
+
source.indexOf("function exists"),
|
|
118
|
+
);
|
|
112
119
|
expect(wait).toContain("Dashboard data readiness returned ${readiness.status}");
|
|
113
120
|
expect(wait).toContain("unavailable.retryable = false;");
|
|
114
121
|
expect(wait).toContain("if (error?.retryable === false) throw error;");
|
|
@@ -118,8 +125,10 @@ describe("dashboard executable session", () => {
|
|
|
118
125
|
it("streams complete structured rebuild progress records even when stderr chunks split a line", async () => {
|
|
119
126
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
120
127
|
|
|
121
|
-
expect(source).toContain(
|
|
122
|
-
expect(source).toContain(
|
|
128
|
+
expect(source).toContain('let startupTelemetryBuffer = "";');
|
|
129
|
+
expect(source).toContain(
|
|
130
|
+
"startupTelemetryBuffer = `${startupTelemetryBuffer}${String(chunk)}`;",
|
|
131
|
+
);
|
|
123
132
|
expect(source).toContain('event?.event === "dashboard_sqlite_rebuild_progress"');
|
|
124
133
|
expect(source).toContain('ZAIP_DASHBOARD_LAUNCH_PROGRESS: "1"');
|
|
125
134
|
});
|
|
@@ -127,10 +136,14 @@ describe("dashboard executable session", () => {
|
|
|
127
136
|
it("uses one durable cache and an append-only worker log for a stale snapshot refresh", async () => {
|
|
128
137
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
129
138
|
|
|
130
|
-
expect(source).toContain(
|
|
139
|
+
expect(source).toContain(
|
|
140
|
+
'const sqliteSnapshotCacheDirectory = join(sqliteReadModelDirectory, "cache");',
|
|
141
|
+
);
|
|
131
142
|
expect(source).toContain("ZAIP_SQLITE_CACHE_DIR: sqliteSnapshotCacheDirectory,");
|
|
132
|
-
expect(source).toContain(
|
|
133
|
-
|
|
143
|
+
expect(source).toContain(
|
|
144
|
+
'const refreshLogPath = join(sessionDirectory, "dashboard-sqlite-refresh.log");',
|
|
145
|
+
);
|
|
146
|
+
expect(source).toContain('stdio: ["ignore", refreshLogDescriptor, refreshLogDescriptor]');
|
|
134
147
|
expect(source).toContain("worker log ${refreshLogPath}");
|
|
135
148
|
});
|
|
136
149
|
|
|
@@ -147,9 +160,10 @@ describe("dashboard executable session", () => {
|
|
|
147
160
|
|
|
148
161
|
it("tears down prior owned sessions only after the new browser handoff", async () => {
|
|
149
162
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
150
|
-
const
|
|
151
|
-
"
|
|
163
|
+
const server = source.indexOf(
|
|
164
|
+
"const { child, port, dbPath, snapshotCache } = await startDashboardServer(",
|
|
152
165
|
);
|
|
166
|
+
const redirect = source.indexOf("await redirectLaunchPage(", server);
|
|
153
167
|
const teardown = source.indexOf("for (const previous of previousSessions)");
|
|
154
168
|
|
|
155
169
|
expect(redirect).toBeGreaterThan(-1);
|
|
@@ -217,7 +231,9 @@ describe("dashboard executable session", () => {
|
|
|
217
231
|
);
|
|
218
232
|
|
|
219
233
|
const ok = source.indexOf('if (status.StartsWith("ok", StringComparison.OrdinalIgnoreCase))');
|
|
220
|
-
const warning = source.indexOf(
|
|
234
|
+
const warning = source.indexOf(
|
|
235
|
+
'if (status.StartsWith("warning", StringComparison.OrdinalIgnoreCase))',
|
|
236
|
+
);
|
|
221
237
|
const okBranch = source.slice(ok, warning);
|
|
222
238
|
|
|
223
239
|
expect(ok).toBeGreaterThan(-1);
|
|
@@ -227,7 +243,10 @@ describe("dashboard executable session", () => {
|
|
|
227
243
|
|
|
228
244
|
it("publishes ok only after Node observed both health and readiness", async () => {
|
|
229
245
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
230
|
-
const wait = source.slice(
|
|
246
|
+
const wait = source.slice(
|
|
247
|
+
source.indexOf("async function waitForDashboard"),
|
|
248
|
+
source.indexOf("function exists"),
|
|
249
|
+
);
|
|
231
250
|
|
|
232
251
|
expect(wait).toContain("dashboardHealthUrl(port)");
|
|
233
252
|
expect(wait).toContain("/api/v2/ready");
|
|
@@ -612,14 +631,20 @@ describe("dashboard executable session", () => {
|
|
|
612
631
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
613
632
|
const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
|
|
614
633
|
const lock = source.indexOf("await withLauncherLock(async () => {");
|
|
615
|
-
const buildSignature = source.indexOf(
|
|
634
|
+
const buildSignature = source.indexOf(
|
|
635
|
+
"const buildSignature = await ensureFreshDashboardBuild();",
|
|
636
|
+
);
|
|
616
637
|
const reusable = source.indexOf("const reusable = await findReusableDashboardSession({");
|
|
617
638
|
|
|
618
639
|
expect(preparation).toBeLessThan(lock);
|
|
619
640
|
expect(buildSignature).toBeGreaterThan(lock);
|
|
620
641
|
expect(reusable).toBeGreaterThan(buildSignature);
|
|
621
|
-
expect(source).toContain(
|
|
622
|
-
|
|
642
|
+
expect(source).toContain(
|
|
643
|
+
"await redirectLaunchPage(launchPage, dashboardUrl(reusable.port, reusable.token));",
|
|
644
|
+
);
|
|
645
|
+
expect(source).toContain(
|
|
646
|
+
'snapshotState: snapshotCache === "stale_seed" ? "updating" : "current",',
|
|
647
|
+
);
|
|
623
648
|
expect(source).toContain("if (launchPage !== null) await launchPage.close().catch(() => {});");
|
|
624
649
|
expect(source).toContain('await writeLauncherStatus("ok");');
|
|
625
650
|
});
|
|
@@ -425,9 +425,7 @@ test("integrates the detailed cost monitor into the main dashboard", async ({ pa
|
|
|
425
425
|
await page.locator(".cost-tabs").getByRole("button", { exact: true, name: tab }).click();
|
|
426
426
|
expect((await response).status()).toBe(200);
|
|
427
427
|
await expect(
|
|
428
|
-
page
|
|
429
|
-
.getByRole("columnheader", { name: /Tempo observado/ })
|
|
430
|
-
.or(page.locator(".ui-empty")),
|
|
428
|
+
page.getByRole("columnheader", { name: /Tempo observado/ }).or(page.locator(".ui-empty")),
|
|
431
429
|
).toBeVisible();
|
|
432
430
|
await expect(
|
|
433
431
|
page.getByRole("navigation", { name: "Paginação dos dados agregados" }),
|
|
@@ -551,7 +549,9 @@ test("groups macro work in All and reveals descendant Tasks only in Tasks", asyn
|
|
|
551
549
|
.filter({ has: page.locator(".operations-work-kind.is-spec") })
|
|
552
550
|
.first();
|
|
553
551
|
if ((await spec.count()) === 0) {
|
|
554
|
-
await expect(
|
|
552
|
+
await expect(
|
|
553
|
+
page.getByLabel("Kanban de trabalho").locator(".operations-task-card"),
|
|
554
|
+
).toHaveCount(0);
|
|
555
555
|
} else {
|
|
556
556
|
await expect(spec).toBeVisible();
|
|
557
557
|
await expect(spec.locator(".operations-work-card-counts")).toHaveText(/Tasks \d+\/\d+/);
|
|
@@ -566,7 +566,9 @@ test("groups macro work in All and reveals descendant Tasks only in Tasks", asyn
|
|
|
566
566
|
.filter({ has: page.locator(".operations-work-kind.is-prd") })
|
|
567
567
|
.first();
|
|
568
568
|
if ((await prd.count()) === 0) {
|
|
569
|
-
await expect(
|
|
569
|
+
await expect(
|
|
570
|
+
page.getByLabel("Kanban de trabalho").locator(".operations-task-card"),
|
|
571
|
+
).toHaveCount(0);
|
|
570
572
|
} else {
|
|
571
573
|
await expect(prd).toBeVisible();
|
|
572
574
|
await expect(prd.locator(".operations-work-card-counts")).toHaveText(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"files": [
|
|
5
5
|
{
|
|
6
6
|
"path": "apps/catalog/.storybook/main.ts",
|
|
@@ -220,7 +220,7 @@
|
|
|
220
220
|
},
|
|
221
221
|
{
|
|
222
222
|
"path": "apps/catalog/package.json",
|
|
223
|
-
"sha256": "
|
|
223
|
+
"sha256": "e9ffdce8dcc8ed1fed3888add953e7e789261307b8d037a6001d98a38f644279"
|
|
224
224
|
},
|
|
225
225
|
{
|
|
226
226
|
"path": "apps/catalog/public/logo_novo_azul.png",
|
|
@@ -304,7 +304,7 @@
|
|
|
304
304
|
},
|
|
305
305
|
{
|
|
306
306
|
"path": "packages/local-runtime/package.json",
|
|
307
|
-
"sha256": "
|
|
307
|
+
"sha256": "73bbd424a00481ca49bd3265183e0b505cc313484459d0701361a987f2b89057"
|
|
308
308
|
},
|
|
309
309
|
{
|
|
310
310
|
"path": "packages/local-runtime/runtime.mjs",
|