fix(ci): fix pipeline #366 — web @mosaic/ui build, Dockerfile find bug, event handler types #366
@@ -50,6 +50,7 @@ steps:
|
|||||||
commands:
|
commands:
|
||||||
- *use_deps
|
- *use_deps
|
||||||
- pnpm --filter "@mosaic/shared" build
|
- pnpm --filter "@mosaic/shared" build
|
||||||
|
- pnpm --filter "@mosaic/ui" build
|
||||||
depends_on:
|
depends_on:
|
||||||
- install
|
- install
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ COPY --from=builder --chown=nestjs:nodejs /app/packages ./packages
|
|||||||
# Copy built orchestrator application
|
# Copy built orchestrator application
|
||||||
COPY --from=builder --chown=nestjs:nodejs /app/apps/orchestrator/dist ./apps/orchestrator/dist
|
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)
|
# 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 --from=builder --chown=nestjs:nodejs /app/apps/orchestrator/package.json ./apps/orchestrator/
|
||||||
|
|
||||||
# Copy app's node_modules which contains symlinks to root node_modules
|
# Copy app's node_modules which contains symlinks to root node_modules
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ export default function CredentialAuditPage(): React.ReactElement {
|
|||||||
<Input
|
<Input
|
||||||
type="date"
|
type="date"
|
||||||
value={filters.startDate ?? ""}
|
value={filters.startDate ?? ""}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
handleFilterChange("startDate", e.target.value);
|
handleFilterChange("startDate", e.target.value);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@@ -192,7 +192,7 @@ export default function CredentialAuditPage(): React.ReactElement {
|
|||||||
<Input
|
<Input
|
||||||
type="date"
|
type="date"
|
||||||
value={filters.endDate ?? ""}
|
value={filters.endDate ?? ""}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
handleFilterChange("endDate", e.target.value);
|
handleFilterChange("endDate", e.target.value);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ function TeamsPageContent(): ReactElement {
|
|||||||
<Input
|
<Input
|
||||||
label="Team Name"
|
label="Team Name"
|
||||||
value={newTeamName}
|
value={newTeamName}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setNewTeamName(e.target.value);
|
setNewTeamName(e.target.value);
|
||||||
}}
|
}}
|
||||||
placeholder="Enter team name"
|
placeholder="Enter team name"
|
||||||
@@ -136,7 +136,7 @@ function TeamsPageContent(): ReactElement {
|
|||||||
<Input
|
<Input
|
||||||
label="Description (optional)"
|
label="Description (optional)"
|
||||||
value={newTeamDescription}
|
value={newTeamDescription}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setNewTeamDescription(e.target.value);
|
setNewTeamDescription(e.target.value);
|
||||||
}}
|
}}
|
||||||
placeholder="Enter team description"
|
placeholder="Enter team description"
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export function LogoutButton({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Button variant={variant} onClick={handleSignOut} className={className}>
|
<Button variant={variant} onClick={() => void handleSignOut()} className={className}>
|
||||||
Sign Out
|
Sign Out
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ export function CreateCredentialDialog({
|
|||||||
<Input
|
<Input
|
||||||
id="name"
|
id="name"
|
||||||
value={formData.name}
|
value={formData.name}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setFormData({ ...formData, name: e.target.value });
|
setFormData({ ...formData, name: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="e.g., GitHub Personal Token"
|
placeholder="e.g., GitHub Personal Token"
|
||||||
@@ -178,7 +178,7 @@ export function CreateCredentialDialog({
|
|||||||
id="value"
|
id="value"
|
||||||
type="password"
|
type="password"
|
||||||
value={formData.value}
|
value={formData.value}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setFormData({ ...formData, value: e.target.value });
|
setFormData({ ...formData, value: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="Enter credential value"
|
placeholder="Enter credential value"
|
||||||
@@ -195,7 +195,7 @@ export function CreateCredentialDialog({
|
|||||||
<Textarea
|
<Textarea
|
||||||
id="description"
|
id="description"
|
||||||
value={formData.description}
|
value={formData.description}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
setFormData({ ...formData, description: e.target.value });
|
setFormData({ ...formData, description: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="Optional description"
|
placeholder="Optional description"
|
||||||
@@ -211,7 +211,7 @@ export function CreateCredentialDialog({
|
|||||||
id="expiresAt"
|
id="expiresAt"
|
||||||
type="date"
|
type="date"
|
||||||
value={formData.expiresAt}
|
value={formData.expiresAt}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setFormData({ ...formData, expiresAt: e.target.value });
|
setFormData({ ...formData, expiresAt: e.target.value });
|
||||||
}}
|
}}
|
||||||
disabled={isSubmitting}
|
disabled={isSubmitting}
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ export function EditCredentialDialog({
|
|||||||
<Input
|
<Input
|
||||||
id="edit-name"
|
id="edit-name"
|
||||||
value={formData.name}
|
value={formData.name}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setFormData({ ...formData, name: e.target.value });
|
setFormData({ ...formData, name: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="e.g., GitHub Personal Token"
|
placeholder="e.g., GitHub Personal Token"
|
||||||
@@ -113,7 +113,7 @@ export function EditCredentialDialog({
|
|||||||
<Textarea
|
<Textarea
|
||||||
id="edit-description"
|
id="edit-description"
|
||||||
value={formData.description}
|
value={formData.description}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
setFormData({ ...formData, description: e.target.value });
|
setFormData({ ...formData, description: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="Optional description"
|
placeholder="Optional description"
|
||||||
@@ -129,7 +129,7 @@ export function EditCredentialDialog({
|
|||||||
id="edit-expiresAt"
|
id="edit-expiresAt"
|
||||||
type="date"
|
type="date"
|
||||||
value={formData.expiresAt}
|
value={formData.expiresAt}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setFormData({ ...formData, expiresAt: e.target.value });
|
setFormData({ ...formData, expiresAt: e.target.value });
|
||||||
}}
|
}}
|
||||||
disabled={isSubmitting}
|
disabled={isSubmitting}
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ export function RotateCredentialDialog({
|
|||||||
id="rotate-new-value"
|
id="rotate-new-value"
|
||||||
type="password"
|
type="password"
|
||||||
value={newValue}
|
value={newValue}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setNewValue(e.target.value);
|
setNewValue(e.target.value);
|
||||||
}}
|
}}
|
||||||
placeholder="Enter new credential value"
|
placeholder="Enter new credential value"
|
||||||
@@ -116,7 +116,7 @@ export function RotateCredentialDialog({
|
|||||||
id="rotate-confirm-value"
|
id="rotate-confirm-value"
|
||||||
type="password"
|
type="password"
|
||||||
value={confirmValue}
|
value={confirmValue}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setConfirmValue(e.target.value);
|
setConfirmValue(e.target.value);
|
||||||
}}
|
}}
|
||||||
placeholder="Re-enter new credential value"
|
placeholder="Re-enter new credential value"
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export function PersonalityForm({
|
|||||||
<Input
|
<Input
|
||||||
id="name"
|
id="name"
|
||||||
value={formData.name}
|
value={formData.name}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setFormData({ ...formData, name: e.target.value });
|
setFormData({ ...formData, name: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="e.g., Professional, Casual, Friendly"
|
placeholder="e.g., Professional, Casual, Friendly"
|
||||||
@@ -96,7 +96,7 @@ export function PersonalityForm({
|
|||||||
<Textarea
|
<Textarea
|
||||||
id="description"
|
id="description"
|
||||||
value={formData.description}
|
value={formData.description}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
setFormData({ ...formData, description: e.target.value });
|
setFormData({ ...formData, description: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="Brief description of this personality style"
|
placeholder="Brief description of this personality style"
|
||||||
@@ -110,7 +110,7 @@ export function PersonalityForm({
|
|||||||
<Input
|
<Input
|
||||||
id="tone"
|
id="tone"
|
||||||
value={formData.tone}
|
value={formData.tone}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setFormData({ ...formData, tone: e.target.value });
|
setFormData({ ...formData, tone: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="e.g., professional, friendly, enthusiastic"
|
placeholder="e.g., professional, friendly, enthusiastic"
|
||||||
@@ -146,7 +146,7 @@ export function PersonalityForm({
|
|||||||
<Textarea
|
<Textarea
|
||||||
id="systemPrompt"
|
id="systemPrompt"
|
||||||
value={formData.systemPromptTemplate}
|
value={formData.systemPromptTemplate}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
setFormData({ ...formData, systemPromptTemplate: e.target.value });
|
setFormData({ ...formData, systemPromptTemplate: e.target.value });
|
||||||
}}
|
}}
|
||||||
placeholder="You are a helpful AI assistant..."
|
placeholder="You are a helpful AI assistant..."
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ export function TeamMemberList({
|
|||||||
label: `${user.name} (${user.email})`,
|
label: `${user.name} (${user.email})`,
|
||||||
}))}
|
}))}
|
||||||
value={selectedUserId}
|
value={selectedUserId}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {
|
||||||
setSelectedUserId(e.target.value);
|
setSelectedUserId(e.target.value);
|
||||||
}}
|
}}
|
||||||
placeholder="Select a user..."
|
placeholder="Select a user..."
|
||||||
@@ -148,7 +148,7 @@ export function TeamMemberList({
|
|||||||
<Select
|
<Select
|
||||||
options={roleOptions}
|
options={roleOptions}
|
||||||
value={selectedRole}
|
value={selectedRole}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {
|
||||||
setSelectedRole(e.target.value as TeamMemberRole);
|
setSelectedRole(e.target.value as TeamMemberRole);
|
||||||
}}
|
}}
|
||||||
fullWidth
|
fullWidth
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ export function TeamSettings({ team, onUpdate, onDelete }: TeamSettingsProps): R
|
|||||||
<Input
|
<Input
|
||||||
label="Team Name"
|
label="Team Name"
|
||||||
value={name}
|
value={name}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setName(e.target.value);
|
setName(e.target.value);
|
||||||
setIsEditing(true);
|
setIsEditing(true);
|
||||||
}}
|
}}
|
||||||
@@ -81,7 +81,7 @@ export function TeamSettings({ team, onUpdate, onDelete }: TeamSettingsProps): R
|
|||||||
<Textarea
|
<Textarea
|
||||||
label="Description"
|
label="Description"
|
||||||
value={description}
|
value={description}
|
||||||
onChange={(e) => {
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
setDescription(e.target.value);
|
setDescription(e.target.value);
|
||||||
setIsEditing(true);
|
setIsEditing(true);
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -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-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-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 |
|
| 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 |
|
||||||
|
|||||||
Reference in New Issue
Block a user