start-ts-by β
Create ts/js projects from flexible templates using git and local folders.
π Get Started β
npx start-ts-by [projectName]
# or
npx start-ts-by create [projectName]Interactive Mode β
npx start-ts-by
# Example workflow:
# π Start creating project...
# β Enter project name: my-app
# β Enter template (e.g. user/repo, ./local-path, git@domain:group/repo.git)
# ? Choose a template (Use arrow keys)
# royfw/starter-ts-app (Starter TypeScript App)
# royfw/starter-ts-lib (Starter TypeScript Library)
# ...Non-interactive Mode β
Basic Usage β
# Using --no-interaction (--ni) flag
npx start-ts-by my-app -t royfw/starter-ts-app --no-interaction
npx start-ts-by my-app -t royfw/starter-ts-app --ni
# Legacy --skip-prompt flag (deprecated, use --no-interaction)
npx start-ts-by my-app --skip-prompt -t royfw/starter-ts-appMonorepo Mode β
# Non-interactive mode: Remove lock files, workspace config, .npmrc, and packageManager field
npx start-ts-by my-app -t user/repo --monorepo --ni
# Combine with other flags
npx start-ts-by my-app -t user/repo --monorepo --no-husky --ni
# Interactive mode: Specify --monorepo flag upfront
npx start-ts-by my-app -t user/repo --monorepo
# Interactive mode: Will prompt for monorepo mode if not specified
npx start-ts-by my-app -t user/repo
# During prompts, you'll see:
# ? Enable monorepo mode? (Remove lock files, workspace config, .npmrc, and packageManager field) (y/N)The --monorepo flag (or interactive prompt) automatically removes files that conflict with monorepo root configuration:
pnpm-lock.yaml,pnpm-workspace.yaml,package-lock.json,yarn.lock(lock files and workspace config).npmrc(package manager config).huskydirectory andpreparescript containing "husky" in package.json.githubdirectory (GitHub Actions workflows)packageManagerfield in package.json
Interactive Mode Behavior:
- If you provide
--monorepoflag when starting, it will be pre-selected in the prompts - If you don't provide the flag, you'll be asked during the interactive prompts
- Default is
false(not enabled) - press Enter to skip or type 'y' to enable
This is useful when creating subprojects in a monorepo where these files should be managed at the root level.
Advanced Non-interactive with Variables β
# Using --vars for inline variables
npx start-ts-by my-app --ni --vars name=my-app,template=user/repo
npx start-ts-by my-app --ni --vars "removeList[0].field=README.md,removeList[0].isRemove=true"
# Using --vars-file for configuration files
npx start-ts-by my-app --ni --vars-file ./project.vars
# Combining multiple sources (vars override vars-file)
npx start-ts-by my-app --ni --vars-file ./base.vars --vars template=user/custom-repoVariable File Format (.vars) β
Create a .vars file with key=value pairs:
# project.vars
name=my-awesome-app
template=user/repo
# Nested variables for removeList
removeList[0].field=README.md
removeList[0].isRemove=true
removeList[1].field=.github
removeList[1].isRemove=false
# Execution options
execList[0].key=gitInit
execList[0].command=git init
execList[0].isExec=true
# File content (@ prefix reads from file)
# token=@./secret-token.txt
# Include other vars files
# include: ./common.varsTemplate Sources with Branches/Subdirectories β
npx start-ts-by my-app -t royfw/starter-ts-app#dev/subdir --ni
npx start-ts-by my-app -t git@your.gitlab:group/repo.git#v2/templates --ni
npx start-ts-by my-app -t ./my-template-folder/subdir --niList Available Templates β
# List all available templates (human-readable format)
npx start-ts-by --list
npx start-ts-by -l
# List templates in JSON format (for programmatic use)
npx start-ts-by --list-json
# List templates with descriptions (verbose mode)
npx start-ts-by --list-verboseExample Output:
π¦ Available Templates:
π Built-in Templates (builtin)
ββ TypeScript Library
ββ TypeScript Application
ββ Monorepo Template
π start-ts-templates (registry)
ββ App (tsdown)
ββ Library
β¨ Total 5 templates from 2 sourcesπ Registry Support β
start-ts-by supports loading templates from external registries, allowing you to use community-provided template collections.
Setting Up Registry β
Create a registry-config.json file:
{
"registries": [
{
"name": "start-ts-templates",
"url": "https://raw.githubusercontent.com/royfw/start-ts-templates/main/registry.json",
"enabled": true
}
],
"cacheDir": ".cache/registries",
"cacheTTL": 3600000
}Registry.json Format β
External registries should provide a JSON file in the following format:
{
"repo": "your-org/your-templates-repo",
"defaultRef": "main",
"templates": [
{
"id": "template-id",
"path": "templates/template-path",
"title": "Template Display Name",
"description": "Optional description"
}
]
}Using Registry Templates β
When running npx start-ts-by create my-project:
- Select template source (Built-in / Registry / Manual input)
- If you choose Registry, select a specific template
- Or use
--listto view all available templates
For detailed instructions, see Registry Guide | zh-TW.
Official Template Collection β
Visit start-ts-templates repository for official template collection and registry configuration.
π Supported Template Sources & Syntax β
GitHub
user/repouser/repo#branchuser/repo#branch/subdiruser/repo/subdir
Custom Git / GitLab / Bitbucket / Gitea / etc.
git@your.gitlab:group/repo.git#branch/subdirhttps://your.gitlab/group/repo.git#tag/subdir
Local Folders
./my-template./my-template/subdirfile:./my-template#subdir
β‘ How It Works β
- Removed degit dependency.
- Uses native
gitcommands to clone repositories based on parsed template source. - Local folders are copied directly.
- Supports branch/tag and subdirectory selection for all git sources.
- Works with GitHub, GitLab, private git servers, SSH/HTTP URLs, and local paths.
CLI Help β
npx start-ts-by --help
Usage: start-ts-by [options] [command]
Start TypeScript project by git repo or local folder templates
Options:
-V, --version output the version number
-l, --list List all available templates
--list-json List all available templates in JSON format
--list-verbose List all available templates with descriptions
-h, --help display help for command
Commands:
create [options] [name] Create new project from template (Default)
help [command] Display help for command
# Create command options:
npx start-ts-by create --help
Options:
-t, --template <repo> Template source (user/repo, git@domain:group/repo.git, ./local-folder)
--skip-prompt Skip prompt (deprecated, use --no-interaction)
--no-interaction, --ni Non-interactive mode, skip all prompts
--yes, -y Use defaults and skip confirmations when applicable
--vars <pairs...> Variables in key=value format (can be used multiple times)
--vars-file <path> Path to variables file (non-JSON, supports includes)
--strict Strict mode: treat duplicate keys and type conflicts as errors
--rm <files...> Remove files/folders after project creation
--no-husky Remove .husky
--github Keep .github/workflows
--git-init Run git init after creation
--npm-install Run npm install after creation
--monorepo Remove monorepo conflicting files (lock files, workspace config, .npmrc, .husky, .github, prepare script, packageManager field)
-h, --help display help for commandVariable Priority (high to low) β
--varscommand line arguments--vars-filefile contents- Individual flags (
-t,--rm, etc.) - Environment variables
- Interactive input
- Default values
Error Handling β
- Non-interactive mode requires
nameandtemplateparameters - Missing required parameters exit with code 2
- File read errors and parsing failures provide specific error messages
--strictmode treats duplicate keys and type conflicts as errors (default: warnings)
References β
Key changes:
- degit is removed, all template fetching is handled by git commands or direct file copy.
- Template source string is parsed to support repo URLs, branches, tags, and subdirectories.