Skip to content

Run 1: Infrastructure and Scaffolding

This run covers Wave 0a (dependency and environment verification) and Wave 0b (structural scaffolding). It produces no new user-facing components but establishes every shared foundation that Runs 2-4 depend on: the utilities directory, shared types, canvas helpers, ShadCN primitives, Badge extension, mock data, and the full directory scaffold.

#CriterionVerification CommandExpected Output
1main is up-to-date with origingit -C /Users/jmp/code/arda/image-components-worktrees/run-1 fetch origin && git -C /Users/jmp/code/arda/image-components-worktrees/run-1 diff origin/main jmpicnic/item-image-upload-components --statEmpty diff — no lines changed
2Worktree exists at image-components-worktrees/run-1 on branch jmpicnic/item-image-upload-componentsgit -C /Users/jmp/code/arda/image-components-worktrees/run-1 branch --show-currentjmpicnic/item-image-upload-components
3Existing lint check passesnpm --prefix /Users/jmp/code/arda/image-components-worktrees/run-1 run lintExit 0, zero warnings
4Existing Storybook build passesnpm --prefix /Users/jmp/code/arda/image-components-worktrees/run-1 run build-storybookExit 0
5Existing unit test suite passesnpm --prefix /Users/jmp/code/arda/image-components-worktrees/run-1 run testExit 0, all tests green
#ArtifactPathFormat / Schema
A1Utilities directorysrc/types/canary/utilities/Directory containing TypeScript modules and barrel
A2Utility types modulesrc/types/canary/utilities/image-field-config.ts.ts — exports: ImageMimeType, ImageFieldStaticConfig, ImageFieldInitConfig, ImageFieldConfig, ImageInput, ImageUploadResult, CropData, PixelCrop
A3Utilities barrelsrc/types/canary/utilities/index.ts.ts — re-exports all from utils, pagination, date-time, image-field-config, get-initials, get-cropped-image
A4getInitials helpersrc/types/canary/utilities/get-initials.ts.ts — named export getInitials(name: string): string
A5getInitials testssrc/types/canary/utilities/get-initials.test.tsVitest — 8 tests
A6getCroppedImage helpersrc/types/canary/utilities/get-cropped-image.ts.ts — named export getCroppedImage(imageSrc: string, pixelCrop: PixelCrop): Promise<Blob>
A7getCroppedImage testssrc/types/canary/utilities/get-cropped-image.test.tsVitest — 5 tests
A8Utilities MDX pagesrc/types/canary/utilities/utilities.mdxStorybook MDX — prose overview with Canvas embeds for getInitials and getCroppedImage
A9alert-dialog primitivesrc/components/canary/primitives/alert-dialog.tsxShadCN primitive, Radix UI
A10checkbox primitivesrc/components/canary/primitives/checkbox.tsxShadCN primitive, Radix UI
A11popover primitivesrc/components/canary/primitives/popover.tsxShadCN primitive, Radix UI
A12progress primitivesrc/components/canary/primitives/progress.tsxShadCN primitive, Radix UI
A13slider primitivesrc/components/canary/primitives/slider.tsxShadCN primitive, Radix UI
A14aspect-ratio primitivesrc/components/canary/primitives/aspect-ratio.tsxShadCN primitive, Radix UI
A15Badge error-overlay variantsrc/components/canary/atoms/badge/badge-base.tsxCVA variant addition — error-overlay entry in variant map
A16Badge unit testssrc/components/canary/atoms/badge/badge-base.test.tsxVitest — 4 new tests for error-overlay variant
A17Badge updated storiessrc/components/canary/atoms/badge/badge-base.stories.tsx3 new stories + updated Playground and AllVariants
A18Mock data modulesrc/components/canary/__mocks__/image-story-data.ts.ts — exports: MOCK_ITEM_IMAGE, MOCK_ITEMS, ITEM_IMAGE_CONFIG, mockUpload, mockReachabilityCheck
A19Molecule directory scaffoldsrc/components/canary/molecules/form/index.ts and siblingsEmpty barrel index.ts in each of: form/, image-display/, image-drop-zone/, image-preview-editor/, image-hover-preview/, image-inspector-overlay/, image-comparison-layout/
A20Atom directory scaffoldsrc/components/canary/atoms/grid/image/index.ts and atoms/copyright-acknowledgment/index.tsEmpty barrel index.ts in each
A21Organism directory scaffoldsrc/components/canary/organisms/shared/image-upload-dialog/index.tsEmpty barrel index.ts
A22Skeleton shimmer verificationsrc/components/canary/primitives/skeleton.tsx + src/styles/globals.css@keyframes shimmer present in @theme block; Skeleton renders animated shimmer
A23Primitive context stories — Skeletonsrc/components/canary/primitives/skeleton-image.stories.tsx3 stories: Default, ImagePlaceholder, GalleryGrid
A24Primitive context stories — Tabssrc/components/canary/primitives/tabs-image.stories.tsx2 stories: Default, ImageDetailTabs
A25Primitive context stories — AlertDialogsrc/components/canary/primitives/alert-dialog-image.stories.tsx2 stories: Default, DeleteConfirmation
#TaskPersonaDepends OnStatusAcceptance Criteria
1.1Verify and update dependencies to latest compatible minor/patch versionsfront-end-engineerPendingnpm outdated returns no minor/patch updates; lint, build-storybook, and test all exit 0
1.2Install react-easy-crop, browser-image-compression, heic2anyfront-end-engineer1.1PendingPackages present in package.json; npm ls react-easy-crop resolves without peer warnings
1.3Move utils.ts, pagination.ts, date-time.ts to src/types/canary/utilities/; update all imports; create barrel index.tsfront-end-engineer1.2PendingNo broken imports anywhere in the codebase; all checks (lint, build-storybook, test) exit 0
1.4Create image-field-config.ts with all eight image-domain types; export from barrelfront-end-engineer1.3PendingAll eight types compile without errors; import { ImageFieldConfig } from '../utilities' resolves in a scratch check
1.5Extract getInitials from item-grid-columns.tsx to utilities/get-initials.ts; update source import; write get-initials.test.ts (8 tests)front-end-engineer1.3Pending8 tests pass; item-grid-columns.tsx behavior is unchanged; helper exported from barrel
1.6Create utilities/get-cropped-image.ts (canvas helper); write get-cropped-image.test.ts (5 tests)front-end-engineer1.3Pending5 tests pass; function exported from barrel
1.7Add ShadCN primitives: alert-dialog, checkbox, popover, progress, slider, aspect-ratio to primitives/front-end-engineer1.2PendingEach primitive file imports and renders in a manual smoke test; Storybook build exits 0
1.8Add error-overlay variant to Badge CVA in badge-base.tsx; write 4 unit tests; add 3 new stories and update Playground + AllVariantsfront-end-engineer1.7Pending4 new Badge tests pass; 3 new stories visible in Storybook; lint exits 0
1.9Verify shimmer animation in Skeleton primitive; if absent, add @keyframes shimmer to globals.css @theme blockfront-end-engineerPendingSkeleton component shows animated shimmer in Storybook; Storybook build exits 0
1.10Create src/components/canary/__mocks__/image-story-data.ts with all five exportsfront-end-engineer1.4PendingFile exists; TypeScript compiles it without errors; all five named exports are accessible
1.11Scaffold all target directories: 7 molecule subdirs, 2 atom subdirs, 1 organism subdir — each with empty index.tsfront-end-engineerPendingAll 10 directories and their index.ts files exist on disk
1.12Create primitive context stories: skeleton-image.stories.tsx (3 stories), tabs-image.stories.tsx (2 stories), alert-dialog-image.stories.tsx (2 stories)front-end-engineer1.7Pending7 stories render in Storybook; Storybook build exits 0
1.13Create utilities/utilities.mdx documenting getInitials and getCroppedImage with prose overview and Canvas embedsfront-end-engineer1.5, 1.6PendingMDX page renders in Storybook without acorn parse errors; Storybook build exits 0

Tasks that can begin immediately (no dependencies within this run):

  • 1.1 — baseline dependency check; must complete first
  • 1.9 — shimmer verification is independent of all other tasks
  • 1.11 — directory scaffolding is independent of all other tasks

Tasks that unlock after 1.1:

  • 1.2 (install packages) — unblocks 1.3 and 1.7

Tasks that unlock after 1.2:

  • 1.3 (move utilities) — unblocks 1.4, 1.5, 1.6
  • 1.7 (ShadCN primitives) — unblocks 1.8 and 1.12

Tasks that unlock after 1.3:

  • 1.4 (image types) — unblocks 1.10
  • 1.5 (getInitials) — can run in parallel with 1.6
  • 1.6 (getCroppedImage) — can run in parallel with 1.5

Tasks that unlock after 1.5 and 1.6:

  • 1.13 (utilities MDX) — requires both helpers to exist
1.1 → 1.2 → 1.3 → 1.4 → 1.10
→ 1.5 ──┐
→ 1.6 ──┴→ 1.13
1.2 → 1.7 → 1.8
→ 1.12
1.9 (independent)
1.11 (independent)
#CriterionVerification CommandExpected Output
1Lint passes with zero warningsnpm --prefix /Users/jmp/code/arda/image-components-worktrees/run-1 run lintExit 0
2Storybook builds cleanlynpm --prefix /Users/jmp/code/arda/image-components-worktrees/run-1 run build-storybookExit 0
3All unit tests passnpm --prefix /Users/jmp/code/arda/image-components-worktrees/run-1 run testExit 0
413 new utility unit tests present and passingnpm --prefix /Users/jmp/code/arda/image-components-worktrees/run-1 run test -- --reporter=verbose 2>&1 | grep -E "(get-initials|get-cropped-image)"8 getInitials tests + 5 getCroppedImage tests all marked PASS
54 new Badge error-overlay tests present and passingnpm --prefix /Users/jmp/code/arda/image-components-worktrees/run-1 run test -- --reporter=verbose 2>&1 | grep -E "badge-base"4 new tests marked PASS
67 primitive context stories render in Storybook build outputInspect storybook-static/ index for skeleton-image, tabs-image, alert-dialog-image story entries7 story entries present
7All utility types exported from barrelnode -e "const u = require('./src/types/canary/utilities'); console.log(Object.keys(u))" (or equivalent TypeScript check)Keys include ImageFieldConfig, ImageMimeType, ImageInput, ImageUploadResult, CropData, PixelCrop, getInitials, getCroppedImage
ArtifactConsumer RunPath
Utilities directory (types, helpers, barrel)Runs 2, 3, 4src/types/canary/utilities/
ImageFieldConfig and related typesRuns 2, 3, 4src/types/canary/utilities/image-field-config.ts
getInitials helperRun 2 (Avatar refactor)src/types/canary/utilities/get-initials.ts
getCroppedImage helperRun 2 (ImagePreviewEditor)src/types/canary/utilities/get-cropped-image.ts
alert-dialog primitiveRun 2 (ImageDisplay), Run 4 (ImageUploadDialog)src/components/canary/primitives/alert-dialog.tsx
checkbox primitiveRun 2 (ImageDropZone)src/components/canary/primitives/checkbox.tsx
popover primitiveRun 3 (ImageHoverPreview)src/components/canary/primitives/popover.tsx
progress primitiveRun 2 (ImageDropZone, ImagePreviewEditor)src/components/canary/primitives/progress.tsx
slider primitiveRun 2 (ImagePreviewEditor)src/components/canary/primitives/slider.tsx
aspect-ratio primitiveRun 2 (ImageDisplay)src/components/canary/primitives/aspect-ratio.tsx
Badge error-overlay variantRun 2 (ImageDisplay)src/components/canary/atoms/badge/badge-base.tsx
Mock data moduleRuns 2, 3, 4src/components/canary/__mocks__/image-story-data.ts
Scaffolded molecule directoriesRuns 2, 3src/components/canary/molecules/{form,image-display,image-drop-zone,image-preview-editor,image-hover-preview,image-inspector-overlay,image-comparison-layout}/
Scaffolded atom directoriesRuns 2, 4src/components/canary/atoms/grid/image/, src/components/canary/atoms/copyright-acknowledgment/
Scaffolded organism directoryRun 4src/components/canary/organisms/shared/image-upload-dialog/

Copyright: (c) Arda Systems 2025-2026, All rights reserved