create-taman

GitHubnpm
CLI that downloads vinicunca/taman, applies template.manifest.ts, and writes a project you own.

Version 0.1.0. Bin: create-taman. Node >=22.18.0. See Create a project for the user flow.

Library exports

The package's "." export is src/index.ts (the generate API). The CLI entry is dist/bin.mjs.

From packages/create-taman/src:

parseCliArgs(argv: string[]): CliArgs
defaultRef(): string                    // `create-taman@${packageJson.version}`
main(argv?: string[]): Promise<void>

generateProject(options: {
  dir: string
  names: GenerateNames
  source: { type: 'github'; ref: string } | { type: 'local'; repo: string }
  git: boolean
}): Promise<{ warnings: string[] }>

validateName(value: string, label: string): string | undefined
normalizeScope(value: string): string   // strips @ and trailing /
toNames(name: string, scope: string): GenerateNames

GenerateNames: { name, scope, nameSnake } where nameSnake is name.replace(/[^a-z0-9]+/g, '_').

Template repo constant: github:vinicunca/taman. GitHub fetch uses giget force + forceClean. Local --from uses git archive HEAD.

Manifest (template.manifest.ts)

interface TemplateManifest {
  remove: Array<string>;
  workspacePackages: Array<string>;
  scripts: Array<string>;
  scopeFrom: string; // '@taman/'
  rename: Array<{ file: string; from: string; to: string }>;
}

to may contain {{name}}, {{scope}}, {{nameSnake}}. Explicit renames run before the scope rename. Unmatched remove globs or missing workspace package entries abort generation.

Name rules

/^[a-z0-9][\w.-]*$/ and no uppercase. Max 214 characters. Empty is rejected.

Git commit

git init -q, git add -A, git commit -q --no-verify -m 'Initial commit from create-taman'. If user.email is unset, -c user.name=create-taman -c user.email=create-taman@users.noreply.github.com. Failures become warnings; the project stays.