Skip to content
GitHubXDiscord

triggery create

Stable · since 0.1.0

Downloads a Triggery starter template into a new directory. Templates live under templates/<name> in the Triggery repo, so the versions stay in lockstep with @triggery/core. The fetch goes through gigetdegit-flavoured tar fetcher over the GitHub archive endpoint, with offline cache after the first run. No git clone, no Node shell-out.

Available as the triggery create CLI command and the createProject programmatic API.

import { createProject, isKnownTemplate, type TemplateName } from '@triggery/cli';
function createProject(options: CreateProjectOptions): Promise<CreateProjectResult>;

type TemplateName = 'vite-react' | 'next-app' | 'react-native';

interface CreateProjectOptions {
  readonly directory: string;
  readonly template: TemplateName;
  readonly cwd?: string;
  readonly force?: boolean;
}

interface CreateProjectResult {
  readonly directory: string; // absolute path
  readonly source: string;    // giget source spec
}
triggery create <directory> [--template <name>] [--force]
FlagDefaultDescription
--template <name>vite-reactOne of vite-react, next-app, react-native.
--forcefalseOverwrite an existing directory instead of erroring.
TemplateStack
vite-reactVite 5 + React 18 + TypeScript + @triggery/react + @triggery/vite. Default — fastest path to a working dev server.
next-appNext.js 15 (App Router) + @triggery/react. Triggery wired into a <TriggerRuntimeProvider> in app/providers.tsx.
react-nativeExpo + React Native + @triggery/react. Trigger registry imported from App.tsx.
triggery create my-chat

Output:

Scaffolded github:triggeryjs/triggery/templates/vite-react#main → /Users/you/my-chat
triggery create my-shop --template next-app
triggery create my-chat --force
import { createProject } from '@triggery/cli';

const { directory, source } = await createProject({
  directory: './apps/playground',
  template: 'vite-react',
});

console.log('scaffolded', source, '→', directory);

isKnownTemplate is the type predicate the CLI uses to reject unknown values:

import { createProject, isKnownTemplate, type TemplateName } from '@triggery/cli';

function safeTemplate(input: string): TemplateName {
  if (!isKnownTemplate(input)) {
    throw new Error(`Unknown template: ${input}`);
  }
  return input;
}

await createProject({
  directory: 'experiment',
  template: safeTemplate(process.env.TRIGGERY_TEMPLATE ?? 'vite-react'),
});

Each template ships:

  • A working dev server / build command (npm run dev / npm run build).
  • A src/triggers/ folder with one example trigger and one matching component.
  • The relevant @triggery/* packages already pinned in package.json.
  • @triggery/vite set up in vite.config.ts (Vite / Next templates) so *.trigger.ts auto-discovery works out of the box.
  • tsconfig.json with strict mode and the @triggery/* paths resolved.