@synap-core/cli 1.2.0 → 1.5.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.
Files changed (74) hide show
  1. package/README.md +26 -0
  2. package/dist/commands/agents.d.ts +31 -0
  3. package/dist/commands/agents.js +478 -0
  4. package/dist/commands/agents.js.map +1 -0
  5. package/dist/commands/connect.d.ts +18 -1
  6. package/dist/commands/connect.js +154 -74
  7. package/dist/commands/connect.js.map +1 -1
  8. package/dist/commands/connections.d.ts +9 -0
  9. package/dist/commands/connections.js +161 -0
  10. package/dist/commands/connections.js.map +1 -0
  11. package/dist/commands/data.d.ts +43 -0
  12. package/dist/commands/data.js +387 -0
  13. package/dist/commands/data.js.map +1 -0
  14. package/dist/commands/finish.js +41 -8
  15. package/dist/commands/finish.js.map +1 -1
  16. package/dist/commands/infra.d.ts +21 -0
  17. package/dist/commands/infra.js +262 -0
  18. package/dist/commands/infra.js.map +1 -0
  19. package/dist/commands/init.js +188 -10
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/knowledge.d.ts +36 -0
  22. package/dist/commands/knowledge.js +123 -0
  23. package/dist/commands/knowledge.js.map +1 -0
  24. package/dist/commands/openclaw.d.ts +2 -0
  25. package/dist/commands/openclaw.js +300 -23
  26. package/dist/commands/openclaw.js.map +1 -1
  27. package/dist/commands/pods.d.ts +17 -0
  28. package/dist/commands/pods.js +371 -0
  29. package/dist/commands/pods.js.map +1 -0
  30. package/dist/commands/status.d.ts +14 -1
  31. package/dist/commands/status.js +78 -220
  32. package/dist/commands/status.js.map +1 -1
  33. package/dist/commands/update.d.ts +11 -2
  34. package/dist/commands/update.js +116 -5
  35. package/dist/commands/update.js.map +1 -1
  36. package/dist/index.js +370 -3
  37. package/dist/index.js.map +1 -1
  38. package/dist/lib/agents-config.d.ts +20 -0
  39. package/dist/lib/agents-config.js +45 -0
  40. package/dist/lib/agents-config.js.map +1 -0
  41. package/dist/lib/auth.d.ts +4 -0
  42. package/dist/lib/auth.js +4 -0
  43. package/dist/lib/auth.js.map +1 -1
  44. package/dist/lib/browser-auth.d.ts +35 -0
  45. package/dist/lib/browser-auth.js +170 -0
  46. package/dist/lib/browser-auth.js.map +1 -0
  47. package/dist/lib/hub-client.d.ts +17 -0
  48. package/dist/lib/hub-client.js +115 -0
  49. package/dist/lib/hub-client.js.map +1 -0
  50. package/dist/lib/openclaw.js +30 -19
  51. package/dist/lib/openclaw.js.map +1 -1
  52. package/dist/lib/pod.d.ts +32 -1
  53. package/dist/lib/pod.js +121 -9
  54. package/dist/lib/pod.js.map +1 -1
  55. package/dist/lib/skills-installer.d.ts +18 -0
  56. package/dist/lib/skills-installer.js +97 -0
  57. package/dist/lib/skills-installer.js.map +1 -0
  58. package/dist/lib/targets.d.ts +65 -0
  59. package/dist/lib/targets.js +673 -0
  60. package/dist/lib/targets.js.map +1 -0
  61. package/package.json +5 -3
  62. package/skills/README.md +91 -0
  63. package/skills/synap/README.md +76 -0
  64. package/skills/synap/SKILL.md +882 -0
  65. package/skills/synap/capture.md +170 -0
  66. package/skills/synap/governance.md +206 -0
  67. package/skills/synap/linking.md +128 -0
  68. package/skills/synap/scripts/orient.sh +28 -0
  69. package/skills/synap-schema/SKILL.md +231 -0
  70. package/skills/synap-schema/property-types.md +228 -0
  71. package/skills/synap-ui/SKILL.md +295 -0
  72. package/skills/synap-ui/bento-recipes.md +608 -0
  73. package/skills/synap-ui/view-types.md +259 -0
  74. package/skills/synap-ui/widget-catalog.md +305 -0
@@ -0,0 +1,608 @@
1
+ # Bento recipes — reference
2
+
3
+ Ready-to-adapt layouts for the most common user asks. Each recipe is a starting point — verify widget kinds against `/widget-definitions` and swap in real IDs before committing.
4
+
5
+ All coordinates use the 12-column grid. `layout: { x, y, w, h }`.
6
+
7
+ ---
8
+
9
+ ## Recipe: Personal home dashboard
10
+
11
+ _User asks: "Give me a home dashboard."_
12
+
13
+ The canonical landing page. What matters today + quick access + recent activity.
14
+
15
+ ```json
16
+ {
17
+ "name": "Home",
18
+ "type": "bento",
19
+ "config": {
20
+ "blocks": [
21
+ {
22
+ "id": "h1",
23
+ "kind": "widget",
24
+ "widgetKind": "section-header",
25
+ "layout": { "x": 0, "y": 0, "w": 12, "h": 1 },
26
+ "config": { "title": "Today", "subtitle": "{{date}}" }
27
+ },
28
+
29
+ {
30
+ "id": "h2",
31
+ "kind": "widget",
32
+ "widgetKind": "stat-card",
33
+ "layout": { "x": 0, "y": 1, "w": 3, "h": 2 },
34
+ "config": {
35
+ "label": "Due today",
36
+ "metric": "count",
37
+ "filter": {
38
+ "profileSlug": "task",
39
+ "properties.dueDate": "today",
40
+ "properties.status": ["todo", "in-progress"]
41
+ },
42
+ "icon": "calendar"
43
+ }
44
+ },
45
+
46
+ {
47
+ "id": "h3",
48
+ "kind": "widget",
49
+ "widgetKind": "stat-card",
50
+ "layout": { "x": 3, "y": 1, "w": 3, "h": 2 },
51
+ "config": {
52
+ "label": "This week",
53
+ "metric": "count",
54
+ "filter": {
55
+ "profileSlug": "event",
56
+ "properties.startDate": "this-week"
57
+ },
58
+ "icon": "calendar-days"
59
+ }
60
+ },
61
+
62
+ {
63
+ "id": "h4",
64
+ "kind": "widget",
65
+ "widgetKind": "stat-card",
66
+ "layout": { "x": 6, "y": 1, "w": 3, "h": 2 },
67
+ "config": {
68
+ "label": "Pending review",
69
+ "metric": "count",
70
+ "filter": { "type": "proposal", "status": "pending" },
71
+ "icon": "inbox"
72
+ }
73
+ },
74
+
75
+ {
76
+ "id": "h5",
77
+ "kind": "widget",
78
+ "widgetKind": "stat-card",
79
+ "layout": { "x": 9, "y": 1, "w": 3, "h": 2 },
80
+ "config": {
81
+ "label": "Captured this week",
82
+ "metric": "count",
83
+ "filter": { "createdAt": "this-week" },
84
+ "icon": "zap"
85
+ }
86
+ },
87
+
88
+ {
89
+ "id": "h6",
90
+ "kind": "widget",
91
+ "widgetKind": "view-list",
92
+ "layout": { "x": 0, "y": 3, "w": 6, "h": 5 },
93
+ "config": {
94
+ "profileSlug": "task",
95
+ "primaryField": "title",
96
+ "secondaryFields": ["priority", "dueDate", "projectId"],
97
+ "filters": [
98
+ {
99
+ "property": "status",
100
+ "op": "in",
101
+ "value": ["todo", "in-progress"]
102
+ }
103
+ ],
104
+ "sort": [{ "property": "priority", "direction": "desc" }],
105
+ "limit": 10
106
+ }
107
+ },
108
+
109
+ {
110
+ "id": "h7",
111
+ "kind": "widget",
112
+ "widgetKind": "proactive-feed",
113
+ "layout": { "x": 6, "y": 3, "w": 6, "h": 5 },
114
+ "config": { "limit": 8 }
115
+ },
116
+
117
+ {
118
+ "id": "h8",
119
+ "kind": "widget",
120
+ "widgetKind": "feed",
121
+ "layout": { "x": 0, "y": 8, "w": 12, "h": 4 },
122
+ "config": { "sources": ["entity.create", "entity.update"], "limit": 20 }
123
+ }
124
+ ]
125
+ }
126
+ }
127
+ ```
128
+
129
+ ---
130
+
131
+ ## Recipe: Project overview
132
+
133
+ _User asks: "Make me a page for Project X."_
134
+
135
+ Built around one entity. Shows context + child tasks + documents + activity.
136
+
137
+ ```json
138
+ {
139
+ "name": "{{projectName}}",
140
+ "type": "bento",
141
+ "config": {
142
+ "blocks": [
143
+ {
144
+ "id": "p1",
145
+ "kind": "entity",
146
+ "entityId": "{{projectId}}",
147
+ "layout": { "x": 0, "y": 0, "w": 12, "h": 3 }
148
+ },
149
+
150
+ {
151
+ "id": "p2",
152
+ "kind": "widget",
153
+ "widgetKind": "view-kanban",
154
+ "layout": { "x": 0, "y": 3, "w": 8, "h": 6 },
155
+ "config": {
156
+ "profileSlug": "task",
157
+ "groupBy": { "property": "status" },
158
+ "filters": [
159
+ { "property": "projectId", "op": "eq", "value": "{{projectId}}" }
160
+ ]
161
+ }
162
+ },
163
+
164
+ {
165
+ "id": "p3",
166
+ "kind": "widget",
167
+ "widgetKind": "entity-gallery",
168
+ "layout": { "x": 8, "y": 3, "w": 4, "h": 3 },
169
+ "config": {
170
+ "profileSlug": "file",
171
+ "filters": [
172
+ { "property": "projectId", "op": "eq", "value": "{{projectId}}" }
173
+ ],
174
+ "limit": 6
175
+ }
176
+ },
177
+
178
+ {
179
+ "id": "p4",
180
+ "kind": "widget",
181
+ "widgetKind": "feed",
182
+ "layout": { "x": 8, "y": 6, "w": 4, "h": 3 },
183
+ "config": { "entityId": "{{projectId}}", "limit": 10 }
184
+ }
185
+ ]
186
+ }
187
+ }
188
+ ```
189
+
190
+ ---
191
+
192
+ ## Recipe: CRM home
193
+
194
+ _User asks: "Make me a CRM."_
195
+
196
+ Pipeline-forward. Deals, contacts, upcoming meetings.
197
+
198
+ ```json
199
+ {
200
+ "name": "CRM",
201
+ "type": "bento",
202
+ "config": {
203
+ "blocks": [
204
+ {
205
+ "id": "c1",
206
+ "kind": "widget",
207
+ "widgetKind": "section-header",
208
+ "layout": { "x": 0, "y": 0, "w": 12, "h": 1 },
209
+ "config": { "title": "Pipeline" }
210
+ },
211
+
212
+ {
213
+ "id": "c2",
214
+ "kind": "widget",
215
+ "widgetKind": "view-kanban",
216
+ "layout": { "x": 0, "y": 1, "w": 12, "h": 6 },
217
+ "config": {
218
+ "profileSlug": "deal",
219
+ "groupBy": { "property": "stage" },
220
+ "cardFields": ["title", "value", "closeDate", "contactId"]
221
+ }
222
+ },
223
+
224
+ {
225
+ "id": "c3",
226
+ "kind": "widget",
227
+ "widgetKind": "stat-card",
228
+ "layout": { "x": 0, "y": 7, "w": 4, "h": 2 },
229
+ "config": {
230
+ "label": "Open pipeline",
231
+ "metric": "sum",
232
+ "metricField": "value",
233
+ "filter": {
234
+ "profileSlug": "deal",
235
+ "properties.stage": ["lead", "qualified", "proposal"]
236
+ },
237
+ "format": "currency",
238
+ "icon": "trending-up"
239
+ }
240
+ },
241
+
242
+ {
243
+ "id": "c4",
244
+ "kind": "widget",
245
+ "widgetKind": "stat-card",
246
+ "layout": { "x": 4, "y": 7, "w": 4, "h": 2 },
247
+ "config": {
248
+ "label": "Closing this month",
249
+ "metric": "count",
250
+ "filter": {
251
+ "profileSlug": "deal",
252
+ "properties.closeDate": "this-month"
253
+ },
254
+ "icon": "clock"
255
+ }
256
+ },
257
+
258
+ {
259
+ "id": "c5",
260
+ "kind": "widget",
261
+ "widgetKind": "stat-card",
262
+ "layout": { "x": 8, "y": 7, "w": 4, "h": 2 },
263
+ "config": {
264
+ "label": "New contacts (30d)",
265
+ "metric": "count",
266
+ "filter": { "profileSlug": "contact", "createdAt": "last-30-days" },
267
+ "icon": "user-plus"
268
+ }
269
+ },
270
+
271
+ {
272
+ "id": "c6",
273
+ "kind": "widget",
274
+ "widgetKind": "view-calendar",
275
+ "layout": { "x": 0, "y": 9, "w": 8, "h": 5 },
276
+ "config": {
277
+ "profileSlug": "event",
278
+ "dateProperty": "startDate",
279
+ "endDateProperty": "endDate",
280
+ "view": "week",
281
+ "filters": [{ "property": "relatedToContact", "op": "exists" }]
282
+ }
283
+ },
284
+
285
+ {
286
+ "id": "c7",
287
+ "kind": "widget",
288
+ "widgetKind": "view-list",
289
+ "layout": { "x": 8, "y": 9, "w": 4, "h": 5 },
290
+ "config": {
291
+ "profileSlug": "contact",
292
+ "primaryField": "title",
293
+ "secondaryFields": ["role", "companyId"],
294
+ "sort": [{ "property": "lastInteractionAt", "direction": "desc" }],
295
+ "limit": 12
296
+ }
297
+ }
298
+ ]
299
+ }
300
+ }
301
+ ```
302
+
303
+ ---
304
+
305
+ ## Recipe: Content pipeline
306
+
307
+ _User asks: "Make me a content creation workspace / dashboard."_
308
+
309
+ Assumes a `draft` profile exists (extend `article` via `synap-schema`).
310
+
311
+ ```json
312
+ {
313
+ "name": "Content Pipeline",
314
+ "type": "bento",
315
+ "config": {
316
+ "blocks": [
317
+ {
318
+ "id": "ct1",
319
+ "kind": "widget",
320
+ "widgetKind": "view-kanban",
321
+ "layout": { "x": 0, "y": 0, "w": 12, "h": 6 },
322
+ "config": {
323
+ "profileSlug": "draft",
324
+ "groupBy": { "property": "status" },
325
+ "columnOrder": ["idea", "writing", "review", "published"],
326
+ "cardFields": ["title", "wordCount", "publishDate"]
327
+ }
328
+ },
329
+
330
+ {
331
+ "id": "ct2",
332
+ "kind": "widget",
333
+ "widgetKind": "stat-card",
334
+ "layout": { "x": 0, "y": 6, "w": 4, "h": 2 },
335
+ "config": {
336
+ "label": "Published this month",
337
+ "metric": "count",
338
+ "filter": {
339
+ "profileSlug": "draft",
340
+ "properties.status": "published",
341
+ "properties.publishDate": "this-month"
342
+ }
343
+ }
344
+ },
345
+
346
+ {
347
+ "id": "ct3",
348
+ "kind": "widget",
349
+ "widgetKind": "stat-card",
350
+ "layout": { "x": 4, "y": 6, "w": 4, "h": 2 },
351
+ "config": {
352
+ "label": "Words written this week",
353
+ "metric": "sum",
354
+ "metricField": "wordCount",
355
+ "filter": { "updatedAt": "this-week" }
356
+ }
357
+ },
358
+
359
+ {
360
+ "id": "ct4",
361
+ "kind": "widget",
362
+ "widgetKind": "stat-card",
363
+ "layout": { "x": 8, "y": 6, "w": 4, "h": 2 },
364
+ "config": {
365
+ "label": "In review",
366
+ "metric": "count",
367
+ "filter": { "profileSlug": "draft", "properties.status": "review" }
368
+ }
369
+ },
370
+
371
+ {
372
+ "id": "ct5",
373
+ "kind": "widget",
374
+ "widgetKind": "entity-gallery",
375
+ "layout": { "x": 0, "y": 8, "w": 12, "h": 4 },
376
+ "config": {
377
+ "profileSlug": "article",
378
+ "filters": [
379
+ { "property": "source", "op": "eq", "value": "research" }
380
+ ],
381
+ "imageProperty": "thumbnail",
382
+ "limit": 12
383
+ }
384
+ }
385
+ ]
386
+ }
387
+ }
388
+ ```
389
+
390
+ ---
391
+
392
+ ## Recipe: Reading list
393
+
394
+ _User asks: "Show me my reading list."_
395
+
396
+ Simple masonry/gallery + stats.
397
+
398
+ ```json
399
+ {
400
+ "name": "Reading",
401
+ "type": "bento",
402
+ "config": {
403
+ "blocks": [
404
+ {
405
+ "id": "r1",
406
+ "kind": "widget",
407
+ "widgetKind": "section-header",
408
+ "layout": { "x": 0, "y": 0, "w": 12, "h": 1 },
409
+ "config": { "title": "To read" }
410
+ },
411
+
412
+ {
413
+ "id": "r2",
414
+ "kind": "widget",
415
+ "widgetKind": "entity-gallery",
416
+ "layout": { "x": 0, "y": 1, "w": 8, "h": 8 },
417
+ "config": {
418
+ "profileSlug": "article",
419
+ "filters": [{ "property": "status", "op": "neq", "value": "read" }],
420
+ "sort": [{ "property": "createdAt", "direction": "desc" }],
421
+ "imageProperty": "thumbnail",
422
+ "captionProperty": "domain",
423
+ "limit": 24
424
+ }
425
+ },
426
+
427
+ {
428
+ "id": "r3",
429
+ "kind": "widget",
430
+ "widgetKind": "stat-card",
431
+ "layout": { "x": 8, "y": 1, "w": 4, "h": 2 },
432
+ "config": {
433
+ "label": "Saved this week",
434
+ "metric": "count",
435
+ "filter": { "profileSlug": "article", "createdAt": "this-week" }
436
+ }
437
+ },
438
+
439
+ {
440
+ "id": "r4",
441
+ "kind": "widget",
442
+ "widgetKind": "view-list",
443
+ "layout": { "x": 8, "y": 3, "w": 4, "h": 6 },
444
+ "config": {
445
+ "profileSlug": "article",
446
+ "primaryField": "title",
447
+ "secondaryFields": ["readAt"],
448
+ "filters": [{ "property": "status", "op": "eq", "value": "read" }],
449
+ "sort": [{ "property": "readAt", "direction": "desc" }],
450
+ "limit": 10
451
+ }
452
+ }
453
+ ]
454
+ }
455
+ }
456
+ ```
457
+
458
+ ---
459
+
460
+ ## Recipe: Daily briefing
461
+
462
+ _User asks: "Every morning show me what matters."_
463
+
464
+ Minimal. AI-driven. Designed to be scannable in 30 seconds.
465
+
466
+ ```json
467
+ {
468
+ "name": "Morning Briefing",
469
+ "type": "bento",
470
+ "config": {
471
+ "blocks": [
472
+ {
473
+ "id": "m1",
474
+ "kind": "widget",
475
+ "widgetKind": "morning-briefing",
476
+ "layout": { "x": 0, "y": 0, "w": 12, "h": 4 }
477
+ },
478
+
479
+ {
480
+ "id": "m2",
481
+ "kind": "widget",
482
+ "widgetKind": "view-list",
483
+ "layout": { "x": 0, "y": 4, "w": 6, "h": 5 },
484
+ "config": {
485
+ "profileSlug": "task",
486
+ "primaryField": "title",
487
+ "secondaryFields": ["dueDate"],
488
+ "filters": [
489
+ { "property": "dueDate", "op": "lte", "value": "today" },
490
+ {
491
+ "property": "status",
492
+ "op": "in",
493
+ "value": ["todo", "in-progress"]
494
+ }
495
+ ],
496
+ "limit": 8
497
+ }
498
+ },
499
+
500
+ {
501
+ "id": "m3",
502
+ "kind": "widget",
503
+ "widgetKind": "view-calendar",
504
+ "layout": { "x": 6, "y": 4, "w": 6, "h": 5 },
505
+ "config": {
506
+ "profileSlug": "event",
507
+ "dateProperty": "startDate",
508
+ "view": "day"
509
+ }
510
+ }
511
+ ]
512
+ }
513
+ }
514
+ ```
515
+
516
+ ---
517
+
518
+ ## Recipe: Governance dashboard
519
+
520
+ _User asks: "Show me what my AI has been doing."_
521
+
522
+ ```json
523
+ {
524
+ "name": "AI Activity",
525
+ "type": "bento",
526
+ "config": {
527
+ "blocks": [
528
+ {
529
+ "id": "g1",
530
+ "kind": "widget",
531
+ "widgetKind": "stat-card",
532
+ "layout": { "x": 0, "y": 0, "w": 3, "h": 2 },
533
+ "config": {
534
+ "label": "Pending proposals",
535
+ "metric": "count",
536
+ "filter": { "type": "proposal", "status": "pending" }
537
+ }
538
+ },
539
+ {
540
+ "id": "g2",
541
+ "kind": "widget",
542
+ "widgetKind": "stat-card",
543
+ "layout": { "x": 3, "y": 0, "w": 3, "h": 2 },
544
+ "config": {
545
+ "label": "Auto-approved (24h)",
546
+ "metric": "count",
547
+ "filter": {
548
+ "type": "action",
549
+ "source": "agent",
550
+ "status": "approved",
551
+ "createdAt": "last-24h"
552
+ }
553
+ }
554
+ },
555
+ {
556
+ "id": "g3",
557
+ "kind": "widget",
558
+ "widgetKind": "stat-card",
559
+ "layout": { "x": 6, "y": 0, "w": 3, "h": 2 },
560
+ "config": {
561
+ "label": "Agents connected",
562
+ "metric": "count",
563
+ "filter": { "type": "agent", "status": "active" }
564
+ }
565
+ },
566
+ {
567
+ "id": "g4",
568
+ "kind": "widget",
569
+ "widgetKind": "stat-card",
570
+ "layout": { "x": 9, "y": 0, "w": 3, "h": 2 },
571
+ "config": {
572
+ "label": "Entities created (7d)",
573
+ "metric": "count",
574
+ "filter": { "source": "agent", "createdAt": "this-week" }
575
+ }
576
+ },
577
+
578
+ {
579
+ "id": "g5",
580
+ "kind": "widget",
581
+ "widgetKind": "proposals-list",
582
+ "layout": { "x": 0, "y": 2, "w": 6, "h": 6 },
583
+ "config": { "status": "pending", "limit": 15 }
584
+ },
585
+
586
+ {
587
+ "id": "g6",
588
+ "kind": "widget",
589
+ "widgetKind": "agent-activity",
590
+ "layout": { "x": 6, "y": 2, "w": 6, "h": 6 },
591
+ "config": { "limit": 20 }
592
+ }
593
+ ]
594
+ }
595
+ }
596
+ ```
597
+
598
+ ---
599
+
600
+ ## Composition tips
601
+
602
+ - **Row-by-row thinking.** Each row is one visual theme. Mixing themes in the same row confuses the eye.
603
+ - **Start tall, shrink later.** It's easier to shrink an oversized block than to realize a tight block feels cramped.
604
+ - **Use `section-header` between themes.** Readers parse visual separators faster than mental ones.
605
+ - **Keep stat-cards together in a strip.** Four stats at 3×2 each = one clean row. Four stats scattered = noise.
606
+ - **End with the feed.** Activity feeds work best as the last row — they're where the eye lands for recency.
607
+ - **One primary view per bento.** The user should know what the bento is "about" at a glance. If you have two headline views, split into two bentos.
608
+ - **Show, don't hide.** Putting the most important info behind a widget that needs interaction is a trap. Top-left gets the most attention — put the answer there.