@synap-core/cli 1.10.0 → 1.12.2
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 +23 -198
- package/dist/build-info.json +6 -0
- package/dist/commands/agent-run.js +3 -2
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/agents.d.ts +33 -17
- package/dist/commands/agents.js +203 -237
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/app.d.ts +143 -0
- package/dist/commands/app.js +523 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/automate.d.ts +21 -0
- package/dist/commands/automate.js +42 -0
- package/dist/commands/automate.js.map +1 -0
- package/dist/commands/automation-schema.test.d.ts +16 -0
- package/dist/commands/automation-schema.test.js +77 -0
- package/dist/commands/automation-schema.test.js.map +1 -0
- package/dist/commands/automation.d.ts +12 -0
- package/dist/commands/automation.js +80 -35
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/bridge-setup.d.ts +14 -1
- package/dist/commands/bridge-setup.js +392 -128
- package/dist/commands/bridge-setup.js.map +1 -1
- package/dist/commands/cap-connections.d.ts +4 -4
- package/dist/commands/cap-connections.js +14 -14
- package/dist/commands/cap-connections.js.map +1 -1
- package/dist/commands/capability.d.ts +2 -0
- package/dist/commands/capability.js +297 -176
- package/dist/commands/capability.js.map +1 -1
- package/dist/commands/catalog.d.ts +275 -0
- package/dist/commands/catalog.js +481 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/cell.d.ts +155 -8
- package/dist/commands/cell.js +416 -40
- package/dist/commands/cell.js.map +1 -1
- package/dist/commands/centrality.js +3 -14
- package/dist/commands/centrality.js.map +1 -1
- package/dist/commands/connect.d.ts +38 -13
- package/dist/commands/connect.js +68 -167
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.d.ts +3 -2
- package/dist/commands/connections.js +95 -25
- package/dist/commands/connections.js.map +1 -1
- package/dist/commands/context.js +9 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +34 -0
- package/dist/commands/data-extra.js +198 -25
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +120 -2
- package/dist/commands/data.js +307 -24
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +66 -4
- package/dist/commands/diagnose.js +329 -29
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/digest.js +2 -1
- package/dist/commands/digest.js.map +1 -1
- package/dist/commands/doc.d.ts +25 -4
- package/dist/commands/doc.js +100 -18
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/doctor.d.ts +130 -0
- package/dist/commands/doctor.js +814 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.js +3 -1
- package/dist/commands/events.js.map +1 -1
- package/dist/commands/explain.js +5 -5
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/graph.js +5 -3
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/import.d.ts +368 -13
- package/dist/commands/import.js +1096 -55
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +20 -9
- package/dist/commands/init.js +433 -973
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts +1 -0
- package/dist/commands/keys.js +15 -2
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/knowledge.d.ts +28 -6
- package/dist/commands/knowledge.js +358 -73
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/launch.js +2 -2
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/lens.d.ts +37 -1
- package/dist/commands/lens.js +193 -72
- package/dist/commands/lens.js.map +1 -1
- package/dist/commands/market-authoring.d.ts +72 -0
- package/dist/commands/market-authoring.js +566 -0
- package/dist/commands/market-authoring.js.map +1 -0
- package/dist/commands/market-official.d.ts +58 -0
- package/dist/commands/market-official.js +84 -0
- package/dist/commands/market-official.js.map +1 -0
- package/dist/commands/market.d.ts +419 -20
- package/dist/commands/market.js +2124 -193
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/mcp.d.ts +70 -13
- package/dist/commands/mcp.js +308 -40
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/open.d.ts +39 -9
- package/dist/commands/open.js +80 -25
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/playbook.d.ts +42 -0
- package/dist/commands/playbook.js +162 -0
- package/dist/commands/playbook.js.map +1 -0
- package/dist/commands/pod.js +1 -1
- package/dist/commands/pod.js.map +1 -1
- package/dist/commands/pods.d.ts +19 -0
- package/dist/commands/pods.js +220 -85
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +62 -0
- package/dist/commands/proposals-actions.js +146 -8
- package/dist/commands/proposals-actions.js.map +1 -1
- package/dist/commands/proposals-await.d.ts +68 -0
- package/dist/commands/proposals-await.js +248 -0
- package/dist/commands/proposals-await.js.map +1 -0
- package/dist/commands/proton-setup.d.ts +73 -0
- package/dist/commands/proton-setup.js +577 -0
- package/dist/commands/proton-setup.js.map +1 -0
- package/dist/commands/providers.d.ts +23 -0
- package/dist/commands/providers.js +126 -1
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/raycast.js +6 -2
- package/dist/commands/raycast.js.map +1 -1
- package/dist/commands/rule.d.ts +150 -0
- package/dist/commands/rule.js +447 -0
- package/dist/commands/rule.js.map +1 -0
- package/dist/commands/session-wait.d.ts +111 -0
- package/dist/commands/session-wait.js +209 -0
- package/dist/commands/session-wait.js.map +1 -0
- package/dist/commands/sessions.d.ts +52 -0
- package/dist/commands/sessions.js +479 -58
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/skill-manage.d.ts +21 -0
- package/dist/commands/skill-manage.js +136 -19
- package/dist/commands/skill-manage.js.map +1 -1
- package/dist/commands/skills.js +19 -1
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/status.d.ts +1 -4
- package/dist/commands/status.js +5 -34
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.backoff.test.d.ts +13 -0
- package/dist/commands/statusline.backoff.test.js +100 -0
- package/dist/commands/statusline.backoff.test.js.map +1 -0
- package/dist/commands/statusline.js +16 -9
- package/dist/commands/statusline.js.map +1 -1
- package/dist/commands/sync-status.d.ts +12 -0
- package/dist/commands/sync-status.js +125 -0
- package/dist/commands/sync-status.js.map +1 -0
- package/dist/commands/templates-retire.d.ts +34 -0
- package/dist/commands/templates-retire.js +192 -0
- package/dist/commands/templates-retire.js.map +1 -0
- package/dist/commands/tools.js +6 -21
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/tracks.d.ts +51 -0
- package/dist/commands/tracks.js +291 -0
- package/dist/commands/tracks.js.map +1 -0
- package/dist/commands/update.d.ts +3 -11
- package/dist/commands/update.js +5 -134
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upload.d.ts +68 -0
- package/dist/commands/upload.js +257 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/vendor.d.ts +28 -0
- package/dist/commands/vendor.js +110 -0
- package/dist/commands/vendor.js.map +1 -0
- package/dist/commands/versions.js +6 -0
- package/dist/commands/versions.js.map +1 -1
- package/dist/commands/view.js +10 -5
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/whoami.d.ts +23 -3
- package/dist/commands/whoami.js +169 -23
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/worker.d.ts +122 -0
- package/dist/commands/worker.js +435 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/commands/worker.test.d.ts +1 -0
- package/dist/commands/worker.test.js +116 -0
- package/dist/commands/worker.test.js.map +1 -0
- package/dist/commands/workspace-ops.d.ts +35 -0
- package/dist/commands/workspace-ops.js +153 -0
- package/dist/commands/workspace-ops.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +1009 -171
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-connections.d.ts +31 -0
- package/dist/lib/agent-connections.js +33 -0
- package/dist/lib/agent-connections.js.map +1 -0
- package/dist/lib/agent-detect.d.ts +27 -0
- package/dist/lib/agent-detect.js +71 -0
- package/dist/lib/agent-detect.js.map +1 -0
- package/dist/lib/agent-door.d.ts +138 -0
- package/dist/lib/agent-door.js +426 -0
- package/dist/lib/agent-door.js.map +1 -0
- package/dist/lib/agents-config.d.ts +2 -0
- package/dist/lib/agents-config.js +4 -9
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/approval-poll.d.ts +31 -2
- package/dist/lib/approval-poll.js +20 -7
- package/dist/lib/approval-poll.js.map +1 -1
- package/dist/lib/atomic-file.d.ts +48 -0
- package/dist/lib/atomic-file.js +129 -0
- package/dist/lib/atomic-file.js.map +1 -0
- package/dist/lib/auth.d.ts +14 -9
- package/dist/lib/auth.js +44 -61
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/batch-approval.d.ts +85 -0
- package/dist/lib/batch-approval.js +170 -0
- package/dist/lib/batch-approval.js.map +1 -0
- package/dist/lib/capture-lane.d.ts +6 -5
- package/dist/lib/capture-lane.js +11 -8
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/capture-structure.d.ts +342 -0
- package/dist/lib/capture-structure.js +295 -0
- package/dist/lib/capture-structure.js.map +1 -0
- package/dist/lib/catalog-templates.d.ts +59 -0
- package/dist/lib/catalog-templates.js +126 -0
- package/dist/lib/catalog-templates.js.map +1 -0
- package/dist/lib/cli-build.d.ts +19 -0
- package/dist/lib/cli-build.js +37 -0
- package/dist/lib/cli-build.js.map +1 -0
- package/dist/lib/conversation-headers.d.ts +18 -0
- package/dist/lib/conversation-headers.js +32 -0
- package/dist/lib/conversation-headers.js.map +1 -0
- package/dist/lib/cp-packages.d.ts +216 -4
- package/dist/lib/cp-packages.js +414 -11
- package/dist/lib/cp-packages.js.map +1 -1
- package/dist/lib/credential-class.d.ts +117 -0
- package/dist/lib/credential-class.js +116 -0
- package/dist/lib/credential-class.js.map +1 -0
- package/dist/lib/describe-lens.d.ts +35 -0
- package/dist/lib/describe-lens.js +40 -0
- package/dist/lib/describe-lens.js.map +1 -1
- package/dist/lib/device-connect.d.ts +125 -0
- package/dist/lib/device-connect.js +256 -0
- package/dist/lib/device-connect.js.map +1 -0
- package/dist/lib/directory-lens.d.ts +99 -0
- package/dist/lib/directory-lens.js +187 -0
- package/dist/lib/directory-lens.js.map +1 -0
- package/dist/lib/exporter-coverage.d.ts +71 -0
- package/dist/lib/exporter-coverage.js +97 -0
- package/dist/lib/exporter-coverage.js.map +1 -0
- package/dist/lib/hub-client.d.ts +43 -9
- package/dist/lib/hub-client.js +429 -65
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/id.d.ts +23 -0
- package/dist/lib/id.js +35 -0
- package/dist/lib/id.js.map +1 -0
- package/dist/lib/init-connect.d.ts +41 -0
- package/dist/lib/init-connect.js +75 -0
- package/dist/lib/init-connect.js.map +1 -0
- package/dist/lib/init-exit.d.ts +24 -0
- package/dist/lib/init-exit.js +41 -0
- package/dist/lib/init-exit.js.map +1 -0
- package/dist/lib/init-flow.d.ts +25 -0
- package/dist/lib/init-flow.js +40 -0
- package/dist/lib/init-flow.js.map +1 -0
- package/dist/lib/init-handoff.d.ts +16 -0
- package/dist/lib/init-handoff.js +19 -0
- package/dist/lib/init-handoff.js.map +1 -0
- package/dist/lib/init-output.d.ts +18 -0
- package/dist/lib/init-output.js +43 -0
- package/dist/lib/init-output.js.map +1 -0
- package/dist/lib/init-pod.d.ts +45 -0
- package/dist/lib/init-pod.js +36 -0
- package/dist/lib/init-pod.js.map +1 -0
- package/dist/lib/installed.d.ts +210 -11
- package/dist/lib/installed.js +234 -36
- package/dist/lib/installed.js.map +1 -1
- package/dist/lib/key-approval.d.ts +57 -0
- package/dist/lib/key-approval.js +117 -0
- package/dist/lib/key-approval.js.map +1 -0
- package/dist/lib/key-diagnosis.d.ts +56 -0
- package/dist/lib/key-diagnosis.js +227 -0
- package/dist/lib/key-diagnosis.js.map +1 -0
- package/dist/lib/key-doctor.d.ts +136 -0
- package/dist/lib/key-doctor.js +286 -0
- package/dist/lib/key-doctor.js.map +1 -0
- package/dist/lib/key-locations.d.ts +120 -0
- package/dist/lib/key-locations.js +326 -0
- package/dist/lib/key-locations.js.map +1 -0
- package/dist/lib/key-source.d.ts +66 -0
- package/dist/lib/key-source.js +106 -0
- package/dist/lib/key-source.js.map +1 -0
- package/dist/lib/key-state.d.ts +70 -0
- package/dist/lib/key-state.js +115 -0
- package/dist/lib/key-state.js.map +1 -0
- package/dist/lib/kind-package.d.ts +181 -0
- package/dist/lib/kind-package.js +679 -0
- package/dist/lib/kind-package.js.map +1 -0
- package/dist/lib/knowledge-title.d.ts +24 -0
- package/dist/lib/knowledge-title.js +46 -0
- package/dist/lib/knowledge-title.js.map +1 -0
- package/dist/lib/knowledge-title.test.d.ts +1 -0
- package/dist/lib/knowledge-title.test.js +34 -0
- package/dist/lib/knowledge-title.test.js.map +1 -0
- package/dist/lib/machine-instance.d.ts +64 -0
- package/dist/lib/machine-instance.js +142 -0
- package/dist/lib/machine-instance.js.map +1 -0
- package/dist/lib/mcp-bridge.d.ts +42 -0
- package/dist/lib/mcp-bridge.js +147 -0
- package/dist/lib/mcp-bridge.js.map +1 -0
- package/dist/lib/mcp-bridge.test.d.ts +1 -0
- package/dist/lib/mcp-bridge.test.js +90 -0
- package/dist/lib/mcp-bridge.test.js.map +1 -0
- package/dist/lib/mcp-call.d.ts +30 -0
- package/dist/lib/mcp-call.js +107 -0
- package/dist/lib/mcp-call.js.map +1 -0
- package/dist/lib/mcp-snippets.d.ts +53 -0
- package/dist/lib/mcp-snippets.js +82 -0
- package/dist/lib/mcp-snippets.js.map +1 -0
- package/dist/lib/next-steps.d.ts +8 -0
- package/dist/lib/next-steps.js +31 -1
- package/dist/lib/next-steps.js.map +1 -1
- package/dist/lib/package-wire.d.ts +179 -0
- package/dist/lib/package-wire.js +68 -0
- package/dist/lib/package-wire.js.map +1 -0
- package/dist/lib/pair-link.d.ts +38 -0
- package/dist/lib/pair-link.js +68 -0
- package/dist/lib/pair-link.js.map +1 -0
- package/dist/lib/pod-wide.d.ts +40 -0
- package/dist/lib/pod-wide.js +46 -0
- package/dist/lib/pod-wide.js.map +1 -0
- package/dist/lib/pod.d.ts +119 -115
- package/dist/lib/pod.js +206 -412
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/project-ref.d.ts +9 -3
- package/dist/lib/project-ref.js +10 -4
- package/dist/lib/project-ref.js.map +1 -1
- package/dist/lib/review-credential.d.ts +119 -0
- package/dist/lib/review-credential.js +147 -0
- package/dist/lib/review-credential.js.map +1 -0
- package/dist/lib/safe-open.d.ts +49 -0
- package/dist/lib/safe-open.js +119 -0
- package/dist/lib/safe-open.js.map +1 -0
- package/dist/lib/session-lens.d.ts +40 -1
- package/dist/lib/session-lens.js +54 -4
- package/dist/lib/session-lens.js.map +1 -1
- package/dist/lib/superwhisper-import.d.ts +8 -0
- package/dist/lib/superwhisper-import.js +14 -7
- package/dist/lib/superwhisper-import.js.map +1 -1
- package/dist/lib/superwhisper-title.test.d.ts +1 -0
- package/dist/lib/superwhisper-title.test.js +18 -0
- package/dist/lib/superwhisper-title.test.js.map +1 -0
- package/dist/lib/targets.d.ts +134 -10
- package/dist/lib/targets.js +962 -258
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/template-file.d.ts +78 -0
- package/dist/lib/template-file.js +140 -0
- package/dist/lib/template-file.js.map +1 -0
- package/dist/lib/template-lifecycle.d.ts +217 -0
- package/dist/lib/template-lifecycle.js +433 -0
- package/dist/lib/template-lifecycle.js.map +1 -0
- package/dist/lib/template-steps.d.ts +88 -0
- package/dist/lib/template-steps.js +118 -0
- package/dist/lib/template-steps.js.map +1 -0
- package/dist/lib/time-ago.d.ts +2 -0
- package/dist/lib/time-ago.js +15 -0
- package/dist/lib/time-ago.js.map +1 -0
- package/dist/utils/logger.js +5 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +25 -18
- package/skills/README.md +12 -10
- package/skills/agent-os/SKILL.md +220 -99
- package/skills/manifest.json +2 -2
- package/skills/onboard/SKILL.md +61 -25
- package/skills/synap/README.md +5 -8
- package/skills/synap/SKILL.md +1185 -301
- package/skills/synap/_order.txt +7 -0
- package/skills/synap/_skill.yaml +1 -1
- package/skills/synap/automations.md +15 -0
- package/skills/synap/capture.md +54 -151
- package/skills/synap/cli-operations.md +24 -18
- package/skills/synap/common-mistakes.md +1 -0
- package/skills/synap/concepts.md +28 -0
- package/skills/synap/content-os.md +92 -0
- package/skills/synap/creative-loop.md +15 -10
- package/skills/synap/crm.md +21 -52
- package/skills/synap/digesting-a-channel.md +25 -0
- package/skills/synap/document-embeds.md +141 -47
- package/skills/synap/escalation-ladder.md +20 -10
- package/skills/synap/focus-sessions.md +47 -21
- package/skills/synap/from-intent.md +142 -0
- package/skills/synap/governance-rules.md +4 -4
- package/skills/synap/governance.md +10 -7
- package/skills/synap/hand-off.md +33 -0
- package/skills/synap/inline-patterns.md +15 -7
- package/skills/synap/lenses.md +33 -15
- package/skills/synap/linking.md +41 -40
- package/skills/synap/mcp-remote-servers.md +64 -0
- package/skills/synap/mental-model.md +24 -22
- package/skills/synap/multi-entity-capture.md +6 -4
- package/skills/synap/operating-mode-rules.md +1 -1
- package/skills/synap/processes.md +118 -0
- package/skills/synap/quick-reference.md +5 -1
- package/skills/synap/reading.md +3 -1
- package/skills/synap/reflexes.md +12 -42
- package/skills/synap/viewframe-cells.md +38 -5
- package/skills/synap/work-flow.md +1 -1
- package/skills/synap/work-model.md +96 -0
- package/skills/synap/worked-examples.md +21 -1
- package/skills/synap/workspace-design.md +14 -10
- package/skills/synap/writes.md +165 -35
- package/skills/synap/writing-titles.md +63 -0
- package/skills/synap-app/SKILL.md +319 -0
- package/skills/synap-app/_order.txt +5 -0
- package/skills/synap-app/_skill.yaml +20 -0
- package/skills/synap-app/creating-the-base-app.md +64 -0
- package/skills/synap-app/governance.md +42 -0
- package/skills/synap-app/install-commands.md +55 -0
- package/skills/synap-app/overview.md +50 -0
- package/skills/synap-app/using-the-sdk.md +73 -0
- package/skills/synap-design/SKILL.md +474 -0
- package/skills/synap-design/_order.txt +4 -0
- package/skills/synap-design/_skill.yaml +21 -0
- package/skills/synap-design/loop.md +134 -0
- package/skills/synap-design/overview.md +44 -0
- package/skills/synap-design/principles.md +130 -0
- package/skills/synap-design/system.md +133 -0
- package/skills/synap-market/SKILL.md +625 -0
- package/skills/synap-market/_order.txt +5 -0
- package/skills/synap-market/_skill.yaml +24 -0
- package/skills/synap-market/author-and-publish.md +212 -0
- package/skills/synap-market/discover-and-fetch.md +59 -0
- package/skills/synap-market/governance-and-catalog.md +63 -0
- package/skills/synap-market/install.md +133 -0
- package/skills/synap-market/overview.md +119 -0
- package/skills/synap-schema/SKILL.md +172 -10
- package/skills/synap-schema/_order.txt +2 -0
- package/skills/synap-schema/_skill.yaml +4 -2
- package/skills/synap-schema/common-mistakes.md +4 -2
- package/skills/synap-schema/discover-profiles.md +1 -1
- package/skills/synap-schema/entity-scope.md +15 -3
- package/skills/synap-schema/extend-first.md +29 -0
- package/skills/synap-schema/extend-vs-create.md +1 -1
- package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
- package/skills/synap-schema/property-types.md +1 -1
- package/skills/synap-schema/relations.md +1 -1
- package/skills/synap-ui/SKILL.md +19 -12
- package/skills/synap-ui/_skill.yaml +1 -1
- package/skills/synap-ui/ai-companion.md +1 -1
- package/skills/synap-ui/arranging-bento.md +2 -0
- package/skills/synap-ui/bento-layouts.md +10 -10
- package/skills/synap-ui/bento-recipes.md +313 -543
- package/skills/synap-ui/four-builds.md +5 -0
- package/skills/synap-ui/view-types.md +2 -2
- package/skills/synap-ui/widget-catalog.md +22 -278
- package/templates/automations/bookmark-enrichment.automation.json +290 -13
- package/templates/automations/url-bookmark-capture.automation.json +73 -11
- package/templates/skills/authoring-playbooks/SKILL.md +6 -3
- package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
- package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
- package/dist/commands/infra.d.ts +0 -21
- package/dist/commands/infra.js +0 -262
- package/dist/commands/infra.js.map +0 -1
- package/dist/lib/browser-auth.d.ts +0 -35
- package/dist/lib/browser-auth.js +0 -170
- package/dist/lib/browser-auth.js.map +0 -1
- package/dist/lib/openclaw.d.ts +0 -32
- package/dist/lib/openclaw.js +0 -164
- package/dist/lib/openclaw.js.map +0 -1
- package/dist/lib/seed.d.ts +0 -13
- package/dist/lib/seed.js +0 -135
- package/dist/lib/seed.js.map +0 -1
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# Author & publish — the ONE write door
|
|
2
|
+
|
|
3
|
+
Every kind (workspace, capability, cell, view, …) publishes through the SAME door:
|
|
4
|
+
`POST /api/packages` → `publishPackageCore`. `synap market <verb>` is the CLI front
|
|
5
|
+
end (human, or an AI driving the CLI on the user's behalf — always say what you ran).
|
|
6
|
+
|
|
7
|
+
**Two distinct AI paths — don't conflate them:**
|
|
8
|
+
|
|
9
|
+
- **Publish to the MARKET (the shared catalog)** = human / CLI / browser only.
|
|
10
|
+
Publishing a template to the CP catalog needs the user's CP session; an agent
|
|
11
|
+
in the pod holds no CP credential (founder-gated trust boundary). So an agent
|
|
12
|
+
_authors + drives the CLI_, or the user publishes from the browser wizard.
|
|
13
|
+
- **Author + PROPOSE an install** = agents CAN do this natively. The IS tool
|
|
14
|
+
**`propose_workspace_template`** authors a full workspace definition and routes it
|
|
15
|
+
through the pod's governed `/packages/apply` → a **reviewable proposal** carrying
|
|
16
|
+
the whole definition (the user sees a live preview and approves). This is NOT a
|
|
17
|
+
market publish — it installs the AI-authored template into the user's pod, governed.
|
|
18
|
+
Use it when the user wants a whole workspace set up as a reviewable proposal.
|
|
19
|
+
|
|
20
|
+
**One space per domain:** A space is a domain, installed once (Content, Brand, CRM…). A project is a filter across spaces. To make something “for project X”: file it into X inside the domain's space (`file_into_project`), and link X to the space (`project_use_workspace`). Never create a space named after a project, a brand or a client.
|
|
21
|
+
|
|
22
|
+
## The loop
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
synap market scaffold my-thing # writes my-thing.template.yaml (refuses to overwrite)
|
|
26
|
+
# ...edit the file...
|
|
27
|
+
synap market validate my-thing.template.yaml
|
|
28
|
+
synap market publish my-thing.template.yaml # PRIVATE by default
|
|
29
|
+
synap market publish my-thing.template.yaml --public # opt in to sharing
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### `scaffold <slug>`
|
|
33
|
+
|
|
34
|
+
Writes a minimal valid `<slug>.template.yaml` — `meta` (slug/name/description/
|
|
35
|
+
icon/color), `workspace` (name/description), and one starter profile. Refuses
|
|
36
|
+
to clobber an existing file — create-then-configure, never silently overwrite
|
|
37
|
+
an author's work.
|
|
38
|
+
|
|
39
|
+
### `validate <file>`
|
|
40
|
+
|
|
41
|
+
Runs the ONE shared validator (`validateTemplate` from
|
|
42
|
+
`@synap-core/workspace-templates`) locally — fast feedback before any network
|
|
43
|
+
call. Fix every reported error before publishing; the CP re-runs the same
|
|
44
|
+
class of check server-side and will reject an invalid definition (400).
|
|
45
|
+
|
|
46
|
+
### `publish [file]`
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
synap market publish [file] [--public|--private] [--from-workspace <id>] [--json]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- Validates first — a failing template is never published.
|
|
53
|
+
- Default is **private**; pass `--public` to share. `--private` is accepted
|
|
54
|
+
explicitly if a script wants to state intent.
|
|
55
|
+
- `--from-workspace <id>` serializes a LIVE, already-built workspace into a
|
|
56
|
+
template via the pod's own `POST /workspaces/:id/to-template` door, then
|
|
57
|
+
publishes that — the fastest way to turn something you already built into a
|
|
58
|
+
reusable package. It runs through the SAME validator as a hand-authored file.
|
|
59
|
+
- Writes go to `POST /api/packages` (upsert by `(slug, authorId)`; version is
|
|
60
|
+
a content hash, so republishing identical content is a safe no-op — you'll
|
|
61
|
+
see `outcome: "no-op"` vs `"created"`/`"updated"`).
|
|
62
|
+
- Slugs `foundation`, `crm`, `operations`, `content-os`, `enterprise-os`,
|
|
63
|
+
`research-base` are reserved bedrock templates — publishing under one of
|
|
64
|
+
those 403s; pick a different slug.
|
|
65
|
+
|
|
66
|
+
### Standalone non-workspace kinds (`--kind`)
|
|
67
|
+
|
|
68
|
+
A lone **cell** (a renderer — the code that draws an entity/widget) or **view** can
|
|
69
|
+
be authored + published on its own, same door:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
synap market scaffold --kind cell my-card # → my-card.cell.json {category, slug, displayName, definition}
|
|
73
|
+
# edit the cell's code/definition
|
|
74
|
+
synap market publish my-card.cell.json # category:"cell", same publish client
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`--kind view` works the same, and so does **`--kind skill`** — a skill ships as its
|
|
78
|
+
own package now:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
synap market scaffold --kind skill my-method # → my-method.skill.json
|
|
82
|
+
# definition.skill = { slug, name, kind: "instruction"|"code", body | code, … }
|
|
83
|
+
synap market publish my-method.skill.json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Author a skill a template needs as its OWN package, never nested inside a
|
|
87
|
+
capability (the nested form still exists for a capability's own verbs, but it is
|
|
88
|
+
not how a space gets a skill). The `slug` is the skill's `load_skill` ref and
|
|
89
|
+
**cannot start with `system/`** — that namespace is reserved for seeded skills.
|
|
90
|
+
|
|
91
|
+
The door is category-gated: only `category:"workspace"` runs the WorkspaceYaml
|
|
92
|
+
validator + lossless normalization; every other kind is stored pod-native as-is (a
|
|
93
|
+
capability/cell/skill is NOT a WorkspaceYaml). A `category:"skill"` publish must
|
|
94
|
+
carry a non-empty `definition.skill` with documentation or code — the pod refuses a
|
|
95
|
+
bodiless skill at install, so the CP refuses it at publish.
|
|
96
|
+
|
|
97
|
+
### Compose — ship a whole stack in one install
|
|
98
|
+
|
|
99
|
+
A template declares `dependencies[]` (`{kind, relation: compose|require}`) so
|
|
100
|
+
installing it installs its whole stack in one governed pass. The resolver
|
|
101
|
+
materializes **workspace / capability / cell / skill** dependencies today;
|
|
102
|
+
**view and workflow are accepted and composable but not yet installed
|
|
103
|
+
standalone** (pending appliers) — so a space can ship its cells + capabilities +
|
|
104
|
+
skills + a base workspace as ONE install. Compose, don't inline.
|
|
105
|
+
|
|
106
|
+
Author these BOTTOM-UP: publish the skill/cell/capability first, then the template
|
|
107
|
+
that requires it. `dependencies[]` is the INSTALL; the template's own `skills:`
|
|
108
|
+
block is the LINK to the space (and its mode). A link with no matching dependency
|
|
109
|
+
installs cleanly and links nothing — silently, because a missing dependency is
|
|
110
|
+
non-fatal by design (`required-absent` in the resolver's report, which you should
|
|
111
|
+
read rather than assume).
|
|
112
|
+
|
|
113
|
+
### `unpublish <slug>`
|
|
114
|
+
|
|
115
|
+
Flips a published package back to private (owner-only). ⚠️ Known gap: the CP's
|
|
116
|
+
PATCH validator doesn't yet accept `isPublic` on every deploy — if it 400s,
|
|
117
|
+
that's a server-side TODO, not something to work around; report it honestly.
|
|
118
|
+
|
|
119
|
+
## Server-side validation scope (important honesty note)
|
|
120
|
+
|
|
121
|
+
`POST /api/packages` validates **self-contained** templates (no `dependencies`
|
|
122
|
+
declared) with the full referential-integrity check (dangling profile refs in
|
|
123
|
+
views/entityLinks, missing view scope, entityLink predicates). A template that
|
|
124
|
+
**declares `dependencies`** (compose/require another template) passes through
|
|
125
|
+
this HTTP door **without** that validation — composition-aware server-side
|
|
126
|
+
validation is not yet wired for ad-hoc publishes (official templates are
|
|
127
|
+
validated corpus-wide from their YAML by the official publish
|
|
128
|
+
(`synap market publish --official`) before it posts). Don't claim a composed publish was fully validated; say what actually ran.
|
|
129
|
+
|
|
130
|
+
**Official templates — ONE catalog, ONE writer.** Every official template, of
|
|
131
|
+
every kind, lives in ONE catalog package: `synap-app/packages/workspace-templates/`
|
|
132
|
+
(npm `@synap-core/workspace-templates`; a rename to `packages/catalog` /
|
|
133
|
+
`@synap-core/catalog` is planned, not done). By kind: workspaces in `src/*.yaml`,
|
|
134
|
+
then `capabilities/`, `skills/`, `packs/`, `automations/`. Each file is one manifest
|
|
135
|
+
`{apiVersion: synap/v1, kind, meta, spec, dependencies}`. Its `README.md` is the
|
|
136
|
+
how-to. It has ONE writer: `synap catalog publish --official [--kind k] [slug...]`.
|
|
137
|
+
That is the founder's command: its `synap login` session must own the
|
|
138
|
+
`synap-official` vendor. It refuses a non-official account before the preview,
|
|
139
|
+
validates the whole corpus, previews the diff against the live catalog, and asks
|
|
140
|
+
before writing; `--dry-run` previews only. `synap market publish --official` is
|
|
141
|
+
its alias for `--kind workspace`. Both go through the ONE lib
|
|
142
|
+
`scripts/catalog-lib.mjs` → `POST /api/packages` (`publishPackageCore`).
|
|
143
|
+
`synap catalog validate|diff` are the read-only verbs. `scripts/publish-official.mjs`
|
|
144
|
+
is only the CI wrapper (`publish-official-templates.yml`): a read-only preview on
|
|
145
|
+
PRs, and on main a live publish of the kinds in `SYNAP_CATALOG_LIVE_KINDS` (default
|
|
146
|
+
`workspace`). The CP never reseeds on deploy, neither templates nor capabilities.
|
|
147
|
+
`seed-templates.ts` and `seed-capability-templates.ts` are insert-only, by-hand
|
|
148
|
+
bootstraps for an empty CP. A catalog change reaches pods only when that publish
|
|
149
|
+
runs. A CP-door change ships CP-deploy first, then publish.
|
|
150
|
+
`definition.sourcePackage` (the `mergeCatalog` winner signal) is official-only:
|
|
151
|
+
the CP rejects it (403) from any other publisher, so never put it in an ad-hoc
|
|
152
|
+
package. Official capability keys are reserved: an ad-hoc publish of a capability
|
|
153
|
+
whose slug or `capability.key` matches an official one gets 409
|
|
154
|
+
`OFFICIAL_CAPABILITY_KEY_RESERVED`. Pick your own key. Never pass the official
|
|
155
|
+
`vendorId` to `market_publish` or publish an official slug ad-hoc — official
|
|
156
|
+
content is authored in the catalog and published by the human with
|
|
157
|
+
`synap catalog publish --official`.
|
|
158
|
+
|
|
159
|
+
## Writing a process (a playbook that follows a kind's lifecycle)
|
|
160
|
+
|
|
161
|
+
The status belongs to the **kind or role**, never to a playbook. Its profile declares the lifecycle ONCE, in its
|
|
162
|
+
template:
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
lifecycle:
|
|
166
|
+
property: post-status
|
|
167
|
+
options:
|
|
168
|
+
- { key: Idea, category: open }
|
|
169
|
+
- { key: Published, category: done }
|
|
170
|
+
- { key: Archived, category: lost, humanOnly: true }
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Every option has one category (`open · active · paused · done · lost`); rules read the category, names stay free.
|
|
174
|
+
`humanOnly` marks an option no agent sets; an agent's move into `done` or `lost` proposes. Every move goes through
|
|
175
|
+
the one status door (`moveStatus`; an agent sends `update_entity` with `expectedStatus`).
|
|
176
|
+
|
|
177
|
+
A playbook that works that lifecycle is a **process**: it FOLLOWS it. Its stages name options of it, its workers
|
|
178
|
+
start on it, and a person decides at the moments that commit the business. It never keeps a second status field.
|
|
179
|
+
The reference is Content OS "Produce Content" (`synap-app/packages/workspace-templates/src/content-os.yaml`).
|
|
180
|
+
|
|
181
|
+
**Official vs pod-local.** An official template or capability lives ONLY in the catalog
|
|
182
|
+
(`synap-app/packages/workspace-templates/`, by kind) and is published with
|
|
183
|
+
`synap catalog publish --official` (CI on main). A playbook, kind or automation an agent creates on a pod
|
|
184
|
+
(`synap_create_playbook`, `synap_define_kind`, …) is **pod-local**: it never reaches the catalog. To make it
|
|
185
|
+
official, write it into the catalog file and publish.
|
|
186
|
+
|
|
187
|
+
| Field | Where | Rule |
|
|
188
|
+
| ------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
189
|
+
| `subjectProfile.profileSlug` | playbook | The kind or role the process works. |
|
|
190
|
+
| `subjectProfile.statusProperty` | playbook | Omit it: the pod follows the profile's declared lifecycle. If you name it, name that same property. A status worker on a role with no declared lifecycle is refused. |
|
|
191
|
+
| `stages[].subjectStatus` | stage | Entering the stage moves the subject to this option, through the door. Must be an **existing option** of the lifecycle — never invent one. |
|
|
192
|
+
| `stages[].gate` | stage | `{kind: human}` at every commitment: send to a client, sign, pay, publish, won/lost, anything irreversible. `{kind: check}` only where the stage's own criteria can be verified. A gated stage writes its status only when the gate passes. A check gate judges the stage being LEFT, so never use it to guard an irreversible status. |
|
|
193
|
+
| `stages[].onFail` | stage | `{toStage: <key>}` — where a rejected gate sends the run (rework loop). |
|
|
194
|
+
| `stages[].criteria` | stage | 2–5 binary statements; `check.kind` evidence (cheapest) · capability · judge · human. |
|
|
195
|
+
| `expectedOutputs[]` | stage or playbook | What the step must produce: `kind` + `label` + `relationToSubject` (an existing relation slug, or `none`). The UI shows what was produced from this. |
|
|
196
|
+
| `activators[]` (workers) | playbook | `on`: `created` · `enters_status` (+ `status`) · `count` (+ `status`, `min` ≥ 2) · `schedule` (+ `cron`, UTC) · `manual`. `size`: `per_thing` (default) · `per_moment` (count and schedule always are). `mode`: `propose` (default) · `run` only when cheap and safe. `maxPendingApprovals` (default 20) throttles. Compiled to a governed rule the owner can pause; it fires once per thing per transition. |
|
|
197
|
+
| `humanOnlyStatuses` | playbook | Legacy: the options no stage owns. Mark a person-only option `humanOnly` on the lifecycle instead; while `statusProperty` is set, `synap catalog validate` still checks that stages and this list cover every option. |
|
|
198
|
+
| `goalTemplate` | playbook | Placeholders are `{paramName}`. Never `@{arg:…}` (read-only legacy). |
|
|
199
|
+
| `params` | playbook | The subject is a `type: entity` param. A required param left unanswered becomes a question owed by the person, not an empty string. |
|
|
200
|
+
|
|
201
|
+
Human moments use an `ask` on an owed slot: `confirm` / `choose` (one `recommended`) / `form` / `act` / `provide`
|
|
202
|
+
(connection, file or secret through the vault). Never ask for a secret in a form.
|
|
203
|
+
|
|
204
|
+
Validation: `synap catalog validate` (process contract, goal grammar, lifecycle coverage ratchet — the count of
|
|
205
|
+
lifecycle kinds with no process may only go down).
|
|
206
|
+
|
|
207
|
+
## What you're producing
|
|
208
|
+
|
|
209
|
+
A `PackageDefinition`: `_meta` (slug/name/description/icon/color/tags),
|
|
210
|
+
`workspaceName`, `description`, `profiles`, `views`, `entityLinks`, optional
|
|
211
|
+
`dependencies`. The scaffolded YAML and `--from-workspace` both produce this
|
|
212
|
+
shape — never hand-write JSON against the raw DB row shape.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Discover & fetch
|
|
2
|
+
|
|
3
|
+
Three doors reach the same catalog. Pick the one that matches where you're
|
|
4
|
+
running.
|
|
5
|
+
|
|
6
|
+
## CLI — `synap market`
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
synap market # browse/list (the default action)
|
|
10
|
+
synap market --search "crm" # filter by name/description/slug
|
|
11
|
+
synap market --type capability # filter by type: workspace|capability|skill|workflow|view|cell
|
|
12
|
+
synap market --search "crm" --type workspace --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`market` with no subcommand lists; `--list` is accepted explicitly too. It
|
|
16
|
+
merges: your OWN packages (public + private, via `GET /api/packages/mine`)
|
|
17
|
+
with the PUBLIC catalog (`GET /api/packages`) — logged out, you only see the
|
|
18
|
+
public/bundled set.
|
|
19
|
+
|
|
20
|
+
Companion commands:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
synap market installed # what's already installed on THIS pod (pure read)
|
|
24
|
+
synap market installed --tree # composition graph: package → templates → workspaces
|
|
25
|
+
synap market update # check installed packages for drift against the catalog
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Pod verb — `market.search` (MCP / agent / automation)
|
|
29
|
+
|
|
30
|
+
The pod-native verb, run via MCP `run_capability` or
|
|
31
|
+
`POST /api/hub/capabilities/execute` with `{ verbId: "market.search", parameters }`:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{ "query": "crm", "kind": "template", "limit": 20 }
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- `kind` ∈ `capability | automation | template | cell` (omit to search all).
|
|
38
|
+
- Reads the pod-local `cp_catalog_cache` — fast, no live CP round-trip.
|
|
39
|
+
- Returns `{ entries: [{ slug, kind, name, description, version, tier, installed }], count }`.
|
|
40
|
+
- `installed` is `true`/`false` for capability/cell (cheap natural-key check);
|
|
41
|
+
`undefined` for automation/template — that's an HONEST unknown, not a bug,
|
|
42
|
+
never read it as "not installed."
|
|
43
|
+
- Empty result → say so plainly ("nothing matched") — never fabricate a
|
|
44
|
+
package that doesn't exist. Offer to capture the gap as a note for later.
|
|
45
|
+
|
|
46
|
+
This is the verb an agent should reach for first — it's read-only (auto-runs,
|
|
47
|
+
no approval needed) and mirrors exactly what `synap market --search` shows a
|
|
48
|
+
human.
|
|
49
|
+
|
|
50
|
+
## Fetching one package's full definition
|
|
51
|
+
|
|
52
|
+
- **CLI (authoring path):** `synap market publish --from-workspace <id>` reads
|
|
53
|
+
a LIVE workspace via the pod's own `to-template` serializer — see
|
|
54
|
+
`author-and-publish.md`.
|
|
55
|
+
- **CP directly:** `GET /api/packages/:slug` returns the full row **with**
|
|
56
|
+
`definition` — the install payload. Auth is required to see a private
|
|
57
|
+
package (author-only). No auth → public only, and a private slug 404s.
|
|
58
|
+
- **From an install:** you don't normally need the definition yourself —
|
|
59
|
+
`market.install` (see `install.md`) resolves and applies it for you.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Governance & the one-catalog principle
|
|
2
|
+
|
|
3
|
+
## Writes are governed — "proposed" is success
|
|
4
|
+
|
|
5
|
+
Every mutating marketplace action an AGENT takes (`market.install` above all)
|
|
6
|
+
can come back `{ status: "proposed", proposalId, reviewUrl }` instead of
|
|
7
|
+
`{ status: "installed" }`. That is the write queued for the pod owner's
|
|
8
|
+
review — like opening a PR, not a failure and not an error to retry. Always:
|
|
9
|
+
|
|
10
|
+
- Surface `reviewUrl` to the user.
|
|
11
|
+
- Don't retry the same install hoping for "installed" — it won't change the
|
|
12
|
+
outcome and may create a duplicate proposal.
|
|
13
|
+
- Remember an unreviewed proposal isn't live yet: `market.search`'s
|
|
14
|
+
`installed` flag and any downstream read won't reflect it until approved.
|
|
15
|
+
|
|
16
|
+
An OPERATOR-driven install (the pod owner themself, via CLI with their own
|
|
17
|
+
credentials, no agent identity) executes directly — no proposal. The
|
|
18
|
+
distinction is WHO is acting, not which door they used.
|
|
19
|
+
|
|
20
|
+
## One catalog — never fork it
|
|
21
|
+
|
|
22
|
+
- The catalog is `synapPackages` in the Control Plane, reached through
|
|
23
|
+
`GET/POST/PATCH /api/packages*`. `cp_catalog_cache` on the pod is a
|
|
24
|
+
**read-through cache** of it (populated by sync), not a second source of
|
|
25
|
+
truth — never write to it directly, and never treat a cache miss as "the
|
|
26
|
+
package doesn't exist" without falling back to a live CP fetch (which
|
|
27
|
+
`market.install` already does for automation/template kinds).
|
|
28
|
+
- Discovery happens on the CP (`market.search`, `synap market`); apply
|
|
29
|
+
happens on the pod (`market.install`, workspace creation). Don't invent a
|
|
30
|
+
parallel "known templates" list anywhere else in a workflow you're
|
|
31
|
+
building — always search the real catalog.
|
|
32
|
+
- Publishing to anywhere other than `POST /api/packages` (e.g. hand-writing a
|
|
33
|
+
file and calling it "published," or registering a template only in a local
|
|
34
|
+
config) is NOT publishing — it produces something invisible to
|
|
35
|
+
`market.search` and every other consumer.
|
|
36
|
+
|
|
37
|
+
## Visibility model
|
|
38
|
+
|
|
39
|
+
- **Public** (`isPublic: true`) — visible to everyone via `GET /api/packages`.
|
|
40
|
+
- **Private** (`isPublic: false`, the default) — visible only to its
|
|
41
|
+
`authorId` (and, for non-workspace categories, active members of an
|
|
42
|
+
`podId`-owned team). A private **workspace template** is stricter:
|
|
43
|
+
owner-only, full stop, even for pod teammates.
|
|
44
|
+
- A private package a caller can't see **404s, never 403s** — this is
|
|
45
|
+
deliberate (don't leak existence). If you get a 404 fetching a package by
|
|
46
|
+
slug, don't assume it never existed — it may just be private to someone
|
|
47
|
+
else.
|
|
48
|
+
|
|
49
|
+
## Tier gating
|
|
50
|
+
|
|
51
|
+
A public package can declare `requiredTier`. `GET /api/packages/available`
|
|
52
|
+
tells an authed caller which tiered slugs their subscription actually
|
|
53
|
+
unlocks; a slug missing from that list but present in the browse catalog is
|
|
54
|
+
locked for them — `market.install` pre-checks this and fails before touching
|
|
55
|
+
governance, so surface the tier requirement rather than treating it as a
|
|
56
|
+
generic install error.
|
|
57
|
+
|
|
58
|
+
The **server pre-check is the authoritative floor** (`assertPackageTierAccess`,
|
|
59
|
+
wired at every install site). The browser UI is **display-only**: it threads
|
|
60
|
+
`requiredTier` through to a "requires <tier>" badge but does NOT hard-block, and
|
|
61
|
+
its lock/upgrade CTA only engages once a host wires a billing destination — so
|
|
62
|
+
don't add a UI-side gate expecting it to enforce anything, and don't rebuild the
|
|
63
|
+
badge thread (it exists). Full current-state: repo `TEMPLATE-DEV-GUIDE.md`.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Install
|
|
2
|
+
|
|
3
|
+
## CLI — `synap market install <slug>`
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
synap market install crm # install as a new workspace
|
|
7
|
+
synap market install crm --dry-run # preview: would-create / reuse / conflicts, writes nothing
|
|
8
|
+
synap market install crm --onto <workspaceId> # reconcile ONTO an existing workspace (additive)
|
|
9
|
+
synap market install crm --project <id> # link the installed workspace(s) to an EXISTING project (id only)
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Installs are **workspace-first**: a `workspace`/`template` package spins up
|
|
13
|
+
(or reconciles onto) a workspace directly. Other package types (capability,
|
|
14
|
+
automation, cell) route you to the right surface (`synap capability add`,
|
|
15
|
+
etc.) rather than being force-fit into a workspace install.
|
|
16
|
+
|
|
17
|
+
**One space per domain:** A space is a domain, installed once (Content, Brand, CRM…). A project is a filter across spaces. To make something “for project X”: file it into X inside the domain's space (`file_into_project`), and link X to the space (`project_use_workspace`). Never create a space named after a project, a brand or a client. Reinstalling reuses the live space. A template is installed **once per pod**, and a space name is held by **one** active space — whoever owns it, human or agent alike: a second copy is refused (`409` — `status: "exists"` + the space to use, or `WORKSPACE_IDENTITY_CONFLICT` naming the space that holds it). There are no named copies: `--as <name>` / `instanceName` answers `400`, and a package with no `_meta.slug` (and no `--onto` target) answers `400` instead of minting a second space.
|
|
18
|
+
|
|
19
|
+
## Pod verb — `market.install` (MCP / agent / automation)
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{ "slug": "crm", "kind": "template", "version": "optional", "params": {} }
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`kind` ∈ `capability | automation | template | cell` — required, unlike
|
|
26
|
+
`market.search`.
|
|
27
|
+
|
|
28
|
+
**This verb ALWAYS mutates**, so it goes through the full permission gate —
|
|
29
|
+
never treat a non-"installed" response as failure:
|
|
30
|
+
|
|
31
|
+
- **Operator call** (no agent identity — e.g. you're driving the CLI as the
|
|
32
|
+
pod owner): executes directly → `{ status: "installed", result }`.
|
|
33
|
+
- **Agent call** (any MCP/automation/agent-key caller): ALWAYS proposes,
|
|
34
|
+
regardless of any standing grant on `market.install` itself — a grant on
|
|
35
|
+
the verb governs _invoking_ it, not the provisioning it performs. Response:
|
|
36
|
+
`{ status: "proposed", proposalId, reviewUrl }`.
|
|
37
|
+
|
|
38
|
+
**`"proposed"` is success, not an error.** Surface `reviewUrl` to the user so
|
|
39
|
+
they can approve it — don't retry, don't report it as a failure. See
|
|
40
|
+
`governance-and-catalog.md`.
|
|
41
|
+
|
|
42
|
+
## Project packs — a suite of workspaces, linked to a project
|
|
43
|
+
|
|
44
|
+
A **project** is a cross-cutting lens over workspaces, not a package kind. A
|
|
45
|
+
"project pack" is a **suite**: an ordinary `workspace`-category package tagged
|
|
46
|
+
`suite`, whose `dependencies[]` **`require`** each constituent workspace package
|
|
47
|
+
(never `compose` — re-applying must not duplicate workspaces). Installing a
|
|
48
|
+
suite installs every constituent workspace (idempotent: reused if present).
|
|
49
|
+
|
|
50
|
+
**Author one from a live project** — never hand-write the suite:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
synap market publish --from-project <projectId> # publishes the constituents first, then the thin suite
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
(Agent door: `export_project_pack` returns `{ definition, constituents }` —
|
|
57
|
+
publish the constituents before the suite so every `require` resolves.)
|
|
58
|
+
|
|
59
|
+
**Install onto a project.** The install never needs to know why the project
|
|
60
|
+
exists — it installs the workspaces and LINKS them (a `project --uses-->
|
|
61
|
+
workspace` edge per workspace, plus seeded entities filed into the project):
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
synap market install <suite-slug> --project <projectId> # EXISTING project id only; errors if not found
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The CLI has no flag that creates a project. Create the project first:
|
|
68
|
+
|
|
69
|
+
- **A human**: in the app, or by passing `projectName` on the Hub door
|
|
70
|
+
`POST /api/hub/packages/apply` (mints or reuses by exact name).
|
|
71
|
+
- **An agent**: `create_project` requires `evidenceEntityIds` — at least 5
|
|
72
|
+
existing entities that belong to it — or it is REJECTED (not proposed).
|
|
73
|
+
Without that evidence, ask the human to create the project, then install with
|
|
74
|
+
its id.
|
|
75
|
+
- **An agent calling `market.install` with `projectName`**: the install becomes
|
|
76
|
+
a proposal that carries the name, and when a human approves it the project is
|
|
77
|
+
minted. The approval is the consent — say so when you propose it.
|
|
78
|
+
|
|
79
|
+
Two packs on one project = install each with the same `--project <id>`. Each
|
|
80
|
+
lands its own workspaces; both link to the project. Only ONE `compose`
|
|
81
|
+
dependency is allowed per package, at every level.
|
|
82
|
+
|
|
83
|
+
**The brief comes with the workspaces.** A workspace package's `onboarding` is
|
|
84
|
+
the space's BRIEF — steady state (`purpose`, `framing`, `expertise`, `anchors`,
|
|
85
|
+
`fetch`) plus its onboarding mode (`goal`, `collect`, `openingQuestions`,
|
|
86
|
+
`doneWhen`) — stored on that workspace's `settings.onboarding`; the package's
|
|
87
|
+
top-level `rules[]` install as the space's rules. A template update reaches an
|
|
88
|
+
installed space without overwriting what its owner edited (conflicts are
|
|
89
|
+
reported), and `synap_update_space_brief` proposes a change. The `onboard` skill runs the
|
|
90
|
+
interview when a lens is empty; for a project spanning several workspaces it
|
|
91
|
+
sets up one workspace's slice at a time, each entity filed into the project.
|
|
92
|
+
There is no project-level recipe — the recipe always lives on a workspace. A
|
|
93
|
+
journey completes by itself once the lens holds real data.
|
|
94
|
+
|
|
95
|
+
## Idempotency by kind
|
|
96
|
+
|
|
97
|
+
- **capability** — natural key is `(name, workspaceId)`; installing twice
|
|
98
|
+
converges, doesn't duplicate.
|
|
99
|
+
- **template/workspace** — keyed by `packageSlug`/`proposalId` (both set to
|
|
100
|
+
the catalog slug); re-installing the same template for the same user
|
|
101
|
+
converges to the existing workspace rather than creating a second one.
|
|
102
|
+
- **automation** — pre-checked by `(name, workspace)` before creating.
|
|
103
|
+
- **cell** — keyed by `(typeKey, workspaceId)`.
|
|
104
|
+
|
|
105
|
+
## Template updates — where a space stands, and whose step it is
|
|
106
|
+
|
|
107
|
+
Read it with MCP `synap_template_health` (or `synap templates` in a terminal).
|
|
108
|
+
Each space's row says what is left to do; act on these fields, not on
|
|
109
|
+
`drifted` alone (`drifted: true` means "there is a step", not "apply now"):
|
|
110
|
+
|
|
111
|
+
| Field | Means | Your move |
|
|
112
|
+
|---|---|---|
|
|
113
|
+
| `state: "active"`, `drifted: true` | a newer version is out | the update path below |
|
|
114
|
+
| `state: "awaiting-approval"` + `awaitingApproval: [ids]` | the last update filed proposals | point the person to them; **do not re-apply** |
|
|
115
|
+
| `state: "partial"` / `"layer-2-not-run"` / `"failed"` | the last update did not finish | `synap templates update <slug>` finishes it |
|
|
116
|
+
| `pendingDataChanges: {count, sentences, needsPodAdmin}` | the update changes existing data and waits for a **person** to agree | tell them the sentences; they run `synap templates update <slug>` themselves (a pod owner/admin when `needsPodAdmin`) |
|
|
117
|
+
| `updateProposal: {id}` | an update of this space is already proposed | point the person to that proposal; **never file another** |
|
|
118
|
+
| `applyWarning` | the pod's one sentence for what is left | relay it as is |
|
|
119
|
+
|
|
120
|
+
The update path is `synap templates update <slug>` (the person's door). Run
|
|
121
|
+
with an agent key it becomes a proposal the person approves. **Agreeing to data
|
|
122
|
+
changes is never an agent's**: the door answers `409
|
|
123
|
+
DATA_CHANGES_NEED_CONSENT` with `needsPerson: true` for any agent, whatever it
|
|
124
|
+
lists in `acceptDataChanges`. The version stamp (`settings.template.version`) is
|
|
125
|
+
written only when an update converged, so a space never reads "up to date" over
|
|
126
|
+
an update that did not land.
|
|
127
|
+
|
|
128
|
+
## Locked / tier-gated packages
|
|
129
|
+
|
|
130
|
+
A package can declare a `requiredTier`. Installing one your account's plan
|
|
131
|
+
doesn't cover fails a pre-check (`assertPackageTierAccess`) BEFORE any
|
|
132
|
+
proposal or provisioning — tell the user which tier is required rather than
|
|
133
|
+
retrying.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Marketplace & templates on Synap
|
|
2
|
+
|
|
3
|
+
Synap is **configuration-first**: a feature is _stored, user-editable config_
|
|
4
|
+
published to one catalog and installed through shared substrate — not hardcoded in
|
|
5
|
+
the pod backend. The marketplace is that **package layer**, and the catalog
|
|
6
|
+
(`synap_packages`) is **kind-agnostic** — one door serves every kind:
|
|
7
|
+
|
|
8
|
+
| Kind | Configures | Standalone install (via `applyMarketInstall`) |
|
|
9
|
+
| ------------------------- | ---------------------------------------------------------------- | -------------------------------------------------- |
|
|
10
|
+
| **workspace** | a whole domain (profiles + views + bento + its caps/automations) | ✅ `createWorkspaceFromDefinitionIdempotent` |
|
|
11
|
+
| **capability** | a credentialed tool pack (+ embedded skills/playbooks) | ✅ `createCapabilityFromDefinition` |
|
|
12
|
+
| **cell** | a renderer — the code that draws an entity/widget | ✅ `installCellFromDefinition` (needs a cache row) |
|
|
13
|
+
| **view** | a saved view/layout | ✅ `viewsRouter.create` (needs a `workspaceId`) |
|
|
14
|
+
| **skill** | agent know-how | ✅ `skillsRouter.create` (pod-wide if no ws) |
|
|
15
|
+
| **workflow / automation** | a WHEN→ACTION flow | ✅ `automationsRouter.create` into acting ws |
|
|
16
|
+
|
|
17
|
+
**All six kinds install standalone today** through the ONE apply core
|
|
18
|
+
`applyMarketInstall` (`services/capabilities/marketplace-install.ts`) — the same
|
|
19
|
+
governed door `market.install` and the `capability.install` proposal executor share,
|
|
20
|
+
each reusing the kind's _governed_ router caller (zero duplicated insert logic). The
|
|
21
|
+
remaining gaps are NOT install: (1) **private-package sync is unauthenticated**, so a
|
|
22
|
+
private package can't reach a pod yet (see `governance-and-catalog.md` / RC4); (2)
|
|
23
|
+
standalone **view / skill / automation stamp no source-link**, so they don't self-heal
|
|
24
|
+
via reconcile the way workspace/capability do. (Subscription-`tier` gating is a
|
|
25
|
+
separate axis — see `governance-and-catalog.md`.)
|
|
26
|
+
|
|
27
|
+
**Words** (template, pack, workspace/work/track/rule template) are defined once
|
|
28
|
+
in the `synap` skill's `concepts` topic. In short: a template's kind is DERIVED
|
|
29
|
+
from its content (a playbook with `scope: "project"` is a track template, the
|
|
30
|
+
default `scope: "session"` a work template), never declared.
|
|
31
|
+
|
|
32
|
+
**A pack is not a seventh kind.** Today it ships as a **suite**: a `workspace`
|
|
33
|
+
package tagged `suite` that `require`s its constituent workspaces, built from a
|
|
34
|
+
live project with `synap market publish --from-project <id>`, and installed
|
|
35
|
+
with `--project <id>` to link every workspace to that project. See
|
|
36
|
+
`install.md` → "Project packs". The model it is moving to: a pack lists the
|
|
37
|
+
workspace templates it depends on and installs the missing ones, and never
|
|
38
|
+
creates a workspace of its own.
|
|
39
|
+
|
|
40
|
+
It lives in the Control Plane (CP) catalog and is discoverable and installable from
|
|
41
|
+
any door: the `synap` CLI, MCP (`market_search` / `run_capability`), or the Hub REST
|
|
42
|
+
API. **Everything that is config, not code, can be a template** — workspaces, entity
|
|
43
|
+
profiles/views, renderers (cells), capabilities, skills, automations.
|
|
44
|
+
|
|
45
|
+
## The authoring order — bottom-up, ALWAYS
|
|
46
|
+
|
|
47
|
+
Everything installable is a **standalone package**, and packages form a graph: a
|
|
48
|
+
bigger one **declares `dependencies[]`** on smaller ones, and the pod installs the
|
|
49
|
+
missing ones in the same governed pass. So author from the SMALLEST piece up:
|
|
50
|
+
|
|
51
|
+
1. **Basic objects** — entity types (profiles), **skills**, capabilities, cells,
|
|
52
|
+
views, workflow/automations. Each is publishable on its OWN and is useful before
|
|
53
|
+
any container exists. A skill package is one skill: its documentation or code.
|
|
54
|
+
2. **Containers** — a **space** (a `workspace` template) that declares
|
|
55
|
+
`dependencies[]` on the basic objects it needs, and activates its skills with a
|
|
56
|
+
`skills:` block.
|
|
57
|
+
3. **Compositions** — a **project / suite** ("truck") that `require`s the spaces.
|
|
58
|
+
|
|
59
|
+
Publish the small pieces FIRST, then the space, then install. Nothing in the chain
|
|
60
|
+
waits on a container.
|
|
61
|
+
|
|
62
|
+
**The two verbs are different, and confusing them is the classic mistake:**
|
|
63
|
+
|
|
64
|
+
- `dependencies[]` = what gets **INSTALLED** — the pod materialises the package if
|
|
65
|
+
it is not already there (idempotent; a second pass reports `found`).
|
|
66
|
+
- `skills:` inside a template = what gets **LINKED** to that space, and in which
|
|
67
|
+
mode (`always` / `on-demand`). It names a skill some `dependencies[]` entry —
|
|
68
|
+
usually its own — already installed. Declaring the link without the dependency
|
|
69
|
+
installs cleanly and links NOTHING.
|
|
70
|
+
|
|
71
|
+
**Never inline what is already a package.** Copying a skill's text into a template,
|
|
72
|
+
or re-declaring a profile set that ships as a dependency, forks the thing and stops
|
|
73
|
+
it converging. Depend on it; let the install bring it. And **never** seed a skill
|
|
74
|
+
into the backend (`skills/synap/…`) to make a template resolve — that directory is
|
|
75
|
+
not the marketplace. Publish it as a package.
|
|
76
|
+
|
|
77
|
+
## The two reflexes
|
|
78
|
+
|
|
79
|
+
1. **DISCOVER before you invent.** Before scaffolding a new template or
|
|
80
|
+
capability, search the catalog — `synap market --search "<query>"` or the
|
|
81
|
+
`market.search` verb. Someone may have already published what you need.
|
|
82
|
+
Reinventing a workspace that already exists as a template is wasted work
|
|
83
|
+
AND fragments the catalog.
|
|
84
|
+
2. **One catalog, never a second one.** Every package — public or private —
|
|
85
|
+
lives in the CP's `synapPackages` table, reached through
|
|
86
|
+
`GET/POST /api/packages`. There is no side channel: don't write a
|
|
87
|
+
template to a random file and call it "published," and don't stand up a
|
|
88
|
+
local list of "known templates" — search the real catalog every time.
|
|
89
|
+
|
|
90
|
+
## The four things this skill teaches
|
|
91
|
+
|
|
92
|
+
| Task | Doc |
|
|
93
|
+
| --------------------------------------------------------- | --------------------------- |
|
|
94
|
+
| Search/browse/fetch a package (any kind) | `discover-and-fetch.md` |
|
|
95
|
+
| Install a package into a pod | `install.md` |
|
|
96
|
+
| Author a new template and publish it (the ONE write door) | `author-and-publish.md` |
|
|
97
|
+
| Governance rules + the one-catalog principle | `governance-and-catalog.md` |
|
|
98
|
+
|
|
99
|
+
## Package kinds
|
|
100
|
+
|
|
101
|
+
- **workspace / template** — a full workspace definition (profiles, views,
|
|
102
|
+
entity links) you can spin up as a new workspace, or reconcile onto an
|
|
103
|
+
existing one.
|
|
104
|
+
- **capability** — a tool + skill bundle (an integration or verb pack).
|
|
105
|
+
- **automation** — a trigger + action definition.
|
|
106
|
+
- **cell** — a custom UI renderer.
|
|
107
|
+
|
|
108
|
+
The CLI's browse filter (`market --type`) uses
|
|
109
|
+
`workspace|capability|skill|workflow|view|cell`; the pod-native install verb
|
|
110
|
+
(`market.install`) and its catalog use the narrower
|
|
111
|
+
`capability|automation|template|cell` (`template` there means a workspace template). Match
|
|
112
|
+
whichever surface you're calling.
|
|
113
|
+
|
|
114
|
+
## Visibility
|
|
115
|
+
|
|
116
|
+
Every package is **public** or **private** (owner-only). Default on publish is
|
|
117
|
+
**private** — you opt in to sharing with `--public`. A private package 404s
|
|
118
|
+
(not 403) to anyone who isn't its author or an active member of its owning pod
|
|
119
|
+
— see `governance-and-catalog.md`.
|