ct
CT CLI
The ct binary is the CLI for CommonTools. Use --help for current commands:
deno task ct --help # Top-level commands
deno task ct piece --help # Piece operations
deno task ct check --help # Type checking
Environment Setup
Identity key (required for most operations):
ls -la claude.key # Check for existing
# For local dev: derive key matching toolshed's "implicit trust" identity
deno run -A packages/cli/mod.ts id derive "implicit trust" > claude.key
# For a fresh random key (e.g., against production):
deno run -A packages/cli/mod.ts id new > claude.key
IMPORTANT: Do NOT use deno task ct id new > file — the deno task wrapper
prints ANSI-colored preamble to stdout, which pollutes the key file. Always use
deno run -A packages/cli/mod.ts when redirecting output.
Environment variables (avoid repeating flags):
export CT_API_URL=http://localhost:8000 # or https://toolshed.saga-castor.ts.net/
export CT_IDENTITY=./claude.key
Experimental flags (must be set on both servers AND CLI commands):
# Pass experiment env vars to CLI commands:
EXPERIMENTAL_CANONICAL_HASHING=true \
EXPERIMENTAL_RICH_STORABLE_VALUES=true \
deno task ct piece new pattern.tsx ...
See docs/development/EXPERIMENTAL_OPTIONS.md for all available flags.
Local servers: See docs/development/LOCAL_DEV_SERVERS.md
Quick Command Reference
| Operation | Command |
|---|---|
| Type check | deno task ct check pattern.tsx --no-run |
| Deploy new | deno task ct piece new pattern.tsx -i key -a url -s space |
| Update existing | deno task ct piece setsrc pattern.tsx --piece ID -i key -a url -s space |
| Inspect state | deno task ct piece inspect --piece ID ... |
| Get field | deno task ct piece get --piece ID fieldPath ... |
| Set field | echo '{"data":...}' | deno task ct piece set --piece ID path ... |
| Call handler | deno task ct piece call --piece ID handlerName ... |
| Trigger recompute | deno task ct piece step --piece ID ... |
| List pieces | deno task ct piece ls -i key -a url -s space |
| Visualize | deno task ct piece map ... |
Check Command Flags
deno task ct check compiles and evaluates patterns. Key flags:
| Flag | Purpose |
|---|---|
--no-run |
Type check only, don't execute |
--no-check |
Execute without type checking |
--show-transformed |
Show the transformed TypeScript after compilation |
--verbose-errors |
Show original TS errors alongside simplified hints |
--pattern-json |
Print the evaluated pattern export as JSON |
--output <path> |
Store compiled JS to a file |
--main-export <name> |
Select non-default export (default: "default") |
--filename <name> |
Override filename for source maps |
Common usage:
deno task ct check pattern.tsx # Compile + execute (quiet on success)
deno task ct check pattern.tsx --no-run # Type check only (fast)
deno task ct check pattern.tsx --no-check # Skip types, just execute
deno task ct check pattern.tsx --show-transformed # Debug compiler transforms
deno task ct check pattern.tsx --verbose-errors # Detailed error context
Core Workflow: setsrc vs new
Critical pattern: After initial deployment, use setsrc to iterate:
# First time only
deno task ct piece new pattern.tsx ...
# Output: Created piece bafyreia... <- Save this ID!
# ALL subsequent iterations
deno task ct piece setsrc pattern.tsx --piece bafyreia... ...
Why: new creates duplicate pieces. setsrc updates in-place.
JSON Input Format
All values to set and call must be valid JSON:
# Strings need nested quotes
echo '"hello world"' | deno task ct piece set ... title
# Numbers are bare
echo '42' | deno task ct piece set ... count
# Objects
echo '{"name": "John"}' | deno task ct piece set ... user
Gotcha: Always step After set or call
Neither piece set nor piece call triggers recomputation automatically.
You must run piece step after either one to get fresh computed values.
# After setting data:
echo '[...]' | deno task ct piece set --piece ID expenses ...
deno task ct piece step --piece ID ... # Required!
deno task ct piece get --piece ID totalSpent ...
# After calling a handler:
deno task ct piece call --piece ID addItem '{"title": "Test"}'
deno task ct piece step --piece ID ... # Required!
deno task ct piece inspect --piece ID ...
Handler testing workflow (deploy → call → step → inspect):
# 1. Deploy
deno task ct piece new pattern.tsx -i key -a url -s space
# 2. Call a handler
deno task ct piece call --piece ID handlerName '{"arg": "value"}' ...
# 3. Step to process
deno task ct piece step --piece ID ...
# 4. Inspect result
deno task ct piece inspect --piece ID ...
# 5. Repeat 2-4 for each handler
See docs/common/workflows/handlers-cli-testing.md for the full workflow
and docs/development/debugging/cli-debugging.md for debugging.
Troubleshooting
| Issue | Fix |
|---|---|
| Commands hang | Check Tailnet connection for *.ts.net URLs |
| Permission denied | chmod 600 claude.key |
| JSON parse error | Check nested quotes, no trailing commas |
| Local servers not responding | ./scripts/check-local-dev.sh then ./scripts/restart-local-dev.sh --force |
References
packages/patterns/system/default-app.tsx- System pieces (allCharms list lives here)docs/common/workflows/handlers-cli-testing.md- Handler testingdocs/development/debugging/cli-debugging.md- CLI debugging