{"id":37183563,"url":"https://github.com/gchiesa/ska","last_synced_at":"2026-01-14T21:12:29.181Z","repository":{"id":251383259,"uuid":"803217378","full_name":"gchiesa/ska","owner":"gchiesa","description":"SKA is a template scaffolder and updater library and CLI. Yet another cookiecutter in golang? Yes but with the superpower to update the initial template!","archived":false,"fork":false,"pushed_at":"2026-01-10T18:59:08.000Z","size":9426,"stargazers_count":9,"open_issues_count":13,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-11T04:27:03.078Z","etag":null,"topics":["cli","cookiecutter","golang","infrastructure-as-code","template-engine"],"latest_commit_sha":null,"homepage":"","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/gchiesa.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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-05-20T09:51:54.000Z","updated_at":"2026-01-10T18:58:26.000Z","dependencies_parsed_at":"2025-07-05T10:33:43.228Z","dependency_job_id":null,"html_url":"https://github.com/gchiesa/ska","commit_stats":null,"previous_names":["gchiesa/ska"],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/gchiesa/ska","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchiesa%2Fska","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchiesa%2Fska/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchiesa%2Fska/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchiesa%2Fska/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gchiesa","download_url":"https://codeload.github.com/gchiesa/ska/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchiesa%2Fska/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28434611,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T18:57:19.464Z","status":"ssl_error","status_checked_at":"2026-01-14T18:52:48.501Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cli","cookiecutter","golang","infrastructure-as-code","template-engine"],"created_at":"2026-01-14T21:12:28.365Z","updated_at":"2026-01-14T21:12:29.165Z","avatar_url":"https://github.com/gchiesa.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"./assets/ska-logo.png\" width=\"400\" alt=\"SKA logo\" /\u003e\n  \u003cbr/\u003e\n  SKA\n\u003c/h1\u003e\n\u003ch4 align=\"center\"\u003eYour scaffolding buddy!\u003c/h4\u003e\n\u003chr/\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pkg.go.dev/github.com/gchiesa/ska\"\u003e\u003cimg src=\"https://pkg.go.dev/badge/github.com/gchiesa/ska.svg\"\u003e\u003c/a\u003e \u003ca href=\"https://github.com/gchiesa/ska/actions/workflows/go-ci-lint.yaml\"\u003e\u003cimg src=\"https://github.com/gchiesa/ska/actions/workflows/go-ci-lint.yaml/badge.svg\" alt=\"Go linter\"\u003e\u003c/a\u003e \u003ca href=\"https://github.com/gchiesa/ska/actions/workflows/go-ci-test.yaml\"\u003e\u003cimg src=\"https://github.com/gchiesa/ska/actions/workflows/go-ci-test.yaml/badge.svg\" alt=\"Go unit tests\"\u003e\u003c/a\u003e \u003ca href=\"https://goreportcard.com/report/github.com/gchiesa/ska\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/gchiesa/ska\" alt=\"Go Report Card\"\u003e\u003c/a\u003e \u003ca href=\"https://github.com/gchiesa/ska/network/dependents\"\u003e\u003cimg src=\"https://img.shields.io/badge/Used%20By-2-blue\" alt=\"Used By\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\nSKA is a \"skaffolding\" tool that allows you to expand folders based on local or remote blueprint templates (GitHub and\nGitLab hosted or local filesystem).\n\n## Yet another templating tool?\n\nYes, probably, but SKA includes some features that make it special:\n\n### Dynamic form for capturing data\n\nEach blueprint supports the `.ska-upstream.yaml` file which is the definition of the variables which can be used to\nexpand the template. For each variable you can define multiple aspects, and this information is used by SKA to\ndynamically create an interactive form to capture the data.\n\n![dynamic-form](assets/dynamic-form.png)\n\n\n### Central management for template update rollouts\n\nTypically, scaffolding tools offer a one-shot code generation. After that the code is autonomous, and there is no\npossibility to centrally onboard new changes.\n\n**SKA is different here**: once the initial scaffolding is generated, you can always update it by changing the values in\nthe\ninteractive form. If your central team created a new version of the template, you can also switch to the new version\nand onboard the centrally manages addition/modifications to the templates.\n\n\n### Support for partial updates on templates\n\nIn SKA, you can update only part of the initially created template. This is done via special tags you need to use as\ncomment in your code.\nWith the support for partial updates, you can keep only a specific part of the file centrally managed by the upstream\nblueprint and let the user change the rest of the file.\n\n\u003e [!TIP]  \n\u003e To configure SKA to update only partial portions of the file introduce a comment in your code with\n\u003e the `ska-start:\u003cidentifier\u003e` and `ska-end` to identify the partial section\n\n\u003cdetails\u003e\n\u003csummary\u003eExample with `codecov.yaml`\u003c/summary\u003e\n\nIn this example on each update only the section enclosed in `ska-start/end` will be updated.\n\n```yaml\n---\ncoverage:\n  status:\n    project:\n      # ska-start:default-codecov-project\n      default:\n        target: auto\n        threshold: 5%\n      # ska-end\n    patch:\n      # ska-start:default-codecov-patch\n      default:\n        target: 50%\n        threshold: 5%\n      # ska-end \nignore:\n- \"cmd/man.go\"\n```\n\n\u003c/details\u003e\n\n## SKA in action\n\nIn the simple demo below you can see how SKA works. In the first step you can see the initial scaffolding. In the second\nstep you can see the interactive form to capture the data. In the third step you can see the final result and how\nyou can update a file partially managed by SKA.\n\n![demo](assets/demo.gif)\n\n## Get Started with SKA\n\nSKA is distributed via [Homebrew](https://brew.sh/), so you can install it with the commands below:\n\n```shell\nbrew tap gchiesa/ska\nbrew install ska\n```\n\n## How To Use\n\nSKA is straightforward to use. Just run `create` with the upstream blueprint you want to use. See the below example for\nscaffolding a golang command line tool:\n\n```shell\nska create --blueprint https://github.com/gchiesa/ska-golang-cli-template@master --output ~/workspace/myNewApp\n```\n\nThis will load the remote template, collect the required variable via Terminal UI and create the project for you.\n\nIn the root of the project you can find the SKA configuration folder `.ska-config/ ` that will keep track of state and\nupstream reference.\n\nWhen you want to update your project, use:\n\n```shell\ncd ~/workspace/myNewApp\nska update --path .\n```\n\nYou can modify the variables or accept the current version. Your project will be updated based on the latest changes in\nthe upstream blueprint.\n\nMore information is available with `ska --help`.\n\n\u003c!-- TODO --\u003e\n\n## Example use cases\n\nThe following links are examples of how you can use SKA in various common use cases:\n\n* [central repository with multiple templates in subfolders](docs/use-case-multiple-template-subfolders.md)\n\n* [centrally maintain only a part of a file](docs/use-case-partial-management.md)\n\n* [ignore files after 1st templating](docs/use-case-ignore-files-after-1st.md)\n\n* [manage multiple ska templates in the same folder](docs/use-case-manage-multiple-templates-same-folder.md)\n\n## Integrate SKA in your project\n\nSKA is designed for simplicity and quick usage. If you want to integrate SKA capabilities in your app or framework,\nyou can leverage the package under `pkg/`.\n\n## Concepts and Templating\n\n### Upstream Blueprint\n\nThis is the typically centrally maintained template that everyone can use to expand its own folder structure. You\ncan specify the blueprint both locally and remotely with specific URIs:\n\n* **file://** for local blueprints. E.g. `file:///Users/gchiesa/git/ska-example-template`\n* **https://** for GitHub or GitLab blueprints. You can optionally pin a specific reference (tag or branch with\n  the `@`)\n  symbol. E.g. `https://github.com/gchiesa/ska-example-template@v1.2.3`\n\n\u003e [!NOTE]\n\u003e You can also pin subfolders with the format: https://github.com/ORG/REPO//path/to/template@ref\n\n### Update from upstream\n\nWhenever the upstream template changes, you might want to onboard the changes yourself. SKA natively supports this, by\noffering a simple `update` command with not additional arguments required.\n\nSee the \"How To Use\" section for more information.\n\n### Upstream Template Language\n\nSKA currently fully supports **[Go Template framework][go-template]** for templating your upstream blueprint.\n\nMoreover, in addition to Go Template you can use the extensions offered by [Sprig functions][sprig]\n\nIf you are not familiar with Go Template have a look to this [simple how-to][go-template-how-to].\n\n\u003e [!NOTE]\n\u003e SKA supports also a Jinja2 like engine (use the `--engine jinja` argument) that will make your life easier\n\u003e when you need to deal with native go code. However, the function set is limited. The support is based on [Pongo2\n\u003e project][pongo2].\n\n\n[go-template]: https://pkg.go.dev/text/template\n\n[sprig]: https://masterminds.github.io/sprig/\n\n[go-template-how-to]: https://www.digitalocean.com/community/tutorials/how-to-use-templates-in-go#step-4-writing-a-template\n\n[pongo2]: https://www.schlachter.tech/solutions/pongo2-template-engine/\n\n### Templating with partial sections\n\nSKA offers the ability to manage only part of files.\nThis is generally useful to keep only a specific part of the file centrally managed by the upstream blueprint and\nlet the user change the rest of the file. See as example\nthe `codecov.yml` [here](https://github.com/gchiesa/ska-golang-cli-template/blob/master/codecov.yml)\n\nThis is achievable with the named partials, a type of block you can use in the SKA template.\n\nFor example, if we want to have only a section of a larger file managed by SKA we can use the approach below:\n\n```yaml\n# this is an example YAML and we want SKA to only manage the section `key4`\n---\nroot:\n  key1: value1\n  key2: {{.notManaged}}\n  key3: value3\n  # ska-start:key/4\n  key4:\n    subkey: \"{{.appName}}\"\n    subkey2: value2\n  # ska-end\n  key5: value5\n```\n\nby using the `ska-start:\u003cblockName\u003e` and `ska-end` tags, you instruct SKA to only process the block and leave the\nrest of the file as it is.\n\nThis is quite useful for files where only a part should be centrally managed and the rest will be customized by the\nuser, after the initial creation.\n\n\n### Template variable collection via Terminal UI\n\nWhile developing the blueprint, you can configure SKA to collect the variables via Terminal UI.\n\nTo do this, you need to create on the root of your blueprint folder a special file `.ska-upstream.yaml`. The file is a\nsimple YAML file with the following structure (see example with comments):\n\n```yaml\n# list of path that will be ignored in the blueprint\n# typically it's wise to ignore `.git` and `.idea` (and your preferred IDE) since you might use\n# the blueprint not only from remote but also from your local filesystem\nignorePaths:\n- .git\n- .idea\n\n# list of path (can be templated) that will be pre-populated in the final ska-config\nskaConfig:\n  ignorePaths:\n  - \"idea/*\"\n  - test-file-to-be-ignored-{{.testFileName}}.txt\n  - \"*.ignored\"\n\n# this is the section that SKA will consume to generate the input form.\n# each input supports the following information:\n#\n# * placeholder: the name of the variable you used in the template blueprint\n# * label: the label used in the form\n# * help: the help inline to be presented in the form for that specific field\n# * regexp: a validation regexp that will be used to specify the set of accepted characters (NOT A ENTIRE PATTERN VALIDATION)\n# * default: the default value you might want to present in the form\ninputs:\n- placeholder: githubRepo\n  label: Github Repository\n  help: The url of the github repository e.g. https://github.com/org/repo\n  regexp: \"^[a-z0-9-/:.]*$\"\n\n# ... other inputs\n```\n\nSKA will check if the file is present, and if yes, then a Terminal UI interface will be used to collect the inputs.\n\nThe interactive Terminal UI can be disabled with `--non-interactive (-n)` command line argument.\n\n\n### Example template\n\nCheck this example golang cli tool template: https://github.com/gchiesa/ska-golang-cli-template\n\n## Contribute\n\nYou are more than welcome! please have a look at [CONTRIBUTING.md](CONTRIBUTING.md)\n\n## Credits\n\nSKA is made with 💙 and attention for good platform engineering practices, by Giuseppe Chiesa.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgchiesa%2Fska","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgchiesa%2Fska","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgchiesa%2Fska/lists"}