fix(ci): fix pipeline #366 — web @mosaic/ui build, Dockerfile find bug, event handler types #366

Merged
jason.woltje merged 1 commits from fix/ci-366 into develop 2026-02-13 00:27:48 +00:00
12 changed files with 37 additions and 23 deletions

View File

@@ -50,6 +50,7 @@ steps:
commands:
- *use_deps
- pnpm --filter "@mosaic/shared" build
- pnpm --filter "@mosaic/ui" build
depends_on:
- install

View File

@@ -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

View File

@@ -180,7 +180,7 @@ export default function CredentialAuditPage(): React.ReactElement {
<Input
type="date"
value={filters.startDate ?? ""}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
handleFilterChange("startDate", e.target.value);
}}
/>
@@ -192,7 +192,7 @@ export default function CredentialAuditPage(): React.ReactElement {
<Input
type="date"
value={filters.endDate ?? ""}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
handleFilterChange("endDate", e.target.value);
}}
/>

View File

@@ -125,7 +125,7 @@ function TeamsPageContent(): ReactElement {
<Input
label="Team Name"
value={newTeamName}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setNewTeamName(e.target.value);
}}
placeholder="Enter team name"
@@ -136,7 +136,7 @@ function TeamsPageContent(): ReactElement {
<Input
label="Description (optional)"
value={newTeamDescription}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setNewTeamDescription(e.target.value);
}}
placeholder="Enter team description"

View File

@@ -27,7 +27,7 @@ export function LogoutButton({
};
return (
<Button variant={variant} onClick={handleSignOut} className={className}>
<Button variant={variant} onClick={() => void handleSignOut()} className={className}>
Sign Out
</Button>
);

View File

@@ -116,7 +116,7 @@ export function CreateCredentialDialog({
<Input
id="name"
value={formData.name}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
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<HTMLInputElement>) => {
setFormData({ ...formData, value: e.target.value });
}}
placeholder="Enter credential value"
@@ -195,7 +195,7 @@ export function CreateCredentialDialog({
<Textarea
id="description"
value={formData.description}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
setFormData({ ...formData, description: e.target.value });
}}
placeholder="Optional description"
@@ -211,7 +211,7 @@ export function CreateCredentialDialog({
id="expiresAt"
type="date"
value={formData.expiresAt}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setFormData({ ...formData, expiresAt: e.target.value });
}}
disabled={isSubmitting}

View File

@@ -99,7 +99,7 @@ export function EditCredentialDialog({
<Input
id="edit-name"
value={formData.name}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setFormData({ ...formData, name: e.target.value });
}}
placeholder="e.g., GitHub Personal Token"
@@ -113,7 +113,7 @@ export function EditCredentialDialog({
<Textarea
id="edit-description"
value={formData.description}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
setFormData({ ...formData, description: e.target.value });
}}
placeholder="Optional description"
@@ -129,7 +129,7 @@ export function EditCredentialDialog({
id="edit-expiresAt"
type="date"
value={formData.expiresAt}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setFormData({ ...formData, expiresAt: e.target.value });
}}
disabled={isSubmitting}

View File

@@ -101,7 +101,7 @@ export function RotateCredentialDialog({
id="rotate-new-value"
type="password"
value={newValue}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setNewValue(e.target.value);
}}
placeholder="Enter new credential value"
@@ -116,7 +116,7 @@ export function RotateCredentialDialog({
id="rotate-confirm-value"
type="password"
value={confirmValue}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setConfirmValue(e.target.value);
}}
placeholder="Re-enter new credential value"

View File

@@ -82,7 +82,7 @@ export function PersonalityForm({
<Input
id="name"
value={formData.name}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setFormData({ ...formData, name: e.target.value });
}}
placeholder="e.g., Professional, Casual, Friendly"
@@ -96,7 +96,7 @@ export function PersonalityForm({
<Textarea
id="description"
value={formData.description}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
setFormData({ ...formData, description: e.target.value });
}}
placeholder="Brief description of this personality style"
@@ -110,7 +110,7 @@ export function PersonalityForm({
<Input
id="tone"
value={formData.tone}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setFormData({ ...formData, tone: e.target.value });
}}
placeholder="e.g., professional, friendly, enthusiastic"
@@ -146,7 +146,7 @@ export function PersonalityForm({
<Textarea
id="systemPrompt"
value={formData.systemPromptTemplate}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
setFormData({ ...formData, systemPromptTemplate: e.target.value });
}}
placeholder="You are a helpful AI assistant..."

View File

@@ -136,7 +136,7 @@ export function TeamMemberList({
label: `${user.name} (${user.email})`,
}))}
value={selectedUserId}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {
setSelectedUserId(e.target.value);
}}
placeholder="Select a user..."
@@ -148,7 +148,7 @@ export function TeamMemberList({
<Select
options={roleOptions}
value={selectedRole}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {
setSelectedRole(e.target.value as TeamMemberRole);
}}
fullWidth

View File

@@ -69,7 +69,7 @@ export function TeamSettings({ team, onUpdate, onDelete }: TeamSettingsProps): R
<Input
label="Team Name"
value={name}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
setName(e.target.value);
setIsEditing(true);
}}
@@ -81,7 +81,7 @@ export function TeamSettings({ team, onUpdate, onDelete }: TeamSettingsProps): R
<Textarea
label="Description"
value={description}
onChange={(e) => {
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
setDescription(e.target.value);
setIsEditing(true);
}}

View File

@@ -61,3 +61,16 @@
| CI-FIX5-001 | done | Add build-shared step to web.yml (fixes lint/typecheck/test: @mosaic/shared not found) | #364 | ci | develop | | CI-FIX5-003 | worker-12 | 2026-02-12T18:00Z | 2026-02-12T18:02Z | 5K | 3K |
| CI-FIX5-002 | done | Remove compiled test files from orchestrator production image (Trivy secret scan false positives) | #365 | orchestrator | develop | | CI-FIX5-003 | worker-13 | 2026-02-12T18:00Z | 2026-02-12T18:02Z | 5K | 3K |
| CI-FIX5-003 | done | Verification: validate all pipeline #365 fixes | | all | develop | CI-FIX5-001,CI-FIX5-002 | | orch | 2026-02-12T18:03Z | 2026-02-12T18:04Z | 3K | 1K |
## Pipeline #366 Fixes
**Branch:** fix/ci-366
**Reports:** docs/reports/ci/mosaic-stack-366-\*.log
**Root causes:** (1) web.yml build-shared missing @mosaic/ui build, (2) Dockerfile find -o without parens, (3) untyped event handlers
| id | status | description | issue | repo | branch | depends_on | blocks | agent | started_at | completed_at | estimate | used |
| ----------- | ------ | -------------------------------------------------------------------------------------------- | ----- | ------------ | ---------- | ----------------------- | ----------- | ----- | ----------------- | ----------------- | -------- | ---- |
| CI-FIX6-001 | done | Add @mosaic/ui build to web.yml build-shared step (fixes 10 test suites + 20 typecheck errs) | | ci | fix/ci-366 | | CI-FIX6-003 | w-14 | 2026-02-12T21:00Z | 2026-02-12T21:01Z | 3K | 3K |
| CI-FIX6-002 | done | Fix Dockerfile find -o parentheses bug (fixes 5 Trivy false positives in spec files) | | orchestrator | fix/ci-366 | | CI-FIX6-004 | w-15 | 2026-02-12T21:00Z | 2026-02-12T21:01Z | 3K | 3K |
| CI-FIX6-003 | done | Add React.ChangeEvent types to ~10 web files with untyped event handlers (49 lint + 19 TS) | | web | fix/ci-366 | CI-FIX6-001 | CI-FIX6-004 | w-16 | 2026-02-12T21:02Z | 2026-02-12T21:08Z | 12K | 8K |
| CI-FIX6-004 | done | Verification: pnpm lint && pnpm typecheck && pnpm test on web; Dockerfile find validation | | all | fix/ci-366 | CI-FIX6-002,CI-FIX6-003 | | orch | 2026-02-12T21:08Z | 2026-02-12T21:10Z | 5K | 2K |