kind: WavePipeline metadata: name: ops-bootstrap description: "Scaffold a greenfield project with language-appropriate structure, CI config, and initial files" release: true input: source: cli schema: type: string description: "Project description and intent (e.g. 'Rust CLI tool for processing CSV files')" example: "Rust CLI tool for processing CSV files" steps: - id: assess persona: navigator workspace: mount: - source: ./ target: /project mode: readonly exec: type: prompt source: | You are assessing a greenfield project for scaffolding. The user described this project as: {{ input }} ## Instructions 1. Read `wave.yaml` to find `project.language`, `project.build_command`, and `project.test_command` 2. List all existing files in the project directory to understand what already exists 3. Read any README, ADR, or design docs for additional project intent 4. Determine the project flavour (language/framework): - If `project.language` is set in wave.yaml, use that - Otherwise infer from existing files (package.json → node, Cargo.toml → rust, go.mod → go, etc.) - If nothing exists, infer from the user's description 5. Recommend the appropriate project scaffold ## Output Write a JSON file to `.wave/output/bootstrap-assessment.json` with this structure: ```json { "flavour": "go|rust|node|bun|python|csharp|...", "project_intent": "description of what the project does", "existing_files": ["list", "of", "existing", "files"], "scaffold_recommendations": { "files_to_create": ["list of files to scaffold"], "build_system": "cargo|go|npm|bun|pip|dotnet", "ci_provider": "github-actions", "gitignore_patterns": ["patterns for .gitignore"] }, "wave_config": { "language": "from wave.yaml if set", "build_command": "from wave.yaml if set", "test_command": "from wave.yaml if set" } } ``` output_artifacts: - name: assessment path: .wave/output/bootstrap-assessment.json type: json retry: policy: patient max_attempts: 2 handover: contract: type: json_schema source: .wave/output/bootstrap-assessment.json schema_path: .wave/contracts/bootstrap-assessment.schema.json must_pass: true on_failure: retry - id: scaffold persona: craftsman dependencies: [assess] memory: inject_artifacts: - step: assess artifact: assessment as: bootstrap_assessment workspace: type: worktree branch: "{{ pipeline_id }}" exec: type: prompt source: | You are scaffolding a new project based on the assessment. Read the assessment artifact to understand the project flavour, intent, and recommendations. ## Instructions Based on the detected flavour, create the appropriate project structure: ### Go - `go.mod` with appropriate module path - `main.go` or `cmd//main.go` for CLI tools - `internal/` directory structure - Basic test file - `.github/workflows/ci.yml` with go build and test ### Rust - `Cargo.toml` with project metadata - `src/main.rs` (binary) or `src/lib.rs` (library) - `tests/` directory with integration test stub - `.github/workflows/ci.yml` with cargo build and test ### Node / Bun - `package.json` with project metadata and scripts - `src/index.ts` entry point - `tsconfig.json` with strict mode - `.github/workflows/ci.yml` with install and test ### Python - `pyproject.toml` with project metadata - `src//__init__.py` - `tests/test_placeholder.py` - `.github/workflows/ci.yml` with pip install and pytest ### C# - `.sln` solution file - `src//.csproj` and `Program.cs` - `tests/.Tests/` with test project - `.github/workflows/ci.yml` with dotnet build and test ### For ALL flavours - Create `.gitignore` appropriate for the language - Create `README.md` with project description, build instructions, and usage ## Verification After creating all files: 1. If a build command is available, run it to verify the project compiles 2. If a test command is available, run it to verify tests pass ## Important - Do NOT create files that already exist (check the assessment's existing_files list) - Use the project intent from the assessment to make README content meaningful - Follow standard conventions for the language ecosystem retry: policy: standard max_attempts: 3 handover: contract: type: test_suite command: "{{ project.test_command }}" must_pass: false on_failure: retry - id: commit persona: craftsman dependencies: [scaffold] workspace: type: worktree branch: "{{ pipeline_id }}" memory: inject_artifacts: - step: assess artifact: assessment as: bootstrap_assessment exec: type: prompt source: | You are creating the initial commit for a newly scaffolded project. Read the assessment artifact to get the project flavour and the list of recommended files from `scaffold_recommendations.files_to_create`. ## Instructions 1. Identify which files were actually created by the scaffold step: ```bash git status --porcelain ``` 2. Stage ONLY the project files explicitly — NEVER use `git add -A` or `git add .`: ```bash git add ... ``` Stage every new or modified project file shown by `git status`, but NEVER stage any of these paths: - `.wave/artifacts/` - `.wave/output/` - `.claude/` - `CLAUDE.md` 3. Create the initial commit with a conventional commit message: ```bash git commit -m "feat: scaffold project" ``` Replace `` with the actual detected flavour from the assessment (e.g. "go", "rust", "node"). 4. Check if a remote is configured: ```bash git remote -v ``` 5. If a remote exists, push the branch: ```bash git push -u origin HEAD ``` ## Important - Do NOT include Co-Authored-By or AI attribution in the commit message - NEVER use `git add -A`, `git add .`, or `git add --all` — always stage files by explicit path - Do NOT commit .wave/artifacts/, .wave/output/, .claude/, or CLAUDE.md - If git push fails (no remote, auth issues), that's OK — just report the commit was created locally