Merge pull request 'fix(ci): fix pipeline #366 — web @mosaic/ui build, Dockerfile find bug, event handler types' (#366) from fix/ci-366 into develop
Some checks failed
ci/woodpecker/push/orchestrator Pipeline failed
ci/woodpecker/push/web Pipeline failed
ci/woodpecker/manual/infra Pipeline was successful
ci/woodpecker/manual/orchestrator Pipeline failed
ci/woodpecker/manual/coordinator Pipeline was successful
ci/woodpecker/manual/api Pipeline was successful
ci/woodpecker/manual/web Pipeline failed
Some checks failed
ci/woodpecker/push/orchestrator Pipeline failed
ci/woodpecker/push/web Pipeline failed
ci/woodpecker/manual/infra Pipeline was successful
ci/woodpecker/manual/orchestrator Pipeline failed
ci/woodpecker/manual/coordinator Pipeline was successful
ci/woodpecker/manual/api Pipeline was successful
ci/woodpecker/manual/web Pipeline failed
Reviewed-on: #366
This commit was merged in pull request #366.
This commit is contained in:
@@ -50,6 +50,7 @@ steps:
|
||||
commands:
|
||||
- *use_deps
|
||||
- pnpm --filter "@mosaic/shared" build
|
||||
- pnpm --filter "@mosaic/ui" build
|
||||
depends_on:
|
||||
- install
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}}
|
||||
|
||||
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user