{"id":45625860,"url":"https://github.com/evanharmon1/harmon-init","last_synced_at":"2026-06-12T02:03:37.037Z","repository":{"id":270263279,"uuid":"857431677","full_name":"evanharmon1/harmon-init","owner":"evanharmon1","description":"New project template to help bootstrap and streamline projects with pre-configured CI/CD, security tests, pre-commit, linting, docs, task runner, etc. Uses the python project \"Copier\"","archived":false,"fork":false,"pushed_at":"2026-06-11T17:46:07.000Z","size":309,"stargazers_count":2,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-11T18:05:08.192Z","etag":null,"topics":["actions","copier","jinja","templates"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/evanharmon1.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":"2024-09-14T16:35:21.000Z","updated_at":"2026-06-11T17:41:09.000Z","dependencies_parsed_at":"2024-12-29T20:45:54.063Z","dependency_job_id":"4e584567-e958-44a3-9f14-092619353972","html_url":"https://github.com/evanharmon1/harmon-init","commit_stats":null,"previous_names":["evanharmon1/harmon-stack"],"tags_count":52,"template":false,"template_full_name":null,"purl":"pkg:github/evanharmon1/harmon-init","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanharmon1%2Fharmon-init","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanharmon1%2Fharmon-init/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanharmon1%2Fharmon-init/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanharmon1%2Fharmon-init/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/evanharmon1","download_url":"https://codeload.github.com/evanharmon1/harmon-init/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanharmon1%2Fharmon-init/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34225359,"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-12T02:00:06.859Z","response_time":109,"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":["actions","copier","jinja","templates"],"created_at":"2026-02-23T20:25:18.582Z","updated_at":"2026-06-12T02:03:37.032Z","avatar_url":"https://github.com/evanharmon1.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Harmon Init\n\nA [Copier](https://copier.readthedocs.io/en/stable/) project template that\nbootstraps repos with a complete set of standardized conventions: go-task\nTaskfile, lefthook git hooks, conventional commits, GitHub Actions CI (with\nClaude Code plan/implement/review workflows), gitleaks/snyk/CodeQL security,\nRenovate, CodeRabbit, a dual-profile devcontainer (AI bot + human) with GHCR\nprebuilds, a docs tree, and AI steering docs (canonical `AGENTS.md`). It can\nalso be applied to existing repos to standardize them.\n\nAuthor: Evan Harmon\n\n[![Build \u0026 Validate](https://github.com/evanharmon1/harmon-init/actions/workflows/build.yml/badge.svg)](https://github.com/evanharmon1/harmon-init/actions/workflows/build.yml)\n[![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json)](https://github.com/copier-org/copier)\n[![Renovate](https://img.shields.io/badge/maintained%20with-renovate-blue?logo=renovatebot)](https://github.com/apps/renovate)\n\n## Usage\n\n### New project\n\n```bash\ncopier copy harmon-init new-project --trust\n```\n\nKey questions: `project_type` (general | web-astro | web-app | iac | docs),\n`github_org`, `ci_runner` (ubuntu-latest | self-hosted), `devcontainer`,\n`include_terraform` / `include_ansible`, `license`. Hidden defaults (author\nidentity, org info, directories) live in `copier.yml` under `when: false` —\ncustomize those once before first use.\n\nAfter generation, work through the project's `docs/CHECKLIST.md` (branch\nruleset import, Dependabot alerts, Renovate/CodeRabbit apps, Actions secrets,\nframework scaffolding for web projects).\n\n### Apply to / update an existing project\n\n```bash\ncd existing-project\ncopier update --trust          # if it was generated from this template\n# or adopt the template in a repo that wasn't:\ncopier copy --trust ~/git/harmon-init . --vcs-ref=HEAD\n```\n\n### Template development gotcha: `--vcs-ref=HEAD`\n\n`copier copy` from a local path renders the **latest git tag** by default —\nNOT your working tree. When testing template changes, always pass\n`--vcs-ref=HEAD`. With it, copier auto-includes dirty/untracked changes via a\nthrowaway commit in a temp clone (`DirtyLocalWarning`); your working tree is\nnever touched. `task test:template` handles this for you.\n\n## Architecture: two layers\n\n1. **Root** — tooling for maintaining the template itself (this Taskfile,\n   lefthook, CI). The root dogfoods the same conventions the template\n   generates.\n2. **`template/`** — the Copier template root (`_subdirectory: template`).\n   Everything here becomes the generated project.\n\n### Custom jinja delimiters\n\nTemplate files use `[[ var ]]` and `[% if x %]` (set via `_envops` in\n`copier.yml`) so GitHub Actions `${{ }}`, go-task `{{.VAR}}`, and lefthook\n`{staged_files}` appear verbatim with zero escaping. Rules of thumb:\n\n- Never use bash `[[ ]]` tests inside `.jinja` files — use `[ ]`.\n- An inline `[% endif %]` at end-of-line eats the next newline\n  (`trim_blocks`) — write `[% endif +%]`.\n- Shell scripts that don't need substitution stay plain (not `.jinja`).\n\n## Testing the template\n\n```bash\ntask verify                # lint + full generation matrix\ntask test:template         # all answer profiles (minimal/web/iac/full)\ntask test:template:web     # one profile\n```\n\nEach profile renders into a temp dir and validates the output: symlinks\n(CLAUDE.md/GEMINI.md → AGENTS.md), Taskfile parses, no leaked copier\nvariables, actionlint, yamllint, lefthook config, shellcheck/shfmt on\nrendered scripts, JSON validity, devcontainer read-configuration (CI), and\ngitleaks. CI runs the same matrix on every PR (`template-test` jobs in\n`build.yml`).\n\n## Releases\n\nReleases are intentional — `task release:patch|minor|major`. Nothing\nauto-releases on merge to main. Generated projects render from the latest\ntag, so **tag a release** after merging template changes you want consumers\nto receive.\n\n### v2 → v3\n\nv3.0.0 was a breaking redesign: new question set (`project_type`,\n`github_org`, `ci_runner`, ...), custom jinja delimiters, lefthook+gitleaks\nreplacing pre-commit+whispers, manual releases, dual-profile devcontainer,\nand canonical AGENTS.md. Projects generated from v2 should be re-templated\n(`copier copy` over the repo and reconcile) rather than `copier update`d.\n\n## Repo maintenance commands\n\n| Command | What it does |\n|---|---|\n| `task verify` | Lint + template generation matrix (merge gate) |\n| `task check` | Root linters (template/ excluded — jinja isn't valid YAML) |\n| `task security:secrets` | gitleaks scan |\n| `task install` | Brewfile deps + lefthook hooks |\n| `task release:patch` | Tag + GitHub release (also `:minor`/`:major`) |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevanharmon1%2Fharmon-init","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fevanharmon1%2Fharmon-init","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevanharmon1%2Fharmon-init/lists"}