{"id":13756355,"url":"https://github.com/form8ion/project","last_synced_at":"2026-03-07T23:10:29.458Z","repository":{"id":37017725,"uuid":"130306331","full_name":"form8ion/project","owner":"form8ion","description":"opinionated scaffolder for new projects","archived":false,"fork":false,"pushed_at":"2025-05-05T06:13:25.000Z","size":19304,"stargazers_count":5,"open_issues_count":21,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-05T07:24:32.427Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://npm.im/@form8ion/project","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/form8ion.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}},"created_at":"2018-04-20T03:56:24.000Z","updated_at":"2025-05-05T06:12:20.000Z","dependencies_parsed_at":"2023-12-17T10:31:20.678Z","dependency_job_id":"ef78bf74-d5f3-4ef8-9e25-894b33533477","html_url":"https://github.com/form8ion/project","commit_stats":{"total_commits":1606,"total_committers":11,"mean_commits":146.0,"dds":0.5896637608966376,"last_synced_commit":"aa3bc0da5756741d93f81167c4b688e8f3a72e79"},"previous_names":["travi/project-scaffolder"],"tags_count":268,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/form8ion%2Fproject","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/form8ion%2Fproject/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/form8ion%2Fproject/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/form8ion%2Fproject/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/form8ion","download_url":"https://codeload.github.com/form8ion/project/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253358069,"owners_count":21895967,"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":[],"created_at":"2024-08-03T11:00:42.863Z","updated_at":"2026-03-07T23:10:29.417Z","avatar_url":"https://github.com/form8ion.png","language":"JavaScript","readme":"# project\n\nopinionated scaffolder for new projects\n\n\u003c!--status-badges start --\u003e\n\n[![Node CI Workflow Status][github-actions-ci-badge]][github-actions-ci-link]\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/form8ion/project/badge)](https://securityscorecards.dev/viewer/?uri=github.com/form8ion/project)\n[![Codecov][coverage-badge]][coverage-link]\n![SLSA Level 2][slsa-badge]\n\n\u003c!--status-badges end --\u003e\n\n## Table of Contents\n\n* [Features](#features)\n* [Usage](#usage)\n  * [Installation](#installation)\n  * [Consumption in a CLI tool](#consumption-in-a-cli-tool)\n  * [Example](#example)\n    * [Import](#import)\n    * [Execute](#execute)\n  * [API](#api)\n    * [`languages` (_optional_)](#languages-optional)\n    * [`vcsHosts` (_optional_)](#vcshosts-optional)\n    * [`dependencyUpdaters` (_optional_)](#dependencyupdaters-optional)\n* [Contributing](#contributing)\n  * [Dependencies](#dependencies)\n  * [Verification](#verification)\n* [Related Projects](#related-projects)\n* [Inspiration](#inspiration)\n\n## Features\n\n* configures generic editor settings through [EditorConfig](http://editorconfig.org/)\n* scaffolds [license](https://spdx.org/licenses/) details\n* scaffolds [VCS](https://en.wikipedia.org/wiki/VCS) details if [git](https://git-scm.com/)\n  is chosen\n* scaffolds the chosen [VCS](https://en.wikipedia.org/wiki/VCS) Host details\n* scaffolds the chosen [CI](https://en.wikipedia.org/wiki/Continuous_integration)\n  service config\n* scaffolds the project `README.md`\n* scaffolds language specific details by delegating to\n  [provided scaffolder functions](#languages-optional)\n\n## Usage\n\n\u003c!--consumer-badges start --\u003e\n\n[![npm][npm-badge]][npm-link]\n![node][node-badge]\n[![MIT license][license-badge]][license-link]\n\n\u003c!--consumer-badges end --\u003e\n\n### Installation\n\n```sh\n$ npm install @form8ion/project --save-prod\n```\n\n### Consumption in a CLI tool\n\nThis scaffolder is intended to be used as a CLI tool, but it is left up to the\nconsumer to provide the actual CLI wrapper. My [sub-command](https://github.com/travi/scaffolder-sub-command)\nfor [commander](https://www.npmjs.com/package/commander) is an example of such\na wrapper.\n\n### Example\n\n#### Import\n\n```javascript\nimport {lift, questionNames, scaffold} from '@form8ion/project';\n```\n\n#### Execute\n\n```javascript\nawait scaffold({\n  decisions: {\n    [questionNames.PROJECT_NAME]: 'my-project',\n    [questionNames.LICENSE]: 'MIT',\n    [questionNames.VISIBILITY]: 'Public',\n    [questionNames.DESCRIPTION]: 'My project',\n    [questionNames.GIT_REPO]: false,\n    [questionNames.COPYRIGHT_HOLDER]: 'John Smith',\n    [questionNames.COPYRIGHT_YEAR]: '2022',\n    [questionNames.PROJECT_LANGUAGE]: 'foo'\n  },\n  plugins: {\n    dependencyUpdaters: {\n      bar: {scaffold: options =\u003e options}\n    },\n    languages: {\n      foo: {scaffold: options =\u003e options}\n    },\n    vcsHosts: {\n      baz: {\n        scaffold: options =\u003e options,\n        prompt: () =\u003e ({repoOwner: 'form8ion'})\n      }\n    }\n  }\n});\n\nawait lift({\n  projectRoot: process.cwd(),\n  results: {},\n  enhancers: {foo: {test: () =\u003e true, lift: () =\u003e ({})}},\n  vcs: {}\n});\n```\n\n### API\n\nThis is an opinionated scaffolder, but there are some aspects that are\nconfigurable in order to support multiple contexts.\n\nTakes a single options object as an argument, containing:\n\n#### `languages` (_optional_)\n\nprovides the languages to choose from and the functions to perform the\nscaffolding for the chosen language. if no languages are provided, `Other` will\nbe the only choice presented. Choosing `Other` will perform no language-specific\nscaffolding. Official options are provided [in the awesome list](https://github.com/form8ion/awesome#languages).\n\n__object__:\n\n* keys: __string__ Name of the language\n* values: __function__ that scaffolds language specific details\n  * receives an options object as its first argument to pass along answers to\n    the project-level prompts\n    * `projectRoot`: __string__ path of the working directory where the CLI\n      command was executed\n    * `projectName`: __string__ name chosen for the project. defaults to the\n      directory name.\n    * `vcs`: __object__ details about the [VCS](https://en.wikipedia.org/wiki/Version_control)\n      host\n      * `host`: __string__ host name\n      * `name`: __string__ repository name. equal to `projectName`\n      * `owner`: __string__ account name on the host service for the repository\n        owner. defaults to `$ git config github.user`\n    * `visibility`: __string__ `Public` or `Private`. defaults to `Private`\n    * `license`: __string__ identifier of the chosen [SPDX License](https://spdx.org/licenses/)\n      or `UNLICENSED`\n    * `ci`: __string__ name of the chosen CI service. defaults to `Travis`\n    * `description`: __string__ short summary of the project\n\n#### `vcsHosts` (_optional_)\n\nprovides the vcs hosts to choose from and the functions to perform the\nscaffolding for the chosen host. if no hosts are provided, `Other` will be the\nonly choice presented. Choosing `Other` will perform no host-specific\nscaffolding. Official options are provided [in the awesome list](https://github.com/form8ion/awesome#version-control-services).\n\n__object__:\n\n* keys: __string__ Name of the vcs host\n* values: __object__\n  * `prompt`: __function__ (_required_) prompts for host specific details\n    * MUST return an object of the prompt answers, which MUST include the name\n      of the account for the host that owns the repo as `repoOwner`\n  * `scaffolder`: __function__ (_required_) scaffolds the host options\n    * receives an options object as its first argument to pass along answers to\n      the project-level prompts\n      * `host`: __string__ name of the chosen host, as provided in the key of\n        the `vcsHosts` object\n      * `name`: __string__ name chosen for the project. defaults to the\n        directory name.\n      * `owner`: the account name of the owner of the repo on the host, as\n        returned from the `prompt` function\n      * `projectRoot`: __string__ path of the working directory where the CLI\n        command was executed\n      * `description`: __string__ brief summary of the project\n      * `homepage`: __string__ url of the project homepage\n  * `public`: __boolean__ (_optional_) whether this host should be presented\n    as a public option\n  * `private`: __boolean__ (_optional_) whether this host should be presented\n    as a private option\n\n#### `dependencyUpdaters` (_optional_)\n\nprovides the dependency updaters to choose from and the functions to perform the\nscaffolding for the chosen updater service. if no updater services are provided,\n`Other` will be the only choice presented. Choosing `Other` will perform no\nupdater-service-specific scaffolding. Official options are provided [in the awesome list](https://github.com/form8ion/awesome#dependency-update-services).\n\n__object__:\n\n* keys: __string__ Name of the dependency update service\n* values: __object__\n  * `scaffolder`: __function__ (_required_) scaffolds the host options\n    * receives an options object as its first argument to pass along answers to\n      the project-level prompts\n      * `projectRoot`: __string__ path of the working directory where the CLI\n        command was executed\n    * `vcs`: __object__ details about the [VCS](https://en.wikipedia.org/wiki/Version_control)\n      host\n      * `host`: __string__ host name\n      * `name`: __string__ repository name. equal to `projectName`\n      * `owner`: __string__ account name on the host service for the repository\n        owner. defaults to `$ git config github.user`\n\n## Contributing\n\n\u003c!--contribution-badges start --\u003e\n\n[![Conventional Commits][commit-convention-badge]][commit-convention-link]\n[![Commitizen friendly][commitizen-badge]][commitizen-link]\n[![PRs Welcome][prs-badge]][prs-link]\n[![Renovate][renovate-badge]][renovate-link]\n[![semantic-release: angular][semantic-release-badge]][semantic-release-link]\n\n\u003c!--contribution-badges end --\u003e\n\n### Dependencies\n\n```sh\n$ nvm install\n$ npm install\n```\n\n### Verification\n\n```sh\n$ npm test\n```\n\n## Related Projects\n\n* [javascript-scaffolder](https://npm.im/@travi/javascript-scaffolder)\n* [scaffolder-sub-command](https://github.com/travi/scaffolder-sub-command)\n* [github-scaffolder](https://github.com/travi/github-scaffolder)\n* [travis-scaffolder-javascript](https://github.com/travi/travis-scaffolder-javascript)\n* [cli](https://npm.im/@travi/cli)\n\n## Inspiration\n\n* [Yeoman](http://yeoman.io/)\n* [Lass](https://lass.js.org/)\n\n[npm-link]: https://www.npmjs.com/package/@form8ion/project\n\n[npm-badge]: https://img.shields.io/npm/v/@form8ion/project?logo=npm\n\n[license-link]: LICENSE\n\n[license-badge]: https://img.shields.io/github/license/form8ion/project.svg?logo=opensourceinitiative\n\n[commit-convention-link]: https://conventionalcommits.org\n\n[commit-convention-badge]: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg\n\n[commitizen-link]: http://commitizen.github.io/cz-cli/\n\n[commitizen-badge]: https://img.shields.io/badge/commitizen-friendly-brightgreen.svg\n\n[prs-link]: http://makeapullrequest.com\n\n[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg\n\n[renovate-link]: https://renovatebot.com\n\n[renovate-badge]: https://img.shields.io/badge/renovate-enabled-brightgreen.svg?logo=renovatebot\n\n[github-actions-ci-link]: https://github.com/form8ion/project/actions?query=workflow%3A%22Node.js+CI%22+branch%3Amaster\n\n[github-actions-ci-badge]: https://img.shields.io/github/actions/workflow/status/form8ion/project/node-ci.yml.svg?branch=master\u0026logo=github\n\n[node-badge]: https://img.shields.io/node/v/@form8ion/project?logo=node.js\n\n[coverage-link]: https://codecov.io/github/form8ion/project\n\n[coverage-badge]: https://img.shields.io/codecov/c/github/form8ion/project?logo=codecov\n\n[slsa-badge]: https://slsa.dev/images/gh-badge-level2.svg\n\n[semantic-release-link]: https://github.com/semantic-release/semantic-release\n\n[semantic-release-badge]: https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release\n","funding_links":[],"categories":["Scaffolding"],"sub_categories":["Official"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fform8ion%2Fproject","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fform8ion%2Fproject","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fform8ion%2Fproject/lists"}