@synap-core/workspace-templates 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -115
- package/agents/chatgpt.agent.yaml +13 -0
- package/agents/claude-code.agent.yaml +24 -0
- package/agents/claude-desktop.agent.yaml +13 -0
- package/agents/codex.agent.yaml +21 -0
- package/agents/cursor.agent.yaml +15 -0
- package/agents/discord.agent.yaml +13 -0
- package/agents/generic.agent.yaml +13 -0
- package/agents/goose.agent.yaml +13 -0
- package/agents/grok.agent.yaml +13 -0
- package/agents/hermes.agent.yaml +18 -0
- package/agents/opencode.agent.yaml +13 -0
- package/agents/openwebui.agent.yaml +13 -0
- package/agents/proton-agent.agent.yaml +13 -0
- package/agents/raycast.agent.yaml +13 -0
- package/agents/vscode.agent.yaml +13 -0
- package/agents/windsurf.agent.yaml +13 -0
- package/agents/zed.agent.yaml +13 -0
- package/capabilities/agency-skills.capability.json +1 -1
- package/capabilities/discord-bot.capability.json +2 -2
- package/capabilities/unipile-linkedin.capability.json +23 -1
- package/dist/index.js +159 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- package/src/catalog-safety.test.ts +1 -1
- package/src/crm-absorbs-outreach.template.test.ts +5 -0
- package/src/crm-find-contact.template.test.ts +121 -0
- package/src/crm.yaml +141 -2
- package/src/lead-outreach-send-door.test.ts +37 -0
- package/src/templates.ts +142 -2
- package/src/unipile-linkedin-find-profile.test.ts +2 -1
- package/src/unipile-lookups-read-only.test.ts +66 -0
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ this folder, through one lib and one CLI. The live catalog is the Control Plane'
|
|
|
9
9
|
> **Name today:** `synap-app/packages/workspace-templates/`, npm
|
|
10
10
|
> `@synap-core/workspace-templates`. **Planned, not done:** a rename to
|
|
11
11
|
> `packages/catalog/`, `@synap-core/catalog`, with the old name kept as a re-export
|
|
12
|
-
> shim for one release. See [Coordinated rename](#
|
|
12
|
+
> shim for one release. See [Coordinated rename](#coordinated-rename-planned).
|
|
13
13
|
|
|
14
14
|
How installs, reconciles and tiers work is in the `synap-market` skill
|
|
15
15
|
(`synap-backend/skills/synap-market/`), which is also the agent door.
|
|
@@ -25,7 +25,8 @@ How installs, reconciles and tiers work is in the `synap-market` skill
|
|
|
25
25
|
| `skills/<slug>/` | `skill` | Either a manifest `<slug>.skill.json` (`creative-director`), or an Agent-Skills folder (`SKILL.md` plus references) with a header `skills/<slug>.catalog.json` beside it | The manifest: yes. A folder: only with its header, and only when it holds no reference files (a skill package carries no documents). Headers decided by the founder on 2026-11-05: `bookmark-enrichment` and `routing-to-channels` public, `mapping-the-server` unlisted (private to the official owner); `reading-client-progress` and the parked `stellar-scf-grants-advisor` stay **staged** |
|
|
26
26
|
| `views/<slug>.view.json` | `view` | Manifest; `spec.views` in the canonical shape the CP stores (`{slug, displayName, type, config, scopeProfileSlugs}`) | Category `view`. Three today (`bookmark-views-pack`, `event-views-pack`, `task-views-pack`), moved from the old CP pack fragments on 2026-11-05. CI on every push to main |
|
|
27
27
|
| `automations/<slug>.automation.json` | `automation` | bridge-setup `flowDefinition` form, plus a header `automations/<slug>.catalog.json` beside it | Only with its header, and only without apply-time placeholders. Headers decided by the founder on 2026-11-05: `bookmark-enrichment` public; `url-bookmark-capture`, `github-pr-events` and the five `ship-a-change-*` unlisted. `mail-feed` stays **staged**: it carries two placeholders bridge-setup fills |
|
|
28
|
-
| `
|
|
28
|
+
| `agents/<slug>.agent.yaml` | `agent` | Manifest. `spec` (`schema/agent.ts`) is what the pod reads as `definition.agent`: `harness` (the `agent_type` join key), `aliases`, `worker`, `tried`, `detect`, `wake` (data: `program` + `args` + `params`, never a shell line; required for a worker only), `practices.skills`. One per program of the backend harness registry, plus `hermes`. CP category `agent`, official vendor only, left out of browse lists (the catalog installs every official agent on every pod, founder decision D8) | **Not automatically.** `publish-official.mjs` leaves `agent` out when no `--kind` is given (`FIRST_PUBLISH_BY_HAND`), so main's publish skips it; the founder approves the first publish (`--kind agent`), after the CP that knows the category is deployed |
|
|
29
|
+
| `schema/` | | Zod manifest schema: `header.ts`, plus one body per kind (`workspace`, `capability`, `skill`, `automation`, `view`, `agent`, `playbook`) | |
|
|
29
30
|
| `standards/*.standard.yaml` | | Quality standard per workspace (`pnpm eval`) | |
|
|
30
31
|
| `scripts/catalog-lib.mjs` | | **The ONE lib**: `loadCatalog` → `validateCatalog` → `diffCatalog` → `publishCatalog` | |
|
|
31
32
|
| `src/*.ts` | | The typed bundle (`dist/`) that clients ship as the zero-network fallback | |
|
|
@@ -260,10 +261,11 @@ start on it, and a person decides at the moments that commit the business. It ne
|
|
|
260
261
|
The reference is Content OS "Produce Content" (`synap-app/packages/workspace-templates/src/content-os.yaml`).
|
|
261
262
|
|
|
262
263
|
**Official vs pod-local.** An official template or capability lives ONLY in the catalog
|
|
263
|
-
(`synap-app/packages/workspace-templates/`, by kind)
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
264
|
+
(`synap-app/packages/workspace-templates/`, by kind); landing it on app-bases main publishes it (CI). A
|
|
265
|
+
playbook, kind or automation an agent creates on a pod (`synap_create_playbook`, `synap_define_kind`, …) is
|
|
266
|
+
**pod-local**: it never reaches the catalog. To make it official, write it into the catalog file and land it
|
|
267
|
+
on main. A pod draft proposal mirrored into the catalog is a second copy: once the file lands, withdraw the
|
|
268
|
+
proposal; the review is the catalog commit.
|
|
267
269
|
|
|
268
270
|
| Field | Where | Rule |
|
|
269
271
|
|---|---|---|
|
|
@@ -317,10 +319,16 @@ meta:
|
|
|
317
319
|
|
|
318
320
|
## 4. The ONE command set
|
|
319
321
|
|
|
322
|
+
**Landing on app-bases `main` IS publishing.** Every push to `main` runs CI (below),
|
|
323
|
+
which publishes every kind, tombstones included. Content that waits for the
|
|
324
|
+
founder's review waits BEFORE it lands on `main`; once it lands it is live. Nobody
|
|
325
|
+
runs a publish step after a merge: `synap catalog publish --official` is the same
|
|
326
|
+
lib by hand, for an emergency republish when CI cannot run.
|
|
327
|
+
|
|
320
328
|
```bash
|
|
321
329
|
synap catalog validate [--kind k] [slug...] # offline: per-kind schema, cross-kind refs, goal grammar, duplicates
|
|
322
330
|
synap catalog diff [--kind k] [slug...] # vs the live CP: new / changed / unchanged (+ warnings)
|
|
323
|
-
synap catalog publish --official [--kind k] [slug...] [--dry-run] [--yes] [--json]
|
|
331
|
+
synap catalog publish --official [--kind k] [slug...] [--dry-run] [--yes] [--json] # emergency republish only
|
|
324
332
|
synap market publish --official [slug...] [--dry-run] # alias of: catalog publish --official --kind workspace
|
|
325
333
|
```
|
|
326
334
|
|
|
@@ -344,23 +352,19 @@ wrapper `scripts/publish-official.mjs`, which uses the same lib):
|
|
|
344
352
|
| Event | What runs |
|
|
345
353
|
|---|---|
|
|
346
354
|
| PR touching the catalog | Job `validate` only: build, validate every kind, print the **offline** preview (each entry and the version the CP will derive, where knowable offline). It holds **no secret and no `id-token`**: a PR runs its own lockfile and scripts. Guarded by `scripts/publish-workflow.guard.test.ts`. |
|
|
347
|
-
| Push to `main` (or manual) | `validate`, then job `publish` (environment `catalog-publish`): a read-only preview against the live CP, then publish EVERY kind live (no `--kind`), tombstones included, then npm publish, only if the `package.json` version is new on npm. |
|
|
355
|
+
| Push to `main` (or manual) | `validate`, then job `publish` (environment `catalog-publish`): a read-only preview against the live CP, then publish EVERY kind live (no `--kind`), tombstones included, then npm publish, only if the `package.json` version is new on npm. A live run with no `SYNAP_CP_PUBLISH_TOKEN` exits 1: a `main` run that publishes nothing is red, never green with a warning. |
|
|
348
356
|
|
|
349
357
|
Main publishes every kind (founder, 2026-11-05: "remove the blocker that only do
|
|
350
|
-
workspace, we will do ALL")
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
Settings →
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
secrets, so no other job, and no workflow a branch pusher writes, can read them.
|
|
361
|
-
`NPM_TOKEN` may stay a repository secret (it is read only by the same job).
|
|
362
|
-
Until step 3 is done, the `publish` job has no token: it validates and leaves a
|
|
363
|
-
`::warning::`, it never publishes.
|
|
358
|
+
workspace, we will do ALL"). Secrets, in the `catalog-publish` environment only:
|
|
359
|
+
`SYNAP_CP_URL` and `SYNAP_CP_PUBLISH_TOKEN` (a CP PAT of the `synap-official`
|
|
360
|
+
owner; humans use `synap login`). npm needs no secret: it publishes through npm
|
|
361
|
+
Trusted Publishing (OIDC, the job's `id-token: write`).
|
|
362
|
+
|
|
363
|
+
**The `catalog-publish` environment** (GitHub → app-bases → Settings →
|
|
364
|
+
Environments; set up and live since 2026-11-06): deployment branches **`main`**
|
|
365
|
+
only; environment secrets `SYNAP_CP_PUBLISH_TOKEN` and `SYNAP_CP_URL`; no
|
|
366
|
+
repository-level copy of either, so no other job, and no workflow a branch pusher
|
|
367
|
+
writes, can read them.
|
|
364
368
|
|
|
365
369
|
**The CP never reseeds on deploy.** `deploy.sh`, `update.sh` and ops `apply` no
|
|
366
370
|
longer run `seed:capabilities` or `seed:templates`. Both seeders are **insert-only
|
|
@@ -378,101 +382,34 @@ stay **local-only** (they skip when the CP is not a sibling checkout):
|
|
|
378
382
|
`scripts/catalog-lib.columns.tripwire.test.ts` (the preview's columns and adoption
|
|
379
383
|
rule ↔ the CP publish core); their CI-safe halves are snapshots.
|
|
380
384
|
|
|
381
|
-
## 5.
|
|
382
|
-
|
|
383
|
-
|
|
385
|
+
## 5. History, and an empty CP
|
|
386
|
+
|
|
387
|
+
**How the catalog got here** (the by-hand runbook this section used to hold is done):
|
|
388
|
+
- Until 2026-11-05 the founder published by hand, kind by kind, with
|
|
389
|
+
`synap catalog publish --official`, after deploying the CP that adopts the seeded
|
|
390
|
+
rows; the CP and the CLI each held a copy of catalog files.
|
|
391
|
+
- 2026-11-05: `main` publishes every kind (founder: "remove the blocker that only
|
|
392
|
+
do workspace, we will do ALL"). The copies are deleted: the CP and the CLI read
|
|
393
|
+
the installed package (CP `2c755f8e`, synap-cli#91), guarded by their
|
|
394
|
+
`no-catalog-copy` tripwires.
|
|
395
|
+
- 2026-11-06: control-plane-api #70 let the publish token reach every call the
|
|
396
|
+
publish makes; run 42141858556 printed "Published 116 catalog entries". Since
|
|
397
|
+
then landing on `main` publishes.
|
|
398
|
+
|
|
399
|
+
**A brand-new, empty CP only:** seed it once, then let CI publish:
|
|
400
|
+
```bash
|
|
401
|
+
docker compose -f docker-compose.prod.yml run --rm control-plane pnpm seed:capabilities
|
|
402
|
+
docker compose -f docker-compose.prod.yml run --rm control-plane pnpm seed:templates
|
|
403
|
+
gh workflow run publish-official-templates.yml -R Synap-core/app-bases
|
|
404
|
+
```
|
|
405
|
+
Both seeders are insert-only; `seed:templates` seeds workspaces only (views reach
|
|
406
|
+
an empty CP through the publish).
|
|
384
407
|
|
|
385
|
-
|
|
408
|
+
**CI cannot run** (GitHub down, the environment broken): `synap catalog publish
|
|
409
|
+
--official`, signed in as the `synap-official` owner, republishes `main`'s catalog
|
|
410
|
+
through the same lib. Say so where you work: it is a recovery, not a step.
|
|
386
411
|
|
|
387
|
-
|
|
388
|
-
does not, resolve the duplicates first.
|
|
389
|
-
```sql
|
|
390
|
-
SELECT lower(definition->'capability'->>'key') k, count(*)
|
|
391
|
-
FROM packages WHERE category = 'capability' GROUP BY 1 HAVING count(*) > 1;
|
|
392
|
-
SELECT slug, count(*)
|
|
393
|
-
FROM packages WHERE category = 'capability' GROUP BY 1 HAVING count(*) > 1;
|
|
394
|
-
```
|
|
395
|
-
2. **Deploy the backend first:** `26638d5e` ("an unanswered optional declared param
|
|
396
|
-
renders empty") must be live on the pods before any playbook goal written as
|
|
397
|
-
`{name}` reaches them; otherwise a literal `{programName}` lands in agent prompts.
|
|
398
|
-
Order: **backend → CP → dry run → publish.**
|
|
399
|
-
3. **Deploy the CP** with all of these commits in that one deploy:
|
|
400
|
-
- `b669f90a`: posthog listing.
|
|
401
|
-
- `7ff44bf9`: capabilities publish onto their seeded row (official adoption, `syncByDefault`, dotted slug, description up to 10,000, full-column compare).
|
|
402
|
-
- `dac1da23`: reserved official keys, official-first read.
|
|
403
|
-
- `fe56bdf6`: reseed retired, seeder is insert-only.
|
|
404
|
-
- `d7a3f401`: ops drift is a human step.
|
|
405
|
-
- `0b0be3c8`: a capability key's owner is resolved before visibility; a key is a string equal to its slug.
|
|
406
|
-
- `a1401509`: an official publish adopts by the adoption rule, never a row of another kind.
|
|
407
|
-
- `6417b9f9`: `GET /api/packages/:slug?category=` serves the row a publish writes (the preview reads it).
|
|
408
|
-
|
|
409
|
-
Never ship `fe56bdf6` without `7ff44bf9` and `dac1da23`: on the old door, a catalog
|
|
410
|
-
publish forks every seeded row. This deploy no longer reseeds, so the rows stay
|
|
411
|
-
as the last reseed left them.
|
|
412
|
-
4. **Dry run**, signed in as the official publisher (a private row is invisible to
|
|
413
|
-
an anonymous read): `synap catalog publish --official --kind capability --dry-run`.
|
|
414
|
-
The preview compares each body with the row the publish WRITES (the CP's adoption
|
|
415
|
-
rule) on the content version AND every column the CP writes, and prints a
|
|
416
|
-
content change as `~ definition: new content version` and each changed column
|
|
417
|
-
as `~ column: before → after`.
|
|
418
|
-
5. **Read the diff.** Expected, and NOT a reason to stop:
|
|
419
|
-
- The **seeded capabilities** each show `CHANGED` with the same `h-` version and
|
|
420
|
-
only `~ source: "file-seed" → "api"`: the first publish writes each row once.
|
|
421
|
-
- **arch-client-intelligence** and **proton** show `CHANGED` with a new version (3 playbooks: Propose Grant Submission, Call Prep Brief, Draft Reply):
|
|
422
|
-
their playbook goals moved to the `{name}` grammar (`84363910`), which the
|
|
423
|
-
retired reseed never shipped.
|
|
424
|
-
- **posthog-analytics** shows `CHANGED` on its listing columns (`b669f90a`).
|
|
425
|
-
- **canva, dropbox, notion, slack, vercel** show `CHANGED` with a new version:
|
|
426
|
-
they have been official rows since 2026-10-01 (published from the old root
|
|
427
|
-
copies), and the catalog copy is newer (a derived `provides`, `72dd8d66`, and
|
|
428
|
-
reconciled descriptions). Their `~ tags` line shows only the AUTHORED tags
|
|
429
|
-
(`["capability"]`): the CP appends the search tokens it derives from the
|
|
430
|
-
definition, so the row keeps its search words and gains `capability` first.
|
|
431
|
-
- **content-idea-to-production** shows `CHANGED` on its definition and
|
|
432
|
-
description: the "Retired" listing the reseed never shipped.
|
|
433
|
-
- **claude-code-routines** is `NEW`. Publish it early: until an official row
|
|
434
|
-
exists, its key can be claimed by anyone.
|
|
435
|
-
- Any other `changed` row, or a warning that the CP ignores `?category=` (an
|
|
436
|
-
older CP): **STOP** and look.
|
|
437
|
-
6. **Publish:** `synap catalog publish --official --kind capability`. Confirm at the
|
|
438
|
-
prompt.
|
|
439
|
-
7. **Views** (`views/`, 2026-11-05): `synap catalog diff bookmark-views-pack
|
|
440
|
-
event-views-pack task-views-pack` shows each `CHANGED`: a new content version
|
|
441
|
-
(the new listing description inside the definition), `displayName` and
|
|
442
|
-
`description` (the catalog's copy, which never reached the CP), `source:
|
|
443
|
-
"file-seed" → "api"` and `vendorId: null → synap-official` (the publish adopts
|
|
444
|
-
the unowned seeded row). The views themselves are byte-equal to the live rows.
|
|
445
|
-
CI publishes them with every other kind on the next push to main.
|
|
446
|
-
8. On a **brand-new, empty** CP only: run
|
|
447
|
-
`docker compose -f docker-compose.prod.yml run --rm control-plane pnpm seed:capabilities`
|
|
448
|
-
(and `seed:templates`) once, then publish (step 6). `seed:templates` seeds
|
|
449
|
-
workspaces only: views reach an empty CP through the publish.
|
|
450
|
-
|
|
451
|
-
### B. Publish the package and retire the mirrors
|
|
452
|
-
|
|
453
|
-
1. **Publish the package to npm.** Merge a version bump to main, and CI publishes
|
|
454
|
-
it. Local is `0.13.0` and npm has `0.12.0`, so `check-publish-freshness` is red
|
|
455
|
-
until then. Never run `npm publish` by hand.
|
|
456
|
-
2. **Bump the pins** and refresh each repo's own lockfile:
|
|
457
|
-
- **CP:** `^0.12.0` → `>=0.13.0 <1.0.0`. The caret excludes 0.13. Do this only
|
|
458
|
-
once the CP `pnpm-lock.yaml` is no longer peer-dirty.
|
|
459
|
-
- **CLI:** `>=0.12.0 <1.0.0`, which already admits 0.13. Refresh with
|
|
460
|
-
`pnpm install --lockfile-only --ignore-workspace` so the root lockfile is not
|
|
461
|
-
touched.
|
|
462
|
-
- **Backend:** `packages/api` **and** `apps/api` (`>=0.11.0 <1.0.0`). Move the
|
|
463
|
-
floor up only if a consumer needs the new content.
|
|
464
|
-
3. **Point the readers at the package:**
|
|
465
|
-
- the CP seeder and capability resolver (`capability-template-dir.ts`) read
|
|
466
|
-
`node_modules/@synap-core/workspace-templates/capabilities/` (done 2026-11-05;
|
|
467
|
-
`seed-templates.ts` no longer seeds packs: views publish through the door);
|
|
468
|
-
- `synap bridge-setup` reads the skill and automation files from the installed
|
|
469
|
-
package (done, synap-cli#91).
|
|
470
|
-
4. **Delete the copies and their tripwires in the same change:**
|
|
471
|
-
- CP: done 2026-11-05 (copies, listing and visibility literals, and both
|
|
472
|
-
tripwires deleted);
|
|
473
|
-
- CLI: done (synap-cli#91).
|
|
474
|
-
|
|
475
|
-
### C. Coordinated rename (planned)
|
|
412
|
+
### Coordinated rename (planned)
|
|
476
413
|
|
|
477
414
|
Rename `packages/workspace-templates` to `packages/catalog` (`@synap-core/catalog`)
|
|
478
415
|
in one change, at a quiet moment, because every tree's `node_modules` links move:
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: chatgpt
|
|
5
|
+
name: "ChatGPT"
|
|
6
|
+
description: "OpenAI's ChatGPT. Connects to the pod through MCP; it does not run handed work."
|
|
7
|
+
tags: [chat]
|
|
8
|
+
spec:
|
|
9
|
+
harness: chatgpt
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: claude-code
|
|
5
|
+
name: "Claude Code"
|
|
6
|
+
description: "Anthropic's coding agent in the terminal. Connects to the pod with its own key and can run handed work headless as a worker."
|
|
7
|
+
tags: [coding, worker]
|
|
8
|
+
spec:
|
|
9
|
+
harness: claude-code
|
|
10
|
+
worker: true
|
|
11
|
+
tried: true
|
|
12
|
+
detect:
|
|
13
|
+
bins: [claude]
|
|
14
|
+
homePaths: [.claude.json, .claude]
|
|
15
|
+
wake:
|
|
16
|
+
program: claude
|
|
17
|
+
args: ["-p", "{prompt}", "--output-format", "stream-json", "--verbose"]
|
|
18
|
+
params:
|
|
19
|
+
prompt: { type: text, required: true }
|
|
20
|
+
model: { type: model }
|
|
21
|
+
env:
|
|
22
|
+
strip: [ANTHROPIC_API_KEY]
|
|
23
|
+
practices:
|
|
24
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: claude-desktop
|
|
5
|
+
name: "Claude Desktop"
|
|
6
|
+
description: "Anthropic's desktop chat app. Connects to the pod through MCP; it does not run handed work."
|
|
7
|
+
tags: [chat]
|
|
8
|
+
spec:
|
|
9
|
+
harness: claude-desktop
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: codex
|
|
5
|
+
name: "Codex"
|
|
6
|
+
description: "OpenAI's coding agent in the terminal. Can run handed work headless (codex exec); that wake has not been run on a real computer yet."
|
|
7
|
+
tags: [coding, worker]
|
|
8
|
+
spec:
|
|
9
|
+
harness: codex
|
|
10
|
+
worker: true
|
|
11
|
+
tried: false
|
|
12
|
+
detect:
|
|
13
|
+
bins: [codex]
|
|
14
|
+
homePaths: [.codex]
|
|
15
|
+
wake:
|
|
16
|
+
program: codex
|
|
17
|
+
args: ["exec", "{prompt}"]
|
|
18
|
+
params:
|
|
19
|
+
prompt: { type: text, required: true }
|
|
20
|
+
practices:
|
|
21
|
+
skills: [synap]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: cursor
|
|
5
|
+
name: "Cursor"
|
|
6
|
+
description: "The Cursor code editor and its agent. Connects to the pod through MCP; it does not run handed work."
|
|
7
|
+
tags: [coding, editor]
|
|
8
|
+
spec:
|
|
9
|
+
harness: cursor
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
detect:
|
|
13
|
+
homePaths: [.cursor]
|
|
14
|
+
practices:
|
|
15
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: discord
|
|
5
|
+
name: "Discord"
|
|
6
|
+
description: "A Discord bot that holds a pod key. It does not run handed work."
|
|
7
|
+
tags: [chat]
|
|
8
|
+
spec:
|
|
9
|
+
harness: discord
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: generic
|
|
5
|
+
name: "Generic"
|
|
6
|
+
description: "Any other MCP client a person connects with a pod key. It does not run handed work."
|
|
7
|
+
tags: [mcp]
|
|
8
|
+
spec:
|
|
9
|
+
harness: generic
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: goose
|
|
5
|
+
name: "Goose"
|
|
6
|
+
description: "Block's Goose agent. Connects to the pod through MCP; it does not run handed work yet."
|
|
7
|
+
tags: [assistant]
|
|
8
|
+
spec:
|
|
9
|
+
harness: goose
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: grok
|
|
5
|
+
name: "Grok"
|
|
6
|
+
description: "xAI's Grok. Connects to the pod through MCP; it does not run handed work (a headless mode is not verified)."
|
|
7
|
+
tags: [chat]
|
|
8
|
+
spec:
|
|
9
|
+
harness: grok
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: hermes
|
|
5
|
+
name: "Hermes Agent"
|
|
6
|
+
description: "Nous Research's Hermes Agent CLI. A stub: its wake (hermes chat -q) has never been run on a real computer, so treat it as untested."
|
|
7
|
+
tags: [assistant, worker]
|
|
8
|
+
spec:
|
|
9
|
+
harness: hermes
|
|
10
|
+
worker: true
|
|
11
|
+
tried: false
|
|
12
|
+
wake:
|
|
13
|
+
program: hermes
|
|
14
|
+
args: ["chat", "-q", "{prompt}"]
|
|
15
|
+
params:
|
|
16
|
+
prompt: { type: text, required: true }
|
|
17
|
+
practices:
|
|
18
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: opencode
|
|
5
|
+
name: "OpenCode"
|
|
6
|
+
description: "The OpenCode coding agent. Connects to the pod through MCP; it does not run handed work yet."
|
|
7
|
+
tags: [coding]
|
|
8
|
+
spec:
|
|
9
|
+
harness: opencode
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: openwebui
|
|
5
|
+
name: "Open WebUI"
|
|
6
|
+
description: "The self-hosted Open WebUI chat. Connects to the pod with its own key; it does not run handed work."
|
|
7
|
+
tags: [chat]
|
|
8
|
+
spec:
|
|
9
|
+
harness: openwebui
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: proton-agent
|
|
5
|
+
name: "Proton"
|
|
6
|
+
description: "Proton's assistant holding a pod key. It does not run handed work."
|
|
7
|
+
tags: [assistant]
|
|
8
|
+
spec:
|
|
9
|
+
harness: proton
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: raycast
|
|
5
|
+
name: "Raycast"
|
|
6
|
+
description: "Raycast's AI on the Mac. Connects to the pod through MCP; it does not run handed work."
|
|
7
|
+
tags: [assistant]
|
|
8
|
+
spec:
|
|
9
|
+
harness: raycast
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: vscode
|
|
5
|
+
name: "VS Code"
|
|
6
|
+
description: "Visual Studio Code and its agent. Connects to the pod through MCP; it does not run handed work."
|
|
7
|
+
tags: [coding, editor]
|
|
8
|
+
spec:
|
|
9
|
+
harness: vscode
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: windsurf
|
|
5
|
+
name: "Windsurf"
|
|
6
|
+
description: "The Windsurf code editor and its agent. Connects to the pod through MCP; it does not run handed work."
|
|
7
|
+
tags: [coding, editor]
|
|
8
|
+
spec:
|
|
9
|
+
harness: windsurf
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
apiVersion: synap/v1
|
|
2
|
+
kind: agent
|
|
3
|
+
meta:
|
|
4
|
+
slug: zed
|
|
5
|
+
name: "Zed"
|
|
6
|
+
description: "The Zed code editor and its agent. Connects to the pod through MCP; it does not run handed work."
|
|
7
|
+
tags: [coding, editor]
|
|
8
|
+
spec:
|
|
9
|
+
harness: zed
|
|
10
|
+
worker: false
|
|
11
|
+
tried: false
|
|
12
|
+
practices:
|
|
13
|
+
skills: [synap]
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
{
|
|
75
75
|
"name": "Lead Outreach",
|
|
76
76
|
"description": "Flow 1 — Lead acquisition via LinkedIn outreach from an imported list. The agent works the list one lead at a time, each step proposal-gated and operator-reviewed.",
|
|
77
|
-
"goalTemplate": "Work a list of imported leads into qualified conversations via LinkedIn. For each lead: (1) find their LinkedIn profile via Unipile profile search; (2) send a connection request (proposal-gated); (3) wait for acceptance (delay / scheduled re-check); (4) on acceptance, use the draft-outreach skill to write a personalized, non-salesy first message from the lead's profile + our agency pitch, and
|
|
77
|
+
"goalTemplate": "Work a list of imported leads into qualified conversations via LinkedIn. For each lead: (1) find their LinkedIn profile via Unipile profile search; (2) send a connection request (proposal-gated); (3) wait for acceptance (delay / scheduled re-check); (4) on acceptance, use the draft-outreach skill to write a personalized, non-salesy first message from the lead's profile + our agency pitch, and file it through the pod's send door (messaging.send, to = the person's entity id) so the operator reviews it in their channel and the pod sends it once approved; never a tool's own send verb; (5) on reply, use qualify-reply to classify interest and recommend the next step — if interested, promote the lead to a deal/client and trigger the client-onboarding flow. Every outbound action stays proposal-gated and reversible.",
|
|
78
78
|
"params": [
|
|
79
79
|
{
|
|
80
80
|
"name": "leadSource",
|
|
@@ -138,8 +138,8 @@
|
|
|
138
138
|
},
|
|
139
139
|
{
|
|
140
140
|
"name": "Lead Outreach",
|
|
141
|
-
"description": "Per lead: draft a personalized first
|
|
142
|
-
"goalTemplate": "Reach out to the lead \"{leadName}\". Review what we know about them
|
|
141
|
+
"description": "Per lead: draft a personalized first message as a proposed message in the person's channel, through the pod's send door (messaging.send); nothing goes out until a person approves it.",
|
|
142
|
+
"goalTemplate": "Reach out to the lead \"{leadName}\". Review what we know about them in the pod and draft one short, personalized first message tailored to their context. File it through the pod's send door: run messaging.send with to = the person's entity id (find them in the pod first; for a company, the person who decides there) and text = the message, so it waits for review in their channel and goes out only once a person approves it. Never call a tool's own send verb (Unipile, Gmail), never create an outreach touch, a note or a task holding the message, and never send.",
|
|
143
143
|
"params": [
|
|
144
144
|
{
|
|
145
145
|
"name": "leadName",
|
|
@@ -85,6 +85,9 @@
|
|
|
85
85
|
],
|
|
86
86
|
"executionMode": "sync",
|
|
87
87
|
"timeoutSeconds": 60,
|
|
88
|
+
"metadata": {
|
|
89
|
+
"readOnly": true
|
|
90
|
+
},
|
|
88
91
|
"parameters": {
|
|
89
92
|
"accountId": "string"
|
|
90
93
|
},
|
|
@@ -132,6 +135,9 @@
|
|
|
132
135
|
],
|
|
133
136
|
"executionMode": "sync",
|
|
134
137
|
"timeoutSeconds": 30,
|
|
138
|
+
"metadata": {
|
|
139
|
+
"readOnly": true
|
|
140
|
+
},
|
|
135
141
|
"parameters": {
|
|
136
142
|
"accountId": "string",
|
|
137
143
|
"cursor": "string?"
|
|
@@ -164,6 +170,9 @@
|
|
|
164
170
|
],
|
|
165
171
|
"executionMode": "sync",
|
|
166
172
|
"timeoutSeconds": 30,
|
|
173
|
+
"metadata": {
|
|
174
|
+
"readOnly": true
|
|
175
|
+
},
|
|
167
176
|
"parameters": {
|
|
168
177
|
"threadId": "string",
|
|
169
178
|
"accountId": "string"
|
|
@@ -281,6 +290,9 @@
|
|
|
281
290
|
],
|
|
282
291
|
"executionMode": "sync",
|
|
283
292
|
"timeoutSeconds": 60,
|
|
293
|
+
"metadata": {
|
|
294
|
+
"readOnly": true
|
|
295
|
+
},
|
|
284
296
|
"parameters": {
|
|
285
297
|
"keywords": "string",
|
|
286
298
|
"accountId": "string",
|
|
@@ -301,7 +313,8 @@
|
|
|
301
313
|
"executionMode": "sync",
|
|
302
314
|
"timeoutSeconds": 60,
|
|
303
315
|
"metadata": {
|
|
304
|
-
"verbType": "read"
|
|
316
|
+
"verbType": "read",
|
|
317
|
+
"readOnly": true
|
|
305
318
|
},
|
|
306
319
|
"parameters": {
|
|
307
320
|
"fullName": "string",
|
|
@@ -321,6 +334,9 @@
|
|
|
321
334
|
],
|
|
322
335
|
"executionMode": "sync",
|
|
323
336
|
"timeoutSeconds": 60,
|
|
337
|
+
"metadata": {
|
|
338
|
+
"readOnly": true
|
|
339
|
+
},
|
|
324
340
|
"parameters": {
|
|
325
341
|
"identifier": "string",
|
|
326
342
|
"accountId": "string"
|
|
@@ -355,6 +371,9 @@
|
|
|
355
371
|
],
|
|
356
372
|
"executionMode": "sync",
|
|
357
373
|
"timeoutSeconds": 30,
|
|
374
|
+
"metadata": {
|
|
375
|
+
"readOnly": true
|
|
376
|
+
},
|
|
358
377
|
"parameters": {
|
|
359
378
|
"accountId": "string",
|
|
360
379
|
"cursor": "string?"
|
|
@@ -387,6 +406,9 @@
|
|
|
387
406
|
],
|
|
388
407
|
"executionMode": "sync",
|
|
389
408
|
"timeoutSeconds": 30,
|
|
409
|
+
"metadata": {
|
|
410
|
+
"readOnly": true
|
|
411
|
+
},
|
|
390
412
|
"parameters": {
|
|
391
413
|
"accountId": "string",
|
|
392
414
|
"cursor": "string?"
|