From e8a9a3087a71a0e0314e5351af0b4815a41686d1 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Thu, 12 Feb 2026 17:50:41 -0600 Subject: [PATCH] =?UTF-8?q?fix(ci):=20fix=20pipeline=20#366=20=E2=80=94=20?= =?UTF-8?q?web=20@mosaic/ui=20build,=20Dockerfile=20find=20bug,=20event=20?= =?UTF-8?q?handler=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three root causes resolved: 1. .woodpecker/web.yml: build-shared step was missing @mosaic/ui build, causing 10 test suite failures + 20 typecheck errors (TS2307) 2. apps/orchestrator/Dockerfile: find -o without parentheses only deleted last pattern's matches, leaving spec files with test fixture secrets that triggered 5 Trivy false positives (3 CRITICAL, 2 HIGH) 3. 9 web files had untyped event handler parameters (e) causing 49 lint errors and 19 typecheck errors — added React.ChangeEvent types Verification: lint 0 errors, typecheck 0 errors, tests 73/73 suites pass Co-Authored-By: Claude Opus 4.6 --- .woodpecker/web.yml | 1 + apps/orchestrator/Dockerfile | 2 +- .../settings/credentials/audit/page.tsx | 4 ++-- .../src/app/settings/workspaces/[id]/teams/page.tsx | 4 ++-- apps/web/src/components/auth/LogoutButton.tsx | 2 +- .../credentials/CreateCredentialDialog.tsx | 8 ++++---- .../components/credentials/EditCredentialDialog.tsx | 6 +++--- .../credentials/RotateCredentialDialog.tsx | 4 ++-- .../components/personalities/PersonalityForm.tsx | 8 ++++---- apps/web/src/components/team/TeamMemberList.tsx | 4 ++-- apps/web/src/components/team/TeamSettings.tsx | 4 ++-- docs/tasks.md | 13 +++++++++++++ 12 files changed, 37 insertions(+), 23 deletions(-) diff --git a/.woodpecker/web.yml b/.woodpecker/web.yml index b03a46f..cda381e 100644 --- a/.woodpecker/web.yml +++ b/.woodpecker/web.yml @@ -50,6 +50,7 @@ steps: commands: - *use_deps - pnpm --filter "@mosaic/shared" build + - pnpm --filter "@mosaic/ui" build depends_on: - install diff --git a/apps/orchestrator/Dockerfile b/apps/orchestrator/Dockerfile index 506919a..ccd9134 100644 --- a/apps/orchestrator/Dockerfile +++ b/apps/orchestrator/Dockerfile @@ -84,7 +84,7 @@ COPY --from=builder --chown=nestjs:nodejs /app/packages ./packages # Copy built orchestrator application COPY --from=builder --chown=nestjs:nodejs /app/apps/orchestrator/dist ./apps/orchestrator/dist # Remove compiled test files from production (contain test fixtures that trigger Trivy secret scanning) -RUN find ./apps/orchestrator/dist -name '*.spec.js' -o -name '*.spec.js.map' -o -name '*.test.js' -o -name '*.test.js.map' | xargs rm -f 2>/dev/null || true +RUN find ./apps/orchestrator/dist \( -name '*.spec.js' -o -name '*.spec.js.map' -o -name '*.test.js' -o -name '*.test.js.map' \) -print | xargs rm -f 2>/dev/null || true COPY --from=builder --chown=nestjs:nodejs /app/apps/orchestrator/package.json ./apps/orchestrator/ # Copy app's node_modules which contains symlinks to root node_modules diff --git a/apps/web/src/app/(authenticated)/settings/credentials/audit/page.tsx b/apps/web/src/app/(authenticated)/settings/credentials/audit/page.tsx index d7b9724..4eb77d4 100644 --- a/apps/web/src/app/(authenticated)/settings/credentials/audit/page.tsx +++ b/apps/web/src/app/(authenticated)/settings/credentials/audit/page.tsx @@ -180,7 +180,7 @@ export default function CredentialAuditPage(): React.ReactElement { { + onChange={(e: React.ChangeEvent) => { handleFilterChange("startDate", e.target.value); }} /> @@ -192,7 +192,7 @@ export default function CredentialAuditPage(): React.ReactElement { { + onChange={(e: React.ChangeEvent) => { handleFilterChange("endDate", e.target.value); }} /> diff --git a/apps/web/src/app/settings/workspaces/[id]/teams/page.tsx b/apps/web/src/app/settings/workspaces/[id]/teams/page.tsx index 71968b0..8a16d36 100644 --- a/apps/web/src/app/settings/workspaces/[id]/teams/page.tsx +++ b/apps/web/src/app/settings/workspaces/[id]/teams/page.tsx @@ -125,7 +125,7 @@ function TeamsPageContent(): ReactElement { { + onChange={(e: React.ChangeEvent) => { setNewTeamName(e.target.value); }} placeholder="Enter team name" @@ -136,7 +136,7 @@ function TeamsPageContent(): ReactElement { { + onChange={(e: React.ChangeEvent) => { setNewTeamDescription(e.target.value); }} placeholder="Enter team description" diff --git a/apps/web/src/components/auth/LogoutButton.tsx b/apps/web/src/components/auth/LogoutButton.tsx index 304d2ab..c14ff0d 100644 --- a/apps/web/src/components/auth/LogoutButton.tsx +++ b/apps/web/src/components/auth/LogoutButton.tsx @@ -27,7 +27,7 @@ export function LogoutButton({ }; return ( - ); diff --git a/apps/web/src/components/credentials/CreateCredentialDialog.tsx b/apps/web/src/components/credentials/CreateCredentialDialog.tsx index da83628..15fe0aa 100644 --- a/apps/web/src/components/credentials/CreateCredentialDialog.tsx +++ b/apps/web/src/components/credentials/CreateCredentialDialog.tsx @@ -116,7 +116,7 @@ export function CreateCredentialDialog({ { + onChange={(e: React.ChangeEvent) => { setFormData({ ...formData, name: e.target.value }); }} placeholder="e.g., GitHub Personal Token" @@ -178,7 +178,7 @@ export function CreateCredentialDialog({ id="value" type="password" value={formData.value} - onChange={(e) => { + onChange={(e: React.ChangeEvent) => { setFormData({ ...formData, value: e.target.value }); }} placeholder="Enter credential value" @@ -195,7 +195,7 @@ export function CreateCredentialDialog({