Developer Toolkit (jdt)¶
The Jarvis Developer Toolkit is a CLI that handles the full package lifecycle: scaffold, validate, test, generate manifests, and deploy. It is the primary way to create, iterate on, and ship Jarvis packages.
Installation¶
jdt depends on the Jarvis command SDK (jarvis-command-sdk), which is not on PyPI, so install the SDK from git first:
pip install git+https://github.com/alexberardi/jarvis-command-sdk.git
pip install git+https://github.com/alexberardi/jarvis-developer-toolkit.git
This installs the jdt command. Verify with:
Commands at a Glance¶
| Command | What it does | Speed |
|---|---|---|
jdt init |
Scaffold a new package with working stubs | Instant |
jdt test |
Three-phase validation (manifest + AST + imports) | ~2s |
jdt validate |
Fast manifest-only check | Instant |
jdt manifest |
Generate/update jarvis_package.yaml from code |
~1s |
jdt deploy |
Install to a node (local or SSH; Docker on the legacy install), then restart the node | ~3s |
Typical Workflow¶
# 1. Create a package
jdt init my_weather --type command
# 2. Implement your logic
cd my_weather
# ... edit commands/my_weather/command.py ...
# 3. Validate as you go
jdt test .
# 4. Deploy to a node, then restart the node so it loads the package
jdt deploy local .
For a complete walkthrough, see the Development Workflow guide.
What Gets Scaffolded¶
When you run jdt init, you get a complete, valid package that passes all tests out of the box:
my_weather/
├── commands/
│ └── my_weather/
│ ├── __init__.py
│ └── command.py # Working IJarvisCommand stub
├── jarvis_package.yaml # Valid manifest
├── CLAUDE.md # AI assistant context
├── README.md
├── LICENSE
└── .gitignore
The stubs are not empty shells --- they implement every required property and method with sensible defaults. You can jdt deploy the scaffold immediately and iterate from a working baseline.
Component Types¶
jdt scaffolds six component types. Five of them install on a Jarvis Automation node; prompt providers belong to the old Docker install only:
| Type | Flag | Interface | Entry File |
|---|---|---|---|
| Command | --type command |
IJarvisCommand |
command.py |
| Agent | --type agent |
IJarvisAgent |
agent.py |
| Device Protocol | --type protocol |
IJarvisDeviceProtocol |
protocol.py |
| Device Manager | --type manager |
IJarvisDeviceManager |
manager.py |
| Routine | --type routine |
JSON schema | routine.json |
| Prompt Provider (legacy only; not supported on jarvisd) | --type prompt_provider |
IJarvisPromptProvider |
provider.py |
You can combine types in a single package:
This creates a multi-component bundle with all three stubs and a unified manifest.
Validation Pipeline¶
jdt test runs the structural checks Pantry runs on a submission, in three phases. Passing locally means your package passes those checks; Pantry also runs an AI security review of the code, which can flag a package that jdt test passes.
Phase 1: Manifest Validation
├── Schema version, YAML syntax
├── Semver format (X.Y.Z)
├── Required fields (name, description, version)
├── Valid categories and component types
└── Component paths exist on disk
Phase 2: Static Analysis (AST)
├── Correct base class (IJarvisCommand, etc.)
├── Required methods/properties present
├── No dangerous imports (subprocess, os, shutil, ctypes, importlib)
├── No dangerous calls (eval, exec, os.system)
├── No raw database access (sqlite3, sqlalchemy)
└── No shared directory name collisions
Phase 3: Import Checks
├── Module imports successfully
├── SDK subclass found and instantiated
├── Properties return correct types
└── Examples methods return lists
Next Steps¶
- New to Jarvis? Start with
jdt initand the Development Workflow - Have existing code? Use
jdt manifestto generate a manifest from your code - Ready to ship? Use
jdt deployto install to a node - Using Claude Code? See the Claude Code Integration guide