{"id":51043649,"url":"https://github.com/axeforging/yankrun","last_synced_at":"2026-06-22T12:02:07.414Z","repository":{"id":343052697,"uuid":"1144537479","full_name":"AxeForging/yankrun","owner":"AxeForging","description":"Template smarter: clone repos and replace tokens safely with size limits, custom delimiters, and JSON/YAML inputs","archived":false,"fork":false,"pushed_at":"2026-05-26T11:44:22.000Z","size":5672,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-26T12:34:34.951Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AxeForging.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-28T19:21:21.000Z","updated_at":"2026-03-08T17:08:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/AxeForging/yankrun","commit_stats":null,"previous_names":["axeforging/yankrun"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/AxeForging/yankrun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fyankrun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fyankrun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fyankrun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fyankrun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AxeForging","download_url":"https://codeload.github.com/AxeForging/yankrun/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fyankrun/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34647750,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-22T12:02:00.743Z","updated_at":"2026-06-22T12:02:07.404Z","avatar_url":"https://github.com/AxeForging.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# YankRun\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"doc/banner.png\" alt=\"YankRun\" width=\"400\"\u003e\n  \u003cp\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Go-1.25%2B-00ADD8?style=flat-square\u0026logo=go\" alt=\"Go Version\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/OS-Linux%20%7C%20macOS%20%7C%20Windows-darkblue?style=flat-square\u0026logo=windows\" alt=\"OS Support\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-MIT-green?style=flat-square\" alt=\"License\"\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n**Template smarter**: Clone repos, replace tokens, or template existing projects — safely, with custom delimiters that won't clash with Helm, Jinja, or any other template language.\n\n## TL;DR\n\n```sh\n# Install\ncurl -L https://github.com/AxeForging/yankrun/releases/latest/download/yankrun-linux-amd64.tar.gz | tar xz\nsudo mv yankrun-linux-amd64 /usr/local/bin/yankrun\n\n# Clone a template and replace placeholders\nyankrun clone --repo https://github.com/AxeForging/template-tester.git \\\n  --input values.yaml --outputDir ./my-project --verbose\n\n# Or template an existing directory\nyankrun template --dir ./my-project --input values.yaml --verbose\n\n# Or use the local web workbench\nyankrun serve --dir ./my-project --input values.yaml\n\n# Works alongside Helm/Jinja/Go templates — default [[ ]] won't touch {{ }}\nyankrun template --dir ./helm-chart --input values.yaml\n\n# Or pick your own delimiters if [[ ]] conflicts with something\nyankrun template --dir ./project --input values.yaml --startDelim \"\u003c%\" --endDelim \"%\u003e\"\n```\n\n## Features\n\n- **Template values replacement** across a directory tree\n- **Git clone** with post-clone templating\n- **Custom delimiters** — use `[[` `]]`, `\u003c%` `%\u003e`, or anything that won't collide with your existing templates (Helm `{{ }}`, Jinja `{% %}`, etc.)\n- **Safe on real projects** — template a repo that already uses Helm/Go templates without breaking `{{ .Values.x }}`\n- **Size-based skipping** (default 3 MB)\n- **Verbose reporting** with per-file replacement counts\n- **JSON/YAML inputs** and ignore patterns\n- **Transformation functions** (`toUpperCase`, `toLowerCase`, `gsub`)\n- **Template file processing** (`.tpl` files processed and renamed)\n- **Caching** for `generate` - caches GitHub repos and template variables in `~/.yankrun/cache.yaml`\n- **Interactive workbench** (`serve`) for local/clone/generate workflows with file trees, evaluated transform previews, saved presets, and JSON import/export\n- **Safe terminal workflow** (`tui`) for preview-first directory templating\n\n## Documentation\n\n| Audience | Link |\n|----------|------|\n| **Users** | [docs/user/README.md](docs/user/README.md) - Installation, usage, examples |\n| **Commands** | [COMMANDS.md](COMMANDS.md) - Quick command and flag reference |\n| **Examples** | [EXAMPLES.md](EXAMPLES.md) - Copy-paste workflows for common use cases |\n| **AI Assistants** | [docs/AI/README.md](docs/AI/README.md) - Architecture, testing, common tasks |\n| **Transformations** | [doc/functions.md](doc/functions.md) - Function reference |\n\n---\n\n## Install\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eLinux/macOS (AMD64)\u003c/strong\u003e\u003c/summary\u003e\n\n```sh\ncurl -L https://github.com/AxeForging/yankrun/releases/latest/download/yankrun-linux-amd64.tar.gz | tar xz\nchmod +x yankrun-linux-amd64\nsudo mv yankrun-linux-amd64 /usr/local/bin/yankrun\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eLinux/macOS (ARM64 / Apple Silicon)\u003c/strong\u003e\u003c/summary\u003e\n\n```sh\n# Linux ARM64\ncurl -L https://github.com/AxeForging/yankrun/releases/latest/download/yankrun-linux-arm64.tar.gz | tar xz\nchmod +x yankrun-linux-arm64\nsudo mv yankrun-linux-arm64 /usr/local/bin/yankrun\n\n# macOS Apple Silicon\ncurl -L https://github.com/AxeForging/yankrun/releases/latest/download/yankrun-darwin-arm64.tar.gz | tar xz\nchmod +x yankrun-darwin-arm64\nsudo mv yankrun-darwin-arm64 /usr/local/bin/yankrun\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWindows (PowerShell)\u003c/strong\u003e\u003c/summary\u003e\n\n```powershell\nInvoke-WebRequest -Uri https://github.com/AxeForging/yankrun/releases/latest/download/yankrun-windows-amd64.zip -OutFile yankrun.zip\nExpand-Archive -Path yankrun.zip -DestinationPath .\nMove-Item -Path yankrun-windows-amd64.exe -Destination yankrun.exe\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eFrom Source (Go 1.25+)\u003c/strong\u003e\u003c/summary\u003e\n\n```sh\ngo install github.com/AxeForging/yankrun@latest\n```\n\nOr build locally:\n\n```sh\ngit clone https://github.com/AxeForging/yankrun.git\ncd yankrun\ngo build -o yankrun .\nsudo mv yankrun /usr/local/bin/\n```\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eSSH Key Configuration\u003c/strong\u003e\u003c/summary\u003e\n\nFor SSH repos (`git@github.com:...`), yankrun auto-detects your SSH key in this order:\n\n1. `~/.ssh/id_ed25519`\n2. `~/.ssh/id_ecdsa`\n3. `~/.ssh/id_rsa`\n\nIf your key has a different name or location, use the `--ssh-key` flag:\n\n```sh\nyankrun clone --repo git@github.com:org/repo.git \\\n  --outputDir ./out --ssh-key ~/.ssh/my_custom_key\n```\n\nFor HTTPS repos, no SSH key is needed.\n\n\u003c/details\u003e\n\n---\n\n## Quick Start\n\n### 1. Create a values file\n\n```yaml\n# values.yaml\nvariables:\n  - key: APP_NAME\n    value: MyAwesomeApp\n  - key: AUTHOR\n    value: Jane Developer\n  - key: VERSION\n    value: 1.0.0\n```\n\n### 2. Clone and template\n\n```sh\nyankrun clone \\\n  --repo https://github.com/AxeForging/template-tester.git \\\n  --input values.yaml \\\n  --outputDir ./my-new-project \\\n  --verbose\n```\n\n### 3. Result\n\nAll `[[APP_NAME]]`, `[[AUTHOR]]`, `[[VERSION]]` placeholders are replaced with your values.\n\n---\n\n## Commands\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eclone\u003c/strong\u003e - Clone a repo and replace placeholders\u003c/summary\u003e\n\n```sh\n# Non-interactive with values file\nyankrun clone \\\n  --repo https://github.com/AxeForging/template-tester.git \\\n  --input values.yaml \\\n  --outputDir ./my-project \\\n  --verbose\n\n# Interactive mode - prompts for each placeholder\nyankrun clone \\\n  --repo git@github.com:AxeForging/template-tester.git \\\n  --outputDir ./my-project \\\n  --prompt --verbose\n\n# With custom delimiters\nyankrun clone \\\n  --repo https://github.com/example/repo.git \\\n  --input values.json \\\n  --outputDir ./out \\\n  --startDelim \"{{\" --endDelim \"}}\"\n\n# Process .tpl files (README.md.tpl → README.md)\nyankrun clone \\\n  --repo https://github.com/example/repo.git \\\n  --input values.yaml \\\n  --outputDir ./out \\\n  --processTemplates\n```\n\n**Flags:**\n\n| Flag | Alias | Description | Default |\n|------|-------|-------------|---------|\n| `--repo` | | Git URL (HTTPS or SSH) | required |\n| `--outputDir` | `-o` | Output directory | required |\n| `--input` | `-i` | Values file (JSON/YAML) | - |\n| `--startDelim` | | Start delimiter | `[[` |\n| `--endDelim` | | End delimiter | `]]` |\n| `--fileSizeLimit` | | Skip files larger than | `3 mb` |\n| `--prompt` | `-p` | Interactive mode | `false` |\n| `--processTemplates` | `--pt` | Process `.tpl` files | `false` |\n| `--onlyTemplates` | `--ot` | Only process `.tpl` files | `false` |\n| `--verbose` | `-v` | Verbose output | `false` |\n| `--branch` | `-b` | Branch to clone | default |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003etemplate\u003c/strong\u003e - Template an existing directory\u003c/summary\u003e\n\n```sh\n# Basic usage\nyankrun template --dir ./my-project --input values.yaml --verbose\n\n# Interactive mode\nyankrun template --dir ./my-project --prompt\n\n# With custom delimiters and size limit\nyankrun template \\\n  --dir ./my-project \\\n  --input values.yaml \\\n  --startDelim \"{{\" --endDelim \"}}\" \\\n  --fileSizeLimit \"10 mb\" \\\n  --verbose\n```\n\n**Flags:**\n\n| Flag | Alias | Description | Default |\n|------|-------|-------------|---------|\n| `--dir` | `-d` | Directory to process | required |\n| `--input` | `-i` | Values file (JSON/YAML) | - |\n| `--startDelim` | | Start delimiter | `[[` |\n| `--endDelim` | | End delimiter | `]]` |\n| `--fileSizeLimit` | | Skip files larger than | `3 mb` |\n| `--prompt` | `-p` | Interactive mode | `false` |\n| `--processTemplates` | `--pt` | Process `.tpl` files | `false` |\n| `--onlyTemplates` | `--ot` | Only process `.tpl` files | `false` |\n| `--verbose` | `-v` | Verbose output | `false` |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003egenerate\u003c/strong\u003e - Interactive template selection\u003c/summary\u003e\n\n```sh\n# Interactive - choose template from config\nyankrun generate --prompt --verbose\n\n# Non-interactive with template filter\nyankrun generate --template \"go-service\" --input values.yaml --outputDir ./new-project\n\n# Dry run uses cache to show placeholders without cloning\nyankrun generate --template \"go-service\" --dryRun\n\n# Force fresh data (skip cache)\nyankrun generate --template \"go-service\" --noCache --outputDir ./new-project\n```\n\nRequires templates configured in `~/.yankrun/config.yaml` or GitHub discovery enabled.\n\nThe `generate` command caches GitHub-discovered repos and template variables in `~/.yankrun/cache.yaml`. Subsequent dry runs use cached data to avoid re-cloning. Use `--noCache` to bypass.\n\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eserve\u003c/strong\u003e - Local web workbench\u003c/summary\u003e\n\n```sh\n# Serve a local directory at http://127.0.0.1:17817\nyankrun serve --dir ./my-project --input values.yaml\n\n# Use a different bind address\nyankrun serve --dir ./my-project --addr 127.0.0.1:19090\n\n# Force preview-only mode\nyankrun serve --dir ./my-project --input values.yaml --dryRun\n```\n\nThe workbench supports:\n\n- local scan, preview, and apply using the same replacement logic as `template`\n- clone from SSH or HTTPS repositories using the existing cloner/auth behavior\n- generate from configured templates and GitHub discovery\n- file-level placeholder trees and evaluated transform previews\n- local saved presets in IndexedDB, with JSON import/export\n\n**Flags:**\n\n| Flag | Alias | Description | Default |\n|------|-------|-------------|---------|\n| `--dir` | `-d` | Directory to scan/apply for local mode | - |\n| `--input` | `-i` | Values file (JSON/YAML) | - |\n| `--addr` | | Web listen address | `127.0.0.1:17817` |\n| `--startDelim` | `--sd` | Start delimiter | `[[` |\n| `--endDelim` | `--ed` | End delimiter | `]]` |\n| `--fileSizeLimit` | `--fl` | Skip files larger than | `3 mb` |\n| `--processTemplates` | `--pt` | Process `.tpl` files | `false` |\n| `--onlyTemplates` | `--ot` | Only process `.tpl` files | `false` |\n| `--dryRun` | `--dr` | Block writes and preview only | `false` |\n| `--ignore` | | Glob patterns to skip | - |\n| `--verbose` | `-v` | Verbose output | `false` |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003etui\u003c/strong\u003e - Safe terminal workflow\u003c/summary\u003e\n\n```sh\nyankrun tui --dir ./my-project --input values.yaml\nyankrun tui --dir ./my-project --dryRun\n```\n\nThe TUI scans a local directory, prints the discovered placeholders, previews the replacement count, and only writes when not in `--dryRun` mode.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003esetup\u003c/strong\u003e - Configure defaults\u003c/summary\u003e\n\n```sh\n# Interactive setup\nyankrun setup\n\n# Show current config\nyankrun setup --show\n\n# Reset config\nyankrun setup --reset\n```\n\nCreates/updates `~/.yankrun/config.yaml`.\n\n\u003c/details\u003e\n\n---\n\n## Values File Format\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eYAML (recommended)\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n# Optional: directories to skip\nignore_patterns:\n  - node_modules\n  - dist\n  - .git\n  - vendor\n\n# Required: key-value pairs\nvariables:\n  - key: APP_NAME\n    value: MyApp\n  - key: PROJECT_NAME\n    value: my-awesome-project\n  - key: AUTHOR_NAME\n    value: Jane Developer\n  - key: AUTHOR_EMAIL\n    value: jane@example.com\n  - key: VERSION\n    value: \"1.0.0\"\n  - key: YEAR\n    value: \"2024\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eJSON\u003c/strong\u003e\u003c/summary\u003e\n\n```json\n{\n  \"ignore_patterns\": [\"node_modules\", \"dist\", \".git\"],\n  \"variables\": [\n    { \"key\": \"APP_NAME\", \"value\": \"MyApp\" },\n    { \"key\": \"PROJECT_NAME\", \"value\": \"my-awesome-project\" },\n    { \"key\": \"AUTHOR_NAME\", \"value\": \"Jane Developer\" },\n    { \"key\": \"AUTHOR_EMAIL\", \"value\": \"jane@example.com\" },\n    { \"key\": \"VERSION\", \"value\": \"1.0.0\" }\n  ]\n}\n```\n\n\u003c/details\u003e\n\n---\n\n## Transformation Functions\n\nApply transformations to placeholder values using the syntax `[[KEY:function]]`:\n\n| Function | Syntax | Input | Output |\n|----------|--------|-------|--------|\n| Uppercase | `[[APP:toUpperCase]]` | `my-app` | `MY-APP` |\n| Lowercase | `[[APP:toLowerCase]]` | `My-App` | `my-app` |\n| Replace | `[[APP:gsub(-,_)]]` | `my-app` | `my_app` |\n| Chain | `[[APP:gsub( ,-):toLowerCase]]` | `My App` | `my-app` |\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eMore examples\u003c/strong\u003e\u003c/summary\u003e\n\n```\n# Template file content\nPackage: [[PACKAGE_NAME:toLowerCase]]\nConstant: [[PACKAGE_NAME:toUpperCase]]\nClassName: [[PACKAGE_NAME:gsub(-,_)]]\nURL-safe: [[PROJECT_NAME:gsub( ,-):toLowerCase]]\n\n# With PACKAGE_NAME=My-Package and PROJECT_NAME=My Project\nPackage: my-package\nConstant: MY-PACKAGE\nClassName: My_Package\nURL-safe: my-project\n```\n\n\u003c/details\u003e\n\nSee [doc/functions.md](doc/functions.md) for full documentation.\n\n---\n\n## Configuration\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eFull config example (~/.yankrun/config.yaml)\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n# Default delimiters\nstart_delim: \"[[\"\nend_delim: \"]]\"\n\n# Skip files larger than this\nfile_size_limit: \"3 mb\"\n\n# Pre-configured templates for `generate` command\ntemplates:\n  - name: \"Go Microservice\"\n    url: \"git@github.com:your-org/go-template.git\"\n    description: \"Production-ready Go service template\"\n    default_branch: \"main\"\n\n  - name: \"React App\"\n    url: \"https://github.com/your-org/react-template.git\"\n    description: \"React + TypeScript starter\"\n    default_branch: \"main\"\n\n# GitHub auto-discovery for templates\ngithub:\n  user: \"your-username\"              # Your GitHub username\n  orgs: [\"your-org\", \"another-org\"]  # Organizations to search\n  topic: \"template\"                  # Filter by topic\n  prefix: \"template-\"                # Filter by name prefix\n  include_private: true              # Include private repos\n  token: \"ghp_xxxx\"                  # Optional: for private repos\n```\n\n\u003c/details\u003e\n\n---\n\n## Use Cases\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eBootstrap a new project from a template\u003c/strong\u003e\u003c/summary\u003e\n\n**Problem:** You maintain a template repo with CI, linting, and base code. You want to create a new project with your names filled in, without the template's git history.\n\n**Solution:**\n\n```sh\nyankrun generate --prompt --verbose\n```\n\nOr non-interactively:\n\n```sh\ncat \u003e values.yaml \u003c\u003c 'EOF'\nvariables:\n  - key: PROJECT_NAME\n    value: my-new-service\n  - key: AUTHOR\n    value: Platform Team\nEOF\n\nyankrun clone \\\n  --repo git@github.com:your-org/service-template.git \\\n  --input values.yaml \\\n  --outputDir ./my-new-service \\\n  --verbose\n```\n\n**Result:** Fresh project with all placeholders replaced, no template git history.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eBatch update config across many files\u003c/strong\u003e\u003c/summary\u003e\n\n**Problem:** You need to update company name, version, or email across dozens of files.\n\n**Solution:**\n\n```sh\ncat \u003e updates.yaml \u003c\u003c 'EOF'\nvariables:\n  - key: COMPANY_NAME\n    value: \"New Company Inc\"\n  - key: SUPPORT_EMAIL\n    value: \"support@newcompany.com\"\n  - key: VERSION\n    value: \"2.0.0\"\nEOF\n\nyankrun template --dir . --input updates.yaml --verbose\n```\n\n**Result:** Consistent updates across all files with a detailed report.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCI/CD pipeline templating\u003c/strong\u003e\u003c/summary\u003e\n\n**Problem:** You need to stamp out projects in an automated pipeline with no user interaction.\n\n**Solution:**\n\n```sh\n# In your CI script\nyankrun clone \\\n  --repo \"$TEMPLATE_REPO\" \\\n  --input /config/values.json \\\n  --outputDir ./output \\\n  --startDelim \"{{\" --endDelim \"}}\" \\\n  --processTemplates \\\n  --verbose\n```\n\n**Result:** Fully templated project ready for deployment, no prompts.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eProcess .tpl template files\u003c/strong\u003e\u003c/summary\u003e\n\n**Problem:** You have `Dockerfile.tpl`, `config.yaml.tpl` files that should be processed and renamed.\n\n**Solution:**\n\n```sh\nyankrun template --dir ./project --input values.yaml --processTemplates --verbose\n```\n\n**Result:**\n- `Dockerfile.tpl` → `Dockerfile` (with placeholders replaced)\n- `config.yaml.tpl` → `config.yaml` (with placeholders replaced)\n- Original `.tpl` files are removed\n\n\u003c/details\u003e\n\n---\n\n## Real-World: Templating Projects That Already Have Templates\n\nMost template tools use `{{ }}` — which breaks if your project already has Helm charts, Go templates, or Jinja files. YankRun solves this with custom delimiters.\n\n**Example:** You have a Helm chart with `{{ .Values.replicaCount }}` and you want to replace your own placeholders without touching Helm's syntax:\n\n```yaml\n# values.yaml (Helm file — has {{ }} everywhere)\nreplicaCount: {{ .Values.replicaCount }}  # Helm — untouched\nimage:\n  repository: [[DOCKER_REGISTRY]]/[[APP_NAME]]  # YankRun — replaced\n  tag: [[VERSION]]                                # YankRun — replaced\n```\n\n```sh\n# Replace only [[ ]] placeholders, Helm {{ }} stays intact\nyankrun template --dir ./my-helm-chart --input values.yaml --verbose\n```\n\nThis works because YankRun defaults to `[[ ]]` delimiters. If your project already uses `[[ ]]`, just pick something else:\n\n```sh\n# Use \u003c% %\u003e delimiters instead\nyankrun template --dir ./project --input values.yaml \\\n  --startDelim \"\u003c%\" --endDelim \"%\u003e\"\n```\n\n**More examples of coexistence:**\n\n| Your project uses | YankRun delimiter | Command flag |\n|---|---|---|\n| Helm / Go (`{{ }}`) | `[[ ]]` (default) | *(none needed)* |\n| Jinja (`{% %}`, `{{ }}`) | `[[ ]]` (default) | *(none needed)* |\n| Terraform (`${ }`) | `[[ ]]` (default) | *(none needed)* |\n| Angular (`{{ }}`) | `[[ ]]` (default) | *(none needed)* |\n| Something using `[[ ]]` | `\u003c% %\u003e` | `--startDelim \"\u003c%\" --endDelim \"%\u003e\"` |\n\n---\n\n## Exit Codes\n\n| Code | Meaning |\n|------|---------|\n| `0` | Success |\n| `1` | Error (invalid flags, clone failed, etc.) |\n\n---\n\n## License\n\nMIT - see [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxeforging%2Fyankrun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxeforging%2Fyankrun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxeforging%2Fyankrun/lists"}