{"id":32639835,"url":"https://github.com/gigaquads/embryo","last_synced_at":"2025-10-31T02:16:14.901Z","repository":{"id":57426215,"uuid":"124126808","full_name":"gigaquads/embryo","owner":"gigaquads","description":"Embryo is a scaffolding framework that's aware of the files and data structures used and generated in previous  invocations. It has the ability to edit existing files and is full of innovative ideas, so make sure to checkout the readme.","archived":false,"fork":false,"pushed_at":"2021-11-18T23:58:11.000Z","size":310,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-21T14:55:45.194Z","etag":null,"topics":["automation","automation-framework","embryo","filesystem","scaffold-template","scaffolding","skeleton-application","template-rendering","tree","utility-library"],"latest_commit_sha":null,"homepage":"","language":"Python","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/gigaquads.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}},"created_at":"2018-03-06T19:17:55.000Z","updated_at":"2021-05-11T20:18:47.000Z","dependencies_parsed_at":"2022-09-11T04:21:04.092Z","dependency_job_id":null,"html_url":"https://github.com/gigaquads/embryo","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/gigaquads/embryo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gigaquads%2Fembryo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gigaquads%2Fembryo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gigaquads%2Fembryo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gigaquads%2Fembryo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gigaquads","download_url":"https://codeload.github.com/gigaquads/embryo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gigaquads%2Fembryo/sbom","scorecard":{"id":426532,"data":{"date":"2025-08-11","repo":{"name":"github.com/gigaquads/embryo","commit":"6f809c93e62bbeb743f49ee00676762f7840a822"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":"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":"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":-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":"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":"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":"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":"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":"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":"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":"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-19T02:21:27.084Z","repository_id":57426215,"created_at":"2025-08-19T02:21:27.088Z","updated_at":"2025-08-19T02:21:27.088Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281914594,"owners_count":26583095,"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-10-31T02:00:07.401Z","response_time":57,"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":["automation","automation-framework","embryo","filesystem","scaffold-template","scaffolding","skeleton-application","template-rendering","tree","utility-library"],"created_at":"2025-10-31T02:15:41.929Z","updated_at":"2025-10-31T02:16:14.884Z","avatar_url":"https://github.com/gigaquads.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Embryo\n\n## Overview\nEmbryo began as a small internal tool for scaffolding new projects. After my friend and I began using it more seriously, it started to take shape. In the context of the Embryo program, _an_ embryo is a plain ol' directory that contains at least one essential file, `tree.yml`, which specifies the templated names and locations of the files and directories to create or verify in the filesystem. In addition to a tree file, embryos can contain static context, templates for rendering files, and hooks for custom logic and transformations along the way.\n\n### Self-awareness\nWhen an embryo is _hatched_ and files are created, metadata pertaining to which embryo was run, where changes were made, and what data was used to render its files is written to the filesystem in a \"dot\" file. Each embryo can resolve metadata stored in its ancestor and children directories at run time, and it has access to custom Python methods which those other embryos define.\n\nThis lets you write embryos that augment and work with each other. For example, you could create an embryo that initializes a new project and another that generates a source and test file for a new component. When the \"new component\" embryo runs, it knows how to resolve the name of the project it's in and can therefore generate the correct import statements when rendering its templates.\n\n### Virtual filesystem\nA basic embryo will contain two main components: a `tree.yml` file and a `templates` directory. Unlike existing project scaffolding tools, the template files need not be arranged in the filesystem in a way that mirrors the structure defined in the tree file. Instead, you can store all your templates directly in the `templates` directory while tinkering with their arrangement in the tree file.\n\nFor example, consider the following embryo, called \"project\", with the following structure:\n\n*the \"project\" embryo directory*\n```\n|- project/\n  |- tree.yml\n  |- templates/\n    |- entity\n    |- unit_test\n    |- README.md\n    |- app.py\n    |- setup.py\n```\n\n*tree.yml*\n```yaml\n---\n- {{ project_name }}:\n  - README.md\n  - setup.py\n  - {{ project_name|snake }}:\n    - app.py\n    - entities:\n      - account.py: entity(account)\n      - user.py: entity(user)\n  - test:\n    - test_account.py: unit_test(account)\n    - test_user.py: unit_test(user)\n...\n```\n\nNotice how templates are contained in a flat listing in the `templates` directory, and at the same time, some of them are invoked like functions in the `tree.yml` file. The \"argument\" to these \"functions\" are top-level properties in the template rendering context (a Python dict). These elements of the context object might contain JSONSchemas used by the `entity` and `unit_test` templates to generate Python class with corresponding getters and setters.\n\nHatching this embryo with `embryo hatch --project-name AmorphousUnicorn`\n\nwould produce the following structure on the filesystem:\n\n```\n|- AmorphousUnicorn/\n  |- README.md\n  |- setup.py\n  |- amorphous_unicorn/\n    |- app.py\n    |- entities/\n      |- account.py\n      |- user.py\n  |- test/:\n    |- test_account.py\n    |- test_user.py\n```\n\n### Composition \u0026 Nesting\nIn addition to utililizing Embryo's self-awareness and virtual filesystem, it is also possible for one embryo to nest other embryos inside the tree file. For example, an embryo that initializes a Git repository within a new project might have a tree file like this:\n\n```yaml\n---\n- {{ project_name }}:\n  - embryo: git(python)\n  - {{ project_name|snake }}:\n    - app.py\n...\n```\n\nNotice the nested Git embryo, which is invoked like a function: `git(python)`. In this example, we're assuming that the Git embryo has a static `context.yml` file, containing custom rules for, say, generating the `.gitignore` file for different project types. As a technical note, embryos are built in a breadth-first traversal.\n\n### Code Formatting\nEmbryo currently supports Yapf as a code formatting engine. Any Python module will be passed through Yapf for formating, so you need not bang your head too hardly against the wall trying to get template files to output the correct Python code structure.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgigaquads%2Fembryo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgigaquads%2Fembryo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgigaquads%2Fembryo/lists"}