@synap-core/workspace-templates 0.24.1 → 0.26.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 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](#5-coordinated-rename-planned).
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
- | `schema/` | | Zod manifest schema: `header.ts`, plus one body per kind (`workspace`, `capability`, `skill`, `automation`, `playbook`) | |
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) and is published with
264
- `synap catalog publish --official` (CI on main). A playbook, kind or automation an agent creates on a pod
265
- (`synap_create_playbook`, `synap_define_kind`, …) is **pod-local**: it never reaches the catalog. To make it
266
- official, write it into the catalog file and publish.
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"); the old `SYNAP_CATALOG_LIVE_KINDS` variable is not
351
- read. Secrets: `SYNAP_CP_URL`, `SYNAP_CP_PUBLISH_TOKEN`
352
- (a CP PAT of the `synap-official` owner; humans use `synap login`), `NPM_TOKEN`.
353
-
354
- **One-time setup of the `catalog-publish` environment** (GitHub → synap-app →
355
- Settings → Environments):
356
- 1. Create the environment `catalog-publish`.
357
- 2. Deployment branches and tags: **Selected branches → `main`** only.
358
- 3. Add the environment secrets `SYNAP_CP_PUBLISH_TOKEN` and `SYNAP_CP_URL`.
359
- 4. **Delete** the repository-level `SYNAP_CP_PUBLISH_TOKEN` (and `SYNAP_CP_URL`)
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. Founder runbook: deploy, publish, retire the copies
382
-
383
- Do these in order. The runbook only names the commands; it does not run anything.
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
- ### A. Turn on catalog-published capabilities
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
- 1. **Pre-flight on the prod CP DB.** Both queries must return 0 rows. If either
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]