home / skills / commontoolsinc / labs / ct

ct skill

/.claude/skills/ct

This skill helps you deploy, manage, and debug CommonTools charms and recipes, linking data and validating execution across environments.

npx playbooks add skill commontoolsinc/labs --skill ct

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
3.4 KB
---
name: ct
description: Guide for using the ct (CommonTools) binary to interact with charms,
  recipes, and the Common Fabric. Use this skill when deploying recipes, managing
  charms, linking data between charms, or debugging recipe execution. Triggers include
  requests to "deploy this recipe", "call a handler", "link these charms", "get data
  from charm", or "test this recipe locally".
---

# CT CLI

The `ct` binary is the CLI for CommonTools. **Use `--help` for current commands:**

```bash
deno task ct --help           # Top-level commands
deno task ct charm --help     # Charm operations
deno task ct check --help     # Type checking
```

## Environment Setup

**Identity key** (required for most operations):
```bash
ls -la claude.key              # Check for existing
deno task ct id new > claude.key  # Create if missing
```

**Environment variables** (avoid repeating flags):
```bash
export CT_API_URL=http://localhost:8000  # or https://toolshed.saga-castor.ts.net/
export CT_IDENTITY=./claude.key
```

**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 charm new pattern.tsx -i key -a url -s space` |
| Update existing | `deno task ct charm setsrc pattern.tsx --charm ID -i key -a url -s space` |
| Inspect state | `deno task ct charm inspect --charm ID ...` |
| Get field | `deno task ct charm get --charm ID fieldPath ...` |
| Set field | `echo '{"data":...}' \| deno task ct charm set --charm ID path ...` |
| Call handler | `deno task ct charm call --charm ID handlerName ...` |
| Trigger recompute | `deno task ct charm step --charm ID ...` |
| List charms | `deno task ct charm ls -i key -a url -s space` |
| Visualize | `deno task ct charm map ...` |

## Core Workflow: setsrc vs new

**Critical pattern:** After initial deployment, use `setsrc` to iterate:

```bash
# First time only
deno task ct charm new pattern.tsx ...
# Output: Created charm bafyreia... <- Save this ID!

# ALL subsequent iterations
deno task ct charm setsrc pattern.tsx --charm bafyreia... ...
```

**Why:** `new` creates duplicate charms. `setsrc` updates in-place.

## JSON Input Format

All values to `set` and `call` must be valid JSON:

```bash
# Strings need nested quotes
echo '"hello world"' | deno task ct charm set ... title

# Numbers are bare
echo '42' | deno task ct charm set ... count

# Objects
echo '{"name": "John"}' | deno task ct charm set ... user
```

## Gotcha: Stale Computed Values

`charm set` does NOT trigger recompute. Run `charm step` after:

```bash
echo '[...]' | deno task ct charm set --charm ID expenses ...
deno task ct charm step --charm ID ...  # Required!
deno task ct charm get --charm ID totalSpent ...
```

See `docs/development/debugging/cli-debugging.md` for debugging patterns.

## 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/restart-local-dev.sh --force` |

## References

- `packages/patterns/system/default-app.tsx` - System charms (allCharms list lives here)
- `docs/common/workflows/handlers-cli-testing.md` - Handler testing
- `docs/development/debugging/cli-debugging.md` - CLI debugging

Overview

This skill guides using the ct (CommonTools) CLI to deploy and manage charms, run recipes, link charm data, and debug execution. It focuses on the practical commands, environment setup, and common pitfalls so you can iterate quickly and safely. Use it when you need to interact with the Common Fabric from your workstation or CI.

How this skill works

The skill explains how to run the ct binary via the provided deno tasks and how to set environment variables to avoid repeating flags. It covers the core charm lifecycle commands (new, setsrc, inspect, get, set, call, step) and the JSON input rules required for set and call. It highlights the important distinction between creating a charm and updating its source to prevent duplicates.

When to use it

  • Deploy a new recipe or charm to the Common Fabric
  • Iteratively update charm code without creating duplicates
  • Call handlers or set fields on a charm during development
  • Link data between charms or fetch charm state for debugging
  • Test handlers or recipes locally before pushing to production

Best practices

  • Create a stable identity key and set CT_IDENTITY and CT_API_URL once per shell session
  • Use deno task ct charm new only for the first deployment; use setsrc for every subsequent update
  • Always supply JSON-valid input to set and call; wrap strings with nested quotes
  • After charm set operations run deno task ct charm step to trigger recompute of computed values
  • Save created charm IDs when new returns them to avoid orphaning duplicates

Example use cases

  • Deploy pattern.tsx for the first time with deno task ct charm new and save the returned charm ID
  • Update an existing charm source during local development with deno task ct charm setsrc pattern.tsx --charm <ID>
  • Write a handler test that calls a charm handler via deno task ct charm call and checks returned state
  • Fix stale totals by running deno task ct charm set to change inputs then deno task ct charm step to recompute
  • Inspect and visualize charm topology with deno task ct charm inspect and deno task ct charm map

FAQ

Why did I get duplicate charms after deploying?

You used charm new again. Use setsrc to update an existing charm in-place; new always creates a fresh charm and a new ID.

My computed fields didn't change after set. What now?

charm set does not trigger recompute. Run deno task ct charm step --charm <ID> to force recompute, then fetch values with charm get.