diff --git a/README.md b/README.md index c0c6ce0..1e14eb8 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,13 @@ # Emulsify CLI -Command line interface for Emulsify projects. +Command line interface for creating Emulsify projects, installing component systems, installing system components, and generating local components. -## Installation +## Requirements + +Emulsify CLI requires Node.js 24 or newer. -Emulsify CLI requires Node 24 or newer. +## Installation Install Emulsify CLI globally from [npm](https://www.npmjs.com/package/@emulsify/cli): @@ -15,284 +17,60 @@ Install Emulsify CLI globally from [npm](https://www.npmjs.com/package/@emulsify npm install -g @emulsify/cli ``` -## Usage - -Run `emulsify --help` for the current command list. - -### Commands - -| Command | Alias | Description | -| ----------------------------------- | ----------------------------- | ----------------------------------------------------------------- | -| `emulsify init [name] [path]` | | Initializes an Emulsify project from a starter. | -| `emulsify system list` | `emulsify system ls` | Lists built-in systems available for installation. | -| `emulsify system install [name]` | | Installs a system in the current Emulsify project. | -| `emulsify component list` | `emulsify component ls` | Lists components available from the installed system and variant. | -| `emulsify component install [name]` | `emulsify component i [name]` | Installs one component from the installed system and variant. | -| `emulsify component create [name]` | `emulsify component c [name]` | Creates a local component in the current Emulsify project. | - -### Initialize A Project - -`emulsify init [name] [path]` clones a starter, writes the project configuration, installs dependencies, runs the starter init hook when present, and removes the starter Git history. - -Options: - -- `--machineName `: Sets the machine-friendly project name. When omitted, Emulsify CLI derives it from the project name. -- `--starter `: Uses a specific starter repository. -- `--checkout `: Checks out a specific starter commit, branch, or tag. -- `--platform `: Sets the project platform when auto-detection is unavailable or should be overridden. For Drupal projects, pass `drupal`. -- `--yes`: Accepts default init values for missing options without prompting. - -Current starter repositories: - -- `https://github.com/emulsify-ds/emulsify-starter` -- `https://github.com/emulsify-ds/emulsify-drupal-starter` - -Examples: +Run the current command help at any time: ```bash -emulsify init "My Project" ./projects -emulsify init "My Theme" ./web/themes/custom --platform drupal --yes -emulsify init "My Project" ./projects --starter https://github.com/emulsify-ds/emulsify-starter --checkout main +emulsify --help ``` -### Systems +## Quick Start -`emulsify system list` lists the built-in systems that Emulsify CLI can install. `emulsify system ls` is the same command. +Create a Drupal starter project, install a system, and add components: ```bash +emulsify init "My Theme" ./web/themes/custom --platform drupal +cd ./web/themes/custom/my_theme emulsify system list -emulsify system ls -``` - -`emulsify system install [name]` installs a system in the current Emulsify project. Use `compound` to install the built-in Compound system. The command installs required components by default. - -Options: - -- `--repository `: Installs a system from a specific Git repository. -- `--checkout `: Checks out a specific system commit, branch, or tag. This is required when `--repository` is used. -- `--all`: Installs all available components from the system instead of only required components. - -Examples: - -```bash emulsify system install compound -emulsify system install compound --all -emulsify system install --repository https://github.com/example/example-system.git --checkout v1.0.0 -``` - -### Components - -`emulsify component list` lists components available from the installed system and variant. `emulsify component ls` is the same command. - -```bash emulsify component list -emulsify component ls +emulsify component install card +emulsify component create promo-card --directory molecules --format default ``` -`emulsify component install [name]` installs one component from the installed system and variant. `emulsify component i [name]` is the same command. - -Options: - -- `--force`: Replaces an installed component. -- `--all`: Installs all available components instead of one named component. -- `--dry-run`: Previews planned component installs, dependencies, destinations, and overwrite behavior without copying or removing files. - -Examples: +For non-interactive environments, pass the flags that normally prompt for input: ```bash -emulsify component install button -emulsify component install card --dry-run -emulsify component i card --force -emulsify component install --all -``` - -`emulsify component create [name]` creates a local component in the current Emulsify project. `emulsify component c [name]` is the same command. - -Options: - -- `--directory `: Sets the variant structure directory where the component is created. -- `--format `: Sets the component format. Supported values are `default` and `sdc`. -- `--yes`: Replaces an existing component without an overwrite confirmation prompt. -- `--dry-run`: Previews the destination and generated files without writing, removing, or creating files. - -In non-interactive environments, pass both `--directory` and `--format`. - -Examples: - -```bash -emulsify component create card --directory base --format default -emulsify component create card --directory base --format default --dry-run -emulsify component create teaser --directory molecules --format sdc --yes -emulsify component create teaser --directory molecules --format sdc --dry-run +emulsify init "My Theme" ./web/themes/custom --platform drupal --yes +emulsify component create promo-card --directory molecules --format default --yes ``` -### Component Template Overrides - -Projects can override the built-in `component create` templates by adding component template override files under `.cli/templates/` at the Emulsify project root. Overrides replace only the known artifacts that Emulsify CLI already generates; they do not add extra files or change which files are created. - -Default component overrides: - -- `.cli/templates/default/component.twig` -- `.cli/templates/default/component.scss` -- `.cli/templates/default/component.yml` -- `.cli/templates/default/component.stories.js` - -SDC component overrides: - -- `.cli/templates/sdc/component.twig` -- `.cli/templates/sdc/component.scss` -- `.cli/templates/sdc/component.component.yml` -- `.cli/templates/sdc/component.js` -- `.cli/templates/sdc/component.stories.js` +## Documentation -Override files can use double-brace tokens: +Detailed documentation lives in [docs](./docs/README.md). -- `{{ filename }}` -- `{{ className }}` -- `{{ camelName }}` -- `{{ snakeName }}` -- `{{ humanName }}` -- `{{ directory }}` -- `{{ format }}` +| Topic | Use This When | +| ---------------------------------------------------------------------- | ------------------------------------------------------------------------------- | +| [CLI Reference](./docs/cli-reference.md) | Looking up commands, aliases, options, and examples. | +| [Project Initialization](./docs/project-initialization.md) | Creating a new Emulsify project from a starter. | +| [Systems](./docs/systems.md) | Listing, installing, or authoring component systems. | +| [Components](./docs/components.md) | Listing, installing, dry-running, or creating components. | +| [Project Configuration](./docs/configuration.md) | Understanding `project.emulsify.json`, variants, and structure mappings. | +| [Component Template Overrides](./docs/component-template-overrides.md) | Customizing files generated by `emulsify component create`. | +| [Hooks And Cache](./docs/hooks-and-cache.md) | Understanding starter hooks, system hooks, and local repository cache behavior. | +| [Development](./docs/development.md) | Setting up this repository and running local checks. | +| [Release](./docs/release.md) | Understanding CI, semantic-release, and npm publishing. | -For each generated artifact, Emulsify CLI first checks for the matching override file. If the override is missing, the built-in template is used. If the override exists but is empty, the built-in template is used and a warning is logged. Unknown tokens are left unchanged and logged as warnings. Partial override sets are supported, so a project can override only `component.twig` and keep the built-in SCSS, data, and story templates. Extra arbitrary files are not generated by component template overrides. +## Command Overview -For more documentation, see the [Emulsify CLI usage documentation](https://www.emulsify.info/docs/supporting-projects/emulsify-cli/emulsify-cli-usage). - -## Development - -Emulsify CLI is developed using TypeScript. You can find all of the source files in the `src` directory, which is organized in the following manner: - -- `src/index.ts` - uses Commander to compose the CLI. -- `src/handlers` - contains all functions that handle CLI commands, such as `emulsify init`. -- `src/lib` - general definitions and logging tools. -- `src/schemas` - contains JSON-Schema files that describe project, system, and variant configuration. These schema files are used to generate TypeScript types. -- `src/scripts` - holds utility scripts for the project. -- `src/types` - type modules live here, auto-generated ones are prefixed with an underscore (`_`). -- `src/util` - contains utility functions that are used in handlers to do various things, such as caching systems and resolving component template overrides. - -### Setup - -- Install the version of Node specified in this project's `.nvmrc` file. If you are using nvm, run `nvm use`. -- Clone this repository into a directory of your choosing. -- In the directory, run `npm install`. -- Build the project: `npm run build`, or watch: `npm run watch`. -- To test the CLI, run: `npm link`. - -### Scripts - -- `npm run build`: builds the project based on the configuration in `tsconfig.dist.json`. -- `npm run build-schema-types`: Compiles the JSON Schema definitions within this project into TypeScript types. -- `npm run watch`: watches the codebase, and re-compiles every time a change is made. -- `npm run format`: uses prettier to format all ts files within the codebase. -- `npm run lint`: runs the Jest test suite via the `test` script. -- `npm run test`: runs Jest on the codebase. You can specify a path to a single test, and add any flags supported by Jest's CLI. -- `npm run type`: uses typescript to check all type signatures. -- `npm run twatch`: runs Jest without coverage, in verbose and watch mode. This is useful for running a single test during active development. -- `npm run semantic-release`: publishes a release using `release.config.cjs`. - -## Deployment - -This project is automatically built and deployed to npm via the release GitHub Actions workflow. Pushes to `main` run `npm run build` and then `npm run semantic-release`. +| Command | Alias | Description | +| ----------------------------------- | ----------------------------- | ----------------------------------------------------------------- | +| `emulsify init [name] [path]` | | Initializes an Emulsify project from a starter. | +| `emulsify system list` | `emulsify system ls` | Lists built-in systems available for installation. | +| `emulsify system install [name]` | | Installs a system in the current Emulsify project. | +| `emulsify component list` | `emulsify component ls` | Lists components available from the installed system and variant. | +| `emulsify component install [name]` | `emulsify component i [name]` | Installs one component from the installed system and variant. | +| `emulsify component create [name]` | `emulsify component c [name]` | Creates a local component in the current Emulsify project. | -### Contributors +## Contributors - - - - - - - - - - - - - - - - - - - - -
- - Patrick -
- Patrick Coffey -
-
- - Brian -
- Brian Lewis -
-
- - Randy -
- Randy Oest -
-
- - Callin -
- Callin Mullaney -
-
- - Jeff -
- Jeff Tomlinson -
-
- - mikeethedude/ -
- mikeethedude -
-
- - Roberto -
- Roberto Hernández Badilla -
-
- - Andrii -
- Andrii Shutov -
-
- - Jim -
- Jim Vomero -
-
- - Caleb -
- Caleb Tucker-Raymond -
-
- - Carlos -
- Carlos Valencia Rivero -
-
- - Igor -
- Igor R. Plity -
-
- - Ryan -
- Ryan Hagerty -
-
+See [Contributors](./docs/contributors.md). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..5dffb77 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,17 @@ +# Emulsify CLI Documentation + +These docs expand on the short project README and are organized by the task a project user or maintainer is usually trying to complete. + +| Topic | Use This When | +| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| [CLI Reference](./cli-reference.md) | Looking up commands, aliases, options, and examples. | +| [Project Initialization](./project-initialization.md) | Creating a new Emulsify project from a starter, including Drupal and non-interactive examples. | +| [Systems](./systems.md) | Listing built-in systems, installing systems, using custom system repositories, or understanding system configuration. | +| [Components](./components.md) | Listing installable components, installing components and dependencies, using dry runs, and creating local components. | +| [Project Configuration](./configuration.md) | Understanding `project.emulsify.json`, system and variant references, structure mappings, and validation. | +| [Component Template Overrides](./component-template-overrides.md) | Replacing the built-in `component create` templates with project-level templates. | +| [Hooks And Cache](./hooks-and-cache.md) | Understanding starter hooks, system install hooks, script execution, and the `~/.emulsify/cache` repository cache. | +| [Development](./development.md) | Setting up this repository, understanding source layout, and running checks. | +| [Release](./release.md) | Understanding CI, develop version bumps, semantic-release, and npm publishing. | +| [Contributors](./contributors.md) | Viewing project contributors moved out of the root README. | +| [Website Usage Copy](./emulsify-info-cli-updates.md) | Copy-ready usage content for the `emulsify.info` CLI page. | diff --git a/docs/cli-reference.md b/docs/cli-reference.md new file mode 100644 index 0000000..0224449 --- /dev/null +++ b/docs/cli-reference.md @@ -0,0 +1,136 @@ +# CLI Reference + +Emulsify CLI installs as the `emulsify` binary. + +```bash +emulsify --help +emulsify --help +``` + +The examples below reflect the command definitions in `src/index.ts` and the generated help from the built `dist/index.js` entry point. + +## Commands + +| Command | Alias | Description | +| ----------------------------------- | ----------------------------- | ---------------------------------------------------------------- | +| `emulsify init [name] [path]` | | Initialize an Emulsify project from a starter. | +| `emulsify system list` | `emulsify system ls` | List built-in systems available for installation. | +| `emulsify system install [name]` | | Install a system in the current Emulsify project. | +| `emulsify component list` | `emulsify component ls` | List components available from the installed system and variant. | +| `emulsify component install [name]` | `emulsify component i [name]` | Install a component from the installed system and variant. | +| `emulsify component create [name]` | `emulsify component c [name]` | Generate a new local component in the current project. | + +## `init` + +```bash +emulsify init [name] [path] +``` + +Options: + +| Option | Description | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| `-m, --machineName ` | Machine-friendly project folder and config name. If omitted, the CLI derives it from the project name. Drupal machine names use underscores. | +| `-s, --starter ` | Starter Git repository to clone. | +| `-c, --checkout ` | Starter commit, branch, or tag to check out after clone. | +| `-p, --platform ` | Platform to use when auto-detection is unavailable or should be overridden. Built-in starters are currently available for `none` and `drupal`. | +| `-y, --yes` | Accept default values for missing init options without prompting. | + +Examples: + +```bash +emulsify init "My Project" ./projects --platform none +emulsify init "My Theme" ./web/themes/custom --platform drupal +emulsify init "My Theme" ./web/themes/custom --platform drupal --machineName my_custom_theme +emulsify init "My Project" ./projects --starter https://github.com/emulsify-ds/emulsify-starter --checkout main --platform none +``` + +## `system list` + +```bash +emulsify system list +emulsify system ls +``` + +Lists the built-in system names and repositories known to this CLI version. + +## `system install` + +```bash +emulsify system install [name] +``` + +Options: + +| Option | Description | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `-r, --repository ` | Install a system from a specific Git repository. Custom repository URLs must end in `.git`. | +| `-c, --checkout ` | Checkout to use. This is required when `--repository` is used. | +| `-a, --all` | Install every component in the selected variant. Without this flag, only components marked `required: true` are installed during system install. | + +Examples: + +```bash +emulsify system install compound +emulsify system install compound --all +emulsify system install --repository https://github.com/example/example-system.git --checkout v1.0.0 +``` + +## `component list` + +```bash +emulsify component list +emulsify component ls +``` + +Lists components available from the installed system and selected variant. Output uses the component structure followed by the component name, for example `atoms -> buttons`. + +## `component install` + +```bash +emulsify component install [name] +emulsify component i [name] +``` + +Options: + +| Option | Description | +| ------------- | --------------------------------------------------------------------------------------------------- | +| `-f, --force` | Replace an existing component destination without prompting. | +| `-a, --all` | Install all available components instead of one named component. | +| `--dry-run` | Preview dependencies, destinations, overwrite behavior, and copy operations without changing files. | + +Examples: + +```bash +emulsify component install card +emulsify component install card --dry-run +emulsify component i accordion --force +emulsify component install --all +``` + +## `component create` + +```bash +emulsify component create [name] +emulsify component c [name] +``` + +Options: + +| Option | Description | +| ----------------------------- | ------------------------------------------------------------------------------------- | +| `-d, --directory ` | Variant structure name where the component should be created. | +| `-f, --format ` | Component format to generate. Supported values are `default` and `sdc`. | +| `-y, --yes` | Replace an existing generated component without prompting. | +| `--dry-run` | Preview destination and generated files without writing, removing, or creating files. | + +Examples: + +```bash +emulsify component create promo-card --directory molecules --format default +emulsify component create promo-card --directory molecules --format default --dry-run +emulsify component c teaser --directory molecules --format sdc --yes +``` + +In a non-interactive environment, pass both `--directory` and `--format`; otherwise the command errors instead of waiting for prompts that cannot be answered. diff --git a/docs/component-template-overrides.md b/docs/component-template-overrides.md new file mode 100644 index 0000000..36be8f3 --- /dev/null +++ b/docs/component-template-overrides.md @@ -0,0 +1,128 @@ +# Component Template Overrides + +`emulsify component create` uses built-in templates by default. A project can replace any generated artifact with a matching override file under `.cli/templates/`. + +Overrides replace known generated files one-for-one. They do not add arbitrary extra files and they do not change which artifacts are generated. + +## Directory Layout + +Default component overrides: + +```text +.cli/templates/default/component.twig +.cli/templates/default/component.scss +.cli/templates/default/component.yml +.cli/templates/default/component.stories.js +``` + +SDC component overrides: + +```text +.cli/templates/sdc/component.twig +.cli/templates/sdc/component.scss +.cli/templates/sdc/component.component.yml +.cli/templates/sdc/component.js +.cli/templates/sdc/component.stories.js +``` + +For each generated artifact, the CLI looks for the matching override first. If the file is missing, the built-in template is used. + +## Supported Tokens + +Override files can use double-brace tokens. + +| Token | Example Value For `featured-item` | +| ----------------- | --------------------------------- | +| `{{ filename }}` | `featured-item` | +| `{{ className }}` | `featured-item` | +| `{{ camelName }}` | `featuredItem` | +| `{{ snakeName }}` | `featured_item` | +| `{{ humanName }}` | `Featured Item` | +| `{{ directory }}` | `base` | +| `{{ format }}` | `default` or `sdc` | + +Whitespace inside the braces is optional: + +```twig +{{humanName}} +{{ humanName }} +``` + +Unknown tokens are left unchanged and logged as warnings. Empty override files are ignored and the built-in template is used. + +## Example Default Twig Override + +Create `.cli/templates/default/component.twig`: + +```twig +{% set classes = [ + '{{ className }}', +] %} + +
+ {% block content %} + {% endblock %} +
+``` + +Then generate a component: + +```bash +emulsify component create featured-item --directory base --format default +``` + +The generated file is: + +```text +components/00-base/featured-item/featured-item.twig +``` + +## Example SDC Metadata Override + +Create `.cli/templates/sdc/component.component.yml`: + +```yaml +name: {{ humanName }} +status: stable +props: + type: object + properties: + {{ snakeName }}_title: + type: string + title: Title +slots: + content: + title: Content +``` + +Generate the SDC component: + +```bash +emulsify component create featured-item --directory base --format sdc +``` + +The generated file is: + +```text +components/00-base/featured-item/featured-item.component.yml +``` + +## Partial Overrides + +Override only the artifacts you need. For example, a project can override Twig and keep the built-in SCSS, data, and story templates: + +```text +.cli/templates/default/component.twig +``` + +All missing override files fall back to the built-in builders. + +## Dry-Run With Overrides + +Dry runs do not write files, but they still resolve the selected format, structure, and output paths: + +```bash +emulsify component create featured-item --directory base --format default --dry-run +``` + +Use dry runs to confirm the component destination before replacing or adding override files. diff --git a/docs/components.md b/docs/components.md new file mode 100644 index 0000000..12fe86b --- /dev/null +++ b/docs/components.md @@ -0,0 +1,167 @@ +# Components + +Component commands use the system and variant recorded in `project.emulsify.json`. Run them from the project root or any child directory inside an initialized Emulsify project. + +## List Available Components + +```bash +emulsify component list +emulsify component ls +``` + +The command loads the configured system, finds the selected variant, and prints each component as: + +```text + -> +``` + +Example: + +```text +base -> 01-colors +atoms -> buttons +molecules -> card +``` + +## Install One Component + +```bash +emulsify component install card +emulsify component i card +``` + +The command installs the named component from the cached system into the project-relative directory defined by the selected variant structure. + +If the component declares dependencies, those dependencies are installed too. + +```json +{ + "name": "card", + "structure": "molecules", + "dependency": ["images", "text", "links", "buttons"] +} +``` + +Installing `card` also installs its dependencies. + +## Overwrite Behavior + +If the destination exists, `component install` prompts before replacing it. + +```bash +emulsify component install card +``` + +Use `--force` to replace without prompting: + +```bash +emulsify component install card --force +``` + +Use `--all` to install every component from the selected variant. This mode force-installs all component destinations. + +```bash +emulsify component install --all +``` + +## Dry Runs + +Use `--dry-run` to preview component installation without copying, removing, or overwriting files. + +```bash +emulsify component install card --dry-run +emulsify component install --all --dry-run +``` + +Dry-run output includes: + +| Output | Meaning | +| ------------------ | ------------------------------------------------------------------------------- | +| Dependencies | Components that will be installed because the target component depends on them. | +| Destination | Project path where each component would be copied. | +| Destination exists | Whether the destination currently exists. | +| Real run would | Whether the real command would copy, replace, or prompt. | + +## Create A Local Component + +`component create` generates a new component from built-in templates or project-level template overrides. + +```bash +emulsify component create promo-card --directory molecules --format default +emulsify component c teaser --directory molecules --format sdc +``` + +Component names may include letters, numbers, and single hyphens between words. The CLI derives reusable name forms from the input. + +| Input | Folder/File Prefix | CSS Class | JavaScript Name | YAML Prefix | Display Name | +| --------------- | ------------------ | --------------- | --------------- | --------------- | --------------- | +| `featured-item` | `featured-item` | `featured-item` | `featuredItem` | `featured_item` | `Featured Item` | +| `featuredItem` | `featured-item` | `featured-item` | `featuredItem` | `featured_item` | `Featured Item` | + +The destination is: + +```text +// +``` + +For a Drupal variant structure named `base` with directory `components/00-base`, this command: + +```bash +emulsify component create featured-item --directory base --format default +``` + +Creates: + +```text +components/00-base/featured-item +``` + +## Generated Formats + +Default components generate: + +```text +.twig +.scss +.yml +.stories.js +``` + +SDC components generate: + +```text +.twig +.scss +.component.yml +.js +.stories.js +``` + +## Create Dry Runs + +Use `--dry-run` to preview component creation without writing files. + +```bash +emulsify component create featured-item --directory base --format default --dry-run +emulsify component create featured-item --directory base --format sdc --dry-run +``` + +Dry-run output includes the selected format, structure path, parent directory, final destination, whether the destination exists, and generated file paths. + +## Non-Interactive Creation + +In interactive terminals, missing `--format` or `--directory` values are prompted. In non-interactive environments, pass both flags: + +```bash +emulsify component create featured-item --directory base --format default +``` + +Use `--yes` when the command should replace an existing generated component without asking: + +```bash +emulsify component create featured-item --directory base --format default --yes +``` + +## Template Overrides + +Projects can override the generated files with `.cli/templates//...` files. See [Component Template Overrides](./component-template-overrides.md). diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..dbdf885 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,115 @@ +# Project Configuration + +Emulsify CLI stores project state in `project.emulsify.json`. Commands search for this file from the current working directory upward, so CLI commands can be run from the project root or a child directory. + +## Required Initial Configuration + +`emulsify init` writes the required project and starter sections. + +```json +{ + "project": { + "platform": "drupal", + "name": "My Theme", + "machineName": "my_theme" + }, + "starter": { + "repository": "https://github.com/emulsify-ds/emulsify-drupal-starter" + } +} +``` + +| Field | Required | Description | +| --------------------- | -------- | ------------------------------------------------ | +| `project.platform` | Yes | Platform name for starter and variant selection. | +| `project.name` | Yes | Human-facing project name provided during init. | +| `project.machineName` | Yes | Machine-friendly folder/config name. | +| `starter.repository` | Yes | Starter repository used to create the project. | + +## System And Variant Configuration + +`emulsify system install` adds system and variant sections. + +```json +{ + "system": { + "repository": "https://github.com/emulsify-ds/compound.git", + "checkout": "v1.0.0" + }, + "variant": { + "platform": "drupal", + "structureImplementations": [ + { + "name": "base", + "directory": "components/00-base" + } + ] + } +} +``` + +| Field | Required After System Install | Description | +| ---------------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `system.repository` | Yes | Git repository containing the selected system. Must be a URL ending in `.git` for commands that parse the system name. | +| `system.checkout` | Yes | Commit, branch, or tag used for the cached system. | +| `variant.platform` | Yes | Platform variant selected from the system. Built-in schemas currently allow `none` and `drupal`. | +| `variant.structureImplementations` | Yes | Project-relative directories for each named system structure. | + +Component commands require both `system` and `variant` to be present. + +## Structure Implementations + +Structure implementations tell the CLI where installed or generated components belong. + +```json +{ + "name": "base", + "directory": "components/00-base" +} +``` + +For an installable system component: + +```json +{ + "name": "promo", + "structure": "base" +} +``` + +The destination is: + +```text +/components/00-base/promo +``` + +For `component create`, the `--directory` option takes the structure implementation name, not the filesystem path: + +```bash +emulsify component create promo --directory base --format default +``` + +## Validation + +The CLI validates project configuration with JSON Schema when loading `project.emulsify.json`. Invalid configuration causes commands to fail before installing or generating files. + +Common validation issues: + +| Issue | Fix | +| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| Unknown top-level properties | Remove properties that are not defined by the schema. | +| Missing `project`, `project.platform`, `project.name`, or `project.machineName` | Re-run init or restore the required fields. | +| Missing `starter.repository` | Restore the starter repository field. | +| Component commands fail because `system` or `variant` is missing | Run `emulsify system install ` from the project. | +| Variant structure name does not match a component structure | Update the system variant so every component structure has a matching structure implementation. | + +## Editing Configuration + +Manual edits are safe when they preserve the schema and match the installed system. Be careful changing: + +| Field | Risk | +| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `system.checkout` | The local cache path depends on checkout. Changing it may cause the CLI to clone or load a different system version. | +| `system.repository` | Component commands parse the system name from this URL and expect a `.git` suffix. | +| `variant.structureImplementations` | Install and create destinations are calculated from these directories. | +| `project.platform` | System install selects variants from this value. Existing system and variant config may no longer match. | diff --git a/docs/contributors.md b/docs/contributors.md new file mode 100644 index 0000000..f1914e4 --- /dev/null +++ b/docs/contributors.md @@ -0,0 +1,19 @@ +# Contributors + +Thanks to the people who have contributed to Emulsify CLI. + +| Contributor | GitHub | +| ------------------------- | ------------------------------------------------------- | +| Patrick Coffey | [patrickocoffeyo](https://github.com/patrickocoffeyo) | +| Brian Lewis | [ModulesUnraveled](https://github.com/ModulesUnraveled) | +| Randy Oest | [amazingrando](https://github.com/amazingrando) | +| Callin Mullaney | [callinmullaney](https://github.com/callinmullaney) | +| Jeff Tomlinson | [JeffTomlinson](https://github.com/JeffTomlinson) | +| mikeethedude | [mikeethedude](https://github.com/mikeethedude) | +| Roberto Hernandez Badilla | [robherba](https://github.com/robherba) | +| Andrii Shutov | [fertant](https://github.com/fertant) | +| Jim Vomero | [nJim](https://github.com/nJim) | +| Caleb Tucker-Raymond | [calebtr-metro](https://github.com/calebtr-metro) | +| Carlos Valencia Rivero | [karldivad](https://github.com/karldivad) | +| Igor R. Plity | [iryston](https://github.com/iryston) | +| Ryan Hagerty | [ryanhagerty](https://github.com/ryanhagerty) | diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 0000000..912fa3e --- /dev/null +++ b/docs/development.md @@ -0,0 +1,78 @@ +# Development + +Emulsify CLI is a TypeScript project that builds to the `dist` directory and publishes the `emulsify` binary from `dist/index.js`. + +## Setup + +Use the Node.js version in `.nvmrc`, which should satisfy the package requirement of Node.js 24 or newer. + +```bash +nvm use +npm install +npm run build +npm link +``` + +After `npm link`, run the local CLI: + +```bash +emulsify --help +``` + +## Source Layout + +| Path | Purpose | +| ------------------- | ------------------------------------------------------------------------------------------------------------ | +| `src/index.ts` | Commander command composition and top-level error handling. | +| `src/handlers` | Command handlers for `init`, `system`, and `component` commands. | +| `src/handlers/hofs` | Shared handler wrappers, including progress and system-loading helpers. | +| `src/lib` | Logging, constants, and CLI error primitives. | +| `src/schemas` | JSON Schemas for project, system, and variant configuration. | +| `src/scripts` | Maintenance scripts, including schema type generation and develop version bumps. | +| `src/types` | Type modules. Generated schema types are prefixed with `_`. | +| `src/util` | Platform detection, cache utilities, filesystem helpers, component generation, and project config utilities. | + +## Scripts + +| Script | Purpose | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| `npm run build` | Generate schema types, compile TypeScript, copy `package.json` to `dist`, and install production dependencies in `dist`. | +| `npm run build-schema-types` | Generate TypeScript definitions from JSON Schema files. | +| `npm run build-ts` | Compile TypeScript with `tsconfig.dist.json`. | +| `npm run watch` | Rebuild when files in `src` change. | +| `npm run watch-ts` | Recompile TypeScript when files in `src` change. | +| `npm run format` | Run Prettier on source TypeScript and JavaScript files. | +| `npm run lint` | Runs the Jest test suite through `npm run test`. | +| `npm run test` | Run Jest with coverage. | +| `npm run type` | Run TypeScript checking without emitting files. | +| `npm run twatch` | Run Jest without coverage in watch mode. | +| `npm run version:develop` | Update package metadata from semantic commits on `develop`. | +| `npm run semantic-release` | Publish through semantic-release using `release.config.cjs`. | + +Run one test file by passing the path after `--`: + +```bash +npm run test -- src/handlers/componentCreate.test.ts +``` + +## Generated Types + +Schema-derived type files live in `src/types` and are generated by: + +```bash +npm run build-schema-types +``` + +Run this after changing files in `src/schemas`. + +## Local Verification + +Before opening a PR, run: + +```bash +npm run type +npm run build +npm run test +``` + +`npm run build` may report npm audit warnings from dependencies after the production install in `dist`; those warnings are not TypeScript build failures. diff --git a/docs/emulsify-info-cli-updates.md b/docs/emulsify-info-cli-updates.md index 3a1e96c..7987e43 100644 --- a/docs/emulsify-info-cli-updates.md +++ b/docs/emulsify-info-cli-updates.md @@ -1,12 +1,18 @@ -# Emulsify CLI Website Updates +# Emulsify CLI Website Usage Copy -Copy-ready updates for the emulsify.info Emulsify CLI usage page. +This file contains copy-ready usage content for the `emulsify.info` Emulsify CLI page. The fuller source documentation lives in the adjacent docs: + +- [CLI Reference](./cli-reference.md) +- [Project Initialization](./project-initialization.md) +- [Systems](./systems.md) +- [Components](./components.md) +- [Component Template Overrides](./component-template-overrides.md) ## Installation -Emulsify CLI requires Node 24 or newer. +Emulsify CLI requires Node.js 24 or newer. -Install Emulsify CLI globally with npm: +Install Emulsify CLI globally from npm: ```bash npm install -g @emulsify/cli @@ -23,19 +29,21 @@ npm install -g @emulsify/cli | `emulsify component install [name]` | `emulsify component i [name]` | Installs one component from the installed system and variant. | | `emulsify component create [name]` | `emulsify component c [name]` | Creates a local component in the current Emulsify project. | +Run `emulsify --help` for current options. + ## Initialize A Project -`emulsify init [name] [path]` clones a starter, writes the project configuration, installs dependencies, runs the starter init hook when present, and removes the starter Git history. +`emulsify init [name] [path]` clones a starter, writes `project.emulsify.json`, installs dependencies, runs the starter init hook when present, and removes the starter Git history. Options: - `--machineName `: Sets the machine-friendly project name. When omitted, Emulsify CLI derives it from the project name. - `--starter `: Uses a specific starter repository. - `--checkout `: Checks out a specific starter commit, branch, or tag. -- `--platform `: Sets the project platform when auto-detection is unavailable or should be overridden. For Drupal projects, pass `drupal`. +- `--platform `: Sets the project platform when auto-detection is unavailable or should be overridden. Built-in starters are available for `none` and `drupal`. - `--yes`: Accepts default init values for missing options without prompting. -Current starter repositories: +Built-in starter repositories: - `https://github.com/emulsify-ds/emulsify-starter` - `https://github.com/emulsify-ds/emulsify-drupal-starter` @@ -43,9 +51,9 @@ Current starter repositories: Examples: ```bash -emulsify init "My Project" ./projects +emulsify init "My Project" ./projects --platform none emulsify init "My Theme" ./web/themes/custom --platform drupal --yes -emulsify init "My Project" ./projects --starter https://github.com/emulsify-ds/emulsify-starter --checkout main +emulsify init "My Project" ./projects --platform none --starter https://github.com/emulsify-ds/emulsify-starter --checkout main ``` ## Systems @@ -57,11 +65,16 @@ emulsify system list emulsify system ls ``` -`emulsify system install [name]` installs a system in the current Emulsify project. Use `compound` to install the built-in Compound system. The command installs required components by default. +Built-in systems in this CLI version: + +- `compound` +- `emulsify-ui-kit` + +`emulsify system install [name]` installs a system in the current Emulsify project. The command installs required components by default. Options: -- `--repository `: Installs a system from a specific Git repository. +- `--repository `: Installs a system from a specific Git repository. Custom repository URLs must end in `.git`. - `--checkout `: Checks out a specific system commit, branch, or tag. This is required when `--repository` is used. - `--all`: Installs all available components from the system instead of only required components. @@ -93,9 +106,9 @@ Options: Examples: ```bash -emulsify component install button +emulsify component install card emulsify component install card --dry-run -emulsify component i card --force +emulsify component i accordion --force emulsify component install --all ``` @@ -103,7 +116,7 @@ emulsify component install --all Options: -- `--directory `: Sets the variant structure directory where the component is created. +- `--directory `: Sets the variant structure where the component is created. - `--format `: Sets the component format. Supported values are `default` and `sdc`. - `--yes`: Replaces an existing component without an overwrite confirmation prompt. - `--dry-run`: Previews the destination and generated files without writing, removing, or creating files. @@ -113,8 +126,8 @@ In non-interactive environments, pass both `--directory` and `--format`. Examples: ```bash -emulsify component create card --directory base --format default -emulsify component create card --directory base --format default --dry-run +emulsify component create promo-card --directory molecules --format default +emulsify component create promo-card --directory molecules --format default --dry-run emulsify component create teaser --directory molecules --format sdc --yes emulsify component create teaser --directory molecules --format sdc --dry-run ``` @@ -148,4 +161,4 @@ Override files can use double-brace tokens: - `{{ directory }}` - `{{ format }}` -For each generated artifact, Emulsify CLI first checks for the matching override file. If the override is missing, the built-in template is used. If the override exists but is empty, the built-in template is used and a warning is logged. Unknown tokens are left unchanged and logged as warnings. Partial override sets are supported, so a project can override only `component.twig` and keep the built-in SCSS, data, and story templates. Extra arbitrary files are not generated by component template overrides. +For each generated artifact, Emulsify CLI first checks for the matching override file. If the override is missing, the built-in template is used. If the override exists but is empty, the built-in template is used and a warning is logged. Unknown tokens are left unchanged and logged as warnings. Partial override sets are supported, so a project can override only `component.twig` and keep the built-in SCSS, data, and story templates. diff --git a/docs/hooks-and-cache.md b/docs/hooks-and-cache.md new file mode 100644 index 0000000..ab0b929 --- /dev/null +++ b/docs/hooks-and-cache.md @@ -0,0 +1,87 @@ +# Hooks And Cache + +Emulsify CLI can run project setup hooks and caches cloned system repositories locally. + +## Starter Init Hook + +During `emulsify init`, the CLI checks the cloned starter for: + +```text +.cli/init.js +``` + +If the file exists, it is executed with the same Node.js binary running the CLI. + +Execution timing: + +1. Starter repository is cloned. +2. `project.emulsify.json` is written. +3. Project dependencies are installed. +4. `.cli/init.js` runs if present. +5. The starter `.git` directory is removed. + +The hook working directory is the hook file directory, so relative file operations are resolved from `.cli/`. + +Example starter hook: + +```js +import { writeFile } from 'node:fs/promises'; +import { resolve } from 'node:path'; + +await writeFile(resolve('..', '.env.example'), 'STORYBOOK_PORT=6006\n'); +``` + +## System Install Hook + +The CLI has a `systemInstall.js` hook constant for system installation workflows: + +```text +.cli/systemInstall.js +``` + +When system install can discover the hook location, it executes the file with Node.js after required components and general assets are installed. + +Use this hook for setup that must happen after a system has populated project files. Keep it idempotent because system installs may be repeated in local development or test projects. + +## Local Cache + +System repositories are cloned into the Emulsify cache directory: + +```text +~/.emulsify/cache +``` + +The cache path includes: + +| Input | Why It Matters | +| ------------------- | ------------------------------------------------------------------ | +| Cache bucket | Systems currently use the `systems` bucket. | +| Project config path | Different Emulsify projects get separate cache locations. | +| Checkout | Different tags, branches, or commits get separate cache locations. | +| System name | The parsed repository name becomes the final cache segment. | + +The project path and checkout are hashed, so the full path is intentionally not human-friendly. + +## Cache Reuse + +If the expected cached repository already exists, the CLI reuses it instead of cloning again. This keeps repeated component installs fast and keeps a project pinned to the checkout recorded in `project.emulsify.json`. + +If you need to force a fresh clone, remove the relevant cache directory under: + +```text +~/.emulsify/cache/systems +``` + +There is currently no CLI command for clearing the cache. + +## Copy Behavior + +Component and asset copies come from the cache into the current project. + +| Command | Copy Source | Destination | +| ------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| `system install` | Required or all system components, plus variant files and directories. | Project paths from the selected variant. | +| `component install` | One component and its dependencies, or all components. | Structure implementation directories in `project.emulsify.json`. | +| `component create` | Built-in templates or `.cli/templates` overrides. | Structure implementation directory selected by `--directory` or prompt. | + +Install commands use safe path resolution so component and asset destinations stay inside the Emulsify project root. diff --git a/docs/project-initialization.md b/docs/project-initialization.md new file mode 100644 index 0000000..763b192 --- /dev/null +++ b/docs/project-initialization.md @@ -0,0 +1,127 @@ +# Project Initialization + +Use `emulsify init` to create a new Emulsify project from a starter repository. + +```bash +emulsify init [name] [path] +``` + +The command clones a starter, writes `project.emulsify.json`, installs dependencies, runs the starter init hook when present, removes the starter `.git` directory, and prints next-step guidance. + +## Platform And Starter Resolution + +The CLI tries to determine the platform from the current working directory before prompting or using defaults. + +| Detection | Result | +| ----------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | +| Drupal Composer project with `extra.drupal-scaffold.locations.web-root` | Platform `drupal`, target parent `/themes/custom`. | +| Existing Emulsify project found by `project.emulsify.json` | Platform `none`, target parent `/web/themes/custom`. | +| No detectable platform | Use `--platform`, prompt in an interactive terminal, or use `--yes` to accept defaults. | + +Built-in starter repositories: + +| Platform | Repository | Checkout | +| -------- | -------------------------------------------------------- | -------- | +| `none` | `https://github.com/emulsify-ds/emulsify-starter` | `main` | +| `drupal` | `https://github.com/emulsify-ds/emulsify-drupal-starter` | `main` | + +You can override starter resolution with `--starter` and `--checkout`. + +## Target Directory + +The `[path]` argument is the parent directory. The CLI creates the project inside that parent using the machine name. + +```bash +emulsify init "Marketing Site" ./projects --platform none +``` + +Creates: + +```text +./projects/marketing-site +``` + +Drupal machine names use underscores: + +```bash +emulsify init "My Theme" ./web/themes/custom --platform drupal +``` + +Creates: + +```text +./web/themes/custom/my_theme +``` + +If the target already exists, initialization stops with an error and does not overwrite the directory. + +## Machine Names + +If `--machineName` is omitted, the CLI derives one from the project name by removing non-alphanumeric characters, replacing spaces, and lowercasing the result. + +| Platform | Project Name | Derived Machine Name | +| -------- | ---------------- | -------------------- | +| `none` | `Marketing Site` | `marketing-site` | +| `drupal` | `My Theme` | `my_theme` | + +Use `--machineName` when the folder name or Drupal theme machine name must be exact. + +```bash +emulsify init "My Theme" ./web/themes/custom --platform drupal --machineName custom_theme +``` + +## Non-Interactive Initialization + +In non-TTY environments, the command does not prompt. Provide the needed values as arguments and flags. + +```bash +emulsify init "Build Theme" ./web/themes/custom --platform drupal --yes +``` + +With `--yes`, missing values use the current defaults: + +| Value | Default | +| ------------- | --------------- | +| Project name | `emulsifyTheme` | +| Target parent | `./` | +| Platform | `drupal` | + +Explicit arguments and flags still take precedence over `--yes` defaults. + +## Custom Starter + +Use a custom starter when the built-in starter list does not match the project. + +```bash +emulsify init "Client Theme" ./web/themes/custom \ + --platform drupal \ + --starter https://github.com/example/client-starter \ + --checkout v1.2.0 +``` + +If `--checkout` is omitted, the starter repository default branch is cloned. + +## Generated Project Configuration + +After a Drupal init, the generated `project.emulsify.json` looks like this: + +```json +{ + "project": { + "platform": "drupal", + "name": "My Theme", + "machineName": "my_theme" + }, + "starter": { + "repository": "https://github.com/emulsify-ds/emulsify-drupal-starter" + } +} +``` + +Systems and variants are added later by `emulsify system install`. + +## Starter Init Hook + +If the cloned starter contains `.cli/init.js`, the CLI runs it with Node.js after dependencies install and before the starter `.git` directory is removed. The hook process runs with its working directory set to the hook file directory. + +Starter hooks are useful for one-time project setup that belongs to the starter rather than the CLI. diff --git a/docs/release.md b/docs/release.md new file mode 100644 index 0000000..342f39e --- /dev/null +++ b/docs/release.md @@ -0,0 +1,81 @@ +# Release + +This project publishes to npm with GitHub Actions and semantic-release. + +## Branches + +| Branch | Behavior | +| --------- | --------------------------------------------------------------------------------------------------------- | +| `develop` | CI validates changes. A workflow may update `package.json` and `package-lock.json` from semantic commits. | +| `main` | CI validates changes and the publish workflow runs semantic-release. | + +## CI Checks + +The workflows use Node.js 24 and run the project checks from a clean install. + +Typical validation includes: + +```bash +npm ci +npm run build +npm run type +npm run test +npm pack --dry-run +``` + +There are currently both `ci.yml` and `test.yml` workflows that validate pull requests and pushes. + +## Develop Version Bump + +Pushes to `develop` run: + +```bash +npm run version:develop -- +``` + +If semantic commits imply a package version change, the workflow commits updated package metadata back to `develop` with: + +```text +chore(release): bump version to [skip ci] +``` + +## Publishing + +Pushes to `main` run the `Publish` workflow: + +1. Check out full Git history. +2. Install Node.js 24. +3. Run `npm ci`. +4. Run `npm run build`. +5. Run `npm run semantic-release`. + +semantic-release is configured in `release.config.cjs` with: + +| Plugin | Purpose | +| ------------------------------------------- | ------------------------------------------------- | +| `@semantic-release/commit-analyzer` | Determine the release type from semantic commits. | +| `@semantic-release/release-notes-generator` | Generate release notes. | +| `@semantic-release/npm` | Publish the package to npm. | +| `@semantic-release/github` | Publish GitHub release metadata. | + +The publish workflow uses `GITHUB_TOKEN` and `NPM_TOKEN` from GitHub Actions. + +## Commit Conventions + +The release config uses the Angular preset. Breaking changes are detected from: + +```text +BREAKING CHANGE +BREAKING CHANGES +BREAKING +``` + +Example release-driving commits: + +```text +fix(component): preserve dependency install order +feat(init): support non-interactive defaults +feat(system)!: require explicit custom checkouts + +BREAKING CHANGE: custom system installs now require --checkout. +``` diff --git a/docs/systems.md b/docs/systems.md new file mode 100644 index 0000000..3fbc21c --- /dev/null +++ b/docs/systems.md @@ -0,0 +1,151 @@ +# Systems + +An Emulsify system is a repository of reusable components, global assets, structure definitions, and platform variants. A project must install one system before `component list`, `component install`, or `component create` can load variant-aware component information. + +## List Systems + +```bash +emulsify system list +emulsify system ls +``` + +Built-in systems in this CLI version: + +| Name | Repository | +| ----------------- | ---------------------------------------------------- | +| `compound` | `https://github.com/emulsify-ds/compound.git` | +| `emulsify-ui-kit` | `https://github.com/emulsify-ds/emulsify-ui-kit.git` | + +The list is currently hard-coded in the CLI. Future versions may resolve systems from a registry. Installation still depends on the variants defined by the selected system's `system.emulsify.json`. + +## Install A Built-In System + +Run `system install` from inside an Emulsify project. + +```bash +emulsify system install compound +``` + +The command: + +1. Finds and validates the nearest `project.emulsify.json`. +2. Resolves the named system repository. +3. Checks out the latest Git tag when the built-in system reference does not specify a checkout. +4. Clones the system into the local Emulsify cache. +5. Reads and validates `system.emulsify.json` from the cached system. +6. Selects the variant that matches `project.platform`. +7. Writes `system` and `variant` entries into `project.emulsify.json`. +8. Installs components marked `required: true`. +9. Installs variant-level general files and directories. + +Use `--all` to install every component in the selected variant during system installation: + +```bash +emulsify system install compound --all +``` + +## Install A Custom System + +Use `--repository` and `--checkout` together. + +```bash +emulsify system install \ + --repository https://github.com/example/example-system.git \ + --checkout v1.0.0 +``` + +Custom system repository URLs must end in `.git`, because the CLI parses the system name from the repository filename. + +Prefer tags or commit hashes for `--checkout` so subsequent installs use the same system version. + +## Project Config After Install + +After a successful install, `project.emulsify.json` includes system and variant data: + +```json +{ + "project": { + "platform": "drupal", + "name": "My Theme", + "machineName": "my_theme" + }, + "starter": { + "repository": "https://github.com/emulsify-ds/emulsify-drupal-starter" + }, + "system": { + "repository": "https://github.com/emulsify-ds/compound.git", + "checkout": "v1.0.0" + }, + "variant": { + "platform": "drupal", + "structureImplementations": [ + { + "name": "base", + "directory": "components/00-base" + } + ] + } +} +``` + +The exact checkout and structure mappings come from the installed system. + +## System Repository Shape + +A system repository must contain `system.emulsify.json` at its root. The schema requires: + +| Field | Required | Purpose | +| ------------ | -------- | ---------------------------------------------------------------------- | +| `name` | Yes | System machine name. | +| `homepage` | Yes | Documentation, styleguide, or example URL. | +| `repository` | Yes | System repository URL. | +| `structure` | Yes | Named structural groups, such as `base` or `molecules`. | +| `variants` | No | Platform-specific implementations, components, files, and directories. | + +Each variant used by the CLI must include: + +| Field | Required | Purpose | +| -------------------------- | -------- | ----------------------------------------------------------------------- | +| `platform` | Yes | Variant platform. Built-in schemas currently allow `none` and `drupal`. | +| `structureImplementations` | Yes | Mapping from structure names to project-relative directories. | +| `components` | Yes | Installable component definitions. | +| `directories` | No | General directories copied during system install. | +| `files` | No | General files copied during system install. | + +To be installable, a system must include a variant whose `platform` matches the current project's `project.platform`. + +Minimal example: + +```json +{ + "name": "example-system", + "homepage": "https://example.com/example-system", + "repository": "https://github.com/example/example-system.git", + "structure": [ + { + "name": "base", + "description": "Base components" + } + ], + "variants": [ + { + "platform": "drupal", + "structureImplementations": [ + { + "name": "base", + "directory": "components/00-base" + } + ], + "components": [ + { + "name": "button", + "structure": "base", + "required": true + } + ] + } + ] +} +``` + +The component folder in the system repository must match the variant structure and component name. For the example above, the cached source path is `components/00-base/button`. diff --git a/package-lock.json b/package-lock.json index 0d62621..4fc5f3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@emulsify/cli", - "version": "2.1.0", + "version": "2.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@emulsify/cli", - "version": "2.1.0", + "version": "2.1.2", "license": "GPL-2.0", "dependencies": { "@inquirer/prompts": "^8.5.2", diff --git a/package.json b/package.json index eccf4fd..e329175 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@emulsify/cli", "productName": "Emulsify CLI", - "version": "2.1.0", + "version": "2.1.2", "description": "Command line interface for Emulsify", "repository": "git@github.com:emulsify-ds/emulsify-cli.git", "author": "Patrick Coffey ",