SSkilltecabyclaudinhocode
Enviar skill
← Voltar para o catálogo

scaffold-project

Desenvolvimento

Разворачивает скелет нового проекта за один диалог: создаёт CLAUDE.md, README, DEVELOPMENT.md, CHANGELOG, incidents.md, rfc/, docs/decisions/, private/backlog/ как DB (BL-NN.md + backlog.base для Obsidian Bases) + первый BL-1, .gitignore, .env.example. По выбору подключает extension-pack под стек (node-cli, python-mcp). Делает git init и первый коммит. После этого все следующие задачи в проекте ид

2estrelas
Ver no GitHub ↗Autor: ymuromcevLicença: MIT

scaffold-project — bootstrap нового проекта

Когда пользователь говорит «новый проект» — этот скилл разворачивает полный скелет за один диалог. После scaffold все задачи в проекте идут через dev-workflow.

Шаг 0 — определить режим

Скилл различает три режима по триггер-фразе пользователя:

ТриггерРежим
«новый проект», «init project», «scaffold проект», «развернуть проект», и т.п.fresh / extension (Шаги 1–5 ниже)
«причеши проект», «оформи как dev-проект», «back-fill бэклог», «добавь дев-обвязку», /scaffold-project --backfillback-fill (секция «Back-fill mode» — пропускаем Шаги 1–5, идём туда)

Если триггер двусмысленный (например, просто /scaffold-project в каталоге с CLAUDE.md) — спросить пользователя один раз: «у проекта уже есть CLAUDE.md. Это fresh-init где-то ещё, или back-fill сюда?».

Шаг 1 — pre-checks (fresh / extension режим)

Перед стартом скилл проверяет целевой каталог:

СостояниеДействие
Каталог не существует / пустойПродолжаем (mkdir создаст).
Не пуст, нет CLAUDE.md/package.json/pyproject.tomlПродолжаем, но предупреждаем «каталог не пуст, продолжить?».
Есть package.json или pyproject.toml без CLAUDE.mdПредлагаем extension mode: добавить недостающие base-файлы, не трогая существующее.
Есть CLAUDE.mdОтказ + подсказка: «проект уже инициализирован. Если хочешь добавить недостающую дев-обвязку — скажи back-fill или причеши проект (см. секцию Back-fill mode)».

Шаг 2 — диалог

Скилл задаёт пять вопросов. Не больше, не меньше.

  1. Имя проекта (kebab-case). Валидация: ^[a-z][a-z0-9-]{1,40}$. Не проходит — спрашиваем заново.
  2. Однострочное описание — 1 предложение, чем проект полезен. Если пользователь хочет дать развёрнутый scope — приветствуется, уйдёт в {{SCOPE_DESCRIPTION}} as-is.
  3. Стек:
    • node-cli — Node 20+ CLI или библиотека, тесты через node --test.
    • python-mcp — Python MCP-сервер или скрипт, тесты через pytest.
    • both — оба extension'а.
    • none — только base, никакого языкового скелета.
  4. Внешние сервисы, которые предполагаются сразу (Notion / Gmail / Stripe / Sentry / другое). Список справочный — попадёт в .env.example и в комментарий к BL-001. Если ничего — none.
  5. Работа с user data?yes / no. Это любые пользовательские данные: профили, контент пользователя, сообщения, email/telegram-чаты, транзакции. Если yes — обязательно подключаем extension multi-user-base (см. секцию «Identity & PII rules»). Это не «потом докрутим» — потом стоит недели работы.

Шаг 3 — preview + approve

Перед записью — плоский список файлов, которые скилл создаст:

<project-root>/
├── CLAUDE.md
├── README.md
├── DEVELOPMENT.md
├── CHANGELOG.md
├── incidents.md
├── .gitignore
├── .env.example
├── rfc/_README.md
├── docs/decisions/_README.md
├── private/backlog.base                  # Obsidian Bases view
├── private/backlog/_README.md            # конвенции: frontmatter, статусы, теги версий
├── private/backlog/BL-1.md               # первый таск (scaffold), in_progress
├── package.json                          (если node-cli)
├── engine/index.js                       (если node-cli)
├── engine/index.test.js                  (если node-cli)
├── pyproject.toml                        (если python-mcp)
├── server.py                             (если python-mcp)
└── tests/test_smoke.py                   (если python-mcp)

Жду явного «ok» от пользователя.

Шаг 4 — запись

По approve:

  1. Pre-flight check. До любых mkdir / write:
    • git --version отвечает (git установлен).
    • git config --get user.name и git config --get user.email оба возвращают значение. Если что-то из этого не выполнено — отказ с понятным сообщением («настрой git config --global user.email … и попробуй заново»). Никаких файлов не создаём, пока pre-flight красный — иначе получим скаффолд без коммита и тупик в следующем запуске («есть CLAUDE.md, отказ»).
  2. mkdir -p <project-root> если не существует. Запомним флаг created_root = (true | false) — пригодится для отката.
  3. Для каждого файла из templates/base/ (и выбранных templates/extensions/<name>/):
    • читаем шаблон,
    • подменяем плейсхолдеры (см. ниже),
    • пишем в <project-root>/<relative-path> без .tpl в имени.
    • исключение: файл README.md в корне каждого templates/extensions/<name>/ — это документация самого extension'а (для скилла, не для проекта). Не копируется в проект.
    • запоминаем список записанных файлов (created_files[]) — для отката.
  4. Sanity-check: grep -l '{{' <created_files[]> (только по только-что-записанным файлам, не по всему каталогу — иначе ловим ложные срабатывания на _README.md-примерах). Если что-то осталось — error и откат:
    • fresh-mode (created_root = true): rm -rf всего каталога.
    • extension-mode (created_root = false): удаляем только created_files[], не трогая ничего другого. Никогда не удаляем целиком чужой каталог.
  5. cd <project-root>git initgit add .git commit -m "scaffold from scaffold-project v{{SCAFFOLD_VERSION}}".
  6. Спросить про push в origin (по правилу из workspace-CLAUDE.md «после каждого коммита спрашивать про push»). Если remote ещё нет — предложить gh repo create (с подтверждением).

Плейсхолдеры

ПлейсхолдерИсточник
{{PROJECT_NAME}}ответ пользователя
{{PROJECT_NAME_UPPER}}UPPER_SNAKE_CASE из имени (-_)
{{SHORT_DESCRIPTION}}ответ на вопрос 2, первое предложение
{{SCOPE_DESCRIPTION}}ответ на вопрос 2 целиком (или то же, что short)
{{STACK}}human-readable mapping: node-cliNode.js 20+ (CLI / library), python-mcpPython 3.11+ (MCP server), bothNode.js 20+ + Python 3.11+, noneTBD — choose during BL-001
{{DATE}}сегодняшняя дата YYYY-MM-DD
{{AUTHOR}}git config user.name, или unknown
{{SCAFFOLD_VERSION}}версия скилла из его CHANGELOG.md
{{EXTERNAL_SERVICES}}ответ на вопрос 4, или none
{{today}}сегодняшняя дата YYYY-MM-DD (alias к {{DATE}} для frontmatter)
{{project_name}}то же что {{PROJECT_NAME}} (alias для frontmatter-шаблонов)

Подмена — простой текстовый replaceAll по содержимому файла.

Шаг 5 — после scaffold

После первого коммита Claude:

  1. Резюмирует что создано (файлы, какие extensions подключены).
  2. Указывает на private/backlog/BL-1.md как первую задачу (in_progress, scaffold). Открыть private/backlog.base в Obsidian — увидишь backlog как таблицу с view'ми Active / Archived / Cards.
  3. Напоминает: «дальше работаем через dev-workflow. Все M/L задачи — через RFC, тесты, code-review».

Back-fill mode — добавить дев-обвязку в существующий проект

Режим для проектов, у которых уже есть CLAUDE.md и свой контент, но нет (или есть не вся) дев-обвязка: private/backlog/, backlog.base, rfc/, incidents.md, CHANGELOG.md. Скилл добавляет недостающее из тех же templates/base/, чтобы формат был один к одному с тем, что получают свежие проекты.

Зачем: раньше Claude в таких проектах делал обвязку руками, сочинял собственные поля в frontmatter, нарушал конвенции и потом приходилось переделывать. Back-fill mode закрывает эту дыру — формат всегда из templates, ничего не сочиняется.

Когда триггерится

  • Триггер-фраза: «причеши проект», «оформи как dev-проект», «back-fill бэклог», «добавь дев-обвязку», /scaffold-project --backfill.
  • Каталог: CLAUDE.md уже существует (иначе это fresh-init, не back-fill).

Что back-fill делает (scope)

Файл шаблонаДействие
templates/base/CHANGELOG.md.tplдобавить если нет
templates/base/incidents.md.tplдобавить если нет
templates/base/rfc/_README.mdдобавить если rfc/_README.md нет
`templates/base/docs/decisi

Como adicionar

/plugin marketplace add ymuromcev/claude-scaffold-project

O comando exato pode variar conforme o repositório. Confira o README no GitHub.

Comentários · Nenhum comentário

Entre para comentar. Entrar

  • Ainda não há comentários. Seja o primeiro.