一键导入
create-web
Scaffold a production-ready web application from language templates. Use when the user wants to bootstrap a new web project from scratch.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Scaffold a production-ready web application from language templates. Use when the user wants to bootstrap a new web project from scratch.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Generates changelog entries from git history following Keep a Changelog conventions and cuts versioned releases. Use when the user wants to update CHANGELOG.md with recent commits or promote [Unreleased] to a versioned release.
Creates a conventional git commit with gitmoji prefix and lowercase imperative message. Use when the user is ready to commit staged changes or wants help composing a clean, atomic commit message.
Scaffolds production-ready CLI projects from language templates, supporting Go with Cobra, Makefile, golangci-lint, goreleaser, and GitHub Pages docs; and Python with Typer, uv, ruff+mypy, PyPI OIDC trusted publishing, and GitHub Pages docs. Use when the user wants to bootstrap a new command-line tool project from scratch.
Analyzes a codebase and generates LLM-optimized documentation covering project overview, architecture, build system, testing, development patterns, deployment, and a file catalog. Use when the user wants to document a codebase or refresh existing project documentation.
Transforms documents into polished self-contained HTML by reading Markdown/text directly, converting other supported inputs with uvx markitdown, selecting from 20 purpose-built templates, and generating the output.
Turns a rough description into a structured GitHub issue with gitmoji title, problem statement, acceptance criteria, optional interview mode, and posting via gh CLI.
| name | create-web |
| description | Scaffold a production-ready web application from language templates. Use when the user wants to bootstrap a new web project from scratch. |
AGENTS.md encoding 37signals engineering principles (symlinked as CLAUDE.md)/create-web
/create-web name=my-app template=ruby database=mysql
Read templates/ to understand the available templates and what variable placeholders each one uses before collecting any input from the user. Read reference/37signals-style.md before changing Rails conventions, and reference/template-maintenance.md only when adding a new language template.
Collect these values via AskUserQuestion. Auto-detect github_user silently; never prompt the user for it.
| Field | Default | Notes |
|---|---|---|
name | — | Lowercase, hyphenated app name (e.g., my-app) |
template | ruby | Currently ruby only — present as "(only option currently)" |
description | — | One sentence: what this app does |
github_user | auto | gh api user --jq .login |
database | sqlite | sqlite or mysql |
ruby_version | 3.4.2 | Latest stable Ruby |
visibility | private | private or public |
Derived values — never ask the user:
| Variable | Derivation | Example |
|---|---|---|
APP_CLASS | PascalCase(name) | my-app → MyApp |
APP_MODULE | underscore(name) | my-app → my_app |
APP_NAME_HUMAN | Title Case(name) | my-app → My App |
YEAR | current year | 2025 |
PascalCase: split on -, capitalize each word, join. Underscore: replace - with _.
Display a confirmation card before creating anything:
╭─ App Spec ──────────────────────────────────────────╮
│ Name: {name} │
│ Class: {APP_CLASS} │
│ Description: {description} │
│ Template: Ruby on Rails 8.x (37signals style) │
│ Database: {database} │
│ Ruby: {ruby_version} │
│ Auth: Passwordless magic links (no Devise) │
│ Frontend: Hotwire (Turbo + Stimulus) + importmap │
│ CSS: Native CSS (no Tailwind) │
│ Jobs: Solid Queue (no Redis) │
│ Deploy: Kamal │
│ Repo: github.com/{github_user}/{name} │
╰──────────────────────────────────────────────────────╯
Ask: "Does this look right? Shall I scaffold the project?"
Execute in order:
Create GitHub repo and clone:
gh repo create {github_user}/{name} --{visibility} --clone --description "{description}"
cd {name}
Copy template files with variable substitution:
templates/ruby/ (relative to this skill's directory) to the project root{{PLACEHOLDER}} tokens in both file contents and filenames:
{{APP_NAME}} → {name}{{APP_CLASS}} → {APP_CLASS}{{APP_MODULE}} → {APP_MODULE}{{APP_NAME_HUMAN}} → {APP_NAME_HUMAN}{{GITHUB_USER}} → {github_user}{{DESCRIPTION}} → {description}{{RUBY_VERSION}} → {ruby_version}{{DATABASE}} → {database} (value: sqlite3 for sqlite, mysql2 for mysql){{YEAR}} → current year.tmpl extension from all *.tmpl files after substitutionchmod +x bin/*Install dependencies:
bundle install
Prepare database (runs db:create + db:migrate + db:seed):
bin/rails db:prepare
Install git hooks:
bundle exec lefthook install
Create CLAUDE.md symlink:
ln -s AGENTS.md CLAUDE.md
Initial commit and push:
git add -A
git commit -m "🎉 init: scaffold {APP_NAME_HUMAN} from create-web"
git push -u origin main
Configure GitHub repo:
gh repo edit --enable-wiki=false --enable-issues=true
✅ Created: https://github.com/{github_user}/{name}
Template: Ruby on Rails 8.x (37signals style)
Next steps:
cd {name}
bin/dev # start development server (localhost:3000)
open http://localhost:3000 # view the app
bin/rails test # run tests
make lint # run rubocop
bin/rails generate model ... # add your first model
Documentation:
docs/development.md # local setup guide
docs/deployment.md # Kamal deployment guide
config/deploy.yml # Kamal deployment config — fill in your server IP and domain
AGENTS.md # AI agent conventions (← CLAUDE.md)
| Placeholder | Example | Used in |
|---|---|---|
{{APP_NAME}} | my-app | filenames, Kamal config, README |
{{APP_CLASS}} | MyApp | Ruby module names, application.rb |
{{APP_MODULE}} | my_app | database names, directory paths |
{{APP_NAME_HUMAN}} | My App | page titles, email subjects, commit message |
{{GITHUB_USER}} | pavelsimo | repo URL, Docker image registry, Kamal |
{{DESCRIPTION}} | A task manager... | README, repo description |
{{RUBY_VERSION}} | 3.4.2 | .ruby-version, Gemfile, Dockerfile |
{{DATABASE}} | sqlite3 | database.yml default adapter |
{{YEAR}} | 2025 | LICENSE copyright line |
Substitution applies to both file contents and filenames. .tmpl extension is stripped post-substitution.
github_user silently via gh api user --jq .login; never prompt the user for itClosure, Publication) rather than boolean columns — this is the 37signals patternapp/assets/stylesheets/ using cascade layers — never suggest Tailwindresource :closure, "pin" → resource :pin, "watch" → resource :watch