{"id":37228157,"url":"https://github.com/abuob/yanice","last_synced_at":"2026-01-15T03:26:20.081Z","repository":{"id":35073936,"uuid":"200223718","full_name":"abuob/yanice","owner":"abuob","description":"Changedetection-Tool for monorepositories","archived":false,"fork":false,"pushed_at":"2026-01-11T10:28:04.000Z","size":1109,"stargazers_count":16,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-11T15:03:46.795Z","etag":null,"topics":["change-detection","monorepo","monorepository"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/abuob.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":"2019-08-02T11:32:15.000Z","updated_at":"2026-01-11T09:59:17.000Z","dependencies_parsed_at":"2024-01-16T12:47:38.038Z","dependency_job_id":"e404ca8f-020f-4bee-bdf2-a70cb693c7c1","html_url":"https://github.com/abuob/yanice","commit_stats":{"total_commits":241,"total_committers":2,"mean_commits":120.5,"dds":0.008298755186721962,"last_synced_commit":"e0928bf26949762f3a182df6e45de0c2f4289e2b"},"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/abuob/yanice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abuob%2Fyanice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abuob%2Fyanice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abuob%2Fyanice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abuob%2Fyanice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abuob","download_url":"https://codeload.github.com/abuob/yanice/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abuob%2Fyanice/sbom","scorecard":{"id":162022,"data":{"date":"2025-08-11","repo":{"name":"github.com/abuob/yanice","commit":"ce1d05d7e4a6e5088ea755425e9f5086bc9a9ad7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/nodejs.yml:1","Info: no jobLevel write permissions found"],"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":"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"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":"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":"Pinned-Dependencies","score":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/abuob/yanice/nodejs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/abuob/yanice/nodejs.yml/main?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 npmCommand dependencies pinned"],"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":"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":"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":"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":"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":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'main'","Warn: branch 'main' does not require approvers","Warn: codeowners review is not required on branch 'main'","Warn: no status checks found to merge onto branch 'main'","Warn: PRs are not required to make changes on branch 'main'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"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"}},{"name":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T13:45:02.416Z","repository_id":35073936,"created_at":"2025-08-16T13:45:02.416Z","updated_at":"2025-08-16T13:45:02.416Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28442270,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T00:55:22.719Z","status":"online","status_checked_at":"2026-01-15T02:00:08.019Z","response_time":62,"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":["change-detection","monorepo","monorepository"],"created_at":"2026-01-15T03:26:19.480Z","updated_at":"2026-01-15T03:26:20.072Z","avatar_url":"https://github.com/abuob.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Yanice\n\nYanice (_yet another incremental command executor_) takes care of change detection and incremental builds/command\nexecution within a git-based monorepository.\nIt lets you define various dependency graphs for different \"scopes\" (e.g. build, test, lint...) to model the\ndependencies between your projects,\ndetects changes between the current working tree and e.g. another commit, and lets you execute commands depending on\nthose changes and the dependency graphs you defined.\n\nFor example, a repository with two projects and two libraries might be modeled as follows:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"yanice-visualization-example\" src=\"https://raw.githubusercontent.com/abuob/yanice/main/resources/yanice-visualize-example.png\"\u003e\n\u003c/p\u003e\n\nIn this example, we look at the graph comparing the working tree to `HEAD`. Something in `lib-2` changed.\nIf we now run `yanice run test --rev=HEAD`, the test-command of `project-A` would be executed: `lib-2` changed, `project-A`\ndepends on `lib-2`, but `lib-2` itself nor `project-B` have a test-command defined (dashed border), therefore only one command is run.\nSee below for how to define the project-structure.\n\n## Assumptions \u0026 Caveats:\n\n-   The dependencies between the projects inside the repository can be modeled as\n    a [directed acyclic graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) (DAG)\n-   This DAG is known and is described in a `yanice.json`-file\n-   Yanice will _not_ read any file inside the repository (except its configuration - the aforementioned `yanice.json`)\n-   Yanice will therefore _not_ automatically detect dependencies via, for example, detecting imports. Enabling this via plugins is possible though, see below\n-   Yanice works best for small- to medium-sized repositories, the dependencies between the projects have\n    to be defined and maintained in a single configuration-file, which _can_ get cumbersome with increasing size\n-   Due to the design philosophy of not reading/touching any files inside the repository, yanice can technically be used for any kind of repository, no matter the technology/languages used (node/git must be\n    available)\n-   In its current form, yanice only detects changes between the current working tree (w/o uncommitted changes) and a\n    given commit-ish (commitSHA, branch, tag, HEAD...). Metadata about last command executions are _not_ stored or considered in any other way. To achieve incremental builds\n    for e.g. CI-purposes, retrieve the commit of the last successful build or e.g. the target-branch of a PR, and compare\n    to that\n\nIn case you're considering using Yanice: If you happen to use a typescript-codebase, make sure to check out the `@yanice/import-boundaries`-plugin ([link](https://www.npmjs.com/package/@yanice/import-boundaries)),\nwhich offers various functionality based on the import-graph of your project:\n\n-   Automatically generate dependency-graphs for the `yanice.json` based on imports\n-   Assert boundaries between projects\n-   Control which project can use which 3rd-party-dependency (`node_modules`)\n-   Ensure that projects are only accessed via their entry-points (`index.ts`, `public_api.ts` etc.); no deep imports\n-   Disallow cyclic imports\n\n## Installation\n\nInstall e.g. via npm as follows:\n\n```\nnpm install --save-dev yanice\n```\n\nYanice can be used programmatically, but its primary intended usage is via CLI.\nThe CLI-commands further below usually follow this pattern: `yanice \u003cargs\u003e`.\nThese commands can be added as a script to the `package.json` in your project.\nAlternatively, to avoid cluttering the `package.json` with various commands, add a single script-entry like so:\n`\"yanice\": \"yanice\"`, and then invoke the command directly in the CLI like so: `npm run yanice -- \u003cargs\u003e`.\n\n## Configuration\n\nThe complete version of the `yanice.json` used for this example can be found\nhere: [example-yanice.json](https://github.com/abuob/yanice/blob/main/resources/yanice-visualize-example.png)\n\nThe example corresponds to the graph in the picture above. `project-A` for example is defined as follows:\n\n```\n{\n  \"projectName\": \"project-A\",\n  \"projectFolder\": \"project-A\",\n  \"pathGlob\": \"**/*.ts\",\n  \"commands\": {\n    \"build\": {\n      \"command\": \"npm run build\",\n      \"cwd\": \"./project-A\"\n    },\n    \"lint\": {\n      \"command\": \"npm run lint-project-A\",\n      \"cwd\": \"./\"\n    },\n    \"test\": {\n      \"command\": \"npm run test-project-A\"\n    }\n  },\n  \"responsibles\": [\"Bob\", \"Bill\"]\n}\n```\n\nEvery file in the repository (and in the same directory as the `yanice.json` or a subdirectory thereof) is possibly part of a project.\nThe files that are part of a project can be defined by using `projectFolder`, `pathGlob` or `pathRegExp`, or a combination of all (all need to be satisfied).\nNote that this allows you to match any file or even no file at all: If you do not define any of these properties,\nall files in the repository will match and be part of the project. Projects such as \"all-js-files\" or \"ci-relevant-files\" can easily be modelled.\n\nA Command will be executed in the given `cwd`. A command corresponds to a scope (here: build, test, lint), for which a\ndependency graph is defined in the `yanice.json`. E.g. for test, the dependencies\nare modeled as such:\n\n```\n\"test\": {\n  \"extends\": \"build\",\n  \"options\": {\n    \"commandOutput\": \"append-at-end-on-error\",\n    \"outputFilters\": [\"npmError\"]\n  },\n  \"dependencies\": {\n    \"project-A\": [\"lib-1\", \"lib-2\", \"important-repo-files\", \"test-utils\"],\n    \"lib-1\": [\"important-repo-files\", \"test-utils\"]\n  }\n}\n```\n\nA scope can extend another scope, but currently, only one level of extension is allowed.\nIf a scope is extended, all dependencies are the same as of the extended scope - except for those that are overridden (\nin the given example, `project-A` and `lib-1` have overridden dependencies inherited from `build`).\n\nA scope can have `defaultDependencies`; projects which are not listed will have these as dependencies. This is intended\nfor scopes that\nhave an inherently 'flat' dependency tree; e.g. linting: Each project might depend on some global linting configuration\nbut nothing else.\nNot intended to be used in combination with `extends`.\n\n## Commands\n\nIn general, commands have the following base\nstructure: `yanice (run|output-only|visualize|plugin:\u003cplugin-name\u003e) \u003cscope\u003e --(rev|branch|commit)=\u003cgit-rev\u003e`.\n\nSee further below for examples.\n\n### First parameter\n\nYanice consists internally of phases: Load configuration, parse the arguments, calculate the dependency tree, determine\nchanged files using git,\ncalculating changed projects, and so on. These steps are always the same, except for the last one, which determines\nwhat to do with all the results from the previous steps. This is determined by the first argument:\n\n| First parameter        | Effect                                                                                                                                                                                                       |\n| :--------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `run`                  | Runs the commands                                                                                                                                                                                            |\n| `output-only`          | Same as `run`, but instead of running the commands, print related information.                                                                                                                               |\n| `visualize`            | Starts a small server which serves a visualization of the graph and all the changes; see e.g. [depiction above](https://raw.githubusercontent.com/abuob/yanice/main/resources/yanice-visualize-example.png). |\n| `plugin:\u003cplugin-name\u003e` | Invokes a plugin with all available data. There are some officially provided plugins, however, you an also provide the location of a custom script that yanice will invoke. See below for details.           |\n\n### Second parameter\n\nThe second parameter selects a `scope` as defined in the `yanice.json`, see above.\n\n### Additional parameters\n\nThe order of the remaining parameters generally does not matter (except when overwriting each other):\n\n| Parameter                                                               | Works only for | Default  | Effect                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n| :---------------------------------------------------------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `--rev=\u003cgit-revision\u003e`, `--branch=\u003cgit-branch\u003e`, `--commit=\u003ccommitSHA\u003e` |                |          | git-revision with which the current working tree (w/o uncommitted changes, see below) will be compared. `--rev=\u003c..\u003e` accepts anything that `git rev-parse` can turn into a commit-SHA. Under the hood, yanice uses `git diff --name-only` in combination with `git merge-base --octopus` to determine the changed files. Therefore, yanice needs to know the corresponding refs/git-history, this is especially relevant with regards to shallow-clone. |\n| `--all`                                                                 |                |          | Ignore all change detection and just assume every project has changed.                                                                                                                                                                                                                                                                                                                                                                                  |\n| `--concurrency=n`                                                       | `run`          | `1`      | Will execute `n` commands in parallel                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| `--output-mode=ignore\\|append-at-end\\|append-at-end-on-error`           | `run`          | `ignore` | Determines what to do with `stdout` when running commands. Note that this overwrites configuration in the `yanice.json`.                                                                                                                                                                                                                                                                                                                                |\n| `--responsibles`                                                        | `output-only`  |          | Will print all responsibles of all projects that are affected by changes as per given scope. This might be useful for determining who should e.g. review a pull request                                                                                                                                                                                                                                                                                 |\n| `--exclude-uncommitted`                                                 |                |          | Per default, uncommitted changes are considered. With this parameter, `HEAD` will be used for comparison, the index will be ignored.                                                                                                                                                                                                                                                                                                                    |\n| `--include-filtered`                                                    | `output-only`  |          | Per default, projects for which a command is not specified will not be part of the output even if they are dependents of a changed project (e.g. a project that imports something from a changed library but does not have any tests and therefore no test-command)                                                                                                                                                                                     |\n| `--save-visualization`                                                  | `visualize`    |          | Instead of serving the visualization, it will save the generated html in `.yanice-output` (see options)                                                                                                                                                                                                                                                                                                                                                 |\n| `--renderer=dagre/vizjs`                                                | `visualize`    | `dagre`  | Will choose the renderer, available are [dagre](https://github.com/dagrejs/dagre) and [vizjs](https://github.com/mdaines/viz.js).                                                                                                                                                                                                                                                                                                                       |\n\nWith\nthe [configuration from above](https://github.com/abuob/yanice/blob/main/src/__fixtures/readme-example-yanice.json),\nwe could run the following commands:\n\n-   `yanice visualize test --rev=HEAD`: Will create a visualization of the graph like in\n    the [depiction above](https://raw.githubusercontent.com/abuob/yanice/main/resources/yanice-visualize-example.png).\n-   `yanice run lint --branch=main --concurrency=3`: Run all lint-commands of all projects that have changed compared to\n    the main branch,\n    include uncommitted changes (default), run 3 commands in parallel (default: 1).\n-   `yanice output-only lint --branch=main`: Same as above, but instead of running the commands, the projects\n    on which lint-commands would be executed are printed to the console.\n-   `yanice output-only test --branch=main --responsibles`: Print all responsibles. Note that we have to provide a\n    scope (here: test)\n    in order to create the dependency graph.\n    Yanice will collect all responsibles of the projects that are either directly changed or affected by changes, and log\n    them to the console.\n    Note that the project does not need to have a command for the used scope; its responsibles are still included.\n\n### Options\n\nOptions are defined in the `yanice.json` and can be defined as global defaults and on a per-scope-basis.\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eOptions\u003c/th\u003e\n        \u003cth\u003eAllowed\u003c/th\u003e\n        \u003cth\u003eDefault\u003c/th\u003e\n        \u003cth\u003eEffect\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003ecommandOutput\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003eignore\u003c/code\u003e, \u003ccode\u003eappend-at-end\u003c/code\u003e, \u003ccode\u003eappend-at-end-on-error\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003eignore\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eHow to treat the stdin/stdout of the executed commands. On \u003ccode\u003eignore\u003c/code\u003e, only a list of all commands and whether they succeeded or not will be displayed. Otherwise, the output will be appended as defined.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eoutputFilters\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eArray of: \u003ccode\u003enpmError\u003c/code\u003e, \u003ccode\u003ekarmaProgressSuccess\u003c/code\u003e, \u003ccode\u003eignoreStderr\u003c/code\u003e, \u003ccode\u003eignoreStdout\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eWill filter out the command-outputs on a line-by-line basis. Only relevant if \u003ccode\u003ecommandOutput\u003c/code\u003e is not \u003ccode\u003eignore\u003c/code\u003e. Mostly quality-of-life to reduce noise; e.g. \u003ccode\u003enpmError\u003c/code\u003e will strip away the standard \u003ccode\u003enpm ERR \u003c..\u003e\u003c/code\u003e-block.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eoutputFolder\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eA filepath relative to the \u003ccode\u003eyanice.json\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e./.yanice-output\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eOnly relevant in combination with the \u003ccode\u003e--save-visualization\u003c/code\u003e-parameter\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eport\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eAny available port number\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e4567\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eOnly relevant in combination with the \u003ccode\u003e--visualize\u003c/code\u003e-parameter\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n## Plugins\n\nAs a design choice, yanice itself will never read any file in the repository except for the `yanice.json`.\nTherefore, tasks like automatically creating dependency-trees based on imports or asserting that declared dependencies\nare not violated\nis not possible from within yanice. However, plugins which are invoked by yanice do not have this limitation.\n\nThe general idea is that when yanice is run with `yanice plugin:some-plugin ...`, yanice will run its usual steps,\nbut in the end invoke the selected plugin and forward all data that has so far been calculated into the plugin.\n\n### Officially supported plugins\n\n| Name              | npm-package                                                                                  | source code                                                                                        | Purpose                                                                                                                                                                                                                                                                               |\n| :---------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| import-boundaries | [link](https://www.npmjs.com/package/@yanice/import-boundaries): `@yanice/import-boundaries` | [packages/import-boundaries](https://github.com/abuob/yanice/tree/main/packages/import-boundaries) | Helps to bridge the gap between the dependencies declared in the `yanice.json` and the _actual_ dependencies as per imports. Currently supports import-detection for javascript/typescript, but allows for custom import-resolvers which take a file and map it to the found imports. |\n\n### Custom plugins\n\nCustom plugins are javascript-files which yanice can require. See [here](https://github.com/abuob/yanice/blob/main/integration-tests/test-project/yanice.json) for configuration, [here](https://github.com/abuob/yanice/blob/main/integration-tests/test-project/custom-scripts/dummy-plugin.ts) for a custom (untranspiled) plugin example.\n\n### Dependencies\n\nYanice tries to work with as few dependencies as possible, currently relying only on the following dependencies:\n\n| Name      | npm-package                                     | Purpose                                               |\n| :-------- | ----------------------------------------------- | ----------------------------------------------------- |\n| ajv       | [link](https://www.npmjs.com/package/ajv)       | Used for JSON-schema validation of the `yanice.json`. |\n| minimatch | [link](https://www.npmjs.com/package/minimatch) | Used for glob-expression matching.                    |\n\n### Roadmap:\n\n-   Built-in incremental change-detection: Currently, if you run the same yanice-command twice (e.g. test), yanice will\n    execute all commands again, even if there are no changes\n    compared to the previous run. Store metadata about the last execution so that yanice will not run obviously redundant\n    commands.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabuob%2Fyanice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabuob%2Fyanice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabuob%2Fyanice/lists"}