{"id":24714256,"url":"https://github.com/kairichard/lace","last_synced_at":"2025-10-09T12:31:32.900Z","repository":{"id":11886126,"uuid":"14447940","full_name":"kairichard/lace","owner":"kairichard","description":"Lace - dotfile management","archived":false,"fork":false,"pushed_at":"2025-01-16T10:35:03.000Z","size":352,"stargazers_count":10,"open_issues_count":1,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-16T12:10:11.588Z","etag":null,"topics":["cucumber","dotfile-manager","lace","pkg","ruby"],"latest_commit_sha":null,"homepage":"","language":"Gherkin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kairichard.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}},"created_at":"2013-11-16T14:03:21.000Z","updated_at":"2025-01-16T10:35:05.000Z","dependencies_parsed_at":"2024-12-24T15:17:31.778Z","dependency_job_id":"39d3e6f6-2237-4a48-a229-ad1b3733b395","html_url":"https://github.com/kairichard/lace","commit_stats":{"total_commits":328,"total_committers":8,"mean_commits":41.0,"dds":"0.28658536585365857","last_synced_commit":"a09978c0dd39fe59492f081891a8ca70829d2c3d"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kairichard%2Flace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kairichard%2Flace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kairichard%2Flace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kairichard%2Flace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kairichard","download_url":"https://codeload.github.com/kairichard/lace/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235820062,"owners_count":19050101,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cucumber","dotfile-manager","lace","pkg","ruby"],"created_at":"2025-01-27T08:16:08.454Z","updated_at":"2025-10-09T12:31:27.561Z","avatar_url":"https://github.com/kairichard.png","language":"Gherkin","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/kairichard/lace/raw/master/icon.png\"\u003e\n\u003c/p\u003e\n\nLace - dotfile management\n========\n[![Build Status](https://travis-ci.org/kairichard/lace.png?branch=master)](https://travis-ci.org/kairichard/lace) [![Gem Version](https://badge.fury.io/rb/lace.png)](http://badge.fury.io/rb/lace) [![Dependency Status](https://gemnasium.com/kairichard/lace.svg)](https://gemnasium.com/kairichard/lace) [![Coverage Status](https://coveralls.io/repos/kairichard/lace/badge.png?branch=master)](https://coveralls.io/r/kairichard/lace?branch=master)\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fkairichard%2Flace.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fkairichard%2Flace?ref=badge_shield)\n\n\nLogging in to different machines at work or at home I just wanted to have an elegant solution to install .dotfiles on them. Lace provides. Also I wanted something that makes it real easy to bootstrap a new maschine, even if they are differently flavored. Lace provides. Updating these should be a breeze. Lace provides. And I hoped for something that lets you share common .dotfiles with your teammates by just installing them next to your own dotfiles. Lace provides.\nLace is inspired by brew.\n###### Synopsis\n```bash\nlace \u003ccmd\u003e \u003cpkg-uri/name\u003e [--name=\u003cname\u003e] [--version] [--no-hooks] [--force]\n```\nInstalling\n-------------\nLace comes as a gem, so given you have ruby installed simply do the following\n```bash\n\u003e gem install lace\n#or\n\u003e git clone https://github.com/kairichard/lace.git\n\u003e cd lace\n\u003e gem build lace.gemspec\n\u003e gem install lace-*.gem\n```\nUsage\n-----------\n### Writing a .lace.yml\nPut a file named `.lace.yml` in the root of your dotfiles. This file describes how your dotfiles will be installed and what is included in them. Example:\n\n```yaml\n---\nhomepage: https://somewhere\nversion: 1.0\n\nosx: \u0026osx            # using a name for a config\n  config_files:      # all files that should appear in $HOME \n    - bash           # bash will become .bash can be directory or file\n    - config/**/*    # globbing is supported this will only link files that are not present in $HOME/config yet\n    - tmux.conf\n    - vimrc\n    \n  setup:             # this is run the first time the package is installed\n    - \u003c%= @package_path/\"bootstrap/osx/brew\" %\u003e\n    - \u003c%= @package_path/\"bootstrap/osx/defaults\" %\u003e\n    - \u003c%= @package_path/\"bootstrap/osx/fonts\" %\u003e\n\n  post:  \n    update:          # do this after `lace update`\n      - *vim_bundles\n\nflavors:             # manage multiple flavors of dotfiles\n  osx: *osx \n  ubuntu-desktop: *ubuntu-desktop\n```\nFor a full example visit https://github.com/kairichard/dotfiles/blob/master/.lace.yml\n\n### Installing a Package\nIts possible to install a Package either locally via the files system or by specifying a remote git repo,\nlocal git repos also work.\n\n```bash\n# install something from disk\n\u003e lace fetch somewhere/mydofiles\n\u003e lace setup mydofiles\n# or from github\n\u003e lace fetch https://github.com/user/repo.git\n\u003e lace setup user \u003cflavor\u003e\n# also works if the exact path is not present on disk\n\u003e lace fetch user/repo.git # or\n\u003e lace fetch user/repo\n# or name it the way you like\n\u003e lace fetch https://github.com/user/repo.git --name=prod\n\u003e lace setup prod \u003cflavor\u003e\n# for some config files to take effect it may be required to reload your current terminal session\n```\n\n### Playing around with a non intrusive example package\nMost likely you dont want to override your existing config files just to get a feeling on how lace\nbehaves. Therefore I prepared an example package for you to just install and play around with.\n```bash\n\u003e lace fetch https://github.com/kairichard/lace_example_dotfile_pkg.git\n\u003e lace setup lace_example_dotfile_pkg\n```\n\n```\nExample usage:\n  Synopsis:\n    lace \u003ccmd\u003e \u003cpkg-uri/name\u003e [\u003cflavor\u003e] [--name=\u003cname\u003e] [--version] [--no-hooks] [--force]\n\n  lace ls\n\n  lace fetch \u003cpkg-uri\u003e\n  lace fetch \u003cpkg-uri\u003e\n\n  lace setup \u003cpkg-uri\u003e\n  lace setup \u003cpkg-uri\u003e \u003cflavor\u003e\n\n  lace diff \u003cpkg-uri\u003e\n  lace diff \u003cpkg-uri\u003e \u003cflavor\u003e\n\n  lace activate \u003cpkg-name\u003e\n  lace activate \u003cpkg-name\u003e \u003cflavor\u003e\n\n  lace deactivate \u003cpkg-name\u003e\n  lace deactivate \u003cpkg-name\u003e \u003cflavor\u003e\n\n  lace remove \u003cpkg-name\u003e\n  lace update \u003cpkg-name\u003e\n\nTroubleshooting:\n  lace help\n  lace info \u003cpkg-name\u003e\n  lace validate \u003clocal-directory\u003e\n```\n- - -\n## Learning how to make your own package\nA good staring point is to look at the output of `lace inspect`. Given you have installed the lace_example_dotfile_pkg\nyou can run the following command:\n```bash\n\u003e lace inspect lace_example_dotfile_pkg\nInspection of lace_example_dotfile_pkg:\n  active:      true\n  flavors:     osx, linux, production\n  version:     0.1\n  upgradeable: true\n  manifest:    ~/.cassias/lace_example_dotfile_pkg/.lace.yml\n  homepage:    https://github.com/kairichard/lace_example_dotfile_pkg\n```\nThan just take a look at the `.lace.yml` to learn some more and eventually make your own package.\n### Validating your own package\nWhen packaging your lace-package you may want to validate your `.lace.yml` to do that just run the following and study the output to improve your package\n```bash\n\u003e lace validate somewhere/on/mydisk\nLace-Manifest Validation Report:\n  config-files:                                              [ error ]\n    # arkrc is missing from this package\n  version:                                                   [ missing ]\n    # adding a version to the manifest improves\n    # a future update experince\n  homepage:                                                  [ missing ]\n    # adding a homepage improves the credibility\n    # of your package\n  setup:                                                     [ error ]\n    # ~/.vim/install_bundles cannot be found\n    # ~/.bootstrap/osx/brew cannot be found\n    # ~/.bootstrap/osx/defaults cannot be found\n    # ~/.bootstrap/osx/fonts cannot be found\n  post-update hook:                                          [ error ]\n    # ~/.vim/install_bundles cannot be found\n    # ~/.bootstrap/osx/brew cannot be found\n```\n**NOTE** `lace validate` only works with local directories\n\n## Contributing Code\n\nIf you want to contribute code, please try to:\n\n* Follow the same coding style as used in the project. Pay attention to the\n  usage of tabs, spaces, newlines and brackets. Try to copy the aesthetics the\n  best you can.\n* Add a scenario under `features` that verifies your change (test with `rake features`). Look at the existing test\n  suite to get an idea for the kind of tests I like. If you do not provide a\n  test, explain why.\n* Write [good commit messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html),\n  explain what your patch does, and why it is needed.\n* Keep it simple: Any patch that changes a lot of code or is difficult to\n  understand should be discussed before you put in the effort.\n\nOnce you have tried the above, create a GitHub pull request to notify me of your\nchanges.\n\n## TODO\n\n- [ ] Determine if a package is \"active\" or partially active using the new `diff`.\n- [ ] Use `diff` to apply/activate changes.\n- [ ] Add mothership communication to notify about changes in different environments.\n- [ ] Add description in `lace ls`.\n- [ ] Provide a name in the package itself.\n- [ ] Allow updates without having to deactivate:\n  - [ ] Determine the active flavor by finding the one with the smallest delta of matching to non-matching config files.\n  - [x] Build the diff between the old and new config.\n  - [ ] Only link the diff.\n- [ ] ---Decide whether to track events with PStore.---\n- [ ] Define a `pkg.lace` to allow multiple packages to be fetched and set up.\n- [ ] Refactor:\n  - [ ] Move hooks away from the package itself into Utils.\n  - [ ] Revise hook invocation.\n  - [ ] Refactor `validate.rb`.\n  - [ ] Refactor facts key access.\n\nLicense\n--------\nMIT License (MIT)\n\nAttribution\n--------\nThanks to the people creating and maintaining Homebrew. Without their prior work this tool would probably not exist.\nAnd if it did it would be in a worse state than it is today.\n\nLogo\n--------\nby Mark Beltran -\u003e https://www.instagram.com/elhoncho/\n\n\n## License\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fkairichard%2Flace.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fkairichard%2Flace?ref=badge_large)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkairichard%2Flace","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkairichard%2Flace","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkairichard%2Flace/lists"}