From 23431c5e4aadf79d4265f2d0e7fa4d76f9c9c527 Mon Sep 17 00:00:00 2001 From: vitya Date: Wed, 6 May 2026 22:34:39 +0300 Subject: [PATCH] feat(project-bootstrap): add greenfield-full mode with remote create MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three modes now: greenfield-full (new + remote), add-remote, upgrade. Step 0: detect git/remote/empty state for mode selection. Step 1.5: Gitea API repo create + push. Step 8: projects-meta sync for visibility. Version 1.7.0 → 1.8.0 (MINOR). Co-Authored-By: Claude Opus 4.7 (1M context) --- dist/project-bootstrap.skill | Bin 10474 -> 11676 bytes skills/project-bootstrap/SKILL.md | 121 ++++++++++++++++++++++++++++-- 2 files changed, 115 insertions(+), 6 deletions(-) diff --git a/dist/project-bootstrap.skill b/dist/project-bootstrap.skill index 20860bf75f801ea90fe4346862ce493b8717a8fb..aeb1ef0731244776141de6215d87da5799036c11 100644 GIT binary patch delta 8534 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 delta 7298 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 diff --git a/skills/project-bootstrap/SKILL.md b/skills/project-bootstrap/SKILL.md index 2de14cc..8b842db 100644 --- a/skills/project-bootstrap/SKILL.md +++ b/skills/project-bootstrap/SKILL.md @@ -1,19 +1,21 @@ --- name: project-bootstrap -version: 1.7.0 +version: 1.8.0 description: > Initializes or upgrades a project in the current folder: git, .gitignore, README.md, .wiki/ using Karpathy's method, .tasks/ for task tracking, CLAUDE.md with skill triggers. + Creates remote Gitea repo and syncs projects-meta cache for greenfield projects. Use this skill when the user says "initialize project", "bootstrap", "setup project", "upgrade project", "add wiki", "add tasks", "start project", "set everything up", - or launches the agent in a new or existing folder and wants to configure the workspace. + "create new project", or launches the agent in a new folder and wants a full setup. Trigger even if the user just says "let's start a project" or "set it all up". --- # Project Bootstrap Sets up a complete working environment for a monorepo project in one pass. -Operates in two modes: **init** (new project) and **upgrade** (existing project). +Operates in three modes: **greenfield-full** (new project + remote create), **add-remote** +(existing git without remote), and **upgrade** (existing project). --- @@ -24,18 +26,26 @@ Check what already exists in the current directory: ```bash ls -la git rev-parse --git-dir 2>/dev/null && echo "git:yes" || echo "git:no" +git remote get-url origin 2>/dev/null && echo "remote:yes" || echo "remote:no" +ls -A 2>/dev/null | grep -q . && echo "empty:no" || echo "empty:yes" [ -d .wiki ] && echo "wiki:yes" || echo "wiki:no" [ -d .tasks ] && echo "tasks:yes" || echo "tasks:no" [ -f CLAUDE.md ] && echo "claude:yes" || echo "claude:no" [ -f README.md ] && echo "readme:yes" || echo "readme:no" ``` +Determine mode: +- **greenfield-full**: `git:no` + `empty:yes` — new project, will create remote +- **add-remote**: `git:yes` + `remote:no` — existing git, offer to create remote +- **upgrade**: otherwise — existing project, upgrade only + Show the user a summary in one block — what was found, what will be created: ``` -Found: ✅ git ❌ .wiki ✅ .tasks ❌ CLAUDE.md ✅ README.md -Create: .wiki CLAUDE.md -Skip: git (exists) .tasks (exists) README.md (exists) +Mode: greenfield-full (new project + remote create) + +Found: (empty directory) +Create: git .wiki .tasks CLAUDE.md .gitignore README.md remote ``` Ask one question: "Looks right? Shall we proceed?" — and wait for confirmation. @@ -56,6 +66,69 @@ If it exists — leave it untouched. --- +## Step 1.5 — Remote create (greenfield-full / add-remote modes) + +Only in **greenfield-full** or **add-remote** mode. Skip for upgrade mode. + +### Prerequisites + +Read `~/.config/projects-mcp/auth.toml` to get Gitea credentials: + +```bash +# POSIX (Linux/macOS/git-bash): +source ~/.config/projects-mcp/auth.toml 2>/dev/null || true +# Windows PowerShell: +Get-Content ~/.config/projects-mcp/auth.toml | Select-String "base_url|token" +``` + +If auth file missing → stop and tell user: run `/setup-projects-meta` first. + +### Validate project name + +Current folder name becomes the repo name. Must be: +- **Latin only** — a-z, 0-9, hyphens +- **kebab-case** — lowercase, hyphens between words +- **Not a duplicate** — check via Gitea API + +```bash +PROJECT_NAME=$(basename "$PWD") +# Validate: only latin alnum + hyphen, no leading/trailing hyphen +echo "$PROJECT_NAME" | grep -qE '^[a-z0-9]+(-[a-z0-9]+)*$' || { + echo "❌ Invalid project name: '$PROJECT_NAME'. Use latin kebab-case (e.g. 'my-project')." + exit 1 +} +``` + +### Create repo via Gitea API + +```bash +# Extract base_url and token from auth.toml (POSIX): +BASE_URL=$(grep "^base_url" ~/.config/projects-mcp/auth.toml | cut -d'"' -f2) +TOKEN=$(grep "^token" ~/.config/projects-mcp/auth.toml | cut -d'"' -f2) + +# Create repo: +curl -X POST "$BASE_URL/api/v1/user/repos?token=$TOKEN" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"$PROJECT_NAME\",\"private\":false,\"auto_init\":false}" +``` + +On failure → stop and show error. Duplicate name = suggest rename or delete existing. + +### Add remote and push + +```bash +git remote add origin "$BASE_URL/$USER/$PROJECT_NAME.git" +git branch -M master +git push -u origin master +``` + +For **add-remote** mode (git exists, push local commits after adding remote): +```bash +git push -u origin master # or main if that's the current branch +``` + +--- + ## Step 2 — README.md If it does not exist — create a minimal one: @@ -462,6 +535,7 @@ Print a final report: CLAUDE.md — skill triggers .gitignore — standard template README.md — starter file + remote — Gitea repo created and pushed Skipped (already existed): git — left untouched @@ -470,6 +544,41 @@ Next step: describe the project in README.md and start your first task — say "use task management system". ``` +For **greenfield-full** mode, append to summary: +``` +Remote: +``` + +--- + +## Step 8 — projects-meta sync (greenfield-full mode) + +Only in **greenfield-full** mode. Re-sync the projects-meta cache so the new +project becomes visible to `mcp__projects-meta__*` tools. + +```bash +# POSIX: +node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js + +# Windows PowerShell: +node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js +``` + +Verify the project is now visible: +```bash +# Via MCP (if available in current session): +# mcp__projects-meta__meta_status + +# Or manually check the cache file exists: +ls -la ~/projects/.common/lib/projects-meta-mcp/cache/projects.json +``` + +If the sync script doesn't exist → skip with informational message: +``` +ℹ️ projects-meta sync script not found at ~/projects/.common/lib/projects-meta-mcp/dist/sync.js + Run /setup-projects-meta to install it. The new repo is already created in Gitea. +``` + --- ## Rules