{"id":33326771,"url":"https://github.com/project-talan/tln-cli","last_synced_at":"2025-11-20T11:04:13.353Z","repository":{"id":38857821,"uuid":"151113968","full_name":"project-talan/tln-cli","owner":"project-talan","description":"Talan CLI (tln) is an open-source framework for managing third-party components from wide range of ecosystems (Java, Node.js, C++, Golang, Angular etc.). tln helps to create fully isolated development environments, uniformly manage mono- \u0026 multi- repo configurations, build smooth onboaring experience, melt borders between local development environments and CI/CT/CD setups, get maximum from Polyglot Programming Polyglot Persistence (4Ps) design.","archived":false,"fork":false,"pushed_at":"2025-11-20T09:07:45.000Z","size":1852,"stargazers_count":32,"open_issues_count":47,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-11-20T11:03:52.646Z","etag":null,"topics":["ci-ct-cd","environment-variables","infrastructure-as-code","microservices","microservices-architecture","monorepo","multirepo","pacakge-manager","software-architecture-as-code"],"latest_commit_sha":null,"homepage":"http://tln.sh","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/project-talan.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":"2018-10-01T15:44:15.000Z","updated_at":"2025-11-18T11:29:35.000Z","dependencies_parsed_at":"2023-09-25T06:28:16.368Z","dependency_job_id":"ecbf1ae1-a209-4c48-a63a-a9560551afeb","html_url":"https://github.com/project-talan/tln-cli","commit_stats":{"total_commits":358,"total_committers":4,"mean_commits":89.5,"dds":"0.027932960893854775","last_synced_commit":"462fe9905e3172fe4799c1f18b93b5f52925bfcf"},"previous_names":[],"tags_count":121,"template":false,"template_full_name":null,"purl":"pkg:github/project-talan/tln-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/project-talan%2Ftln-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/project-talan%2Ftln-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/project-talan%2Ftln-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/project-talan%2Ftln-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/project-talan","download_url":"https://codeload.github.com/project-talan/tln-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/project-talan%2Ftln-cli/sbom","scorecard":{"id":746387,"data":{"date":"2025-08-11","repo":{"name":"github.com/project-talan/tln-cli","commit":"51431383014a6189531fc11ce843567c672cbea5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.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":"Code-Review","score":0,"reason":"Found 0/29 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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/project-talan/tln-cli/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/project-talan/tln-cli/build.yml/main?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction 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":"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":"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":"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":"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"SAST","score":3,"reason":"SAST tool is not run on all commits -- score normalized to 3","details":["Warn: 10 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":7,"reason":"3 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6"],"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-22T18:54:07.226Z","repository_id":38857821,"created_at":"2025-08-22T18:54:07.227Z","updated_at":"2025-08-22T18:54:07.227Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":285422073,"owners_count":27168929,"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","status":"online","status_checked_at":"2025-11-20T02:00:05.334Z","response_time":54,"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":["ci-ct-cd","environment-variables","infrastructure-as-code","microservices","microservices-architecture","monorepo","multirepo","pacakge-manager","software-architecture-as-code"],"created_at":"2025-11-20T11:04:12.147Z","updated_at":"2025-11-20T11:04:13.348Z","avatar_url":"https://github.com/project-talan.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Architecture as Code\n\n\u003cimg alt=\"ccf\" align=\"right\" src=\"https://raw.githubusercontent.com/project-talan/tln-cli/master/docs/banner.jpg\" width=\"300\"\u003e\n\nTalan CLI (tln)\n* is an open-source framework designed to manage third-party components across diverse ecosystems like Java, Node.js, C++, Golang etc.\n* it enables the creation of fully isolated, nested development, environments, streamlines the management of both mono and multi-repo configurations, and facilitates a seamless onboarding experience.\n* effectively bridges gaps between local development environments and CI/CD setups, maximizing the benefits of Polyglot Programming and Polyglot Persistence (4Ps) design.\n\n## Similar or related projects\n[Brew](https://brew.sh/), [Conan](https://conan.io/), [Meta](https://github.com/mateodelnorte/meta), [Lerna](https://github.com/lerna/lerna), [SDKMAN](https://sdkman.io), [jEnv](https://www.jenv.be/), [Chocolatey](https://chocolatey.org/)\n\n## Prerequisites\n* Install `Nodejs 20.x` or higher (https://nodejs.org)\n* Make sure that `wget` is accessible via command line (Linux/MacOS)\n* Make sure that [`Powershell`](https://superuser.com/questions/106360/how-to-enable-execution-of-powershell-scripts) script can be executed (Windows):\n* Install tln-cli \n  ```\n  npm i -g tln-cli@1.110.0 \u0026\u0026 tln --version\n  ```\n\n## Quick start \u003csub\u003e\u003csup\u003e~3 min\u003c/sup\u003e\u003c/sub\u003e\n* Create folder where all your projects will be located\n  * Linux/MacOs\n    ```\n    cd ~\n    ```\n  * Windows (you can use any disk, disk d: is used for demonstration purpose)\n    ```\n    d:\n    cd /\n    ```\n  ```\n  mkdir projects \u0026\u0026 cd projects \u0026\u0026 tln config --terse\n  ```\n\n* Create folder for the `hellotalan` project (inside `projects` folder)\n  ```\n  mkdir hellotalan \u0026\u0026 cd hellotalan \u0026\u0026 tln config --terse\n  ```\n* Edit `.tln.conf` file to get next configuration (you can just copy-paste it)\n  ```\n  module.exports = {\n    options: async (tln, args) =\u003e {},\n    env: async (tln, env) =\u003e {},\n    dotenvs: async (tln) =\u003e [],\n    inherits: async (tln) =\u003e [],\n    depends: async (tln) =\u003e ['openjdk-18', 'mvn-3.8.6', 'go-1.19.2', 'node-16.18.0', 'kubectl-1.23.13', 'firebase-11.15.0'],\n    steps: async (tln) =\u003e [],\n    components: async (tln) =\u003e []\n  }\n  ```\n* Next command will install all components were listed inside `depends` section from `.tln.conf`. Components will be installed inside `projects` folder and `will not affect any other already installed software`.\n  ```\n  tln install --depends\n  ```\n* Check version of installed components\n  ```\n  tln versions --depends\n  ```\n  ```\n  [java]\n  openjdk version \"18\" 2022-03-22\n  OpenJDK Runtime Environment (build 18+36-2087)\n  OpenJDK 64-Bit Server VM (build 18+36-2087, mixed mode, sharing)\n  [maven]\n  Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)\n  Maven home: /root/projects/maven/mvn-3.8.6\n  Java version: 1.8.0_342, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre\n  Default locale: en, platform encoding: UTF-8\n  OS name: \"linux\", version: \"4.15.0-194-generic\", arch: \"amd64\", family: \"unix\"\n  [golang]\n  go version go1.19.2 linux/amd64\n  [node]\n  v16.18.0\n  [npm]\n  8.19.2\n  [kubectl]\n  Client Version: version.Info{Major:\"1\", Minor:\"23\", GitVersion:\"v1.23.13\", GitCommit:\"592eca05be27f7d927d0b25cbb4241d75a9574bf\", GitTreeState:\"clean\", BuildDate:\"2022-10-12T10:57:16Z\", GoVersion:\"go1.17.13\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n  [firebase]\n  11.15.0\n  ```\n\n## tln architecture \u0026 in-depth details\n* [What is Component?](docs/component.md)\n* [Management of environment variables \u0026 dotenv files](docs/dotenv.md)\n* [Versioning](docs/versioning.md)\n* [Mono- \u0026 multi-repo configurations](docs/repos.md)\n* [MVTs - Minimal Vaible Templates](docs/mvt.md)\n* [Software Development Life Cycle](docs/sdlc.md)\n\n\n## Real life scenario \u003csub\u003e\u003csup\u003e~15 min\u003c/sup\u003e\u003c/sub\u003e\nLet's say, you've joined Calbro.com company to head software project development. You will need to build new service as part of multiple already in-production applications. Your first steps are: configure local development environment, checkout existing projects and create initial structure for the new one.\n\n### Calbro projects home\n* First step is to configure Calbro components\n  * Linux/MacOs\n    ```\n    \u003e cd ~/projects\n    ```\n  * Windows\n    ```\n    \u003e d:\n    \u003e cd /projects\n    ```\n  ```\n  \u003e mkdir calbro\n  \u003e cd calbro\n  ```\n  For the next command replace Alice account name and email with your own (for this tutorial, please use your Github account)\n  ```\n  \u003e tln config --terse -e TLN_GIT_USER=Alice -e TLN_GIT_EMAIL=alice@calbro.com --inherit git\n  ```\n  \n* If you check created configuration file `.tln.conf`, you will see following JSON structure\n  ```\n  module.exports = {\n    options: async (tln, args) =\u003e {},\n    env: async (tln, env) =\u003e {\n      env.TLN_GIT_USER = 'Alice';\n      env.TLN_GIT_EMAIL = 'alice@calbro.com';\n    },\n    dotenvs: async (tln) =\u003e [],\n    inherits: async (tln) =\u003e ['git'],\n    depends: async (tln) =\u003e [],\n    steps: async (tln) =\u003e [],\n    components: async (tln) =\u003e []\n  }\n  ```\n  This information will be used by all subsequent git calls.\n\n### Checkout, configure \u0026 build existing projects\nCalbo is a big company and has a lot of teams and ongoing projects. You know that Calbro is using `tln` to deal with internal complexity, so onboarding should be straightforward.\n* You are part of `teamone` team and this should be reflected as part of your local dev environment\n  ```\n  \u003e mkdir teamone\n  \u003e cd teamone\n  \n  # for ssh access\n  \u003e tln config --repo git@github.com:project-talan/calbro-teamone-tln.git\n  # for https access\n  # tln config --repo https://github.com/project-talan/tln-calbro-teamone.git\n  \n  \u003e tln ls\n  ```\n  Two last commands will do the magic: get teamone list of projects and display them to you\n  \n  Configuration file `.tln/.tlf.conf` can unhide more details\n  ```\n  module.exports = {\n    options: async (tln) =\u003e [],\n    dotenvs: async (tln) =\u003e [],\n    inherits: async (tln) =\u003e [],\n    depends: async (tln) =\u003e [],\n    env: async (tln, env) =\u003e {\n      env.TLN_GIT_SSH_PREFIX = 'git@github.com:';\n      env.TLN_GIT_HTTPS_PREFIX = 'https://github.com/';  \n      env.TLN_GIT_ORIGIN = `${env.TLN_GIT_USER}/${env.TLN_COMPONENT_ID}.git`;\n      env.TLN_GIT_UPSTREAM = `project-talan/${env.TLN_COMPONENT_ID}.git`;\n    },\n    steps: async (tln) =\u003e [],\n    components: async (tln) =\u003e [\n      { id: 'calbro-scanner' },\n      { id: 'calbro-portal' }\n    ]\n  }\n  ```\n  \n* At this point, you are ready to get source code of the existing projects, build it and start checking implemented functionality\n  ```\n  # for ssh access\n  \u003e tln clone calbro-scanner:calbro-portal\n  # for https access\n  # tln clone calbro-scanner:calbro-portal -- --https\n  \n  \u003e tln install calbro-portal:calbro-scanner --depends\n  \u003e tln prereq:init -r\n  \u003e tln build -r\n  ```\n  * First command will use `git clone` and your credentials were defined early inside `.tln.conf`\n  * Second will install all necessary `third-parties` components\n  * Third one will generate `.env` file if any, using template, and run initialization commands like `npm i`\n  * The last command will recursivelly `build` all components\n\n### Skeleton for the new project\nYou project is still at early stage, there are a lot of uncertainty, but you have to push it forward.\n\nIt's also not clear will be project based on SOA or Microservices or even N-tier, so you are ok to start with mono repo, but at the same time you want to build structure which can be splitted later if needed.\n\nCalbro software development culture also includes recommendation to reuse wide range of project templates and you will follow this practice too.\n\n* This is how your initial concept looks like:\n  * Admin `Frontend` - `Angular`, a couple of developers have joined your team recently with necessary skills, Admin `Backend` - `Nodejs`\n  * `API` service - `Go`, since this is general company strategy and your project should be aligned with it\n  * `Auth` service will utilize `Nodejs` again, since it will be handled by the developer who will be working on Admin part\n  * You need to have two types of persistent storages - `SQL \u0026 NoSQL`, because initial analysis shows that we can't have \"shoes for all feets\" approach\n  * Managment wants to go with `mobile-first` approach, so you will try satisfy this requirement by using `Cordova` and reuse our Javascript based frontend\n  * `Main portal` web part will use `React`, because it's cool\n  * We also need `Java` to build our automated test framework\n\n* So, here we go (you can copy commands below into create.sh script and execute them in a single run)\n  ```\n  mkdir calbro-reporting \u0026\u0026 \\\n  cd calbro-reporting \u0026\u0026 \\\n  tln init-repo \u0026\u0026 \\\n  tln config --terse \u0026\u0026 git add . \u0026\u0026 git commit -m\"empty repo\" \u0026\u0026 \\\n  tln subtree-add -- --prefix static/admin --subtree https://github.com/project-talan/tln-angular.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix static/portal --subtree https://github.com/project-talan/tln-react.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix services/admin --subtree https://github.com/project-talan/tln-nodejs.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix services/api --subtree https://github.com/project-talan/tln-golang.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix services/auth --subtree https://github.com/project-talan/tln-nodejs.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix dbs/mongo --subtree https://github.com/project-talan/tln-mongodb.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix dbs/postgresql --subtree https://github.com/project-talan/tln-postgresql.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix mobile/cordova --subtree https://github.com/project-talan/tln-cordova.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix qa/api --subtree https://github.com/project-talan/tln-java.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix qa/load --subtree https://github.com/project-talan/tln-java.git --ref master \u0026\u0026 \\\n  tln subtree-add -- --prefix qa/e2e --subtree https://github.com/project-talan/tln-java.git --ref master \u0026\u0026 \\\n  tln config dbs:mobile:qa:services:static --terse \u0026\u0026 \\\n  git add . \u0026\u0026 git commit -m\"Initial skeleton\" \u0026\u0026 \\\n  cd ..\n  ```\n  Windows (create.cmd)\n  ```\n  mkdir calbro-reporting \u0026\u0026 ^\n  cd calbro-reporting \u0026\u0026 ^\n  tln init-repo \u0026\u0026 ^\n  tln config --terse \u0026\u0026 git add . \u0026\u0026 git commit -m\"empty repo\" \u0026\u0026 ^\n  tln subtree-add -- --prefix static/admin --subtree https://github.com/project-talan/tln-angular.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix static/portal --subtree https://github.com/project-talan/tln-react.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix services/admin --subtree https://github.com/project-talan/tln-nodejs.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix services/api --subtree https://github.com/project-talan/tln-golang.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix services/auth --subtree https://github.com/project-talan/tln-nodejs.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix dbs/mongo --subtree https://github.com/project-talan/tln-mongodb.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix dbs/postgresql --subtree https://github.com/project-talan/tln-postgresql.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix mobile/cordova --subtree https://github.com/project-talan/tln-cordova.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix qa/api --subtree https://github.com/project-talan/tln-java.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix qa/load --subtree https://github.com/project-talan/tln-java.git --ref master \u0026\u0026 ^\n  tln subtree-add -- --prefix qa/e2e --subtree https://github.com/project-talan/tln-java.git --ref master \u0026\u0026 ^\n  tln config dbs:mobile:qa:services:static --terse \u0026\u0026 ^\n  git add . \u0026\u0026 git commit -m\"Initial skeleton\" \u0026\u0026 ^\n  cd ..\n  ```\n\n* Initial structure is ready and we can verify mounted subtrees\n  ```\n  \u003e tln ls-subtrees calbro-reporting\n  ```\n  | Prefix | Subtree | Ref |\n  |-----------|-----------|-----------|\n  | static/admin | https://github.com/project-talan/tln-angular.git | master |\n  | static/portal | https://github.com/project-talan/tln-react.git | master |\n  | services/admin | https://github.com/project-talan/tln-nodejs.git | master |\n  | services/api | https://github.com/project-talan/tln-golang.git | master |\n  | services/auth | https://github.com/project-talan/tln-nodejs.git | master |\n  | dbs/mongo | https://github.com/project-talan/tln-mongodb.git | master |\n  | dbs/postgresql | https://github.com/project-talan/tln-postgresql.git | master |\n  | mobile/cordova | https://github.com/project-talan/tln-cordova.git | master |\n  | qa/api | https://github.com/project-talan/tln-java.git | master |\n  | qa/load | https://github.com/project-talan/tln-java.git | master |\n  | qa/e2e | https://github.com/project-talan/tln-java.git | master |\n\n* And the final step is to observe ready to use development environment structure with all necessary dependencies\n  ```\n  \u003e tln ls / -d 5 --all --installed-only\n  ```\n  ```\n  /\n  ├ angular\n  │ ├ angular-9.1.8\n  │ └ angular-9.1.7\n  ├ calbro\n  │ └ teamone\n  │   ├ calbro-portal\n  │   ├ calbro-reporting\n  │   │ ├ dbs\n  │   │ │ ├ mongo\n  │   │ │ └ postgresql\n  │   │ ├ mobile\n  │   │ │ └ cordova\n  │   │ ├ qa\n  │   │ │ ├ api\n  │   │ │ ├ e2e\n  │   │ │ └ load\n  │   │ ├ services\n  │   │ │ ├ admin\n  │   │ │ ├ api\n  │   │ │ └ auth\n  │   │ └ static\n  │   │   ├ admin\n  │   │   └ portal\n  │   └ calbro-scanner\n  ├ cordova\n  │ └ cordova-9.0.0\n  ├ golang\n  │ └ go-1.14.4\n  ├ hellotalan\n  ├ java\n  │ ├ openjdk-14.0.1\n  │ └ openjdk-11.0.2\n  ├ maven\n  │ └ mvn-3.6.3\n  └ nodejs\n    └ node-14.4.0\n  ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproject-talan%2Ftln-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fproject-talan%2Ftln-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproject-talan%2Ftln-cli/lists"}