@synap-core/cli 1.11.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +40 -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 +32 -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 +524 -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 +116 -66
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/box.d.ts +42 -0
- package/dist/commands/box.js +89 -0
- package/dist/commands/box.js.map +1 -0
- package/dist/commands/bridge-setup.d.ts +14 -1
- package/dist/commands/bridge-setup.js +395 -129
- 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 +3 -1
- package/dist/commands/capability.js +249 -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 +1 -13
- package/dist/commands/centrality.js.map +1 -1
- package/dist/commands/close-questions.d.ts +27 -0
- package/dist/commands/close-questions.js +49 -0
- package/dist/commands/close-questions.js.map +1 -0
- package/dist/commands/close-questions.test.d.ts +1 -0
- package/dist/commands/close-questions.test.js +52 -0
- package/dist/commands/close-questions.test.js.map +1 -0
- package/dist/commands/connect.d.ts +36 -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 +79 -44
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +34 -0
- package/dist/commands/data-extra.js +203 -25
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +120 -2
- package/dist/commands/data.js +295 -21
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +66 -4
- package/dist/commands/diagnose.js +285 -28
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/doc.d.ts +11 -4
- package/dist/commands/doc.js +39 -14
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/doctor.d.ts +133 -3
- package/dist/commands/doctor.js +761 -41
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain.js +5 -5
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/hooks.d.ts +19 -0
- package/dist/commands/hooks.js +70 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/import.d.ts +393 -13
- package/dist/commands/import.js +1150 -54
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +34 -9
- package/dist/commands/init.js +481 -981
- 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 +22 -6
- package/dist/commands/knowledge.js +121 -57
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/lens.d.ts +37 -1
- package/dist/commands/lens.js +194 -72
- package/dist/commands/lens.js.map +1 -1
- package/dist/commands/market-authoring.d.ts +29 -2
- package/dist/commands/market-authoring.js +348 -7
- package/dist/commands/market-authoring.js.map +1 -1
- 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 +400 -16
- package/dist/commands/market.js +1802 -146
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/mcp.d.ts +60 -25
- package/dist/commands/mcp.js +251 -64
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/observe.category.test.d.ts +1 -0
- package/dist/commands/observe.category.test.js +59 -0
- package/dist/commands/observe.category.test.js.map +1 -0
- package/dist/commands/observe.d.ts +3 -0
- package/dist/commands/observe.js +7 -5
- package/dist/commands/observe.js.map +1 -1
- package/dist/commands/observe.title.test.d.ts +1 -0
- package/dist/commands/observe.title.test.js +37 -0
- package/dist/commands/observe.title.test.js.map +1 -0
- 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 +171 -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 +11 -1
- package/dist/commands/pods.js +129 -131
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +62 -0
- package/dist/commands/proposals-actions.js +143 -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 +579 -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-feed-wait.d.ts +48 -0
- package/dist/commands/session-feed-wait.js +261 -0
- package/dist/commands/session-feed-wait.js.map +1 -0
- package/dist/commands/session-post.d.ts +40 -0
- package/dist/commands/session-post.js +96 -0
- package/dist/commands/session-post.js.map +1 -0
- package/dist/commands/session-wait.d.ts +116 -0
- package/dist/commands/session-wait.js +224 -0
- package/dist/commands/session-wait.js.map +1 -0
- package/dist/commands/sessions.d.ts +54 -0
- package/dist/commands/sessions.js +501 -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-commands.d.ts +2 -0
- package/dist/commands/skills-commands.js +9 -1
- package/dist/commands/skills-commands.js.map +1 -1
- package/dist/commands/skills-commands.test.d.ts +1 -0
- package/dist/commands/skills-commands.test.js +57 -0
- package/dist/commands/skills-commands.test.js.map +1 -0
- package/dist/commands/skills.js +16 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/status.d.ts +1 -4
- package/dist/commands/status.js +6 -35
- 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 +112 -0
- package/dist/commands/tracks.js +543 -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 +41 -3
- package/dist/commands/upload.js +120 -18
- package/dist/commands/upload.js.map +1 -1
- 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 +30 -3
- package/dist/commands/whoami.js +186 -23
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/worker-accounts.d.ts +149 -0
- package/dist/commands/worker-accounts.js +339 -0
- package/dist/commands/worker-accounts.js.map +1 -0
- package/dist/commands/worker-accounts.test.d.ts +1 -0
- package/dist/commands/worker-accounts.test.js +224 -0
- package/dist/commands/worker-accounts.test.js.map +1 -0
- package/dist/commands/worker.d.ts +331 -0
- package/dist/commands/worker.js +1067 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/commands/worker.test.d.ts +1 -0
- package/dist/commands/worker.test.js +427 -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 +1043 -186
- 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 +136 -0
- package/dist/lib/agent-door.js +429 -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 +17 -11
- package/dist/lib/auth.js +47 -64
- 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/box/egress.d.ts +82 -0
- package/dist/lib/box/egress.js +264 -0
- package/dist/lib/box/egress.js.map +1 -0
- package/dist/lib/box/evidence.d.ts +86 -0
- package/dist/lib/box/evidence.js +121 -0
- package/dist/lib/box/evidence.js.map +1 -0
- package/dist/lib/box/job-server.d.ts +72 -0
- package/dist/lib/box/job-server.js +246 -0
- package/dist/lib/box/job-server.js.map +1 -0
- package/dist/lib/box/provisioner.d.ts +83 -0
- package/dist/lib/box/provisioner.js +312 -0
- package/dist/lib/box/provisioner.js.map +1 -0
- package/dist/lib/box/proxmox.d.ts +112 -0
- package/dist/lib/box/proxmox.js +211 -0
- package/dist/lib/box/proxmox.js.map +1 -0
- package/dist/lib/box/wire.d.ts +98 -0
- package/dist/lib/box/wire.js +70 -0
- package/dist/lib/box/wire.js.map +1 -0
- package/dist/lib/capture-lane.d.ts +6 -5
- package/dist/lib/capture-lane.js +6 -5
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/capture-structure.d.ts +230 -11
- package/dist/lib/capture-structure.js +251 -13
- package/dist/lib/capture-structure.js.map +1 -1
- 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/client-header.test.d.ts +1 -0
- package/dist/lib/client-header.test.js +85 -0
- package/dist/lib/client-header.test.js.map +1 -0
- package/dist/lib/conversation-headers.d.ts +33 -0
- package/dist/lib/conversation-headers.js +69 -0
- package/dist/lib/conversation-headers.js.map +1 -0
- package/dist/lib/cp-packages.d.ts +167 -11
- package/dist/lib/cp-packages.js +253 -21
- package/dist/lib/cp-packages.js.map +1 -1
- package/dist/lib/credential-class.d.ts +144 -0
- package/dist/lib/credential-class.js +138 -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/goal-words.d.ts +38 -0
- package/dist/lib/goal-words.js +112 -0
- package/dist/lib/goal-words.js.map +1 -0
- package/dist/lib/hub-client.d.ts +57 -15
- package/dist/lib/hub-client.js +396 -82
- package/dist/lib/hub-client.js.map +1 -1
- 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 +24 -0
- package/dist/lib/init-handoff.js +26 -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 +68 -0
- package/dist/lib/key-source.js +109 -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 +25 -0
- package/dist/lib/knowledge-title.js +47 -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 +49 -0
- package/dist/lib/mcp-bridge.js +180 -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 +118 -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/openclaw.js +3 -2
- package/dist/lib/openclaw.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-moved.d.ts +70 -0
- package/dist/lib/pod-moved.js +146 -0
- package/dist/lib/pod-moved.js.map +1 -0
- package/dist/lib/pod-reach.d.ts +39 -0
- package/dist/lib/pod-reach.js +117 -0
- package/dist/lib/pod-reach.js.map +1 -0
- package/dist/lib/pod-reach.test.d.ts +1 -0
- package/dist/lib/pod-reach.test.js +67 -0
- package/dist/lib/pod-reach.test.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 +74 -112
- package/dist/lib/pod.js +146 -415
- 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/register-claude-code-mcp.test.d.ts +1 -0
- package/dist/lib/register-claude-code-mcp.test.js +78 -0
- package/dist/lib/register-claude-code-mcp.test.js.map +1 -0
- package/dist/lib/review-credential.d.ts +119 -0
- package/dist/lib/review-credential.js +149 -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-feed.d.ts +185 -0
- package/dist/lib/session-feed.js +257 -0
- package/dist/lib/session-feed.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 +152 -10
- package/dist/lib/targets.js +974 -325
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/template-file.d.ts +4 -0
- package/dist/lib/template-file.js.map +1 -1
- 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/lib/wake-hook-settings.d.ts +57 -0
- package/dist/lib/wake-hook-settings.js +153 -0
- package/dist/lib/wake-hook-settings.js.map +1 -0
- package/dist/lib/wake-state.d.ts +65 -0
- package/dist/lib/wake-state.js +122 -0
- package/dist/lib/wake-state.js.map +1 -0
- package/dist/utils/logger.js +5 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +26 -17
- package/skills/README.md +13 -11
- package/skills/agent-os/SKILL.md +214 -99
- package/skills/manifest.json +1 -1
- package/skills/onboard/SKILL.md +55 -26
- package/skills/synap/README.md +5 -8
- package/skills/synap/SKILL.md +1149 -289
- 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 +5 -0
- package/skills/synap/cli-operations.md +24 -18
- package/skills/synap/code-skills.md +70 -0
- package/skills/synap/concepts.md +36 -0
- package/skills/synap/content-os.md +10 -1
- package/skills/synap/creative-loop.md +15 -10
- package/skills/synap/crm.md +21 -52
- package/skills/synap/document-embeds.md +143 -47
- package/skills/synap/escalation-ladder.md +20 -10
- package/skills/synap/focus-sessions.md +56 -21
- package/skills/synap/from-intent.md +158 -0
- package/skills/synap/governance-rules.md +5 -5
- 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 +34 -16
- package/skills/synap/linking.md +42 -41
- package/skills/synap/mcp-remote-servers.md +64 -0
- package/skills/synap/mental-model.md +17 -15
- package/skills/synap/operating-mode-rules.md +2 -2
- package/skills/synap/processes.md +118 -0
- package/skills/synap/quick-reference.md +7 -2
- 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 +110 -0
- package/skills/synap/worked-examples.md +4 -5
- package/skills/synap/workspace-design.md +15 -11
- package/skills/synap/writes.md +105 -25
- package/skills/synap/writing-titles.md +63 -0
- package/skills/synap-app/SKILL.md +149 -67
- package/skills/synap-app/_skill.yaml +1 -1
- package/skills/synap-app/creating-the-base-app.md +12 -7
- package/skills/synap-app/governance.md +27 -16
- package/skills/synap-app/install-commands.md +18 -9
- package/skills/synap-app/overview.md +16 -9
- package/skills/synap-app/using-the-sdk.md +75 -25
- 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 +306 -16
- package/skills/synap-market/_skill.yaml +1 -1
- package/skills/synap-market/author-and-publish.md +145 -8
- package/skills/synap-market/governance-and-catalog.md +7 -0
- package/skills/synap-market/install.md +79 -1
- package/skills/synap-market/overview.md +74 -6
- 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/box/runner.py +206 -0
- 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/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -1261
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -1647
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -1647
- package/node_modules/@synap/hub-rest-client/dist/index.js +0 -1231
- package/node_modules/@synap/hub-rest-client/package.json +0 -45
- package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1631
- package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
- package/node_modules/@synap/hub-rest-client/src/index.ts +0 -153
- package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -133
- package/node_modules/@synap/hub-rest-client/src/types.ts +0 -1299
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Remote MCP servers — how a pod registers, approves and governs them
|
|
2
|
+
|
|
3
|
+
Load this before you suggest connecting an external MCP server to a pod, or when a server's tools do not
|
|
4
|
+
show up. Every claim here is read from the code: the `mcp_servers` table
|
|
5
|
+
(`packages/database/src/schema/mcp-servers.ts`), the settings door (`routers/mcp-servers.ts`), the
|
|
6
|
+
capability installer (`services/capabilities/create-from-definition.ts`) and the IS adapter.
|
|
7
|
+
|
|
8
|
+
### The row
|
|
9
|
+
|
|
10
|
+
One row per server in `mcp_servers`, scoped to a space (`workspaceId`) or pod-wide (null). `slug` is
|
|
11
|
+
lowercase `a-z0-9-`, unique per space; the IS names each tool `mcp_<slug>_<tool>`, so a space's server
|
|
12
|
+
overrides a pod-wide one with the same slug.
|
|
13
|
+
|
|
14
|
+
| Field | Meaning |
|
|
15
|
+
| ------------ | ------------------------------------------------------------------------------------------ |
|
|
16
|
+
| `transport` | `http` (needs `url`) or `stdio` (needs `command` + `args`, runs on the IS host) |
|
|
17
|
+
| `auth` | http only: `{ credentialRef: "vault://<id>", header: "Authorization", prefix: "Bearer " }` |
|
|
18
|
+
| `toolPolicy` | `{ default: "governed" or "inline", inline: ["tool_a", …] }`; absent = governed |
|
|
19
|
+
| `approved` | false by default; the supply-chain gate |
|
|
20
|
+
| `enabled` | the owner's on/off switch |
|
|
21
|
+
|
|
22
|
+
### Secrets never sit on the row
|
|
23
|
+
|
|
24
|
+
`auth.credentialRef` points at a vault secret. The pod resolves it server-side on every call (never
|
|
25
|
+
cached), sends it to the IS as a header, and the agent never sees it. If it cannot be resolved for the
|
|
26
|
+
acting user or agent, the server is skipped and its tools simply do not appear: check the vault grant
|
|
27
|
+
before you blame the server.
|
|
28
|
+
|
|
29
|
+
### Governed by default
|
|
30
|
+
|
|
31
|
+
- A **governed** tool is never called directly: the IS routes it through the pod (`mcp://<slug>`),
|
|
32
|
+
where the capability gate runs it or files a proposal. For an agent, `proposed` is success.
|
|
33
|
+
- An **inline** tool is called directly by the IS. Declare `default: "inline"` only for a server that
|
|
34
|
+
exposes nothing but reads; for a mixed server, list its read tools in `inline`.
|
|
35
|
+
- No policy at all means governed. This is deliberate and fail-closed.
|
|
36
|
+
|
|
37
|
+
### Approval, and when it resets
|
|
38
|
+
|
|
39
|
+
- Tools reach an agent only when the server is **approved AND enabled** (and, in a channel that keeps
|
|
40
|
+
its own MCP list, only the servers that channel opted into). The list is cached for 30 seconds.
|
|
41
|
+
- In the space settings, tab MCP Servers: a space **owner or admin** adds, edits or deletes a server; only the space
|
|
42
|
+
**owner** approves it; a pod-wide server needs a pod admin to add or edit.
|
|
43
|
+
- Editing `url`, `command`, `args`, `env` or `transport` in the settings **resets approval** (compared by
|
|
44
|
+
value, so a rename or an enabled toggle does not). Re-approve after re-pointing a server.
|
|
45
|
+
- A capability (catalog or `market.install`) may declare `mcpServers[]` with `auth` and `toolPolicy`;
|
|
46
|
+
this is the only door that sets those two today (the settings form does not). Its install is the trust
|
|
47
|
+
decision: it may ship `approved: true`. Re-applying it converges url, auth and policy to the
|
|
48
|
+
template and only ever promotes approval, never revokes it.
|
|
49
|
+
|
|
50
|
+
### As an agent
|
|
51
|
+
|
|
52
|
+
You have no tool that registers a server. Propose it: a capability that declares the server (installed
|
|
53
|
+
through `market.install`, which files a proposal), or ask the person to add it in the space settings (MCP Servers). Never
|
|
54
|
+
ask for the secret in chat; it goes in the vault.
|
|
55
|
+
|
|
56
|
+
### Network: who must reach the URL
|
|
57
|
+
|
|
58
|
+
The **IS** opens the connection, not your machine. A `url` must be reachable from where the pod's IS runs.
|
|
59
|
+
|
|
60
|
+
**An unauthenticated dev MCP is never registered on a public URL.** Storybook's `/mcp`
|
|
61
|
+
(`http://localhost:6006/mcp`) and similar dev servers have no auth: reach them only over a private
|
|
62
|
+
network or a tunnel the IS is on (an SSH tunnel to a dev pod), keep them bound to loopback otherwise,
|
|
63
|
+
and prefer a static artifact (Storybook's `/manifests/components.json`) for agents on a remote pod. If
|
|
64
|
+
a server would need to be public to be reached, it needs `auth` first.
|
|
@@ -6,15 +6,15 @@ Synap is a typed knowledge graph. **Reading is one verb (`synap ask`) — it rou
|
|
|
6
6
|
|
|
7
7
|
Ask yourself: _who does this knowledge serve?_ **There is no private AI scratchpad** — structuring knowledge into a real lane IS your job. Never write a `note` (that's the human's raw inbox); always `capture` into a lane.
|
|
8
8
|
|
|
9
|
-
**Known fields → typed create.** If you already know the profileSlug and
|
|
9
|
+
**Known fields → typed create.** If you already know the profileSlug and values, use `synap create entity` / `synap_create_entity`. Reach for free-text `capture "…"` only for an unstructured blob you haven't parsed — it runs an AI pipeline that can degrade to one flat `note`. 'Always capture into a lane' means _don't leave it unstructured_, not _always use the free-text pipeline_.
|
|
10
10
|
|
|
11
|
-
| If it…
|
|
12
|
-
|
|
|
13
|
-
| **is about the CURRENT WORK** —
|
|
14
|
-
| **is GLOBAL truth** — a best-practice / runbook / how-to that holds across ALL projects
|
|
15
|
-
| **is about the USER** — how they work/talk/decide, their preferences, their life
|
|
11
|
+
| If it… | Lane | Where it goes | Governance |
|
|
12
|
+
| --------------------------------------------------------------------------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| **is about the CURRENT WORK** — a reusable conclusion or caveat in the project/task you're on | **Work** _(default)_ | a `knowledge` entity through server-derived Work placement (pin with `--workspace` only when you know the domain) | proposal-gated (it's the user's real data; the workspace IS the domain — Builder ≠ marketing) |
|
|
14
|
+
| **is GLOBAL truth** — a best-practice / runbook / how-to that holds across ALL projects | **Global** | pod-wide procedural `knowledge_keys` (`synap capture --global --type … [--key ns:slug]`) | reviewed for shared truth |
|
|
15
|
+
| **is about the USER** — how they work/talk/decide, their preferences, their life | **User** | pod-wide `user_observation` (`synap observe write` / `record_observation` tool) | inferences are **proposed** (you review); explicit "I always X" auto-saves — never model the user silently |
|
|
16
16
|
|
|
17
|
-
> **Why this matters:** writing to the wrong lane degrades the graph. A
|
|
17
|
+
> **Why this matters:** writing to the wrong lane degrades the graph. A caution you learned about the **current project** is **Work** (let the server route it, or pin the known domain explicitly). A best-practice that holds **everywhere** is **Global** (`--global`, pod-wide). A fact about **how the user works** is **User** (pod-wide, inferences proposed). `synap capture` echoes which lane + governance it used; check it.
|
|
18
18
|
|
|
19
19
|
> **Read the write outcome — it guides your next move (it never blocks you).** Every write (`capture`, `observe`, `create entity`, `create relation`, `note`) reports one of two outcomes (and `--json` carries `"outcome"`):
|
|
20
20
|
>
|
|
@@ -23,6 +23,8 @@ Ask yourself: _who does this knowledge serve?_ **There is no private AI scratchp
|
|
|
23
23
|
|
|
24
24
|
> **Substrate names (tables under the hood):** _semantic_ = `entities` (the `knowledge` profile, workspace-scoped = domain separation), _episodic_ = `knowledge_facts`, _procedural_ = `knowledge_keys` (pod-wide runbooks). `ask` queries across them so you never pick on read.
|
|
25
25
|
|
|
26
|
+
**Facets (roles)** are hats on **any kind** (`applicableKinds`), not only person/company. “This item is an X” is `attach_facet`, not a new kind, until X has its own life. Widen the role when `kind_mismatch`. See `from-intent` + `extend-first`. What role, workspace, project, goal and template mean: `concepts` (the one glossary).
|
|
27
|
+
|
|
26
28
|
### Data layers — the graph itself
|
|
27
29
|
|
|
28
30
|
| Layer | What it is | When to use |
|
|
@@ -35,11 +37,11 @@ Ask yourself: _who does this knowledge serve?_ **There is no private AI scratchp
|
|
|
35
37
|
|
|
36
38
|
### Key profiles for AI use
|
|
37
39
|
|
|
38
|
-
| Profile slug | Scope | Who writes | Purpose
|
|
39
|
-
| ------------------ | --------- | -------------- |
|
|
40
|
-
| `note` | pod | **human only** | The human's raw "dump now, structure later" inbox. **The AI never writes a note** — structuring into a lane is its job; use `capture` instead.
|
|
41
|
-
| `knowledge` | workspace | AI |
|
|
42
|
-
| `user_observation` | pod | AI only | Durable user model — habits, communication style, preferences
|
|
43
|
-
| `decision` | pod | human + AI | Architectural decisions with rationale
|
|
44
|
-
| `research` | pod | AI | Investigation with sources + conclusion
|
|
45
|
-
| `question` | pod | human + AI | Open inquiry, closed when a decision answers it
|
|
40
|
+
| Profile slug | Scope | Who writes | Purpose |
|
|
41
|
+
| ------------------ | --------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
42
|
+
| `note` | pod | **human only** | The human's raw "dump now, structure later" inbox. **The AI never writes a note** — structuring into a lane is its job; use `capture` instead. |
|
|
43
|
+
| `knowledge` | workspace | AI | Reusable **Insights** and **Cautions** — one required `knowledgeForm`; an optional `ek_claim` is only a compact summary and long form belongs in the linked Markdown document. Decisions and sources remain linked first-class entities. DOMAIN = the workspace. Cross-project runbooks go to `knowledge_keys` via `--global`. |
|
|
44
|
+
| `user_observation` | pod | AI only | Durable user model — habits, communication style, preferences |
|
|
45
|
+
| `decision` | pod | human + AI | Architectural decisions with rationale |
|
|
46
|
+
| `research` | pod | AI | Investigation with sources + conclusion |
|
|
47
|
+
| `question` | pod | human + AI | Open inquiry, closed when a decision answers it |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Synap-first operating mode
|
|
2
2
|
|
|
3
|
-
> **MCP clients** (Claude Desktop, Raycast,
|
|
3
|
+
> **MCP clients** (Claude Desktop, Raycast, any agent with MCP): use `synap_*` tool names — they wrap auth and governance automatically. **REST / HTTP clients**: use the endpoints below.
|
|
4
4
|
|
|
5
5
|
These five rules override default assistant behavior when connected to a Synap pod:
|
|
6
6
|
|
|
@@ -33,7 +33,7 @@ Before answering any question about the user's projects, tasks, contacts, decisi
|
|
|
33
33
|
When the user shares a decision, task, meeting outcome, contact, or any durable information: save it. Don't ask "should I save this?" for obviously important information. Use:
|
|
34
34
|
|
|
35
35
|
- entities for structured data (tasks, people, projects, decisions)
|
|
36
|
-
- `
|
|
36
|
+
- `synap_remember_fact` for preferences, context, loose facts (not `POST /api/hub/memory` — that door needs an unrestricted key)
|
|
37
37
|
- documents for long-form notes (meeting notes, research, writeups)
|
|
38
38
|
|
|
39
39
|
**4. Link everything**
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Processes — a playbook that follows a kind's lifecycle
|
|
2
|
+
|
|
3
|
+
<!-- brief:start -->
|
|
4
|
+
|
|
5
|
+
A process = `synap_create_playbook` with `subjectProfileSlug`; it FOLLOWS the
|
|
6
|
+
lifecycle the kind or role declares (omit `statusProperty`, or name that same
|
|
7
|
+
property). Each stage's `subjectStatus` is an EXISTING option of it (read it
|
|
8
|
+
with `synap_list_profiles` first — never invent one); `gate: {kind: 'human'}` at
|
|
9
|
+
every commitment, `onFail: {toStage}` for rework; typed `expectedOutputs`
|
|
10
|
+
(`kind`, `label`, `relationToSubject`); workers = `activators` (`on`, `size`,
|
|
11
|
+
default `mode: 'propose'`). What you create is POD-LOCAL, never an official
|
|
12
|
+
template.
|
|
13
|
+
|
|
14
|
+
<!-- brief:end -->
|
|
15
|
+
|
|
16
|
+
## Writing a process (a playbook that follows a kind's lifecycle)
|
|
17
|
+
|
|
18
|
+
The status belongs to the **kind or role**, never to a playbook. Its profile declares the lifecycle ONCE, in its
|
|
19
|
+
template:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
lifecycle:
|
|
23
|
+
property: post-status
|
|
24
|
+
options:
|
|
25
|
+
- { key: Idea, category: open }
|
|
26
|
+
- { key: Published, category: done }
|
|
27
|
+
- { key: Archived, category: lost, humanOnly: true }
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Every option has one category (`open · active · paused · done · lost`); rules read the category, names stay free.
|
|
31
|
+
`humanOnly` marks an option no agent sets; an agent's move into `done` or `lost` proposes. Every move goes through
|
|
32
|
+
the one status door (`moveStatus`; an agent sends `update_entity` with `expectedStatus`).
|
|
33
|
+
|
|
34
|
+
A playbook that works that lifecycle is a **process**: it FOLLOWS it. Its stages name options of it, its workers
|
|
35
|
+
start on it, and a person decides at the moments that commit the business. It never keeps a second status field.
|
|
36
|
+
The reference is Content OS "Produce Content" (`synap-app/packages/workspace-templates/src/content-os.yaml`).
|
|
37
|
+
|
|
38
|
+
**Official vs pod-local.** An official template or capability lives ONLY in the catalog
|
|
39
|
+
(`synap-app/packages/workspace-templates/`, by kind) and is published with
|
|
40
|
+
`synap catalog publish --official` (CI on main). A playbook, kind or automation an agent creates on a pod
|
|
41
|
+
(`synap_create_playbook`, `synap_define_kind`, …) is **pod-local**: it never reaches the catalog. To make it
|
|
42
|
+
official, write it into the catalog file and publish.
|
|
43
|
+
|
|
44
|
+
| Field | Where | Rule |
|
|
45
|
+
| ------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
46
|
+
| `subjectProfile.profileSlug` | playbook | The kind or role the process works. |
|
|
47
|
+
| `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. |
|
|
48
|
+
| `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. |
|
|
49
|
+
| `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. |
|
|
50
|
+
| `stages[].onFail` | stage | `{toStage: <key>}` — where a rejected gate sends the run (rework loop). |
|
|
51
|
+
| `stages[].criteria` | stage | 2–5 binary statements; `check.kind` evidence (cheapest) · capability · judge · human. |
|
|
52
|
+
| `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. |
|
|
53
|
+
| `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. |
|
|
54
|
+
| `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. |
|
|
55
|
+
| `goalTemplate` | playbook | Placeholders are `{paramName}`. Never `@{arg:…}` (read-only legacy). |
|
|
56
|
+
| `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. |
|
|
57
|
+
|
|
58
|
+
Human moments use an `ask` on an owed slot: `confirm` / `choose` (one `recommended`) / `form` / `act` / `provide`
|
|
59
|
+
(connection, file or secret through the vault). Never ask for a secret in a form.
|
|
60
|
+
|
|
61
|
+
Validation: `synap catalog validate` (process contract, goal grammar, lifecycle coverage ratchet — the count of
|
|
62
|
+
lifecycle kinds with no process may only go down).
|
|
63
|
+
|
|
64
|
+
## Declaring it over MCP
|
|
65
|
+
|
|
66
|
+
`synap_create_playbook` takes the contract as-is. Before calling it, read the
|
|
67
|
+
subject kind (`synap_list_profiles`) and copy the options of its lifecycle
|
|
68
|
+
property exactly. Over MCP you cannot declare or change a lifecycle; it comes
|
|
69
|
+
with the kind's template.
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"name": "Draft a post",
|
|
74
|
+
"goalTemplate": "Draft {post}",
|
|
75
|
+
"params": [{ "name": "post", "type": "entity", "required": true }],
|
|
76
|
+
"subjectProfileSlug": "post",
|
|
77
|
+
"activators": [
|
|
78
|
+
{
|
|
79
|
+
"on": "enters_status",
|
|
80
|
+
"status": "Briefed",
|
|
81
|
+
"size": "per_thing",
|
|
82
|
+
"mode": "propose"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"stages": [
|
|
86
|
+
{
|
|
87
|
+
"key": "draft",
|
|
88
|
+
"name": "Draft",
|
|
89
|
+
"category": "started",
|
|
90
|
+
"subjectStatus": "In Draft",
|
|
91
|
+
"expectedOutputs": [
|
|
92
|
+
{
|
|
93
|
+
"kind": "document",
|
|
94
|
+
"label": "Draft",
|
|
95
|
+
"relationToSubject": "made_for"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"key": "review",
|
|
101
|
+
"name": "Review",
|
|
102
|
+
"category": "started",
|
|
103
|
+
"subjectStatus": "Review",
|
|
104
|
+
"gate": { "kind": "human" },
|
|
105
|
+
"onFail": { "toStage": "draft" }
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
These are the Content OS post options; use the ones the kind really has. A
|
|
112
|
+
batch worker looks like `{ "on": "schedule", "cron": "0 8 * * 1", "status":
|
|
113
|
+
"Idea", "mode": "propose" }` (one session over every post in Idea, weekly) or
|
|
114
|
+
`{ "on": "count", "status": "Review", "min": 5, "mode": "propose" }`.
|
|
115
|
+
An agent call lands as a proposal (`status: "proposed"` is success). The
|
|
116
|
+
playbook lives on this pod only; to make it an official template, a developer
|
|
117
|
+
writes it into the catalog and publishes it with
|
|
118
|
+
`synap catalog publish --official`.
|
|
@@ -8,11 +8,15 @@ synap use <workspace-name-or-id> # focus a workspace (this
|
|
|
8
8
|
synap create entity --profile=task --name="…" --props='{"status":"todo","priority":"high"}' --json
|
|
9
9
|
synap set entity <id> --props='{"status":"done"}' --json # merge-patch (only changed keys)
|
|
10
10
|
synap ask "your question" --json # THE read verb — routes to the right store(s) + shows which answered
|
|
11
|
-
synap
|
|
11
|
+
synap create entity --profile=knowledge --name="…" --props='{"knowledgeForm":"fact|caution|convention","ek_claim":"…"}' --content="…" --json
|
|
12
12
|
synap capture --global --type=reference --claim="…" --json # Global lane — pod-wide cross-cutting runbook (knowledge_keys)
|
|
13
13
|
synap observe write "…" --json # User lane — durable user model (inferences proposed)
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
**Titles:** ≤ 80 characters, the lasting thing, no status words, ids or "…"; the
|
|
17
|
+
receipt's `titleLint` says what to rewrite. Rules + what counts as knowledge:
|
|
18
|
+
`synap_load_skill("system/synap/writing-titles")`.
|
|
19
|
+
|
|
16
20
|
**The canonical verbs:** `ask` (read) · `capture` (structured write — pick a lane:
|
|
17
21
|
Work default / `--global` / `observe` for User) · `orient` (bootstrap). `note` exists
|
|
18
22
|
for the HUMAN's raw "dump now, structure later" inbox — **the AI always `capture`s
|
|
@@ -34,10 +38,11 @@ POST /api/hub/relations body: { userId, sourceEntityId, targetEntityId
|
|
|
34
38
|
GET /api/hub/entities?q=…&profileSlug=task&workspaceId=…
|
|
35
39
|
GET /api/hub/entities/{id}/connections?userId=…
|
|
36
40
|
POST /api/hub/knowledge/ask body: { query, workspaceId?, limit? } ← ONE read door, routes across substrates
|
|
37
|
-
POST /api/hub/memory body: { userId, fact }
|
|
38
41
|
GET /api/hub/memory?userId=…&query=…
|
|
39
42
|
```
|
|
40
43
|
|
|
44
|
+
A fact about the user: MCP `synap_remember_fact` (a governed write). `POST /api/hub/memory` acts for the whole owner, so it needs an unrestricted key — a restricted agent key (the AI preset) is refused.
|
|
45
|
+
|
|
41
46
|
**Profile schemas are runtime-discovered — never hardcoded:**
|
|
42
47
|
|
|
43
48
|
```bash
|
package/skills/synap/reading.md
CHANGED
|
@@ -7,11 +7,13 @@ the low-level doors below only when you deliberately want a single substrate or
|
|
|
7
7
|
specific shape (a graph traversal, a typed-entity filter, an entity's neighborhood).
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
# THE read door — routes across semantic / procedural / episodic, tells you which answered
|
|
10
|
+
# THE read door — routes across semantic / procedural / episodic / library, tells you which answered
|
|
11
11
|
POST /api/hub/knowledge/ask body: { query, workspaceId?, limit? }
|
|
12
12
|
→ { query, routedTo: [...], primary, answers: [{ substrate, items, status }], degraded, understanding, verdict }
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
A link the person kept is in their Library: `ask` finds it (a `library` block — title, source URL, a snippet of what was read, who read it; `degraded: ["library"]` means the Library could not be read, never "nothing kept"). To read any URL use the `read_webpage` intent (builtin `web.read`).
|
|
16
|
+
|
|
15
17
|
Low-level doors (`ask` routes to these — graph-based, not semantic; type filter →
|
|
16
18
|
relations → neighborhood):
|
|
17
19
|
|
package/skills/synap/reflexes.md
CHANGED
|
@@ -1,46 +1,16 @@
|
|
|
1
|
-
## Reflexes —
|
|
1
|
+
## Reflexes — what holds on every door
|
|
2
2
|
|
|
3
|
-
> Canonical source — MCP instructions
|
|
3
|
+
> Canonical source — the MCP `instructions` field is derived from this file and composed with live grounding under ONE 2 KB budget (pinned by `instructions-budget.test.ts`). Most important first. Depth belongs in a skill, never here.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
(the source of truth about their life, work, projects, people, and preferences).
|
|
7
|
-
Two reflexes hold on every session, on every door (MCP, IS, CLI, HTTP):
|
|
5
|
+
The user's Synap pod: source of truth. Tool names below are stems; your door may prefix them (`pod__ask`).
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
second brain grows.
|
|
7
|
+
1. **Recall first.** Before answering or creating, `ask`.
|
|
8
|
+
2. **Capture after.** A durable fact, decision, person, task: `capture`; about the user: `remember_fact`. No private scratchpad.
|
|
9
|
+
3. **Orient once.** `orient`: pending review (raise first), open sessions.
|
|
10
|
+
4. **Work in a session.** `start_session` or resume (playbook `templateId`); goal (TRACK): `list_tracks`, else `start_track`; work in it = `start_session` + `trackId`; 2-5 `criteria`; status moves carry `expectedStatus`; person-only: `owner:'human'` slot + `blockedReason` + `ask` (confirm/choose with 1 `recommended`/form/act/provide), then `wait_for_answer` if listed; post progress, questions and results in its room (`post_message` to `session.channelId`); your own chat may repeat them (`Q-<id8>`); chat answer → `relay_answer`, words verbatim; PR = outcome `pr-<repo>-<n>` (`ref.url`); `evaluate_session`, close open asks, `complete_session`.
|
|
11
|
+
5. **Never guess a project**: pin only what the user names (`set_*_focus`).
|
|
12
|
+
6. **`proposed` is success**: keep going, never retry.
|
|
13
|
+
7. **Discover before inventing**: `list_profiles` / `list_capabilities`; **extend** (facet, overlay, parent), never a twin.
|
|
14
|
+
8. **One space per domain**; projects filter it (`file_into_project`, `project_use_workspace`).
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
workspaces, projects, and entity types before acting.
|
|
21
|
-
|
|
22
|
-
**Writes are governed: a `"proposed"` response is normal, never an error.** It
|
|
23
|
-
means the write is queued for the user's review — like a PR, not a failure. Keep
|
|
24
|
-
working; see `writes.md` for the full governance contract and `inline-patterns.md`
|
|
25
|
-
for how to surface a proposal's review link in a Companion reply.
|
|
26
|
-
|
|
27
|
-
**No private scratchpad.** Everything you learn goes into the shared graph, not a hidden note. Capture a proven tool-fact into `knowledge` immediately; PROMOTE it into a curated skill only once it's proven reusable — a skill is a versioned artifact (one capability, when-to-use + do/don't), never an append-anything log.
|
|
28
|
-
|
|
29
|
-
## Escalation ladder (keep in a corner of your head)
|
|
30
|
-
|
|
31
|
-
You can always escalate — never dead-end on "I can't." Full detail: `escalation-ladder.md`.
|
|
32
|
-
|
|
33
|
-
- **L0 Reflexes** — recall before, capture after, proposed ≠ error
|
|
34
|
-
- **L1 OPERATE on data** — capture, create_entity, link, attach KNOWN facets, sessions
|
|
35
|
-
- **L2 DISCOVER before invent** — list_profiles, list_capabilities, market.search (capability|template|automation|cell)
|
|
36
|
-
- **L3 MUTATE meta-model (proposal-gated)** — only if L2 empty for the need:
|
|
37
|
-
define_role, create_property_def/profile, create_view, create_workspace, market.install.
|
|
38
|
-
**Template FIRST for new domains:** market.search(kind:template) before freehand create_workspace
|
|
39
|
-
- **L4 CRYSTALLIZE after proof** — promote_session_to_playbook, promote_cell_to_renderer, create_playbook.
|
|
40
|
-
Never crystallize a one-off that hasn't succeeded once
|
|
41
|
-
|
|
42
|
-
**Gates:**
|
|
43
|
-
|
|
44
|
-
- Blocked / can't express need → L2 then L3 propose (never dead-end error; never silent invent)
|
|
45
|
-
- Success / repeatable pattern → one structural suggestion (question first if speculative)
|
|
46
|
-
- Capture placement routes to EXISTING lenses only — never invent a workspace from capture
|
|
16
|
+
Depth: `load_skill` `system/synap/concepts`, `work-model`, `focus-sessions`, `from-intent`, `escalation-ladder`, `writes`.
|
|
@@ -10,6 +10,12 @@ ViewFrame is the standard way to create custom data visualizations in Synap. Use
|
|
|
10
10
|
| User asks for a specific chart type, map, 3D scene, or custom layout | Generate a ViewFrame widget |
|
|
11
11
|
| User says "show X as a [funnel / heatmap / treemap / scatter / globe]" | Generate a ViewFrame widget |
|
|
12
12
|
|
|
13
|
+
### Default vs. generated — never the reflex, always the explicit ask
|
|
14
|
+
|
|
15
|
+
Every kind already renders as a familiar, kind-shaped card — its built-in `entity-card` (small block) / `entity-detail` (full page) / `entity-profile` (dashboard) renderer. That built-in is the DEFAULT for everyone, including brand-new user-defined kinds (which get an automatic card built from the schema — no generation needed). **Never generate a frame renderer as a kind's default presentation.** Generate one ONLY when the user explicitly asks for a custom look — a specific chart type, a redesigned card, a bespoke layout — and bind it PER KIND (one profile's one renderer slot), never as a blanket replacement for every kind. The sandbox's egress holes (see Security below) are still open, so treat "generate a view/card" as a deliberate, scoped request, not something to reach for by default.
|
|
16
|
+
|
|
17
|
+
After binding, tell the user where the result lives: **"⋯ → Customize display"** on that kind's page (Renderer Studio itself now lives in Builder mode / Settings, not a designer mode you build). That is the one place a human reverts it or picks something else — never invent a second, agent-only way to switch it back.
|
|
18
|
+
|
|
13
19
|
### What ViewFrame Is
|
|
14
20
|
|
|
15
21
|
- A sandboxed iframe that renders **one ES module** that default-exports a React component (or plain JS)
|
|
@@ -17,7 +23,7 @@ ViewFrame is the standard way to create custom data visualizations in Synap. Use
|
|
|
17
23
|
`deps` map, but the current Hub `cells/define` persistence path does not yet
|
|
18
24
|
retain that map, so external runtime dependencies are not a reliable contract.
|
|
19
25
|
- The host injects a `SynapWidget` bridge for data access and shell actions
|
|
20
|
-
- Security: `sandbox="allow-scripts allow-modals allow-popups
|
|
26
|
+
- Security: `sandbox="allow-scripts allow-modals"` — no `allow-popups`, no `allow-same-origin`, no cookies, no pod token
|
|
21
27
|
|
|
22
28
|
### Authoring contract
|
|
23
29
|
|
|
@@ -32,7 +38,7 @@ A ViewFrame cell is **one self-contained ES module** (inline in `rendererSource`
|
|
|
32
38
|
|
|
33
39
|
**Use `POST /api/hub/cells/define` — this is the canonical Hub Protocol path for AI-generated cells.**
|
|
34
40
|
|
|
35
|
-
It is idempotent (upserts on typeKey)
|
|
41
|
+
It is idempotent (upserts on typeKey) and pod-global by default (no workspaceId needed). **It IS governed for agent callers** — `POST /cells/define` runs `checkPermissionOrPropose({ resource: "cell", action: "define", trustLevel: "generated" })`; a `status: "proposed"` response is the normal outcome for AI-generated renderer source, not an error — surface `reviewUrl` and keep going. Only an operator-initiated define auto-applies.
|
|
36
42
|
|
|
37
43
|
```
|
|
38
44
|
POST /api/hub/cells/define
|
|
@@ -100,7 +106,7 @@ The cell appears immediately in the side panel with "Q2 Revenue Report" as the t
|
|
|
100
106
|
|
|
101
107
|
> **Note:** `POST /api/hub/widget-definitions` (tRPC path) still works but is the internal/admin path. Use `POST /api/hub/cells/define` for all agent-generated cells.
|
|
102
108
|
|
|
103
|
-
### CLI commands (when running as Claude Code
|
|
109
|
+
### CLI commands (when running as Claude Code or another terminal agent)
|
|
104
110
|
|
|
105
111
|
```bash
|
|
106
112
|
# Build a multi-file cell source into a single ES module bundle
|
|
@@ -120,7 +126,7 @@ synap doc create --title "Q2 Report" --file ./report.md
|
|
|
120
126
|
synap doc update <docId> --file ./updated-report.md
|
|
121
127
|
|
|
122
128
|
# Arrange widgets on an existing bento view
|
|
123
|
-
|
|
129
|
+
echo '[{"key":"generated:my-chart","x":0,"y":0,"w":8,"h":6}]' | synap view arrange <viewId>
|
|
124
130
|
```
|
|
125
131
|
|
|
126
132
|
### The SynapWidget Bridge (inside the iframe)
|
|
@@ -157,6 +163,33 @@ SynapWidget.onInit(async ({ config, context }) => {
|
|
|
157
163
|
|
|
158
164
|
All `query()` calls return a Promise. Entity shape: `{ id, title, profileSlug, properties, createdAt, … }`.
|
|
159
165
|
|
|
166
|
+
#### Intent reads (a kind's pipeline, goal, needs-you, sessions)
|
|
167
|
+
|
|
168
|
+
The same reads a kind's own page makes, so a frame can be that kind's dashboard. The host stamps the lens (the active space and project); a `workspaceId` / `projectId` you pass is ignored. `trackId` narrows to one goal.
|
|
169
|
+
|
|
170
|
+
| Operation | Params | Returns |
|
|
171
|
+
| ---------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
172
|
+
| `lifecycle.board` | `profileSlug` (required), `trackId`, `windowDays`, `firstN`, `column` + `cursor`, `limit`, `workedBy` | `{ lifecycle: { profileSlug, property, options }, columns: [{ key, category, count, stuck, items: [{ id, name, status, since, stuck, workedBy? }] }], live, total, doneWindowed, lostWindowed, suggestedShape, window, nextCursor }` |
|
|
173
|
+
| `lifecycle.throughput` | `profileSlug`, `trackId`, `bucket` (`day` · `week` · `month`), `count` | `{ bucket, since, buckets: [{ bucketStart, done, lost }] }`, oldest first, zeros included |
|
|
174
|
+
| `attention.needsYou` | `profileSlug`, `trackId`, `limit` | `{ signals: [{ id, kind, title, count, occurredAt, target }] }` |
|
|
175
|
+
| `attention.count` | `profileSlug`, `trackId` | `{ needsYou, decisions, blocked, review, captures, truncated, … }` |
|
|
176
|
+
| `sessions.list` | `profileSlug` (its things) or `entityId` (one thing), `status`, `kind` (default `work`), `limit` | `[{ id, title, goal, status, currentStage, progress, startedAt, … }]` |
|
|
177
|
+
|
|
178
|
+
```js
|
|
179
|
+
const board = await SynapWidget.query("lifecycle.board", {
|
|
180
|
+
profileSlug: "post",
|
|
181
|
+
firstN: 5,
|
|
182
|
+
});
|
|
183
|
+
if (board?.error) return showError(board.error); // 404 = unknown kind, 412 = no lifecycle
|
|
184
|
+
const month = await SynapWidget.query("lifecycle.throughput", {
|
|
185
|
+
profileSlug: "post",
|
|
186
|
+
bucket: "month",
|
|
187
|
+
count: 1,
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
A failed read returns `{ error }`. Show it as a failure, never as an empty board. Moves still go through `update_entity` (the lifecycle property), so the status door and governance apply.
|
|
192
|
+
|
|
160
193
|
#### Mutations (governance-gated — return `{ status: "approved" | "proposed" | "denied" }`)
|
|
161
194
|
|
|
162
195
|
```js
|
|
@@ -182,7 +215,7 @@ await SynapWidget.mutate("delete_entity", { id: "uuid" });
|
|
|
182
215
|
await SynapWidget.mutate("create_relation", {
|
|
183
216
|
sourceEntityId: "uuid-a",
|
|
184
217
|
targetEntityId: "uuid-b",
|
|
185
|
-
type: "
|
|
218
|
+
type: "relates_to",
|
|
186
219
|
});
|
|
187
220
|
```
|
|
188
221
|
|
|
@@ -77,7 +77,7 @@ User: _"I'm trying to figure out whether we should build our own orchestrator or
|
|
|
77
77
|
} }
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
4. When the user
|
|
80
|
+
4. When the user picked through an answered `confirm`/`choose` ask, the pod ALREADY filed the decision (`slot.decisionId`) — link that one, never create a twin. Picked in plain chat? Create it yourself, linked to the question:
|
|
81
81
|
|
|
82
82
|
```json
|
|
83
83
|
POST /api/hub/entities
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
## Work model — how work is shaped on a pod
|
|
2
|
+
|
|
3
|
+
Load this before you plan, start or run work, or author a process. The long form is the pod document "The Synap work model" (36878a70-6cbb-4122-8bfa-288fdbd65218); the words are in `concepts`.
|
|
4
|
+
|
|
5
|
+
### Why
|
|
6
|
+
|
|
7
|
+
A process is the life of a **thing**, not a script. A lead, a post or a feature has ONE status. Boards, workers, sessions, goals and history read that status or move it through ONE door. So "when a post enters Review, run the review" is one rule, "how many leads reached Qualified this month" is a count, and a person and an agent can work the same thing without overwriting each other. Before, each playbook kept its own stages and status field, and the same fact lived in three places.
|
|
8
|
+
|
|
9
|
+
### The nouns
|
|
10
|
+
|
|
11
|
+
| Noun | What it is | Not |
|
|
12
|
+
| ------------------- | --------------------------------------------------------------------------------------------------------------------- | ----------------------------------- |
|
|
13
|
+
| **Project** | a commitment, and a lens across spaces | a method, a domain |
|
|
14
|
+
| **Goal** (optional) | in one project (a _track_ in tools): direction, criteria, the workers it turns on; its judge closes it with a verdict | a list of stages |
|
|
15
|
+
| **Thing** | any entity: one kind, maybe roles, one status per kind or role | a second entity for a hat |
|
|
16
|
+
| **Session** | the unit of work that closes: goal, criteria, room; one thing or a batch | a "run" because it follows a method |
|
|
17
|
+
|
|
18
|
+
Not nouns (nobody manages them as objects): a **pipeline** is a view of a lifecycle; a **worker** is configuration (a method + a trigger + a size); a **method** is a playbook a session may follow; a **check** is a recurring verification.
|
|
19
|
+
|
|
20
|
+
How they relate: a project files things; each kind or role declares one **lifecycle** (its status list); its **pipeline** is computed (columns = the options in order); a status change fires **workers**, which start **sessions** carrying the project, the goal and their **targets**; a session moves each thing's status through the door. **Hand-off is a role:** a won deal makes the party a client (attach the role); nothing is copied.
|
|
21
|
+
|
|
22
|
+
### Three tenses of a thing
|
|
23
|
+
|
|
24
|
+
- **Past = history.** Every status change is one transition event: from, to, who, which session, why.
|
|
25
|
+
- **Present = status.** One value per kind or role, in its own column.
|
|
26
|
+
- **Future = agenda.** Tasks and events linked to the thing, with an owner. _(Planned, wave 4.)_
|
|
27
|
+
|
|
28
|
+
### Five categories
|
|
29
|
+
|
|
30
|
+
Every lifecycle option has one fixed category: `open · active · paused · done · lost`. Names are free; rules read the category. An agent moving a thing into `done` or `lost` proposes by default; an option marked `humanOnly` is never set by an agent. A space may ADD options; it never renames, removes or recategorises one.
|
|
31
|
+
|
|
32
|
+
### The one door
|
|
33
|
+
|
|
34
|
+
Every status change — your call, a board drag, a method's step, a sync — goes through `moveStatus`. As an agent: a kind's status = `update_entity` with the lifecycle property set to the new value AND, over MCP, `expectedStatus` = the status you saw (the in-app `update_entity` has no `expectedStatus` yet; the door still checks the lifecycle); a role's status = `update_facet` `status` where your tools list it (the in-app agent; MCP has no role-status tool yet).
|
|
35
|
+
|
|
36
|
+
- `conflict` (with the current status) is normal: someone moved it; re-read and decide again. A person's move always wins.
|
|
37
|
+
- `proposed` is success (a done/lost move, or governance said review).
|
|
38
|
+
- A refusal naming the valid options means the value is not in the declared lifecycle: pick one of them.
|
|
39
|
+
Never invent a status, never keep your own stage field.
|
|
40
|
+
|
|
41
|
+
### Session size
|
|
42
|
+
|
|
43
|
+
- **Per thing** when each item needs its own thinking: a post, a feature, a deal in negotiation.
|
|
44
|
+
- **Per batch** when items are interchangeable: one session for "find 10 leads today" or "today's follow-ups".
|
|
45
|
+
- A session's **step is its subject's status**: move the thing, the step follows.
|
|
46
|
+
- **Set the subject.** A session about one thing names it: `subjectEntityId` on `start_session`, or on `update_session` the moment the thing exists (a batch names its things as targets). A session on no thing shows on the homes as "No thing yet · attach one", outside every pipeline.
|
|
47
|
+
- Following a method does not turn your session into a run; it stays your work and still shows in the method's runs.
|
|
48
|
+
- **Targets get a result each**: a worker session holds its things as targets. Your own move of a target marks it `done`; someone else's move marks it `skipped`; targets left at close are `skipped`. Put the outcome on each thing, not only in a summary.
|
|
49
|
+
|
|
50
|
+
### Workers
|
|
51
|
+
|
|
52
|
+
A worker is a playbook **activator**, declared on the method and owned by the lifecycle: `on` = `created` · `enters_status` (+ `status`) · `count` (+ `status`, `min`: once N things wait) · `schedule` (+ `cron`) · `manual`; `size` = `per_thing` · `per_moment` (a count or schedule is always per batch); `mode` = `propose` (default) · `run`; `maxPendingApprovals` throttles it. It compiles into a governed rule the owner can pause; it fires once per thing per transition. A goal or project **turns it on** for its scope; installs turn it on space-wide. Authoring: `processes`.
|
|
53
|
+
|
|
54
|
+
### Goals (tracks)
|
|
55
|
+
|
|
56
|
+
A goal is a _track_ in every tool and field name (`start_track`, `trackId`) — say "goal" to the person; a session's one-line `goal` is its **Aim**. A goal holds an owner, a direction, instructions, the workers it turns on, and what done means (criteria, or a number measured as transitions into `done`). It has no stages. A goal can stay open as long as it matters, or finish: a person closes it with a verdict once its criteria are met (`set_track_status` `completed` + `verdict`; dropped = `archived`, with a `verdict` saying why). Your close is a proposal; a closed goal comes back only as a new version. Pause it while nobody should work on it. Work in it = `start_session` + `trackId`. A thing may count for two goals. Solo users may never need one: workers can run space-wide. Legacy: `start_stage_session` and `add_track_stage` serve old goals started from a method; never `advance_track` without the user.
|
|
57
|
+
|
|
58
|
+
**Keep the pod current (every agent, every session)** — three rules, so the next agent picks your step up from the pod alone:
|
|
59
|
+
|
|
60
|
+
1. **Attach the session to its goal.** `orient`'s `startHere.openGoals` and the start reply's `offers.goals` name the open goals; start with `trackId`, or file an open session with `update_session` `trackId` (a proposal for an agent). No goal fits: say so in the room, never invent one silently.
|
|
61
|
+
2. **Record your PR as an outcome** the moment you open it: `update_session` `outcomes: [{ key: "pr-<repo>-<n>", kind: "pull_request", label: "<repo>#<n>", ref: { url: "<PR url>" } }]`. With no `sessionId`, the pod files it on the one open session this conversation started, and refuses with the list when there are several.
|
|
62
|
+
3. **Close when your outcomes are met.** When every outcome is met the `update_session` reply carries `nudges.readyToClose`: grade with `evaluate_session`, then `complete_session`. A merged PR is not always the end of the work: if more remains, declare it instead.
|
|
63
|
+
|
|
64
|
+
**The rest of the goal protocol** (`set_track_participant`, `reopen_track`, `convert_to_goal`, `update_track`):
|
|
65
|
+
|
|
66
|
+
- **A delegate's commitment.** The owner or judge asks someone (`add`, role `delegate`, with a `commitment`). The delegate answers only their own: `accept`, `counter` (text = what they would commit to instead), `decline`, or later `report_impossible` (text = why). A report is not the goal's verdict: the owner or judge `acknowledge`s it and re-plans. Never answer for a person; adding yourself as a delegate commits you.
|
|
67
|
+
- **Claims and the judge.** A session that passes a goal criterion CLAIMS it. Only the judge (the owner unless one is named) accepts or sends back a claim, and only the judge closes the goal. Never accept your own claim.
|
|
68
|
+
- **Reopen = a new version.** A closed or dropped goal never moves back: `reopen_track` starts a new version linked to it, with the same people asked again.
|
|
69
|
+
- **Make it a goal.** A goal, objective or OKR entity becomes a goal once with `convert_to_goal` (its key results become measured criteria). Offer it when the person treats such an entity as live work; never convert one twice.
|
|
70
|
+
- **The loop** is OFF by default. When it is on (`update_track` `loop: { on: true, perWeek? }`), the goal proposes its next session while a required criterion is unmet, and a person approves each one. Your switch-on is always a proposal: the person turns it on. If it stops after two failures on one criterion, ask the owner to re-plan; do not switch it on again yourself.
|
|
71
|
+
|
|
72
|
+
### The homes: what each space makes, what is moving
|
|
73
|
+
|
|
74
|
+
Home, a space and a project read the work through two reads (the same answer every app shows):
|
|
75
|
+
|
|
76
|
+
- `lifecycle.home` (Hub `GET /api/hub/lifecycle/home?projectId=`): every space you see with its intent and, per kind it produces, the pipeline in one line, needs-you, being-worked and one headline thing.
|
|
77
|
+
- `lifecycle.moving` (Hub `GET /api/hub/lifecycle/moving?workspaceId=&projectId=&limit=`): the things with open work on them, the work under each (asks you first), and `unattached`, the open sessions on no thing.
|
|
78
|
+
|
|
79
|
+
Read them to answer "what is going on" before you list sessions one by one.
|
|
80
|
+
|
|
81
|
+
### A kind's dashboard
|
|
82
|
+
|
|
83
|
+
A kind with a lifecycle has its own page: the board, Needs you, the sessions on its things. To give it a custom Dashboard ("make this my Posts dashboard"), `create_cell` a frame over the bridge's intent reads (`lifecycle.board`, `lifecycle.throughput`, `attention.needsYou`, `attention.count`, `sessions.list`), then `promote_cell_to_renderer` with `slot: "dashboard"` (the `entity-profile` content kind). Recipe: `synap-ui`; params and shapes: `viewframe-cells`.
|
|
84
|
+
|
|
85
|
+
### Rules of thumb
|
|
86
|
+
|
|
87
|
+
1. Find the thing before creating one: resolve identity, then attach a role — never a twin.
|
|
88
|
+
2. Status changes go through the door, with `expectedStatus`.
|
|
89
|
+
3. Never invent a status or a second status field; the lifecycle is declared on the profile (`list_profiles`).
|
|
90
|
+
4. Size the session from the work: per thing or per batch.
|
|
91
|
+
5. Results go on the things, not only in prose.
|
|
92
|
+
6. `proposed` is success. Commitments (publish, send, sign, spend) are a person's call.
|
|
93
|
+
|
|
94
|
+
### Applied: content (Content OS)
|
|
95
|
+
|
|
96
|
+
- Thing = a **post**. Lifecycle `post-status`: Idea (open) · Briefed · Scripted · In Draft · Review · Scheduled (active) · Published (done) · Archived (lost, human-only).
|
|
97
|
+
- Nothing publishes itself: a move to Published is a proposal the person approves on the preview.
|
|
98
|
+
- Pipeline = the Posts board, filtered by project or campaign.
|
|
99
|
+
- Workers: **Draft** (per thing, enters Briefed) · **Review prep** (per thing, enters Review, ends by proposing the publish date) · **Ideas** (per batch, weekly, creates posts at Idea). Today the catalog ships them as Produce Content (enters Briefed), Repurpose (enters Published) and Plan Next Content (weekly, off by default).
|
|
100
|
+
- "The next posts" = read the pipeline: gaps per pillar, posts waiting per status.
|
|
101
|
+
|
|
102
|
+
### Applied: leads and deals (CRM)
|
|
103
|
+
|
|
104
|
+
- **Lead** = a role for qualification only, `leadStage`: new · researching · outreach (open) · engaged · qualified · nurturing (active) · converted (done) · disqualified (lost, human-only).
|
|
105
|
+
- **Deal** = the sale, `commercialStage`, created only at hand-off. A **won** deal attaches the client role to the party.
|
|
106
|
+
- A Cal.com booking makes the attendee a lead at `engaged` and records the call as an event; it never creates a deal and never moves a lead backwards.
|
|
107
|
+
|
|
108
|
+
### Point another AI here
|
|
109
|
+
|
|
110
|
+
Every door can load this: `load_skill system/synap/work-model`. To make a space carry it, put a one-line pointer in the space brief (`update_space_brief`, `purpose` or `framing`, 240 characters each): in-app agents and worker sessions read the brief every turn, MCP agents when they `orient`. To steer a session in flight, post the pointer in its room. A document attached to a session reaches an agent as a title only, so it does not teach.
|