greentic-bundle helps people build a Greentic bundle.
A bundle is a folder, and later a .gtbundle file, that brings together:
- one or more app packs
- optional provider packs
- access rules
- setup state
- build metadata
This tool is meant for humans first. You do not need to be a Rust developer to use it. If you are comfortable running a few terminal commands and reading simple JSON or YAML files, you can work with this project.
If you are a coding agent, do not use this README as your main workflow guide. Go straight to docs/coding-agents.md.
This repo is especially useful for:
- app builders who want to assemble a bundle from existing
.gtpackfiles - operators who want deterministic, repeatable bundle builds
- non-technical programmers who are more comfortable with guided tools than with handwritten config
- coding agents that need to replay the wizard safely and consistently
The main jobs of greentic-bundle are:
- guide you through bundle creation with a wizard
- save bundle metadata in
bundle.yaml - save dependency and catalog information in
bundle.lock.json - copy selected app packs into the bundle layout
- copy selected provider packs into the bundle layout
- generate bundle artifacts with
build - inspect or validate a workspace or artifact later
.gtbundle files are SquashFS artifacts. greentic-bundle creates, lists, reads, and extracts them with a Rust-native backhand implementation by default, so normal use does not require external mksquashfs or unsquashfs binaries. For compatibility testing, the legacy tools can be selected with GREENTIC_BUNDLE_SQUASHFS_WRITER=mksquashfs and GREENTIC_BUNDLE_SQUASHFS_READER=unsquashfs; in that mode squashfs-tools must be installed.
The most important idea is simple:
- You choose what should go into the bundle.
- The wizard writes that choice down.
- The tool materializes the needed packs into the bundle folders.
- The tool can later build a deterministic
.gtbundleartifact from that workspace.
You do not need to memorize every command. These are the ones most people need:
greentic-bundle wizard
greentic-bundle wizard --schema
greentic-bundle wizard validate --answers answers.json
greentic-bundle wizard apply --answers answers.json
greentic-bundle build --root /path/to/bundle
greentic-bundle inspect --root /path/to/bundle
greentic-bundle doctor --root /path/to/bundleUse greentic-bundle --help or greentic-bundle <command> --help for the current CLI details.
If you are creating a bundle by hand for the first time, start with the interactive wizard:
greentic-bundle wizardThe wizard walks through the bundle step by step.
You will usually be asked for:
- a bundle name
- a bundle id
- an output directory
- one or more app pack references
- where each pack should be available
- any extension providers you want included
When the wizard runs in execute mode, it writes a real bundle workspace to disk.
Think of the bundle workspace like this:
bundle.yamlThis is the main authored description of the bundle.bundle.lock.jsonThis records resolved dependency and catalog information.packs/This is where global app packs are copied.providers/This is where provider packs are copied.tenants/This holds tenant and team access rules.state/This holds generated state such as caches, resolved outputs, setup state, and build state.dist/This is where built.gtbundleartifacts usually end up.
There are two different things to keep in mind:
- the reference written into
bundle.yamlandbundle.lock.json - the actual
.gtpackfile copied into the bundle layout
Those are related, but they are not the same thing.
For example, a bundle may keep the authored reference:
app_packs:
- demos/deep-research-demo.gtpackAt the same time, the wizard may copy the real pack file into:
packs/deep-research-demo.gtpack
That is expected. The metadata preserves what you selected. The materialized pack is what later build and runtime steps need.
There are two common ways to use the wizard.
This is the best option for a person sitting at a terminal.
greentic-bundle wizardThe wizard asks questions and writes the workspace.
This is useful when another tool, launcher, or coding agent prepares a JSON answers file first.
greentic-bundle wizard validate --answers answers.json
greentic-bundle wizard apply --answers answers.jsonvalidate checks the plan without writing files.
apply writes the bundle workspace and materializes packs and providers.
Here is a safe beginner-friendly flow:
- Run
greentic-bundle wizard. - Choose your app pack or packs.
- Let the wizard write the bundle.
- Check that
bundle.yamlexists. - Check that
packs/contains the expected materialized.gtpackfiles. - Run
greentic-bundle inspect --root <bundle-dir>if you want a structured view. - Run
greentic-bundle build --root <bundle-dir>when you are ready to create a.gtbundle.
The most common problems are:
bundle.yamlhas the pack reference, butpacks/is empty- the wrong pack filename was materialized
- provider packs were copied, but app packs were not
- a later tool such as setup or start behaves as if no app pack exists
When that happens, check the bundle workspace first.
Look at:
bundle.yamlbundle.lock.jsonpacks/providers/
If the expected app pack is not in packs/, the problem is usually earlier than runtime or setup.
When your workspace looks correct, you can build it:
greentic-bundle build --root /path/to/bundleTo inspect the workspace or the built artifact:
greentic-bundle inspect --root /path/to/bundle
greentic-bundle doctor --root /path/to/bundleThis repository is a Rust workspace.
The main local verification command is:
bash ci/local_check.shThat script runs formatting, linting, tests, docs, packaging checks, and i18n validation.
If you only want a lighter check while working on a small change, common commands are:
cargo fmt --all
cargo test
cargo run -- --helpREADME.mdStart here if you are a human trying to understand what the tool is for.- docs/coding-agents.md Required reading for coding agents and launcher-driven automation.
greentic-bundle --helpBest source for the current command surface.greentic-bundle wizard --helpBest source for the current wizard replay and schema options.
Older milestone and baseline documentation has been retired from the main README because it was too hard to follow and had drifted out of date.
If you notice documentation that contradicts this README or the CLI help text, treat the CLI help and the dedicated agent guide as the current source of truth and update the stale document.