{"id":18064814,"url":"https://github.com/franciscop/happy","last_synced_at":"2026-03-06T21:33:03.379Z","repository":{"id":57261228,"uuid":"184276810","full_name":"franciscop/happy","owner":"franciscop","description":"Happy simplifies your day-to-day git workflow:","archived":false,"fork":false,"pushed_at":"2024-08-08T17:41:25.000Z","size":979,"stargazers_count":10,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-09T07:39:22.985Z","etag":null,"topics":["ci","cli","continuous-integration","git","npm"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/franciscop.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"custom":"https://www.paypal.me/franciscopresencia/19"}},"created_at":"2019-04-30T14:25:43.000Z","updated_at":"2024-08-08T17:41:29.000Z","dependencies_parsed_at":"2025-04-11T18:11:13.632Z","dependency_job_id":"e0341bc2-df2e-4273-bef8-d766c735e5ce","html_url":"https://github.com/franciscop/happy","commit_stats":null,"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"purl":"pkg:github/franciscop/happy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franciscop%2Fhappy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franciscop%2Fhappy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franciscop%2Fhappy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franciscop%2Fhappy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/franciscop","download_url":"https://codeload.github.com/franciscop/happy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franciscop%2Fhappy/sbom","scorecard":{"id":409128,"data":{"date":"2025-08-11","repo":{"name":"github.com/franciscop/happy","commit":"bf2778822ccd221196289111a2d6677f62c84b72"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-18T22:10:24.829Z","repository_id":57261228,"created_at":"2025-08-18T22:10:24.830Z","updated_at":"2025-08-18T22:10:24.830Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30198661,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T19:07:06.838Z","status":"ssl_error","status_checked_at":"2026-03-06T18:57:34.882Z","response_time":250,"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":["ci","cli","continuous-integration","git","npm"],"created_at":"2024-10-31T06:07:56.806Z","updated_at":"2026-03-06T21:33:03.332Z","avatar_url":"https://github.com/franciscop.png","language":"JavaScript","funding_links":["https://www.paypal.me/franciscopresencia/19"],"categories":[],"sub_categories":[],"readme":"# Happy\n\nHappy simplifies your day-to-day git workflow:\n\n```bash\n$ happy\n$ happy \"Move the dates to ISO 8601\"\n$ happy \"Quick hot fix\" --now\n```\n\n\u003cimg width=\"400px\" src=\"https://raw.githubusercontent.com/franciscop/happy/master/img/happy.png\" alt=\"screenshot\" /\u003e\n\n_happy_ analyzes your project to find the appropriate npm scripts to run and then commits and deploys those changes with git.\n\n## Getting started\n\nFirst install it globally:\n\n```bash\nnpm install happy -g\n```\n\nThen you can run it in your console, either with just `happy` or with `happy \"Message\"`. Run `happy --help` anytime:\n\n```bash\n$ happy --help\n\n  Happy simplifies your day-to-day git workflow.\n\n  Usage\n    $ happy\n    $ happy \"Message here\" --now\n    $ happy \"Message here\" --publish patch\n\n  Options\n    --now                Skip build, lint and tests to deploy the changes *now*\n    --publish VERSION    Publish your package to NPM with \"np VERSION --yolo\"\n    --patch              Alias for --publish patch\n    --minor              Alias for --publish minor\n    --major              Alias for --publish major\n\n  Examples\n    $ happy\n    ✔ Building project\n    ↓ Linting\n    ✔ Testing project\n    ✔ Saving changes\n    ✔ Downloading latest\n    ✔ Uploading changes\n\n    $ happy \"Move the dates to ISO 8601\"\n    ✔ Building project\n    ↓ Linting\n    ✔ Testing project\n    ✔ Saving changes\n    ↓ Downloading latest\n    ✔ Uploading changes\n\n    $ happy --now\n    ✔ Saving changes\n    ↓ Downloading latest\n    ✔ Uploading changes\n```\n\n\n## What it does\n\nIt makes sure your project is ready to deploy, and then deploy it. For this, these are the steps:\n\n- [\"Building project\"](#building-project): run `npm run build` *if* the `\"build\"` script is found in your `package.json`.\n- [\"Linting\"](#linting): run `npm run lint` *if* the `\"lint\"` script is found in the project `package.json`.\n- [\"Testing project\"](#testing-project): run `npm test` *if* the `\"test\"` script is found in the project `package.json`.\n- [\"Saving changes\"](#saving-changes): add all of the files with git, equivalent to `git add . \u0026\u0026 git commit -m \"Saved on $TIME\"`. Provide a message for a custom git message.\n- [\"Downloading latest\"](#downloading-latest): git pull\n- [\"Uploading changes\"](#uploading-changes): git push\n- [\"Publish to npm\"](#publish-to-npm): _only_ if the `--publish` flag is passed, publish it to npm.\n\n\n\n### Building project\n\nRun the `npm run build` script *if* this script is found in your `package.json` configuration. Example:\n\n```json\n{\n  \"scripts\": {\n    \"build\": \"rollup -c\"\n  }\n}\n```\n\nThis step will be **skipped** if:\n- The script `\"build\"` is not found in the project `package.json`.\n- The flag `--now` was passed.\n\n\n\n### Linting\n\nRun the `npm run lint` script *if* this script is found in your `package.json` configuration. Example:\n\n```json\n{\n  \"scripts\": {\n    \"lint\": \"eslint\"\n  }\n}\n```\n\nThis step will be **skipped** if:\n- The script `\"lint\"` is not found in the project `package.json`.\n- The flag `--now` was passed.\n\n\n\n### Testing project\n\nRun the `npm test` script *if* this script is found in your `package.json` configuration. Example:\n\n```json\n{\n  \"scripts\": {\n    \"test\": \"jest\"\n  }\n}\n```\n\nThe test script will also set the environment variable CI=true to avoid [some common issues](https://stackoverflow.com/a/56917151/938236).\n\nThis step will be **skipped** if:\n- The script `\"test\"` is not found in the project `package.json`.\n- The flag `--now` was passed.\n\n\n\n### Saving Changes\n\nThis is the equivalent of _adding_ and _commiting_ the changed files to Git. The message for the commit is the string that you pass:\n\n```bash\nhappy \"Added that new cool feature\"\n```\n\nWhen no string is provided, it will save the changes with a generic commit with the current timestamp like:\n\n```\nSaved on 2020-08-13T10:20:00Z\n```\n\nThis step will be **skipped** if:\n- There are no changes to add or commit.\n- The changes were already commited.\n\n\n\n### Downloading latest\n\nTry to pull the latest changes from the remote repo to combine them locally. It will exit if there's a problem with the merge so that you can merge it manually.\n\n\u003e This step might take longer than the others since it talks to your git server.\n\nThis step will be **skipped** if:\n- There were no changes in the remote repo (you are up to date).\n\nThis step will **throw an error** if:\n- The origin is not set.\n\n\u003e TODO: ask/fix the origin if it's not set\n\n\n\n### Uploading changes\n\nTake all of your changes and upload them to the `origin` that is set in your project. This is specially useful when combined with e.g. Heroku, and you set heroku as the origin, since it will also deploy the full website.\n\nThis step takes longer than the others since it's talking to your git server.\n\nThis step will be **skipped** if:\n- There were no changes in the local repo.\n\n\n\n### Publish to npm\n\n\u003e You need to have the library `np` installed for this, please do `npm i np -g`\n\nAdd a `--publish VERSION` flag to publish the current package to npm with [np](https://github.com/sindresorhus/np#readme):\n\n```bash\nhappy --publish patch\nhappy --publish minor\nhappy --publish major\n\nhappy --publish 5.0.0\n```\n\nAs an alias, you can do with just `--patch`, `--minor` or `--major` instead:\n\n```bash\nhappy --patch\nhappy --minor\nhappy --major\n\nhappy --publish 5.0.0\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranciscop%2Fhappy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffranciscop%2Fhappy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranciscop%2Fhappy/lists"}