@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.
- package/README.md +69 -59
- package/automations/bookmark-enrichment.catalog.json +16 -0
- package/automations/github-pr-events.catalog.json +18 -0
- package/automations/ship-a-change-checks-green.catalog.json +18 -0
- package/automations/ship-a-change-checks-red.catalog.json +18 -0
- package/automations/ship-a-change-deployed.catalog.json +18 -0
- package/automations/ship-a-change-pr-merged.catalog.json +18 -0
- package/automations/ship-a-change-pr-opened.catalog.json +18 -0
- package/automations/url-bookmark-capture.catalog.json +17 -0
- package/capabilities/stripe.capability.json +1163 -87
- package/capabilities/unipile-linkedin.capability.json +30 -7
- package/dist/{define-CPS0n8BV.d.ts → define-DqoItRiR.d.ts} +40 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +159 -4
- package/dist/index.js.map +1 -1
- package/dist/wire.d.ts +1 -1
- package/package.json +3 -3
- package/skills/app-factory-design-review/SKILL.md +8 -2
- package/skills/bookmark-enrichment.catalog.json +16 -0
- package/skills/design-critique/SKILL.md +3 -0
- package/skills/mapping-the-server.catalog.json +18 -0
- package/skills/routing-to-channels.catalog.json +16 -0
- package/src/catalog-safety.test.ts +1 -1
- package/src/content-os.template.test.ts +27 -0
- package/src/content-os.yaml +43 -0
- package/src/crm-messages-cadence.template.test.ts +83 -1
- package/src/crm.yaml +111 -4
- package/src/define.ts +16 -0
- package/src/reserved-profile-slugs.test.ts +8 -10
- package/src/retired-goal-kinds.test.ts +6 -12
- package/src/stripe-capability.test.ts +192 -0
- package/src/template-documents.test.ts +158 -0
- package/src/templates.ts +92 -4
- package/src/types.ts +32 -1
- package/src/unipile-linkedin-find-profile.test.ts +183 -0
- package/src/validate.ts +81 -0
- package/views/bookmark-views-pack.view.json +39 -0
- package/views/event-views-pack.view.json +45 -0
- package/views/task-views-pack.view.json +53 -0
- package/packs/bookmark-views-pack.json +0 -33
- package/packs/crm-pack.json +0 -76
- package/packs/customer-profile.json +0 -28
- package/packs/deep-research.playbook.json +0 -30
- package/packs/event-views-pack.json +0 -33
- package/packs/habit-profile.json +0 -27
- package/packs/hr-pack.json +0 -54
- package/packs/invoice-profile.json +0 -28
- package/packs/knowledge-base-pack.json +0 -56
- package/packs/meeting-profile.json +0 -29
- package/packs/product-profile.json +0 -30
- package/packs/project-management-pack.json +0 -49
- package/packs/recipe-profile.json +0 -29
- 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
|
|
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,
|
|
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).
|
|
26
|
-
| `
|
|
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.
|
|
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`.
|
|
35
|
-
whole-catalog validate
|
|
36
|
-
workspace ·
|
|
37
|
-
|
|
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
|
-
-
|
|
84
|
-
`
|
|
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
|
-
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
126
|
-
|
|
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
|
-
|
|
138
|
-
`
|
|
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
|
|
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
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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
|
-
**
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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. **
|
|
433
|
-
`
|
|
434
|
-
|
|
435
|
-
|
|
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
|
|
456
|
-
`seed-templates.ts
|
|
457
|
-
- `synap bridge-setup`
|
|
458
|
-
|
|
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:
|
|
461
|
-
|
|
462
|
-
- CLI:
|
|
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
|
+
}
|