Templates and packs
Start a routine from a bundled template or a routine pack. What a pack is, the ten shipped packs, maturity, and what a pack can never do.
Packs since 0.6.0. Bundled templates (
new --from-template) work in 0.4.0 and later.
What it is
- A template is a routine folder bundled with the plugin (
templates/jobs-watch,templates/watch).new --from-templatecopies it. - A pack is one JSON file (
routineos.pack.v1) that holds a whole routine:routine.tomlas data, the prompt, the README, the definition, the declared stages and connectors, and anylib/scripts or skills. It can be validated, installed from a file or an https URL, exported from any routine folder, and listed in a catalog.
Why it exists
A good routine is worth reusing. A pack makes one shareable as a single file that can be checked before install, never runs code on install, carries no secrets, and tells the person exactly what to connect.
How it works
From a bundled template
python3 skills/routineos/scripts/routineos.py new hiring-signals --from-template jobs-watch
From a pack
python3 skills/routineos/scripts/routineos.py pack validate jobs-watch.pack.json
python3 skills/routineos/scripts/routineos.py pack install jobs-watch.pack.json --name hiring-signals
See Install a pack.
The shipped packs
| id | type | Code stages | Skill stage | Gate | Maturity |
|---|---|---|---|---|---|
jobs-watch |
watch | learn, write |
none | email, 48 hours | piloted |
watch |
watch | learn |
none | off by default | piloted |
meeting-brief |
watch | write |
none | no | unpiloted |
weekly-marketing-report |
watch | lib/week_over_week.py, write |
none | no | unpiloted |
inbox-triage |
approval-gated | write |
reply-style |
before any send | unpiloted |
support-gap-digest |
watch | lib/group_questions.py, write |
none | no | unpiloted |
invoice-exceptions |
watch | lib/invoice_checks.py, write |
none | no; never pays | unpiloted |
candidate-shortlist |
watch | lib/score_rubric.py, write |
none | no; never rejects | unpiloted |
content-calendar |
approval-gated | lib/check_citations.py, write |
house-style |
before any post | unpiloted |
engineering-digest |
watch | lib/stale_items.py, write |
none | no | unpiloted |
maturity is piloted only for a pack that has run for real. Everything else is unpiloted, and says so.
What a pack never does
- Runs code on install.
lib/files are written, never executed. - Fetches any URL but the one given.
- Holds a secret, an email address or a Slack-style id. Validation scans for them.
- Writes a people collection (
decisions,settings,merges,userstate, viewer state). - Ships with
first_run = "live". A person switches a routine live. - Overwrites a folder.
- Ships the Desk as HTML. Install writes the bundled Desk.
- Includes the app layer. Run
app-initafterwards.
Worked example
Installing jobs-watch as Hiring Signals writes six files (README.md, dashboard/index.html, definition.json, pack.json, prompt.md, routine.toml) and prints a connector report. From there it is the same routine as one made with new --from-template.
Common pitfalls
- Treating
unpilotedas tested. It validated; it has not run for real. - Expecting install to connect things. It reports what to connect; you connect it.