CLI tool to scaffold feature modules with a consistent structure.
Featish creates standardized feature directories with barrel exports, README files, and a customizable folder layout — so every feature in your project follows the same pattern.
npm install -g featishOr use it directly with npx:
npx featish user-profile# Scaffold a new feature
featish user-profile
# Preview without creating files
featish user-profile --dry-run
# Custom folder structure
featish user-profile --folders components,hooks,utils
# Custom target directory
featish user-profile --dir src/modulesThis creates:
src/features/user-profile/
├── components/
│ └── index.ts
├── hooks/
│ └── index.ts
├── services/
│ └── index.ts
├── stores/
│ └── index.ts
├── types/
│ └── index.ts
├── utils/
│ └── index.ts
├── constants/
│ └── index.ts
├── index.ts
└── README.md
Usage: featish [options] <name>
Arguments:
name Feature name in kebab-case (e.g., user-profile)
Options:
-V, --version Output the version number
-d, --dir <path> Target directory relative to cwd (default: "src/features")
--no-barrels Skip generating barrel index.ts files
--no-readme Skip generating README.md
--dry-run Preview what would be created without writing files
--folders <items> Comma-separated list of folders to create
--verbose Show config resolution details
-h, --help Display help for command
Generate shell completions for your shell:
# Bash
featish completion >> ~/.bashrc
# Zsh
featish completion >> ~/.zshrc
# Fish
featish completion --fish > ~/.config/fish/completions/featish.fishGenerate a starter config file in your project root:
featish initThis creates a .featishrc.json with the default configuration, ready to customize.
Featish looks for configuration in the following files (in order):
featish.config.json.featishrc.json.featishrc
CLI flags override config file values, which override defaults.
| Option | Type | Default | Description |
|---|---|---|---|
dir |
string |
"src/features" |
Target directory relative to cwd |
folders |
string[] |
["components", "hooks", "services", "stores", "types", "utils", "constants"] |
Folders to create inside each feature |
barrels |
boolean |
true |
Generate barrel index.ts files |
readme |
boolean |
true |
Generate a README.md per feature |
React project (.featishrc.json):
{
"dir": "src/features",
"folders": ["components", "hooks", "services", "stores", "types", "utils", "constants"],
"barrels": true,
"readme": true
}Vue project:
{
"dir": "src/features",
"folders": ["components", "composables", "services", "stores", "types", "utils"],
"barrels": true,
"readme": true
}Plain TypeScript:
{
"dir": "src/modules",
"folders": ["services", "types", "utils", "constants"],
"barrels": true,
"readme": false
}Featish exports its core functions for use in other tools:
import { scaffoldFeature, generateFiles } from 'featish/api';
import { DEFAULT_CONFIG } from 'featish/api';
import type { FeatishConfig, FeatureFile } from 'featish/api';
// Generate file list without writing to disk
const files: FeatureFile[] = generateFiles('user-profile', DEFAULT_CONFIG);
// Scaffold a feature
const created = await scaffoldFeature('user-profile', DEFAULT_CONFIG, process.cwd(), false);MIT