Skip to content

Releases: lsst-sqre/squareone

squareone@0.31.0

12 Feb 19:42
69d3aad

Choose a tag to compare

Minor Changes

  • #354 2d91039 Thanks @jonathansick! - Migrated four pages from Pages Router to App Router:

    • Home page (/)
    • Docs page (/docs)
    • Support page (/support)
    • API Aspect page (/api-aspect)

    Created the App Router foundation:

    • Root layout (src/app/layout.tsx) with PageShell integration
    • Providers wrapper (src/app/providers.tsx) for theme and config contexts
    • Force dynamic rendering to support runtime configuration loading
  • #383 0d1bfc3 Thanks @jonathansick! - Integrate BroadcastBannerStack with Semaphore API via semaphore-client

    The BroadcastBannerStack component now fetches broadcast messages from the Semaphore API using the new @lsst-sqre/semaphore-client package. Key changes:

    • Prefetch broadcasts in the root layout using service discovery for the Semaphore API URL
    • Consolidate BroadcastBannerStack as a client component with React Query hydration
    • Remove the legacy maintenance category from BroadcastBanner
    • Add a mock Semaphore API endpoint (/api/dev/semaphore/v1/broadcasts) for local development
  • #385 a713c75 Thanks @jonathansick! - Complete Pages Router removal

    Migrated the remaining Pages Router pages to App Router and deleted the entire src/pages/ directory:

    • terms page: Migrated to src/app/terms/page.tsx as a server component
    • enrollment pages: Migrated 4 enrollment status pages (pending-approval, pending-confirmation, thanks-for-signing-up, thanks-for-verifying) to src/app/enrollment/ using RSC MDX compilation via compileMdxForRsc()
    • Deleted framework files: _app.tsx, _document.tsx, _error.tsx (App Router uses layout.tsx, error.tsx)
    • Deleted dev-only pages: login.tsx, logout.tsx, sentry-example-page.tsx, api/sentry-example-api.ts
    • Deleted legacy modules: AppConfigContext.tsx (replaced by RSC ConfigProvider), footerLoader.ts (Pages Router MDX serialization), loadConfigAndMdx() helper

    Simplified useStaticConfig to only support the App Router ConfigProvider path, removing the AppConfigContext fallback branch. The AppConfigContextValue type is now re-exported from useStaticConfig for backward compatibility.

    squareone is now fully App Router — no Pages Router code remains.

  • #385 a03bd17 Thanks @jonathansick! - Add pino structured logging for server-side code

    • Replaced console.* calls in server-side code with pino structured JSON logging
    • Production outputs GKE-compatible JSON to stdout; development uses pino-pretty for readable output
    • Log level configurable via LOG_LEVEL environment variable (defaults to info in production, debug in development)
    • Config loading and MDX loading messages moved to debug level to reduce production noise
    • API route handlers use child loggers with route context for easier tracing
    • Client-side components remain unchanged (Sentry handles client error reporting)
  • #354 2d91039 Thanks @jonathansick! - New React Server Components-compatible utilities for loading server-side configuration and MDX content

    • Config loading (src/lib/config/rsc/loader.ts): Server-side configuration loading using React's cache() for request deduplication
    • MDX compilation (src/lib/mdx/rsc/compiler.ts): RSC-compatible MDX content compilation for server components
    • ConfigProvider (src/contexts/rsc/ConfigProvider.tsx): Context provider using React 19's use() hook to bridge server-loaded config to client components
    • useStaticConfig hook (src/hooks/useStaticConfig.ts) provides seamless configuration access across both router patterns

    These utilities enable the same configuration and content patterns used in Pages Router while leveraging RSC benefits like reduced client bundle size.

  • #357 8d837f6 Thanks @jonathansick! - New @lsst-sqre/repertoire-client package for Rubin Science Platform service discovery

    This package provides a reusable client for the Repertoire API, enabling dynamic service discovery across monorepo apps:

    • Zod schemas for runtime validation of API responses
    • ServiceDiscoveryQuery class with convenience methods for querying applications, services, and datasets
    • TanStack Query integration with discoveryQueryOptions() for server prefetching and client-side caching
    • useServiceDiscovery hook for client components with automatic hydration support
    • Mock data for development and testing

    Integrated into squareone:

    • Added TanStack Query providers with server-side prefetching in root layout
    • Components can now use useServiceDiscovery() to check service availability
    • Service URLs dynamically discovered instead of hard-coded in configuration
  • #368 0b3f783 Thanks @jonathansick! - Migrate Settings UI pages to App Router with TanStack Query

    Migrated pages:

    • /settings - Account overview with MDX content
    • /settings/tokens - Access token list with create button
    • /settings/tokens/new - Create new access token form
    • /settings/tokens/[id] - Token detail view
    • /settings/tokens/history - Token change history with pagination
    • /settings/sessions - Active sessions list
    • /settings/sessions/[id] - Session detail view
    • /settings/sessions/history - Session history with pagination
    • /settings/quotas - Resource quotas display

    New components:

    • AuthRequired - Reusable client component for auth-protected pages with login redirect
    • SettingsLayoutClient - App Router settings layout with sidebar navigation
  • #373 454db1b Thanks @jonathansick! - Migrate Times Square pages to App Router

    All Times Square pages now use Next.js App Router instead of Pages Router:

    • /times-square - Home page with GitHub repository listing
    • /times-square/github/[...tsSlug] - GitHub notebook viewer
    • /times-square/github-pr/[owner]/[repo]/[commit] - PR preview landing page
    • /times-square/github-pr/[owner]/[repo]/[commit]/[...tsSlug] - PR notebook viewer

    Key implementation details:

    • TimesSquareUrlParametersProvider - Consolidated provider using App Router navigation APIs (useParams, usePathname, useSearchParams); removed separate Pages Router variant
    • Shared layout - layout.tsx handles service availability checks (404 if Times Square not configured) and wraps all pages with WideContentLayout
    • Client components - SSE updates handled via TimesSquareHtmlEventsProvider in client component wrappers
    • Config access - Migrated from useAppConfig to useStaticConfig which works with both routers
    • TimesSquareParametersClient - Updated to use next/navigation hooks instead of next/router

    This completes the Times Square App Router migration as part of the broader squareone modernization effort.

  • #373 771eb09 Thanks @jonathansick! - Migrate Times Square hooks from SWR to TanStack Query

    All Times Square components now use hooks from @lsst-sqre/times-square-client instead of local SWR-based implementations:

    • TimesSquareParametersClient - uses useTimesSquarePage for parameter metadata
    • TimesSquareGitHubPagePanelClient - uses useTimesSquarePage for page info
    • TimesSquareHtmlEventsProviderClient - uses useTimesSquarePage for events URL
    • TimesSquareNotebookViewerClient - uses useTimesSquarePage and useHtmlStatus for notebook display
    • TimesSquareMainGitHubNavClient - uses useGitHubContents for navigation tree
    • TimesSquarePrGitHubNavClient - uses useGitHubPrContents for PR preview navigation
    • PR Preview Page - uses useGitHubPrContents for check status and PR details

    Deleted legacy SWR hooks:

    • apps/squareone/src/hooks/useTimesSquarePage.ts
    • apps/squareone/src/components/TimesSquareNotebookViewer/useHtmlStatus.ts
    • apps/squareone/src/components/TimesSquareMainGitHubNav/useGitHubContentsListing.ts
    • apps/squareone/src/components/TimesSquarePrGitHubNav/useGitHubPrContentsListing.ts

Patch Changes

  • #361 [3914272](https://...
Read more

@lsst-sqre/times-square-client@1.0.0

12 Feb 19:42
69d3aad

Choose a tag to compare

Minor Changes

  • #385 b2ab600 Thanks @jonathansick! - Add optional structured logger injection to client packages

    • Added a Logger type to each client package (repertoire-client, semaphore-client, gafaelfawr-client, times-square-client) matching pino's (obj, msg) calling convention
    • All console.log, console.error, and console.warn calls replaced with structured logger calls using debug, error, and warn levels
    • Logger is accepted as an optional parameter; when omitted, a console-based default preserves existing behavior for client-side and test usage
    • squareone's server-side layout now passes its pino logger to discoveryQueryOptions, fetchServiceDiscovery, and broadcastsQueryOptions for structured JSON output on GKE
  • #373 49e148f Thanks @jonathansick! - Add direct URL support to useHtmlStatus hook

    The useHtmlStatus hook now accepts a htmlStatusUrl option that allows using a pre-fetched URL directly, rather than building the URL from a page name:

    const { htmlStatusUrl } = useTimesSquarePage(githubSlug, { repertoireUrl });
    const { htmlAvailable, htmlUrl } = useHtmlStatus("", params, {
      htmlStatusUrl,
    });

    This enables efficient usage patterns where page metadata is already fetched and the HTML status URL can be passed directly. Also adds fetchHtmlStatusByUrl and htmlStatusUrlQueryOptions for direct URL-based queries.

  • #373 5d29200 Thanks @jonathansick! - New @lsst-sqre/times-square-client package for Times Square API integration

    This package provides a type-safe client for the Times Square notebook execution API with TanStack Query integration:

    • Zod schemas for all Times Square API responses (pages, HTML status, GitHub contents, PR previews)
    • Client functions with runtime validation (fetchPage, fetchHtmlStatus, fetchGitHubContents, etc.)
    • TanStack Query integration with query key factories and query options for caching and prefetching
    • SSE handler for real-time notebook execution status via Server-Sent Events
    • React hooks for client components (useTimesSquarePage, useHtmlStatus, useGitHubContents, useGitHubPrContents)
    • Mock data and test utilities for development and testing

    This package is part of the App Router migration, replacing the existing SWR-based hooks with TanStack Query patterns.

Patch Changes

@lsst-sqre/squared@0.13.0

12 Feb 19:43
69d3aad

Choose a tag to compare

Minor Changes

  • #391 643b9cb Thanks @jonathansick! - Migrate icons from FontAwesome and react-feather to lucide-react

    squared package:

    • Replaced @fortawesome/fontawesome-svg-core, @fortawesome/free-solid-svg-icons, @fortawesome/react-fontawesome, and react-feather with lucide-react as the unified icon library
    • Updated all components (IconPill, Button, ClipboardButton, DateTimePicker, Modal, Select) to use Lucide icon components
    • Fixed IconPill icon vertical alignment by replacing font-size: 0.9em with vertical-align: text-bottom for proper SVG baseline alignment
    • Updated component prop types from FontAwesome [IconPrefix, IconName] tuples to LucideIcon component references
    • Updated Storybook stories and tests to use Lucide icons

    squareone app:

    • Migrated all components from FontAwesome and react-feather imports to lucide-react
    • Removed FontAwesome library initialization (styles/icons.ts) and CSS import from root layout
    • Removed react-feather type declarations
    • Added a custom GitHubIcon SVG component for the GitHub logo (not available in lucide-react)
    • Updated icon CSS from font-size/margin-right patterns to width/height/flexbox for proper SVG alignment
    • Removed FontAwesome mock from test setup

Patch Changes

  • #386 dd3a96b Thanks @dependabot! - Migrate ESLint configuration to v9 flat config format

    • Replace legacy .eslintrc.js files with eslint.config.mjs across all packages and apps
    • Convert shared @lsst-sqre/eslint-config to export a flat config array using eslint-config-turbo/flat and FlatCompat for eslint-config-next
    • Add @eslint/eslintrc dependency for FlatCompat bridging where native flat config is not yet available
    • Remove inline eslintConfig from squareone's package.json in favor of a standalone eslint.config.mjs
    • Add explicit lint script to squareone

@lsst-sqre/semaphore-client@0.2.0

12 Feb 19:42
69d3aad

Choose a tag to compare

Minor Changes

  • #383 0a774e8 Thanks @jonathansick! - Add @lsst-sqre/semaphore-client package

    New package providing a typed client for the Semaphore broadcast API:

    • Zod schemas for broadcast message validation
    • SemaphoreClient class for fetching broadcasts
    • useBroadcasts React Query hook with prefetch support via query option factories
    • Mock broadcast data for testing and development
    • ESLint configuration and vitest test suite
  • #385 b2ab600 Thanks @jonathansick! - Add optional structured logger injection to client packages

    • Added a Logger type to each client package (repertoire-client, semaphore-client, gafaelfawr-client, times-square-client) matching pino's (obj, msg) calling convention
    • All console.log, console.error, and console.warn calls replaced with structured logger calls using debug, error, and warn levels
    • Logger is accepted as an optional parameter; when omitted, a console-based default preserves existing behavior for client-side and test usage
    • squareone's server-side layout now passes its pino logger to discoveryQueryOptions, fetchServiceDiscovery, and broadcastsQueryOptions for structured JSON output on GKE

@lsst-sqre/repertoire-client@0.2.0

12 Feb 19:43
69d3aad

Choose a tag to compare

Minor Changes

  • #385 b2ab600 Thanks @jonathansick! - Add optional structured logger injection to client packages

    • Added a Logger type to each client package (repertoire-client, semaphore-client, gafaelfawr-client, times-square-client) matching pino's (obj, msg) calling convention
    • All console.log, console.error, and console.warn calls replaced with structured logger calls using debug, error, and warn levels
    • Logger is accepted as an optional parameter; when omitted, a console-based default preserves existing behavior for client-side and test usage
    • squareone's server-side layout now passes its pino logger to discoveryQueryOptions, fetchServiceDiscovery, and broadcastsQueryOptions for structured JSON output on GKE
  • #357 8d837f6 Thanks @jonathansick! - New @lsst-sqre/repertoire-client package for Rubin Science Platform service discovery

    This package provides a reusable client for the Repertoire API, enabling dynamic service discovery across monorepo apps:

    • Zod schemas for runtime validation of API responses
    • ServiceDiscoveryQuery class with convenience methods for querying applications, services, and datasets
    • TanStack Query integration with discoveryQueryOptions() for server prefetching and client-side caching
    • useServiceDiscovery hook for client components with automatic hydration support
    • Mock data for development and testing

    Integrated into squareone:

    • Added TanStack Query providers with server-side prefetching in root layout
    • Components can now use useServiceDiscovery() to check service availability
    • Service URLs dynamically discovered instead of hard-coded in configuration

Patch Changes

  • #373 5dba6a8 Thanks @jonathansick! - Fix getTimesSquareUrl() to return versioned v1 API URL

    Times Square is an internal service with a versioned API, not a UI service. The getTimesSquareUrl() method now correctly returns the v1 version URL from internal services (e.g., https://data.lsst.cloud/times-square/api/v1), matching the pattern used by getGafaelfawrUrl().

    This aligns with the actual Repertoire service discovery data where times-square is listed under services.internal with versions.v1.url.

@lsst-sqre/gafaelfawr-client@1.0.0

12 Feb 19:42
69d3aad

Choose a tag to compare

Minor Changes

  • #385 b2ab600 Thanks @jonathansick! - Add optional structured logger injection to client packages

    • Added a Logger type to each client package (repertoire-client, semaphore-client, gafaelfawr-client, times-square-client) matching pino's (obj, msg) calling convention
    • All console.log, console.error, and console.warn calls replaced with structured logger calls using debug, error, and warn levels
    • Logger is accepted as an optional parameter; when omitted, a console-based default preserves existing behavior for client-side and test usage
    • squareone's server-side layout now passes its pino logger to discoveryQueryOptions, fetchServiceDiscovery, and broadcastsQueryOptions for structured JSON output on GKE
  • #368 65ba6a5 Thanks @jonathansick! - New @lsst-sqre/gafaelfawr-client package for Gafaelfawr authentication API

    This package provides a reusable client for the Gafaelfawr authentication API with TanStack Query integration:

    • Zod schemas for runtime validation of user info, tokens, and login responses
    • React hooks for common operations:
      • useUserInfo - Fetch authenticated user information
      • useLoginInfo - Get CSRF token and available scopes
      • useUserTokens - List user's access tokens
      • useTokenDetails - Get details of a specific token
      • useCreateToken - Create new user tokens
      • useDeleteToken - Revoke user tokens
      • useTokenChangeHistory - Paginated token change history with infinite scroll
      • useGafaelfawrUrl - Resolve Gafaelfawr URL from repertoire service discovery
    • Query helpers (UserInfoQuery, LoginInfoQuery, TokenListQuery) for convenient data access
    • Mock data and test utilities for development and testing

    The package integrates with @lsst-sqre/repertoire-client for dynamic URL resolution based on service discovery.

Patch Changes

@lsst-sqre/eslint-config@0.3.0

12 Feb 19:42
69d3aad

Choose a tag to compare

Minor Changes

  • #386 dd3a96b Thanks @dependabot! - Migrate ESLint configuration to v9 flat config format

    • Replace legacy .eslintrc.js files with eslint.config.mjs across all packages and apps
    • Convert shared @lsst-sqre/eslint-config to export a flat config array using eslint-config-turbo/flat and FlatCompat for eslint-config-next
    • Add @eslint/eslintrc dependency for FlatCompat bridging where native flat config is not yet available
    • Remove inline eslintConfig from squareone's package.json in favor of a standalone eslint.config.mjs
    • Add explicit lint script to squareone

squareone@0.30.0

11 Dec 22:31
8c7d8da

Choose a tag to compare

Minor Changes

  • #323 e033943 Thanks @jonathansick! - Migrate BroadcastBanner button to squared Button component

  • #325 7109e44 Thanks @jonathansick! - Add Card, CardGroup, and Note components to squared package

    New components for documentation and content display:

    • Card: A content card with shadow and hover border when wrapped in links. Uses CSS Modules with design tokens.
    • CardGroup: A responsive CSS Grid container for Card components with configurable minCardWidth and gap props.
    • Note: A callout/note container with floating badge. Supports four types with distinct colors: note (red), warning (orange), tip (green), and info (blue).

    The squareone docs page now imports these components from squared instead of using local styled-components implementations. This is part of the ongoing styled-components to CSS Modules migration.

  • #331 b71c274 Thanks @jonathansick! - Migrate static page components from styled-components to CSS Modules

    This change converts the following component groups to CSS Modules styling:

    Layout Core Components

    • Page - Main page wrapper component
    • MainContent - Content area wrapper
    • WideContentLayout - Full-width content layout

    Header Components

    • Header - Main site header
    • HeaderNav - Navigation links in header
    • PreHeader - Above-header section
    • Login - User login/logout controls

    Footer Components

    • Footer - Main site footer
    • FooterComponents - Footer sub-components (social links, copyright)

    Sidebar Components

    • Sidebar - Sidebar container
    • SidebarLayout - Layout with sidebar
    • SidebarNavItem - Individual navigation items
    • SidebarNavSection - Navigation section groupings
    • MobileMenuToggle - Mobile menu hamburger button

    Homepage Components

    • HomepageHero - Landing page hero section
    • FullBleedBackgroundImageSection - Full-width background image sections

    Typography Components

    • Typography - Text styling components

    Static Page Components

    • Section - Content section component used in docs and support pages

    This migration moves the squareone app closer to eliminating styled-components in favor of CSS Modules with design tokens, improving consistency with the squared component library architecture.

  • #332 d61c458 Thanks @jonathansick! - Migrate Times Square components from styled-components to CSS Modules

    This change completes the CSS Modules migration for all Times Square notebook execution components, replacing styled-components with CSS Modules and design tokens.

    Times Square App Layout

    • TimesSquareApp - Main app layout wrapper
    • Sidebar - Times Square sidebar with navigation

    GitHub Navigation Components

    • TimesSquareGitHubNav - File tree navigation
    • Directory - Directory entries with expandable folders
    • Page - Notebook page entries with current state highlighting
    • TimesSquareMainGitHubNavClient - Main branch navigation container
    • TimesSquarePrGitHubNavClient - PR preview navigation container

    GitHub PR Badge Components

    • GitHubPrBadge - PR state badges with dynamic colors
    • GitHubPrTitle - PR header with title and subtitle
    • GitHubCheckBadge - CI check status badges

    Notebook Viewer Components

    • TimesSquareNotebookViewerClient - Notebook iframe viewer
    • ParameterInput - Form input wrapper with labels
    • StringInput - Text input with error state styling
    • TimesSquareParametersClient - Parameter form container

    Page Panel Components

    • TimesSquareGitHubPagePanel - Page info container
    • TimesSquareGitHubPagePanelClient - Client-side page panel
    • ExecStats - Execution statistics and recompute button
    • GitHubEditLink - Link to edit notebook on GitHub
    • IpynbDownloadLink - Notebook download link

    Page Files

    • GitHub PR landing page ([commit].tsx)

    Button Migration

    Replaced the custom Button component with @lsst-sqre/squared Button component, using appropriate variants (appearance="outline", tone="danger", size="sm"). The old Button/ component directory has been deleted.

    Dynamic Styling Patterns

    • Uses clsx for conditional classes (current page highlighting, error states)
    • Uses CSS custom properties for dynamic colors (PR state colors)
    • Uses inline styles for computed color values (check badge colors)

Patch Changes

  • #329 8f01ffc Thanks @dependabot! - Bump @storybook/addon-a11y from 10.0.8 to 10.1.3

  • #329 8f01ffc Thanks @dependabot! - Bump @storybook/addon-docs from 10.0.8 to 10.1.3

  • #329 8f01ffc Thanks @dependabot! - Bump @storybook/addon-links from 10.0.8 to 10.1.3

  • #329 8f01ffc Thanks @dependabot! - Bump @storybook/addon-onboarding from 10.0.8 to 10.1.3

  • #329 8f01ffc Thanks @dependabot! - Bump @storybook/addon-themes from 10.0.8 to 10.1.3

  • #329 8f01ffc Thanks @dependabot! - Bump @storybook/addon-vitest from 10.0.8 to 10.1.3

  • #330 2a03f41 Thanks @dependabot! - Bump @turbo/gen from 2.6.1 to 2.6.3

  • #339 827d024 Thanks @jonathansick! - Fix API rate limit time window description

    Updated the rate limit description in QuotasView to correctly state that API rate limits are measured over a 60 second window (reset every minute) instead of the previous incorrect 15 minute window description.

  • #323 f767cf1 Thanks @jonathansick! - Fix BroadcastBanner button baseline alignment

  • #328 8001bac Thanks @dependabot! - Bump eslint-config-next from 15.5.6 to 15.5.7 in the nextjs group

  • #330 2a03f41 Thanks @dependabot! - Bump eslint-config-turbo from 2.6.1 to 2.6.3

  • #334 3fc5955 Thanks @jonathansick! - Migrate from next/legacy/image to next/image

    Upgraded the remaining Image components from the legacy next/legacy/image import to the modern next/image component. This is part of the Next.js 15 upgrade to remove deprecated APIs.

    Components updated:

    • PreHeader - Header logo image
    • Footer - Agency partner logos
    • FooterComponents - PartnerLogos MDX component

    Changes:

    • Replaced import Image from 'next/legacy/image' with import Image from 'next/image'
    • Added responsive styling with style={{ maxWidth: '100%', width: 'auto', height: 'auto' }} to maintain aspect ratios
    • Both width and height set to 'auto' to satisfy Next.js 13+ Image component requirements

    The SidebarLayout component had minor whitespace cleanup.

  • #334 611bf95 Thanks @jonathansick! - Migrate to modern next/Link behavior

    Removed the legacyBehavior prop from Next.js Link components across the application. This is part of the Next.js 15...

Read more

@lsst-sqre/squared@0.12.0

11 Dec 22:31
8c7d8da

Choose a tag to compare

Minor Changes

  • #325 7109e44 Thanks @jonathansick! - Add Card, CardGroup, and Note components to squared package

    New components for documentation and content display:

    • Card: A content card with shadow and hover border when wrapped in links. Uses CSS Modules with design tokens.
    • CardGroup: A responsive CSS Grid container for Card components with configurable minCardWidth and gap props.
    • Note: A callout/note container with floating badge. Supports four types with distinct colors: note (red), warning (orange), tip (green), and info (blue).

    The squareone docs page now imports these components from squared instead of using local styled-components implementations. This is part of the ongoing styled-components to CSS Modules migration.

Patch Changes

  • #323 2bb920e Thanks @jonathansick! - Fix outline+tertiary Button hover state readability

    The appearance="outline" tone="tertiary" Button hover state now uses a subtle 10% opacity background instead of a solid background that made the label illegible on hover. This hover style works dynamically across any context (white text on blue, red, orange backgrounds).

  • #334 611bf95 Thanks @jonathansick! - Add active state styling to PrimaryNavigation.TriggerLink

    Added CSS styles for the [data-active] attribute on TriggerLink components. When a navigation link is marked as active, it now displays with:

    • Highlighted text color matching the hover state
    • Underline decoration for visual distinction

    This enables applications to visually indicate the current page in the primary navigation by passing active={true} to TriggerLink.

@lsst-sqre/file-factory@0.2.0

11 Dec 22:31
8c7d8da

Choose a tag to compare

Minor Changes

  • #324 eee05ea Thanks @jonathansick! - Add file-factory CLI tool for scaffolding React components, hooks, contexts, and pages

    This new package provides:

    • file-factory component - Create React components with optional CSS Modules, tests, and Storybook stories
    • file-factory hook - Create React hooks with optional directory structure
    • file-factory context - Create global React context providers
    • file-factory page - Create Next.js pages (both Pages Router and App Router)

    Features:

    • Directory-as-template pattern (like cookiecutter)
    • Component-scoped contexts with --with-context flag
    • Automatic barrel file updates
    • Package-specific configuration via .file-factory/config.ts
    • Custom template overrides
    • TypeScript throughout with Zod validation
    • Interactive mode when no arguments provided