1. Project Overview & Quickstart (teambit/bit)
File: README.md
Bit is the build system to connect components and apps from development to CI in the AI era. Bit organizes source code into composable components, empowering to build reliable, scalable and consistent applications. It enables AI agents to intelligenly create and reuse components via MCP preventing duplication and accelerating development.
⚡ Features
- Reusable components. Create reusable UI components and modules to reuse across your software.
- Standard building blocks. Define the blueprints templates for creating components for devs and AI as one.
- Shell applications. Compose reusable components and features into application shells.
- Atomic and safe deployments. Ensure simple, safe and optimized deployments of apps and services for testing and production.
Bit supports all tooling in the JS ecosystem and comes out of the box with official dev environments for NodeJS, React, Angular, Vue, React Native, NextJS and far more. All are native to TypeScript and ESM and equipped with the best dev tooling.
Bit is a fit to every codebase structure. You can use Bit components in a monorepo, polyrepo, or even without repositories at all.
Getting started
Install Bit
Use the Bit installer to install Bit to be available on your PATH.
npx @teambit/bvm installInitialize Bit on a new folder or in an existing project by running the following command:
bit init --default-scope my-org.my-projectMake sure to create your scope on the Bit platform and use the right org and project name. After running the command, Bit is initialized on the chosen directory, and ready to be used via Bit commands, AI agent, your editor or the Bit UI!
Create shell application
Create the application shell to run, compose and deploy your application:
bit create react-app corporate-websiteRun the platform:
bit run corporate-websiteHead to http://localhost:3000 to view your application shell. You can start composing the application layout and specific pages to build your application. Learn more on building shell applications.
Compose components
Create the components to compose into the feature. Run the following command to create a new React UI component for the application login route:
bit create react pages/loginFind simple guides for creating NodeJS modules, UI components and apps, backend services and more on the Create Component docs.
Compose the component into the application shell:
import { Login } from '@my-org/users.pages.login';
import { Routes, Route } from 'react-router-dom';
export function CorporateWebsite() {
return (
<AcmeTheme>
<NavigationProvider>
<Routes>
<Route path="/" element={Hello world} />
<Route path="/login" element={<Login />} />
</Routes>
</NavigationProvider>
</AcmeTheme>
);
}Head to http://localhost:3000/login to view your new login page.
You can use bit templates to list official templates or find guides for creating React hooks, backend services, NodeJS modules, UI components and more on our create components docs. Optionally, use bit start to run the Bit UI to preview components in isolation.
Release and deploy
You can either use hosted scopes on Bit Cloud or by hosting scopes on your own. Use the following command to create your Bit Cloud account and your first scope.
bit loginUse semantic versioning to version your components:
bit tag --message "my first release" --majorBy default, Bit uses Ripple CI to build components. You can use the --build flag to build the components on the local machine. To tag and export from your CI of choice to automate the release process or use our official CI scripts.
After versioning, you can proceed to release your components:
bit exportModernize existing projects
Head over to your bit.cloud account to see your components build progress. Once the build process is completed, the components will be available for use using standard package managers:
npm install @my-org/users.pages.loginNext steps
Contributors
Bit is entirely built with Bit and you can find all its components on Bit Cloud.
Your contribution, no matter how big or small, is much appreciated. Before contributing, please read the code of conduct.
See Contributing.
License
File: components/legacy/utils/checksum/readme.md
This is a wrapper around the checksum package to make the checksumFile promise based
File: components/legacy/scope/README.md
Scope
Scope stores the components and their metadata compressed in the filesystem as "object". A scope can be local, along side the workspace, saved in .git/bit/.bit directory. Or it can be on a remote, which gets created by bit init --bare.
To push/pull objects from the remote, use bit export, bit import and bit fetch. To see the list of the components in the scope, use bit list or the low-level bit cat-scope commands.
When importing components to a scope, normally, Bit brings all its flattened-dependencies, which is the direct dependencies and their dependencies recursively. Also, during the export process, once a component is pushed to a remote, Bit imports all the missing flattened dependencies of that component. This protects the user in case one of the indirect dependency got deleted or its scope is down (the historic "pad-left" case).
Objects
Component- has the main data about the component, such as, name, scope-name, head-hash and a list of tags:hashes.Version- represents a snap. has the source file hashes, dependencies data, build data, etc.Source- source-file/dist-file.Lane- component ids and their heads of the lane.LaneHistory- aggregation of all changes done to a lane.ExportMetadata- deprecated since 0.0.928. (see #6758).
Write objects to the FS
During export - see export-scope-components.saveObjects().
During import - see ObjectsWritable class.
If you add a new object and it needs merging, make sure it's properly handled in both of them and also add it to ObjectList.objectTypesRequireMerge.
Export Process
The main challenge in the export process is to keep the scopes consistent when exporting to multiple scopes. a user can export components belong to different scopes with cycle dependencies between them. For example. scopeA/compA depends on scopeB/compB that depends on scopeA/compA. If we persist the data of scopeA/compA but fail during the persist of scopeB/compA, users that import compA will get the an invalid component as its dependency compB is missing.
Since Bit is distributed, there is no central place to make the persist of all scopes at once. It requires some extra steps to ensure the data integrity.
The following steps are executed during the export:
- data transfer - the components are exported to the different scopes and stored in a temporarily directory
pending-object/<export-id>on the remote. This is a non-blocking step, meaning, multiple clients can enter to this steps simultaneously. - validation - validate that the objects can be merged with no errors such as merge-conflict or component-needs-update. This is where the 'lock' starts. if there are multiple export-ids, only the first one is allowed to enter this step, the rest get an
ServerIsBusyexception. The reason for locking is that if two clients export at the same time and validate at the same time on the same component, since they validate against the stored component, both can succeed but after saving one of them, the other would get a conflict error during the persist, which we want to avoid at all cost. In case anything goes wrong in this step, the pending-object of this export-id is deleted for all scopes to release the resources. - persist - load the data from pending-objects and save them in the objects, the components and lanes are merged carefully to not loose any local data. If the persist of a scope completed successfully, it deletes the pending-object dir to free the resource.
If it failed, the pending-objects are not deleted, so no other export could push data until this export completes. To be able to resume this failed persist, the user can re-run the export with--resume <export-id>flag. To make sure the scopes are not locked forever in case the user who ran the export is not available, a commandbit resume-export <export-id> <remotes...>can be running outside of the original workspace. - import-missing-dependencies - as described above in the "scope" section, this is to make sure the remote scope has all flattened-dependencies of the exported components. In case there is an error in this step, the process continues and the export is not cancelled.
Once all steps are completed, Bit updates the .bitmap file with the new versions and the objects if needed.
The data transferred to the server is minimal, since Bit saves the locally tagged/snapped hashes, it knows to export only those. To override this and export all tags/snaps of a component, use --all-versions flag.
Import Process
TBD. See https://github.com/teambit/bit/pull/3656 for new changes here.
File: scopes/harmony/config/readme.md
WIP
this was cherry picked from another branch, so it doesn't contain all the logic.
please do not touch:)
File: scopes/docs/docs/docs.docs.mdx
labels: ['core aspect', 'bit', 'docs']
import DocsOverview from '@teambit/docs.content.docs-overview';
File: scopes/dependencies/dependencies/dependencies-loader/README.md
Dependencies Cache Mechanism
To improve component-loading performance, the dependencies data is cached in the filesystem.
The component's cache gets invalidated in the following scenario:
- The component-dir or sub-dirs have been changed. (modified-date of the dirs paths)
- One of the component files have been changed.
- A component config file (component.json/package.json) has modified.
The entire cache of all component dependencies is invalidated if one of the following happened:
- workspace-config file (workspace.jsonc) has changed.
- package.json file has changed.
- node_modules-dir (only root dir, not sub-dirs) has changed. - not sure if needed.
- On completion of "bit link".
- On completion of "bit install".
- During 'bit tag --persist', before loading the components.
A component is not entered to the cache in the first place in the following cases:
- No root-dir/track-dir (legacy).
- Component has one of the following issues: missingPackagesDependenciesOnFs, untrackedDependencies.
Limitations:
- If a user deleted the dists directories of a component in node-modules, we don't know about it and bit-status won't show any error.
- If a user deleted a package from node-modules dir manually, we don't know about it.
Disabling the cache
set the "no-fs-cache" feature.
For one command, prefix your command with BIT_FEATURES=no-fs-cache.
Or you can configure it on the machine level for all commands/workspaces: bit config set features='no-fs-cache'
File: scripts/docker-teambit-bit/README.md
Docker containers for bit harmony.
This dockers are not dealing with legacy bit (pre-harmony) for legacy bit please refer to bit-docker
Structure
- Dockerfile-bit: A docker file which installs bvm and then uses bvm to install bit. This docker is usually useful for running bit commands like tag and export on CI machine
- Dockerfile-bit-server: A docker file based on the
Dockerfile-bit(using from) which creates a bare scope, and initializes the bit server on it (bit start) - Dockerfile-symphony: For internal use only
Using from Dockerhub
The docker images hosted on Dockerhub on those links Dockerfile-bit and Dockerfile-bit-server
Building locally
cd scripts/docker-teambit-bit- first build the bit docker -
docker build -f ./Dockerfile-bit -t bitcli/bit:latest . - second build the bit server docker -
docker build -f ./Dockerfile-bit-server -t bitcli/bit-server:latest .
Running containers
Run the cli container
docker run -it bitcli/bit:latest /bin/bashbit -vto see bit's version to make sure it works
Run the server container
docker run -it -p {host-port}:3000 bitcli/bit-server:latest- replace the host port with the port you want to use on your host machine, for example 5000- browse
http://localhost:{host-port}and make sure you see the bit's ui
Exporting components to bit server
- Make sure you run the server container and validate it works
- On your local workspace run
bit remote add http://localhost:{host-port}you should get a message saying remote-scope was added - Set
remote-scopeon yourworkspace.jsoncasdefaultScope - Run
bit export
Advanced usage
Using specific version of bit on the bit server
Bit server is getting a BIT_VERSION argument which is used in the FROM statement. You can use it with docker build -f ./Dockerfile-bit-server --build-arg BIT_VERSION={version} -t bitcli/bit-server:{version} .
This will make your server to fetch the cli container from Dockerhub with the specified version
Change bare scope name and location on the server container
The scope name is defined by the folder name of the containing scope (remote-scope by default).
This name is then later used for setting it up in the workspace.jsonc file.
In case you want to change it you can pass the build arg called SCOPE_PATH like --build-arg SCOPE_PATH=/root/custom-remote-scope
Using volume to make sure data is persisted
In order to persist the scope data, you want the scope folder to live outside the container in the host machine.
You can use bind mounts to do so:docker run -it -v {scope-path-on-host}:/root/remote-scope -p {host-port}:3000 bitcli/bit-server:latest
Usually it's better to use volumes than bind mounts, or even handle the mounts by an orchestrator like Kubernetes but this topics is out of the scope in this guide
Combining scope volume with scope name/location
When combining change of the scope name/location and volume you have to make sure the location provided in the SCOPE_PATH in the build arg is matching the target in the volume:docker run -it -v {scope-path-on-host}:/root/custom-remote-scope -build-arg SCOPE_PATH=/root/custom-remote-scope -p {host-port}:3000 bitcli/bit-server:latest
See the /root/custom-remote-scope is used both in the -v arg after the : and as the SCOPE_PATH value.
Watch bit server logs on host machine
Since the bit start command at the moment can't be run as detached, you will need a way to run it as the main command and to monitor the logs at the same time.
In order to do so, we will connect the logs dir on the container to a dir in the host using bind mounts.
In order to watch the bit logs, you will need to mount the logs directory in the host machine. like this:docker run -it -v {logs-dir-on-host}:/root/Library/Caches/Bit/logs -p {host-port}:3000 bitcli/bit-server:latest
An example with actual values (use /root/bit-server-docker-logs for logs on host and port 5000 on host):docker run -it -v /root/bit-server-docker-logs:/root/Library/Caches/Bit/logs -p 5000:3000 bitcli/bit-server:latest
In most cases it make sense to use tmpfs-mounts for this, but this as well is out of the scope for this guide
Important notes
- Do not mount the same scope directory on the host to multiple bit-server containers.
Bit is using different in memory cache mechanism, so mount the same dir into different servers instances, might produce unpredictable outcome.
Troubleshooting
- Problem: Running bit start on the server container is killed with code 137
Solution: Increase the memory provided by the host machine (usually 4GB should be enough - this is also the value we provide for the node process byNODE_OPTIONS=--max_old_space_size=4096). For example in mac - docker for mac resources
File: scripts/docker-teambit-bit/README-zh.md
Docker 容器运行 bit harmony
这些 Docker 容器不处理旧版的 bit (pre-harmony),对于旧版的 bit 请参考 bit-docker
结构
- Dockerfile-bit:一个安装 bvm 然后使用 bvm 安装 bit 的 Dockerfile。这个 Docker 通常用来在 CI 机器上运行如 tag 和 export 的 bit 命令。
- Dockerfile-bit-server:基于
Dockerfile-bit的 Dockerfile。它创建一个空的 scope,并在其上初始化 bit 服务器 (bit start)。 - Dockerfile-symphony:仅供内部使用。
从 Dockerhub 使用
Docker 镜像托管在 Dockerhub,链接是 Dockerfile-bit 和 Dockerfile-bit-server。
本地构建
cd scripts/docker-teambit-bit- 首先构建 bit docker -
docker build -f ./Dockerfile-bit -t bitcli/bit:latest . - 其次构建 bit server docker -
docker build -f ./Dockerfile-bit-server -t bitcli/bit-server:latest .
运行容器
运行 cli 容器
docker run -it bitcli/bit:latest /bin/bashbit -v查看 bit 版本以确保工作正常。
运行 server 容器
docker run -it -p {host-port}:3000 bitcli/bit-server:latest- 将{host-port}替换为主机要使用的端口,例如 5000。- 浏览
http://localhost:{host-port}并确保可以看到 bit 的界面。
导出组件到 bit 服务器
- 确保运行了 server 容器并验证它可用。
- 在本地工作空间运行
bit remote add http://localhost:{host-port},应该会看到 remote-scope 已添加的消息。 - 在
workspace.jsonc中将remote-scope设为defaultScope。 - 运行
bit export。
高级用法
在 bit 服务器上使用特定版本的 bit
Bit 服务器会读取一个用于 FROM 语句的参数 BIT_VERSION。你可以通过 docker build -f ./Dockerfile-bit-server --build-arg BIT_VERSION={version} -t bitcli/bit-server:{version} . 来使用它。这会让你的服务器从 Dockerhub 获取指定版本的 cli 容器。
改变 server 容器上的空 scope 名称和位置
scope 的名称由包含 scope 的文件夹名称定义(默认为 remote-scope)。这个名称后来会被设置于 workspace.jsonc 文件中。如果要更改,可以传递名为 SCOPE_PATH 的构建参数,如 --build-arg SCOPE_PATH=/root/custom-remote-scope。
通过 volume 确保数据持久化
为了使 scope 数据持久化,你需要将 scope 文件夹放置在容器外的主机上。你可以通过绑定挂载来实现:docker run -it -v {scope-path-on-host}:/root/remote-scope -p {host-port}:3000 bitcli/bit-server:latest。
通常使用 volume 比绑定挂载好,甚至可以由诸如 Kubernetes 之类的编排器来处理挂载,但这超出了本指南讨论的范围。
将 scope volume 和 scope 名称/位置相绑定
当同时更改 scope 名称/位置和 volume 时,你需要确保构建参数 SCOPE_PATH 中提供的位置与 volume 中的目标匹配:docker run -it -v {scope-path-on-host}:/root/custom-remote-scope -build-arg SCOPE_PATH=/root/custom-remote-scope -p {host-port}:3000 bitcli/bit-server:latest。请注意 /root/custom-remote-scope 既用在了 -v 参数的 : 之后,又用于了 SCOPE_PATH 的值。
在主机上观察 bit 服务器日志
由于目前 bit start 命令无法以分离方式运行,因此需要一种方法同时将其作为主命令运行且监控日志。为此,我们将使用绑定挂载将容器上的日志目录连接到主机上的目录。为了观察 bit 日志,你需要挂载主机上的日志目录,如:docker run -it -v {logs-dir-on-host}:/root/Library/Caches/Bit/logs -p {host-port}:3000 bitcli/bit-server:latest。举一个实际的例子 (在主机上使用 /root/bit-server-docker-logs 作为日志目录,主机端口为 5000):docker run -it -v /root/bit-server-docker-logs:/root/Library/Caches/Bit/logs -p 5000:3000 bitcli/bit-server:latest。
在大多数情况下,最好对此使用 tmpfs 挂载,但这也超出了本指南讨论的范围。
重要提示
- 不要将同一个 scope 目录挂载到多个 bit server 容器上。
Bit 使用不同的内存缓存机制,因此将同一目录挂载到不同的服务器实例上可能会产生不可预测的结果。
故障排除
- 问题:在 server 容器上运行 bit start 时被杀死,代码为 137。
解决方案:增加主机提供的内存量 (通常 4GB 就足够了——这也是我们为节点进程提供的内存大小NODE_OPTIONS=--max_old_space_size=4096)。例如在 Mac 上:docker for mac resources。
2. Official Technical Reference & Guides (teambit/docs)
bit.dev docs
This repo contains the source code and documentation powering docs.bit.dev.
The website is based on Docusaurus
Getting started
Installation
npm ito install top level dependencies
Running locally
cd websiteto go into the project rootnpm ito install the website's npm dependenciesnpm run startto start the development server with docs hot reloading- or
npm run watchto start the development server with structure changes hot reloading (slower) open http://localhost:3000to open the site in your browser
Contributing
Contributions are always welcome, no matter how large or small. Before contributing, please read the code of conduct.
You can just hit the "Edit" button on each page to make change to the content of the page.
Images should be placed in the docs/assets files and be linked into.
License
MIT License.