@synap-core/workspace-templates 0.23.0 → 0.24.1

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.
Files changed (53) hide show
  1. package/README.md +69 -59
  2. package/automations/bookmark-enrichment.catalog.json +16 -0
  3. package/automations/github-pr-events.catalog.json +18 -0
  4. package/automations/ship-a-change-checks-green.catalog.json +18 -0
  5. package/automations/ship-a-change-checks-red.catalog.json +18 -0
  6. package/automations/ship-a-change-deployed.catalog.json +18 -0
  7. package/automations/ship-a-change-pr-merged.catalog.json +18 -0
  8. package/automations/ship-a-change-pr-opened.catalog.json +18 -0
  9. package/automations/url-bookmark-capture.catalog.json +17 -0
  10. package/capabilities/stripe.capability.json +1163 -87
  11. package/capabilities/unipile-linkedin.capability.json +30 -7
  12. package/dist/{define-CPS0n8BV.d.ts → define-DqoItRiR.d.ts} +40 -1
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.js +159 -4
  15. package/dist/index.js.map +1 -1
  16. package/dist/wire.d.ts +1 -1
  17. package/package.json +3 -3
  18. package/skills/app-factory-design-review/SKILL.md +8 -2
  19. package/skills/bookmark-enrichment.catalog.json +16 -0
  20. package/skills/design-critique/SKILL.md +3 -0
  21. package/skills/mapping-the-server.catalog.json +18 -0
  22. package/skills/routing-to-channels.catalog.json +16 -0
  23. package/src/catalog-safety.test.ts +1 -1
  24. package/src/content-os.template.test.ts +27 -0
  25. package/src/content-os.yaml +43 -0
  26. package/src/crm-messages-cadence.template.test.ts +83 -1
  27. package/src/crm.yaml +111 -4
  28. package/src/define.ts +16 -0
  29. package/src/reserved-profile-slugs.test.ts +8 -10
  30. package/src/retired-goal-kinds.test.ts +6 -12
  31. package/src/stripe-capability.test.ts +192 -0
  32. package/src/template-documents.test.ts +158 -0
  33. package/src/templates.ts +92 -4
  34. package/src/types.ts +32 -1
  35. package/src/unipile-linkedin-find-profile.test.ts +183 -0
  36. package/src/validate.ts +81 -0
  37. package/views/bookmark-views-pack.view.json +39 -0
  38. package/views/event-views-pack.view.json +45 -0
  39. package/views/task-views-pack.view.json +53 -0
  40. package/packs/bookmark-views-pack.json +0 -33
  41. package/packs/crm-pack.json +0 -76
  42. package/packs/customer-profile.json +0 -28
  43. package/packs/deep-research.playbook.json +0 -30
  44. package/packs/event-views-pack.json +0 -33
  45. package/packs/habit-profile.json +0 -27
  46. package/packs/hr-pack.json +0 -54
  47. package/packs/invoice-profile.json +0 -28
  48. package/packs/knowledge-base-pack.json +0 -56
  49. package/packs/meeting-profile.json +0 -29
  50. package/packs/product-profile.json +0 -30
  51. package/packs/project-management-pack.json +0 -49
  52. package/packs/recipe-profile.json +0 -29
  53. package/packs/task-views-pack.json +0 -39
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # The Synap catalog
2
2
 
3
3
  ONE home for every official installable template: workspaces, capabilities, skills,
4
- packs and automations. The team sees, edits, validates and publishes them all from
4
+ packs, automations and views. The team sees, edits, validates and publishes them all from
5
5
  this folder, through one lib and one CLI. The live catalog is the Control Plane's
6
6
  `synap_packages` table, and it has one write door: `POST /api/packages` →
7
7
  `publishPackageCore`.
@@ -21,20 +21,26 @@ How installs, reconciles and tiers work is in the `synap-market` skill
21
21
  | Dir | Kind | Format | Published today? |
22
22
  |---|---|---|---|
23
23
  | `src/*.yaml` | `workspace` (and `pack`, for a suite) | Legacy workspace YAML (`meta:` plus body). A thin adapter reads it as `{kind: workspace, meta, spec}` | Yes. 31 entries, CI on every push to main |
24
- | `capabilities/<key>.capability.json` | `capability` | Manifest (below). `meta` carries the listing and visibility; `spec` is the CapabilityDefinition | Yes, by hand. CI also publishes it once `SYNAP_CATALOG_LIVE_KINDS` includes `capability` (§3) |
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). Today one folder has a header (`designing-with-real-components`); the five moved folders have none and are **staged** |
26
- | `packs/*.json` | `pack` (CP profile/view fragment) | CP `_meta` fragment | **Staged** (founder decision pending: what `pack` means). The CP's insert-only `seed-templates.ts` still owns them |
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. Today none has a header, so all three are **staged** (`mail-feed` also carries two placeholders bridge-setup fills) |
24
+ | `capabilities/<key>.capability.json` | `capability` | Manifest (below). `meta` carries the listing and visibility; `spec` is the CapabilityDefinition | Yes, CI on every push to main (§4) |
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
+ | `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
+ | `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
  | `schema/` | | Zod manifest schema: `header.ts`, plus one body per kind (`workspace`, `capability`, `skill`, `automation`, `playbook`) | |
29
29
  | `standards/*.standard.yaml` | | Quality standard per workspace (`pnpm eval`) | |
30
30
  | `scripts/catalog-lib.mjs` | | **The ONE lib**: `loadCatalog` → `validateCatalog` → `diffCatalog` → `publishCatalog` | |
31
31
  | `src/*.ts` | | The typed bundle (`dist/`) that clients ship as the zero-network fallback | |
32
32
 
33
33
  A staged file is read, validated and counted, and the problem list carries a
34
- `staged` warning for it. It cannot reach `POST /api/packages`. Today the
35
- whole-catalog validate prints `✓ 73 catalog entries validated (selected: 31
36
- workspace · 41 capability · 1 skill · 0 pack · 0 automation)` (41 = 35 seeded on
37
- the CP + 6 authored here first).
34
+ `staged` warning for it. It cannot reach `POST /api/packages`. On 2026-11-05 the
35
+ whole-catalog validate printed `✓ 93 catalog entries validated (selected: 27
36
+ workspace · 44 capability · 18 skill · 0 pack · 0 automation · 3 view) + 13 retired`.
37
+
38
+ **No CP pack fragment.** The old CP `templates/packs/*.json` shape (a JSON with a
39
+ top-level `_meta`) is a load error. Its three view packs are `kind: view`
40
+ manifests in `views/`. Its ten profile packs and the misfiled `deep-research`
41
+ playbook are in `retired-sources/packs/` (never loaded or published): the CP
42
+ retired the `profile-pack` category in its migration 0049, and the playbook never
43
+ reached the CP.
38
44
 
39
45
  **What stays elsewhere:**
40
46
  - **System skills** (`system/*`) stay in `synap-backend/skills/`. They are the pod's
@@ -48,7 +54,7 @@ the CP + 6 authored here first).
48
54
  ```jsonc
49
55
  {
50
56
  "apiVersion": "synap/v1",
51
- "kind": "capability", // workspace | capability | skill | pack | automation
57
+ "kind": "capability", // workspace | capability | skill | pack | automation | view
52
58
  "meta": { // the header: same limits as the CP publishSchema
53
59
  "slug": "apify", // kebab-case; dots only for a capability whose slug === spec.key
54
60
  "name": "Apify — Web Scraping",
@@ -64,7 +70,7 @@ the CP + 6 authored here first).
64
70
  One pure compiler, `toPublishBody(manifest)`, turns a manifest into today's
65
71
  `POST /api/packages` body. The CP door and its `PACKAGE_TYPES` are unchanged. A
66
72
  workspace publishes as category `workspace`, a capability as `capability`, a skill
67
- as `skill`, an automation as `workflow`.
73
+ as `skill`, an automation as `workflow`, a view as `view`.
68
74
 
69
75
  Playbook goals use `{name}` placeholders. `@{arg:}` is refused at authoring; the
70
76
  runtime still reads it.
@@ -80,12 +86,8 @@ only when it is strictly newer than their bundle.
80
86
 
81
87
  **Capability.** Edit `capabilities/<key>.capability.json`. The listing and
82
88
  visibility go in `meta`; the definition goes in `spec`.
83
- - **Transition:** an **existing** capability also has a CP copy,
84
- `synap-control-plane-api/src/seeds/capability-templates/<key>.capability.json`,
85
- whose content must equal `spec`. Its header lives in `capability-listings.ts` and
86
- `CAPABILITY_VISIBILITY` in the seeder, and must equal `meta`. Change both sides.
87
- The CP tripwire `catalog-mirror.tripwire.test.ts` turns red otherwise.
88
- - A **new** capability is authored here only: catalog-only files are allowed.
89
+ - This file is the only copy. The CP's insert-only bootstrap reads this package's
90
+ `capabilities/` (installed from npm); it holds no copy of its own.
89
91
  - **A reader** is an ordinary verb that reads one link: `intent: "read_webpage"`, `metadata.readOnly: true`,
90
92
  a required `url` parameter, and `urls: [...]` declaring the links it handles (`host[/path]`, `*.host`,
91
93
  or `"*"`; the grammar lives in `@synap-core/types/url-read`). The pod's one read door routes by those
@@ -115,15 +117,26 @@ folder (`skill-documents`), `metadata.auto_load: true` (`skill-auto-load`), a
115
117
  frontmatter name that is not `meta.slug` (`skill-slug`). Without a header the folder
116
118
  is staged. Deciding which folders get a header (their listing and visibility) is a
117
119
  content decision; `reading-client-progress` and `stellar-scf-grants-advisor` are
118
- client-specific.
119
- - **Transition:** the five moved folders (`bookmark-enrichment`,
120
- `mapping-the-server`, `reading-client-progress`, `routing-to-channels`,
121
- `stellar-scf-grants-advisor`) must stay byte-identical to
122
- `synap-cli/templates/skills/<slug>/`, because `bridge-setup` still reads them
123
- there. The guard is the CLI's `test/catalog-mirror.tripwire.test.ts`.
120
+ client-specific. A private (unlisted) header carries `"isPublic": false, "owner":
121
+ "template-owner"`. `synap bridge-setup` reads these folders from the installed
122
+ package; the CLI holds no copy (synap-cli#91).
123
+
124
+ **View.** Add or edit `views/<slug>.view.json`:
124
125
 
125
- **Pack.** `packs/*.json` must stay byte-identical to the CP's `templates/packs/`
126
- (CP tripwire).
126
+ ```jsonc
127
+ { "apiVersion": "synap/v1", "kind": "view",
128
+ "meta": { "slug": "task-views-pack", "name": "Task Views", "description": "listing copy", "icon": "layout-grid", "color": "#3B82F6", "tags": ["tasks"], "isPublic": true },
129
+ "spec": { "views": [ { "slug": "task-board", "displayName": "Task Board", "type": "kanban", "config": { "groupByField": "status" }, "scopeProfileSlugs": ["task"] } ] },
130
+ "dependencies": [] }
131
+ ```
132
+
133
+ It publishes as category `view` with `definition = { profiles: [], views, description:
134
+ meta.description, icon, color }`, the shape the seeded view rows carry. Only the
135
+ canonical view shape is accepted (the CP's `name` / singular `scopeProfileSlug`
136
+ shorthand is refused), and view slugs are unique within the file.
137
+
138
+ **Pack.** A `pack` is a workspace suite (`src/*.yaml` with the `suite` tag): it
139
+ publishes as category `workspace` and owns no space.
127
140
 
128
141
  **Automation.** Either a manifest (`kind: automation`, `spec` in the authoring
129
142
  `flow` form), or a raw `automations/<slug>.automation.json` in the `flowDefinition`
@@ -134,8 +147,9 @@ description?, triggerType, triggerConfig, flowDefinition, status }] }`, i.e. the
134
147
  file minus its `metadata` notes. Refused: an apply-time placeholder
135
148
  (`apply-time-placeholder`: an empty or `<…>` connection id, a `<…>` output channel,
136
149
  a skill node without `skillId`) and any raw key a package cannot carry (`state`).
137
- Transition: the three raw files must stay byte-identical to
138
- `synap-cli/templates/automations/` (CLI tripwire).
150
+ `synap bridge-setup` reads `bookmark-enrichment`, `mail-feed` and
151
+ `url-bookmark-capture` from the installed package; the CLI holds no copy
152
+ (synap-cli#91).
139
153
 
140
154
  **Every kind.** Run the gate before you push:
141
155
 
@@ -159,7 +173,7 @@ X" from "never heard of it" and offer the person a safe move to X.
159
173
  2. Add an entry to `retired.yaml`:
160
174
  ```yaml
161
175
  - slug: radar
162
- kind: workspace # default; capability · skill · pack · automation
176
+ kind: workspace # default; capability · skill · pack · automation · view
163
177
  replacedBy: ecosystem # a LIVE slug of the same kind, or omit when nothing replaces it
164
178
  reason: Radar was merged into Ecosystem, which tracks competitors and trends in one place.
165
179
  since: "2026-07-16"
@@ -330,12 +344,11 @@ wrapper `scripts/publish-official.mjs`, which uses the same lib):
330
344
  | Event | What runs |
331
345
  |---|---|
332
346
  | 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`. |
333
- | Push to `main` (or manual) | `validate`, then job `publish` (environment `catalog-publish`): a read-only preview against the live CP, then publish live `--kind ${SYNAP_CATALOG_LIVE_KINDS:-workspace}`, then npm publish, only if the `package.json` version is new on npm. |
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. |
334
348
 
335
- `SYNAP_CATALOG_LIVE_KINDS` is a repository **variable**. While it is unset, main
336
- publishes workspaces only: every kind is still validated and previewed, but only
337
- workspaces are written. Set it to `workspace,capability,skill,pack,automation`
338
- only after runbook §5 A. Secrets: `SYNAP_CP_URL`, `SYNAP_CP_PUBLISH_TOKEN`
349
+ 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`
339
352
  (a CP PAT of the `synap-official` owner; humans use `synap login`), `NPM_TOKEN`.
340
353
 
341
354
  **One-time setup of the `catalog-publish` environment** (GitHub → synap-app →
@@ -357,19 +370,13 @@ row. A tripwire (`no-template-reseed-on-deploy-tripwire.test.ts`) guards this.
357
370
  key gets 409 `OFFICIAL_CAPABILITY_KEY_RESERVED`, and the CP serves the official row
358
371
  first for a key.
359
372
 
360
- **Transition mirrors** (each retires in the same change that deletes its copies; see §5).
361
- These guards are **local-only**: each skips when the sibling repo is not checked out,
362
- and every repo's CI checks out itself alone, so CI does not enforce them. Run them
363
- on a full monorepo checkout before merging a change to either side. The same holds
364
- for `schema/header.mirror.tripwire.test.ts` (header limits ↔ the CP `publishSchema`)
365
- and `scripts/catalog-lib.columns.tripwire.test.ts` (the preview's columns and
366
- adoption rule ↔ the CP publish core); their CI-safe halves are snapshots.
367
-
368
- | Copy | Guard | Retires when |
369
- |---|---|---|
370
- | CP `src/seeds/capability-templates/*.capability.json` + listings/visibility | CP `src/seeds/catalog-mirror.tripwire.test.ts` (spec- and meta-equal) | the CP pin is bumped and the seeder reads the package |
371
- | CP `templates/packs/*.json` | same file (byte-equal) | same |
372
- | CLI `templates/skills/<5 moved>/`, `templates/automations/*.automation.json` | CLI `test/catalog-mirror.tripwire.test.ts` (byte-equal, both directions) | the CLI's pin admits a package release that ships them: `bridge-setup` already reads the installed package first, and the CLI's retirement test fails while both exist |
373
+ **No copies.** Since 2026-11-05 (founder: "keep one source only") neither the CP
374
+ nor the CLI holds a copy of any catalog file: both read this package from npm. The
375
+ CP's `no-catalog-copy.tripwire.test.ts` fails on a copy there. Two cross-repo guards
376
+ stay **local-only** (they skip when the CP is not a sibling checkout):
377
+ `schema/header.mirror.tripwire.test.ts` (header limits ↔ the CP `publishSchema`) and
378
+ `scripts/catalog-lib.columns.tripwire.test.ts` (the preview's columns and adoption
379
+ rule ↔ the CP publish core); their CI-safe halves are snapshots.
373
380
 
374
381
  ## 5. Founder runbook: deploy, publish, retire the copies
375
382
 
@@ -429,13 +436,17 @@ Do these in order. The runbook only names the commands; it does not run anything
429
436
  older CP): **STOP** and look.
430
437
  6. **Publish:** `synap catalog publish --official --kind capability`. Confirm at the
431
438
  prompt.
432
- 7. **Widen CI:** set the repo variable
433
- `SYNAP_CATALOG_LIVE_KINDS=workspace,capability,skill,automation`. A skill folder
434
- or raw automation publishes only once it has a header; `pack` stays out until
435
- its meaning is decided.
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.
436
446
  8. On a **brand-new, empty** CP only: run
437
447
  `docker compose -f docker-compose.prod.yml run --rm control-plane pnpm seed:capabilities`
438
- (and `seed:templates`) once, then step 6.
448
+ (and `seed:templates`) once, then publish (step 6). `seed:templates` seeds
449
+ workspaces only: views reach an empty CP through the publish.
439
450
 
440
451
  ### B. Publish the package and retire the mirrors
441
452
 
@@ -452,15 +463,14 @@ Do these in order. The runbook only names the commands; it does not run anything
452
463
  floor up only if a consumer needs the new content.
453
464
  3. **Point the readers at the package:**
454
465
  - the CP seeder and capability resolver (`capability-template-dir.ts`) read
455
- `node_modules/@synap-core/workspace-templates/capabilities/`, plus `packs/` for
456
- `seed-templates.ts`;
457
- - `synap bridge-setup` installs the published skill and automation entries
458
- through the pod instead of reading `templates/`.
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).
459
470
  4. **Delete the copies and their tripwires in the same change:**
460
- - CP: `src/seeds/capability-templates/`, `templates/packs/`, the listing and
461
- visibility literals, and `catalog-mirror.tripwire.test.ts`;
462
- - CLI: the five moved skill folders, `templates/automations/`, and
463
- `test/catalog-mirror.tripwire.test.ts`.
471
+ - CP: done 2026-11-05 (copies, listing and visibility literals, and both
472
+ tripwires deleted);
473
+ - CLI: done (synap-cli#91).
464
474
 
465
475
  ### C. Coordinated rename (planned)
466
476
 
@@ -0,0 +1,16 @@
1
+ {
2
+ "apiVersion": "synap/v1",
3
+ "kind": "automation",
4
+ "meta": {
5
+ "slug": "bookmark-enrichment-auto",
6
+ "name": "Bookmark enrichment (auto)",
7
+ "description": "When a bookmark is saved, enrich it: what the pod already connects to it first, then the page itself, classified and linked into the graph.",
8
+ "tags": [
9
+ "automation",
10
+ "bookmarks",
11
+ "enrichment"
12
+ ],
13
+ "isPublic": true
14
+ },
15
+ "dependencies": []
16
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "apiVersion": "synap/v1",
3
+ "kind": "automation",
4
+ "meta": {
5
+ "slug": "github-pr-events",
6
+ "name": "GitHub pull requests and checks to dev-loop facts",
7
+ "description": "Reads the GitHub org webhook (one inbound source named GitHub) and records what happened as dev-loop observations: a pull request opened or reopened → dev.pr_opened, merged → dev.pr_merged, closed unmerged → dev.pr_closed; a check suite completed → ci.finished. The pod's own consumers (the merge sweeper, the Ship a change automations) take it from there.",
8
+ "tags": [
9
+ "automation",
10
+ "github",
11
+ "dev-loop",
12
+ "builder"
13
+ ],
14
+ "isPublic": false,
15
+ "owner": "template-owner"
16
+ },
17
+ "dependencies": []
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "apiVersion": "synap/v1",
3
+ "kind": "automation",
4
+ "meta": {
5
+ "slug": "ship-a-change-checks-green",
6
+ "name": "CI green to Ship a change waits on the merge",
7
+ "description": "When a CI run on a pull request's head finishes green, grade the session's checks-green criterion and move its Ship a change step to Merged.",
8
+ "tags": [
9
+ "automation",
10
+ "dev-loop",
11
+ "builder",
12
+ "ship-a-change"
13
+ ],
14
+ "isPublic": false,
15
+ "owner": "template-owner"
16
+ },
17
+ "dependencies": []
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "apiVersion": "synap/v1",
3
+ "kind": "automation",
4
+ "meta": {
5
+ "slug": "ship-a-change-checks-red",
6
+ "name": "CI red to Ship a change goes back to Building",
7
+ "description": "When a CI run on a pull request's head fails, grade the session's checks-green criterion as failed and send its Ship a change step back to Building (the Checks green stage's onFail).",
8
+ "tags": [
9
+ "automation",
10
+ "dev-loop",
11
+ "builder",
12
+ "ship-a-change"
13
+ ],
14
+ "isPublic": false,
15
+ "owner": "template-owner"
16
+ },
17
+ "dependencies": []
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "apiVersion": "synap/v1",
3
+ "kind": "automation",
4
+ "meta": {
5
+ "slug": "ship-a-change-deployed",
6
+ "name": "Deployed to the devbox worker dogfoods it",
7
+ "description": "When this pod reports a new build live (dev.deployed, recorded by the pod itself after a successful update), start a Dogfood a change run handed to the devbox worker, filed into the goal.",
8
+ "tags": [
9
+ "automation",
10
+ "dev-loop",
11
+ "builder",
12
+ "ship-a-change"
13
+ ],
14
+ "isPublic": false,
15
+ "owner": "template-owner"
16
+ },
17
+ "dependencies": []
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "apiVersion": "synap/v1",
3
+ "kind": "automation",
4
+ "meta": {
5
+ "slug": "ship-a-change-pr-merged",
6
+ "name": "PR merged to Ship a change waits on the lab deploy",
7
+ "description": "When a PR merges: the merge sweeper (built in, backend#283) already marks the session's pr-* outcome met. This automation grades the session's `merged` criterion and moves its Ship a change step to Deployed to lab, where the person approves the deploy.",
8
+ "tags": [
9
+ "automation",
10
+ "dev-loop",
11
+ "builder",
12
+ "ship-a-change"
13
+ ],
14
+ "isPublic": false,
15
+ "owner": "template-owner"
16
+ },
17
+ "dependencies": []
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "apiVersion": "synap/v1",
3
+ "kind": "automation",
4
+ "meta": {
5
+ "slug": "ship-a-change-pr-opened",
6
+ "name": "PR opened to Ship a change waits on its checks",
7
+ "description": "When a pull request opens with a `Pod session:` line, grade the session's pr-opened criterion and move its Ship a change step to Checks green.",
8
+ "tags": [
9
+ "automation",
10
+ "dev-loop",
11
+ "builder",
12
+ "ship-a-change"
13
+ ],
14
+ "isPublic": false,
15
+ "owner": "template-owner"
16
+ },
17
+ "dependencies": []
18
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "apiVersion": "synap/v1",
3
+ "kind": "automation",
4
+ "meta": {
5
+ "slug": "url-bookmark-capture",
6
+ "name": "Discord links to bookmarks",
7
+ "description": "Every link posted in a Discord message becomes a bookmark, with the message's context kept. No AI.",
8
+ "tags": [
9
+ "automation",
10
+ "bookmarks",
11
+ "discord"
12
+ ],
13
+ "isPublic": false,
14
+ "owner": "template-owner"
15
+ },
16
+ "dependencies": []
17
+ }