@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 @@
|
|
|
1
|
+
{"version":3,"file":"template-steps.js","sourceRoot":"","sources":["../../src/lib/template-steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** "5 minutes ago" from an ISO date — the CLI's relative-time words (was local to `synap status`). */
|
|
2
|
+
export function timeAgo(isoDate, now = Date.now()) {
|
|
3
|
+
const diff = now - new Date(isoDate).getTime();
|
|
4
|
+
const minutes = Math.floor(diff / 60_000);
|
|
5
|
+
if (minutes < 1)
|
|
6
|
+
return "just now";
|
|
7
|
+
if (minutes < 60)
|
|
8
|
+
return `${minutes} minute${minutes === 1 ? "" : "s"} ago`;
|
|
9
|
+
const hours = Math.floor(minutes / 60);
|
|
10
|
+
if (hours < 24)
|
|
11
|
+
return `${hours} hour${hours === 1 ? "" : "s"} ago`;
|
|
12
|
+
const days = Math.floor(hours / 24);
|
|
13
|
+
return `${days} day${days === 1 ? "" : "s"} ago`;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=time-ago.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-ago.js","sourceRoot":"","sources":["../../src/lib/time-ago.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAC/D,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wake hook in a Claude Code settings file — `synap hooks install-wake`
|
|
3
|
+
* and `synap init`.
|
|
4
|
+
*
|
|
5
|
+
* One `Stop` hook, `asyncRewake: true`, running `synap session wait --hook`.
|
|
6
|
+
* The contract, verified against Claude Code 2.1.309 (its bundled settings
|
|
7
|
+
* schema and hook runner) and code.claude.com/docs/en/hooks:
|
|
8
|
+
* - `asyncRewake` runs the command in the background ("Implies async") and
|
|
9
|
+
* wakes the model when it exits 2; the hook's stderr (stdout if stderr is
|
|
10
|
+
* empty) is shown to Claude as a system reminder. Any other exit wakes no one.
|
|
11
|
+
* - `timeout` is enforced on it too (seconds; default 600, no maximum in the
|
|
12
|
+
* schema), so the entry sets one and the command stops on its own first.
|
|
13
|
+
* - Only an INTERACTIVE session (or the SDK with streaming input) backgrounds
|
|
14
|
+
* it; `claude -p` runs it in the foreground — the command exits at once there.
|
|
15
|
+
*
|
|
16
|
+
* The merge never clobbers: other hooks, other events and other keys are kept
|
|
17
|
+
* as they are, a second install is a no-op, and a file that does not parse is
|
|
18
|
+
* refused (`readJsonStrict`), never rewritten from `{}`. The command names
|
|
19
|
+
* `synap` on PATH, not this machine's absolute path, because a project's
|
|
20
|
+
* `.claude/settings.json` is usually committed and shared.
|
|
21
|
+
*/
|
|
22
|
+
/** Claude Code's own limit on the background process, in seconds. */
|
|
23
|
+
export declare const WAKE_HOOK_TIMEOUT_SECONDS = 3600;
|
|
24
|
+
/** Our own deadline sits under it, so we exit 0 (no wake) before Claude Code kills us. */
|
|
25
|
+
export declare const WAKE_HOOK_COMMAND = "synap session wait --hook --timeout 55m";
|
|
26
|
+
export interface WakeHookEntry {
|
|
27
|
+
type: "command";
|
|
28
|
+
command: string;
|
|
29
|
+
asyncRewake: true;
|
|
30
|
+
timeout: number;
|
|
31
|
+
}
|
|
32
|
+
export declare const WAKE_HOOK_ENTRY: WakeHookEntry;
|
|
33
|
+
type Settings = Record<string, unknown>;
|
|
34
|
+
/** Ours, in any version: a command hook that runs `synap session wait … --hook`. */
|
|
35
|
+
export declare function isWakeHook(hook: unknown): boolean;
|
|
36
|
+
export type WakeHookChange = "added" | "updated" | "unchanged" | "removed" | "absent";
|
|
37
|
+
/**
|
|
38
|
+
* Settings with the wake hook in place. An older wake entry (another command
|
|
39
|
+
* line or timeout) is updated where it stands; anything else is untouched.
|
|
40
|
+
*/
|
|
41
|
+
export declare function withWakeHook(settings: Settings): {
|
|
42
|
+
settings: Settings;
|
|
43
|
+
change: WakeHookChange;
|
|
44
|
+
};
|
|
45
|
+
/** Settings without the wake hook. Empty groups, an empty `Stop` and an empty `hooks` go too. */
|
|
46
|
+
export declare function withoutWakeHook(settings: Settings): {
|
|
47
|
+
settings: Settings;
|
|
48
|
+
change: WakeHookChange;
|
|
49
|
+
};
|
|
50
|
+
/** `<dir>/.claude/settings.json`, or the user's `~/.claude/settings.json`. */
|
|
51
|
+
export declare function wakeHookSettingsPath(opts: {
|
|
52
|
+
user?: boolean;
|
|
53
|
+
dir?: string;
|
|
54
|
+
}): string;
|
|
55
|
+
/** Read, merge, write (only when something changed). Throws on a file that does not parse. */
|
|
56
|
+
export declare function applyWakeHook(file: string, uninstall?: boolean): WakeHookChange;
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wake hook in a Claude Code settings file — `synap hooks install-wake`
|
|
3
|
+
* and `synap init`.
|
|
4
|
+
*
|
|
5
|
+
* One `Stop` hook, `asyncRewake: true`, running `synap session wait --hook`.
|
|
6
|
+
* The contract, verified against Claude Code 2.1.309 (its bundled settings
|
|
7
|
+
* schema and hook runner) and code.claude.com/docs/en/hooks:
|
|
8
|
+
* - `asyncRewake` runs the command in the background ("Implies async") and
|
|
9
|
+
* wakes the model when it exits 2; the hook's stderr (stdout if stderr is
|
|
10
|
+
* empty) is shown to Claude as a system reminder. Any other exit wakes no one.
|
|
11
|
+
* - `timeout` is enforced on it too (seconds; default 600, no maximum in the
|
|
12
|
+
* schema), so the entry sets one and the command stops on its own first.
|
|
13
|
+
* - Only an INTERACTIVE session (or the SDK with streaming input) backgrounds
|
|
14
|
+
* it; `claude -p` runs it in the foreground — the command exits at once there.
|
|
15
|
+
*
|
|
16
|
+
* The merge never clobbers: other hooks, other events and other keys are kept
|
|
17
|
+
* as they are, a second install is a no-op, and a file that does not parse is
|
|
18
|
+
* refused (`readJsonStrict`), never rewritten from `{}`. The command names
|
|
19
|
+
* `synap` on PATH, not this machine's absolute path, because a project's
|
|
20
|
+
* `.claude/settings.json` is usually committed and shared.
|
|
21
|
+
*/
|
|
22
|
+
import os from "node:os";
|
|
23
|
+
import path from "node:path";
|
|
24
|
+
import fs from "node:fs";
|
|
25
|
+
import { readJsonStrict, writeFileAtomic } from "./atomic-file.js";
|
|
26
|
+
/** Claude Code's own limit on the background process, in seconds. */
|
|
27
|
+
export const WAKE_HOOK_TIMEOUT_SECONDS = 3600;
|
|
28
|
+
/** Our own deadline sits under it, so we exit 0 (no wake) before Claude Code kills us. */
|
|
29
|
+
export const WAKE_HOOK_COMMAND = "synap session wait --hook --timeout 55m";
|
|
30
|
+
export const WAKE_HOOK_ENTRY = {
|
|
31
|
+
type: "command",
|
|
32
|
+
command: WAKE_HOOK_COMMAND,
|
|
33
|
+
asyncRewake: true,
|
|
34
|
+
timeout: WAKE_HOOK_TIMEOUT_SECONDS,
|
|
35
|
+
};
|
|
36
|
+
/** Ours, in any version: a command hook that runs `synap session wait … --hook`. */
|
|
37
|
+
export function isWakeHook(hook) {
|
|
38
|
+
if (!hook || typeof hook !== "object")
|
|
39
|
+
return false;
|
|
40
|
+
const h = hook;
|
|
41
|
+
return (h.type === "command" &&
|
|
42
|
+
typeof h.command === "string" &&
|
|
43
|
+
/(^|[\s/])synap\s+session\s+wait\b/.test(h.command) &&
|
|
44
|
+
/\s--hook\b/.test(h.command));
|
|
45
|
+
}
|
|
46
|
+
function sameEntry(hook) {
|
|
47
|
+
if (!hook || typeof hook !== "object")
|
|
48
|
+
return false;
|
|
49
|
+
const h = hook;
|
|
50
|
+
return (h.type === WAKE_HOOK_ENTRY.type &&
|
|
51
|
+
h.command === WAKE_HOOK_ENTRY.command &&
|
|
52
|
+
h.asyncRewake === true &&
|
|
53
|
+
h.timeout === WAKE_HOOK_ENTRY.timeout);
|
|
54
|
+
}
|
|
55
|
+
/** The settings' `hooks.Stop` array, or a refusal when the file holds something else there. */
|
|
56
|
+
function stopGroups(settings) {
|
|
57
|
+
const hooks = settings.hooks;
|
|
58
|
+
if (hooks !== undefined && (typeof hooks !== "object" || hooks === null || Array.isArray(hooks))) {
|
|
59
|
+
throw new Error("`hooks` in this settings file is not an object; fix it by hand, nothing was written.");
|
|
60
|
+
}
|
|
61
|
+
const stop = hooks?.Stop;
|
|
62
|
+
if (stop === undefined)
|
|
63
|
+
return [];
|
|
64
|
+
if (!Array.isArray(stop)) {
|
|
65
|
+
throw new Error("`hooks.Stop` in this settings file is not a list; fix it by hand, nothing was written.");
|
|
66
|
+
}
|
|
67
|
+
return stop;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Settings with the wake hook in place. An older wake entry (another command
|
|
71
|
+
* line or timeout) is updated where it stands; anything else is untouched.
|
|
72
|
+
*/
|
|
73
|
+
export function withWakeHook(settings) {
|
|
74
|
+
const groups = stopGroups(settings);
|
|
75
|
+
let found = false;
|
|
76
|
+
let updated = false;
|
|
77
|
+
const nextGroups = groups.map((g) => {
|
|
78
|
+
if (!Array.isArray(g?.hooks))
|
|
79
|
+
return g;
|
|
80
|
+
const hooks = g.hooks.flatMap((h) => {
|
|
81
|
+
if (!isWakeHook(h))
|
|
82
|
+
return [h];
|
|
83
|
+
if (found) {
|
|
84
|
+
updated = true; // a duplicate of ours: keep one
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
found = true;
|
|
88
|
+
if (sameEntry(h))
|
|
89
|
+
return [h];
|
|
90
|
+
updated = true;
|
|
91
|
+
return [{ ...WAKE_HOOK_ENTRY }];
|
|
92
|
+
});
|
|
93
|
+
return { ...g, hooks };
|
|
94
|
+
});
|
|
95
|
+
const cleaned = nextGroups.filter((g) => !Array.isArray(g?.hooks) || g.hooks.length > 0);
|
|
96
|
+
if (found && !updated)
|
|
97
|
+
return { settings, change: "unchanged" };
|
|
98
|
+
const finalGroups = found ? cleaned : [...cleaned, { hooks: [{ ...WAKE_HOOK_ENTRY }] }];
|
|
99
|
+
return {
|
|
100
|
+
settings: {
|
|
101
|
+
...settings,
|
|
102
|
+
hooks: { ...(settings.hooks ?? {}), Stop: finalGroups },
|
|
103
|
+
},
|
|
104
|
+
change: found ? "updated" : "added",
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Settings without the wake hook. Empty groups, an empty `Stop` and an empty `hooks` go too. */
|
|
108
|
+
export function withoutWakeHook(settings) {
|
|
109
|
+
const groups = stopGroups(settings);
|
|
110
|
+
let removed = false;
|
|
111
|
+
const nextGroups = groups
|
|
112
|
+
.map((g) => {
|
|
113
|
+
if (!Array.isArray(g?.hooks))
|
|
114
|
+
return g;
|
|
115
|
+
const hooks = g.hooks.filter((h) => {
|
|
116
|
+
const ours = isWakeHook(h);
|
|
117
|
+
if (ours)
|
|
118
|
+
removed = true;
|
|
119
|
+
return !ours;
|
|
120
|
+
});
|
|
121
|
+
return { ...g, hooks };
|
|
122
|
+
})
|
|
123
|
+
.filter((g) => !Array.isArray(g?.hooks) || g.hooks.length > 0);
|
|
124
|
+
if (!removed)
|
|
125
|
+
return { settings, change: "absent" };
|
|
126
|
+
const { Stop: _stop, ...otherEvents } = settings.hooks ?? {};
|
|
127
|
+
const hooks = nextGroups.length > 0 ? { ...otherEvents, Stop: nextGroups } : otherEvents;
|
|
128
|
+
const { hooks: _hooks, ...rest } = settings;
|
|
129
|
+
return {
|
|
130
|
+
settings: Object.keys(hooks).length > 0 ? { ...rest, hooks } : rest,
|
|
131
|
+
change: "removed",
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** `<dir>/.claude/settings.json`, or the user's `~/.claude/settings.json`. */
|
|
135
|
+
export function wakeHookSettingsPath(opts) {
|
|
136
|
+
if (opts.user)
|
|
137
|
+
return path.join(os.homedir(), ".claude", "settings.json");
|
|
138
|
+
return path.join(path.resolve(opts.dir ?? process.cwd()), ".claude", "settings.json");
|
|
139
|
+
}
|
|
140
|
+
/** Read, merge, write (only when something changed). Throws on a file that does not parse. */
|
|
141
|
+
export function applyWakeHook(file, uninstall = false) {
|
|
142
|
+
const existing = readJsonStrict(file);
|
|
143
|
+
if (!existing && uninstall)
|
|
144
|
+
return "absent";
|
|
145
|
+
const { settings, change } = uninstall ? withoutWakeHook(existing ?? {}) : withWakeHook(existing ?? {});
|
|
146
|
+
if (change === "added" || change === "updated" || change === "removed") {
|
|
147
|
+
// A new project settings file is shared config, not a secret: 0644. An
|
|
148
|
+
// existing file keeps its own mode (~/.claude/settings.json holds keys).
|
|
149
|
+
writeFileAtomic(file, JSON.stringify(settings, null, 2) + "\n", fs.existsSync(file) ? {} : { mode: 0o644 });
|
|
150
|
+
}
|
|
151
|
+
return change;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=wake-hook-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake-hook-settings.js","sourceRoot":"","sources":["../../src/lib/wake-hook-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnE,qEAAqE;AACrE,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAC9C,0FAA0F;AAC1F,MAAM,CAAC,MAAM,iBAAiB,GAAG,yCAAyC,CAAC;AAS3E,MAAM,CAAC,MAAM,eAAe,GAAkB;IAC5C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,iBAAiB;IAC1B,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,yBAAyB;CACnC,CAAC;AAKF,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,CAAC,GAAG,IAA6C,CAAC;IACxD,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,SAAS;QACpB,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAC7B,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACnD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAC7B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAa;IAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI;QAC/B,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,OAAO;QACrC,CAAC,CAAC,WAAW,KAAK,IAAI;QACtB,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,OAAO,CACtC,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,SAAS,UAAU,CAAC,QAAkB;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,IAAI,GAAI,KAA6C,EAAE,IAAI,CAAC;IAClE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,IAAmB,CAAC;AAC7B,CAAC;AAID;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAClC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,GAAG,IAAI,CAAC,CAAC,gCAAgC;gBAChD,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,SAAS,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzF,IAAI,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAChE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;IACxF,OAAO;QACL,QAAQ,EAAE;YACR,GAAG,QAAQ;YACX,KAAK,EAAE,EAAE,GAAG,CAAE,QAAQ,CAAC,KAAiC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;SACrF;QACD,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;KACpC,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,UAAU,GAAG,MAAM;SACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI;gBAAE,OAAO,GAAG,IAAI,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC;QACf,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACpD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,GAAI,QAAQ,CAAC,KAAiC,IAAI,EAAE,CAAC;IAC1F,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IACzF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC5C,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;QACnE,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,IAAsC;IACzE,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AACxF,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,SAAS,GAAG,KAAK;IAC3D,MAAM,QAAQ,GAAG,cAAc,CAAW,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,IAAI,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACxG,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvE,uEAAuE;QACvE,yEAAyE;QACzE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wake hook's memory between runs — `~/.synap/wake/<key>.json`.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code runs an `asyncRewake` Stop hook as a NEW background process on
|
|
5
|
+
* every Stop, and never kills the previous one ("Each execution creates a
|
|
6
|
+
* separate background process", code.claude.com/docs/en/hooks). So two waiters
|
|
7
|
+
* for one terminal overlap whenever the person types again before the first
|
|
8
|
+
* gives up. This file keeps them honest:
|
|
9
|
+
*
|
|
10
|
+
* - `owner`: the newest waiter's token. An older waiter sees it change and
|
|
11
|
+
* exits quietly at its next read — the terminal has one doorbell, not two.
|
|
12
|
+
* - `since`: the feed cursor, so the next run resumes where the last one
|
|
13
|
+
* read (never a replay, never a gap) — the pod's `nextSince`.
|
|
14
|
+
* - `delivered`: event ids already handed to the agent, so an older waiter
|
|
15
|
+
* whose read was in flight and a newer one cannot both wake it for the
|
|
16
|
+
* same event.
|
|
17
|
+
* - `carried`: events read (and so marked read by the pod) that do not wake
|
|
18
|
+
* — an fyi, a done, a held wake — kept until the next wake shows them.
|
|
19
|
+
*
|
|
20
|
+
* Best-effort by design: a lost write costs at most one duplicate line, and a
|
|
21
|
+
* file that cannot be read is a fresh start, never a crash in someone's hook.
|
|
22
|
+
* The read-modify-writes are unlocked: two waiters racing inside the same
|
|
23
|
+
* milliseconds can both wake the agent once.
|
|
24
|
+
*
|
|
25
|
+
* Stated limits, both from the pod's contract rather than this file:
|
|
26
|
+
* - the pod marks a message read when it HANDS it out (there is no ack), so
|
|
27
|
+
* a hook killed between that read and its stderr write (the session ended,
|
|
28
|
+
* the hook's timeout) loses that one wake — the message stays in the room;
|
|
29
|
+
* - after the first run the hook reads in CURSOR mode (`since`), which sees
|
|
30
|
+
* owner messages written while the agent worked its turn, but not a post
|
|
31
|
+
* whose row commits after a concurrent read already moved the cursor past
|
|
32
|
+
* its timestamp (unread mode would; it would also drop those owner messages).
|
|
33
|
+
*/
|
|
34
|
+
import type { SessionFeedEvent } from "./session-feed.js";
|
|
35
|
+
export interface WakeState {
|
|
36
|
+
owner?: string;
|
|
37
|
+
pid?: number;
|
|
38
|
+
since?: string | null;
|
|
39
|
+
delivered?: string[];
|
|
40
|
+
carried?: SessionFeedEvent[];
|
|
41
|
+
updatedAt?: string;
|
|
42
|
+
}
|
|
43
|
+
/** One file per (Claude Code conversation, focus session). */
|
|
44
|
+
export declare function wakeStatePath(conversationId: string | undefined, sessionId: string): string;
|
|
45
|
+
export declare function readWakeState(file: string): WakeState;
|
|
46
|
+
/** Claim the doorbell: this run becomes the owner. Returns its token. */
|
|
47
|
+
export declare function claimWake(file: string): string;
|
|
48
|
+
export declare function isWakeOwner(file: string, owner: string): boolean;
|
|
49
|
+
/** Advance the cursor (never backwards) and carry events that did not wake. */
|
|
50
|
+
export declare function recordRead(file: string, p: {
|
|
51
|
+
since: string | null;
|
|
52
|
+
carry?: SessionFeedEvent[];
|
|
53
|
+
}): void;
|
|
54
|
+
/**
|
|
55
|
+
* Hand events to the agent: drop any already delivered (by another waiter),
|
|
56
|
+
* mark the rest delivered, and release the carried ones with them. Returns
|
|
57
|
+
* what to show; `events` empty = someone else already woke the agent for them.
|
|
58
|
+
*/
|
|
59
|
+
export declare function takeDelivery(file: string, p: {
|
|
60
|
+
events: SessionFeedEvent[];
|
|
61
|
+
since: string | null;
|
|
62
|
+
}): {
|
|
63
|
+
events: SessionFeedEvent[];
|
|
64
|
+
carried: SessionFeedEvent[];
|
|
65
|
+
};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wake hook's memory between runs — `~/.synap/wake/<key>.json`.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code runs an `asyncRewake` Stop hook as a NEW background process on
|
|
5
|
+
* every Stop, and never kills the previous one ("Each execution creates a
|
|
6
|
+
* separate background process", code.claude.com/docs/en/hooks). So two waiters
|
|
7
|
+
* for one terminal overlap whenever the person types again before the first
|
|
8
|
+
* gives up. This file keeps them honest:
|
|
9
|
+
*
|
|
10
|
+
* - `owner`: the newest waiter's token. An older waiter sees it change and
|
|
11
|
+
* exits quietly at its next read — the terminal has one doorbell, not two.
|
|
12
|
+
* - `since`: the feed cursor, so the next run resumes where the last one
|
|
13
|
+
* read (never a replay, never a gap) — the pod's `nextSince`.
|
|
14
|
+
* - `delivered`: event ids already handed to the agent, so an older waiter
|
|
15
|
+
* whose read was in flight and a newer one cannot both wake it for the
|
|
16
|
+
* same event.
|
|
17
|
+
* - `carried`: events read (and so marked read by the pod) that do not wake
|
|
18
|
+
* — an fyi, a done, a held wake — kept until the next wake shows them.
|
|
19
|
+
*
|
|
20
|
+
* Best-effort by design: a lost write costs at most one duplicate line, and a
|
|
21
|
+
* file that cannot be read is a fresh start, never a crash in someone's hook.
|
|
22
|
+
* The read-modify-writes are unlocked: two waiters racing inside the same
|
|
23
|
+
* milliseconds can both wake the agent once.
|
|
24
|
+
*
|
|
25
|
+
* Stated limits, both from the pod's contract rather than this file:
|
|
26
|
+
* - the pod marks a message read when it HANDS it out (there is no ack), so
|
|
27
|
+
* a hook killed between that read and its stderr write (the session ended,
|
|
28
|
+
* the hook's timeout) loses that one wake — the message stays in the room;
|
|
29
|
+
* - after the first run the hook reads in CURSOR mode (`since`), which sees
|
|
30
|
+
* owner messages written while the agent worked its turn, but not a post
|
|
31
|
+
* whose row commits after a concurrent read already moved the cursor past
|
|
32
|
+
* its timestamp (unread mode would; it would also drop those owner messages).
|
|
33
|
+
*/
|
|
34
|
+
import fs from "node:fs";
|
|
35
|
+
import os from "node:os";
|
|
36
|
+
import path from "node:path";
|
|
37
|
+
import { randomBytes } from "node:crypto";
|
|
38
|
+
import { writeFileAtomic } from "./atomic-file.js";
|
|
39
|
+
/** Ids remembered as delivered (the newest win). */
|
|
40
|
+
const DELIVERED_MAX = 200;
|
|
41
|
+
/** Events carried to the next wake (the newest win). */
|
|
42
|
+
const CARRIED_MAX = 20;
|
|
43
|
+
function wakeDir() {
|
|
44
|
+
return path.join(os.homedir(), ".synap", "wake");
|
|
45
|
+
}
|
|
46
|
+
/** One file per (Claude Code conversation, focus session). */
|
|
47
|
+
export function wakeStatePath(conversationId, sessionId) {
|
|
48
|
+
const safe = (s) => s.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
49
|
+
return path.join(wakeDir(), `${safe(conversationId ?? "terminal")}__${safe(sessionId)}.json`);
|
|
50
|
+
}
|
|
51
|
+
export function readWakeState(file) {
|
|
52
|
+
try {
|
|
53
|
+
const v = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
54
|
+
return v && typeof v === "object" && !Array.isArray(v) ? v : {};
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function writeWakeState(file, state) {
|
|
61
|
+
try {
|
|
62
|
+
writeFileAtomic(file, JSON.stringify({ ...state, updatedAt: new Date().toISOString() }, null, 2) + "\n", {
|
|
63
|
+
mode: 0o600,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* best-effort — see the header */
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** The later of two millisecond ISO cursors (they compare as strings). */
|
|
71
|
+
function laterCursor(a, b) {
|
|
72
|
+
if (!a)
|
|
73
|
+
return b ?? null;
|
|
74
|
+
if (!b)
|
|
75
|
+
return a;
|
|
76
|
+
return a > b ? a : b;
|
|
77
|
+
}
|
|
78
|
+
/** Claim the doorbell: this run becomes the owner. Returns its token. */
|
|
79
|
+
export function claimWake(file) {
|
|
80
|
+
const owner = randomBytes(8).toString("hex");
|
|
81
|
+
writeWakeState(file, { ...readWakeState(file), owner, pid: process.pid });
|
|
82
|
+
return owner;
|
|
83
|
+
}
|
|
84
|
+
export function isWakeOwner(file, owner) {
|
|
85
|
+
return readWakeState(file).owner === owner;
|
|
86
|
+
}
|
|
87
|
+
/** Advance the cursor (never backwards) and carry events that did not wake. */
|
|
88
|
+
export function recordRead(file, p) {
|
|
89
|
+
const s = readWakeState(file);
|
|
90
|
+
const delivered = new Set(s.delivered ?? []);
|
|
91
|
+
const carried = [...(s.carried ?? [])];
|
|
92
|
+
for (const e of p.carry ?? []) {
|
|
93
|
+
if (!delivered.has(e.id) && !carried.some((c) => c.id === e.id))
|
|
94
|
+
carried.push(e);
|
|
95
|
+
}
|
|
96
|
+
writeWakeState(file, {
|
|
97
|
+
...s,
|
|
98
|
+
since: laterCursor(s.since, p.since),
|
|
99
|
+
carried: carried.slice(-CARRIED_MAX),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Hand events to the agent: drop any already delivered (by another waiter),
|
|
104
|
+
* mark the rest delivered, and release the carried ones with them. Returns
|
|
105
|
+
* what to show; `events` empty = someone else already woke the agent for them.
|
|
106
|
+
*/
|
|
107
|
+
export function takeDelivery(file, p) {
|
|
108
|
+
const s = readWakeState(file);
|
|
109
|
+
const delivered = new Set(s.delivered ?? []);
|
|
110
|
+
const events = p.events.filter((e) => !delivered.has(e.id));
|
|
111
|
+
const carried = events.length > 0 ? (s.carried ?? []).filter((e) => !delivered.has(e.id)) : [];
|
|
112
|
+
for (const e of [...events, ...carried])
|
|
113
|
+
delivered.add(e.id);
|
|
114
|
+
writeWakeState(file, {
|
|
115
|
+
...s,
|
|
116
|
+
since: laterCursor(s.since, p.since),
|
|
117
|
+
delivered: [...delivered].slice(-DELIVERED_MAX),
|
|
118
|
+
carried: events.length > 0 ? [] : s.carried,
|
|
119
|
+
});
|
|
120
|
+
return { events, carried: carried.filter((c) => !events.some((e) => e.id === c.id)) };
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=wake-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake-state.js","sourceRoot":"","sources":["../../src/lib/wake-state.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -5,8 +5,11 @@ import chalk from "chalk";
|
|
|
5
5
|
// are trying to parse. Callers that print a failure and its next-action hint
|
|
6
6
|
// use error/warn/dim — dim stays on stdout because it is also used for ordinary
|
|
7
7
|
// output detail; hint lines that accompany an error are emitted via `hint`.
|
|
8
|
+
//
|
|
9
|
+
// Colour carries meaning only: green ✓ done, yellow ⚠ warning, red ✗ error,
|
|
10
|
+
// cyan for a command to type. Ordinary lines stay uncoloured.
|
|
8
11
|
export const log = {
|
|
9
|
-
info: (msg) => console.log(
|
|
12
|
+
info: (msg) => console.log(" " + msg),
|
|
10
13
|
success: (msg) => console.log(chalk.green(" ✓ " + msg)),
|
|
11
14
|
warn: (msg) => console.error(chalk.yellow(" ⚠ " + msg)),
|
|
12
15
|
error: (msg) => console.error(chalk.red(" ✗ " + msg)),
|
|
@@ -19,7 +22,7 @@ export const log = {
|
|
|
19
22
|
export function banner() {
|
|
20
23
|
console.log(chalk.cyan(`
|
|
21
24
|
╔═══════════════════════════════════════╗
|
|
22
|
-
║ ${chalk.bold("Synap CLI")}
|
|
25
|
+
║ ${chalk.bold("Synap CLI")} ║
|
|
23
26
|
║ Knowledge infrastructure for agents ║
|
|
24
27
|
╚═══════════════════════════════════════╝
|
|
25
28
|
`));
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;IAC9C,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAChE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC9D,0EAA0E;IAC1E,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC7D,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;;cAEX,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;;CAGpC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C;YACE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,41 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synap-core/cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.13.0",
|
|
4
|
+
"description": "Connect any AI agent (Claude Code, Codex, Cursor and more) to your own Synap data pod: shared memory, structured data and human-approved changes.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"synap": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"build": "tsc",
|
|
10
|
+
"build": "tsc && node scripts/write-build-info.mjs",
|
|
11
11
|
"dev": "tsx src/index.ts",
|
|
12
12
|
"sync-skills": "bash scripts/sync-skills.sh",
|
|
13
|
-
"prepublishOnly": "
|
|
14
|
-
"prepack": "rm -rf node_modules/@synap/hub-rest-client && cp -r ../synap-backend/packages/hub-rest-client node_modules/@synap/",
|
|
15
|
-
"postpack": "rm -rf node_modules/@synap/hub-rest-client && ln -s ../../../synap-backend/packages/hub-rest-client node_modules/@synap/hub-rest-client",
|
|
13
|
+
"prepublishOnly": "npm run sync-skills && npm run build",
|
|
16
14
|
"postbuild": "chmod +x dist/index.js",
|
|
17
|
-
"test": "vitest run"
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"verify-artifact": "node scripts/verify-artifact.mjs",
|
|
17
|
+
"docs:cli": "node scripts/gen-cli-reference.mjs",
|
|
18
|
+
"docs:cli:check": "node scripts/gen-cli-reference.mjs --check"
|
|
18
19
|
},
|
|
19
20
|
"dependencies": {
|
|
20
|
-
"@synap/hub-rest-client": "
|
|
21
|
-
"@synap-core/
|
|
21
|
+
"@synap-core/hub-rest-client": "^1.1.1",
|
|
22
|
+
"@synap-core/types": "^1.12.1",
|
|
23
|
+
"@synap-core/workspace-templates": ">=0.12.0 <1.0.0",
|
|
22
24
|
"chalk": "^5.4.0",
|
|
23
25
|
"commander": "^13.0.0",
|
|
26
|
+
"esbuild": "^0.28.0",
|
|
24
27
|
"ora": "^8.0.0",
|
|
25
28
|
"prompts": "^2.4.2",
|
|
29
|
+
"qrcode": "^1.5.4",
|
|
26
30
|
"yaml": "^2.9.0"
|
|
27
31
|
},
|
|
28
32
|
"devDependencies": {
|
|
29
33
|
"@types/node": "^22.0.0",
|
|
30
34
|
"@types/prompts": "^2.4.9",
|
|
31
|
-
"
|
|
35
|
+
"@types/qrcode": "^1.5.5",
|
|
32
36
|
"tsx": "^4.0.0",
|
|
33
37
|
"typescript": "^5.7.0",
|
|
34
38
|
"vitest": "^3.2.4"
|
|
35
39
|
},
|
|
36
|
-
"bundledDependencies": [
|
|
37
|
-
"@synap/hub-rest-client"
|
|
38
|
-
],
|
|
39
40
|
"files": [
|
|
40
41
|
"dist",
|
|
41
42
|
"skills",
|
|
@@ -46,15 +47,23 @@
|
|
|
46
47
|
},
|
|
47
48
|
"repository": {
|
|
48
49
|
"type": "git",
|
|
49
|
-
"url": "https://github.com/
|
|
50
|
+
"url": "git+https://github.com/Synap-core/synap-cli.git"
|
|
50
51
|
},
|
|
51
52
|
"license": "MIT",
|
|
53
|
+
"homepage": "https://synap.live/download/cli",
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/Synap-core/synap-cli/issues"
|
|
56
|
+
},
|
|
52
57
|
"keywords": [
|
|
53
58
|
"synap",
|
|
54
|
-
"
|
|
55
|
-
"ai",
|
|
59
|
+
"mcp",
|
|
60
|
+
"ai-agents",
|
|
61
|
+
"claude-code",
|
|
62
|
+
"codex",
|
|
63
|
+
"cursor",
|
|
56
64
|
"knowledge-graph",
|
|
57
65
|
"memory",
|
|
58
|
-
"
|
|
66
|
+
"personal-data",
|
|
67
|
+
"self-hosted"
|
|
59
68
|
]
|
|
60
69
|
}
|
package/skills/README.md
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
# Synap Skills
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Four baseline skills make up the Synap agent surface (`manifest.json` is the list). Install all of them for the full experience; they are designed to be used together.
|
|
4
4
|
|
|
5
|
-
## The
|
|
5
|
+
## The baseline skills
|
|
6
6
|
|
|
7
|
-
| Skill | Purpose
|
|
8
|
-
| -------------- |
|
|
9
|
-
| `synap` | Core data operations — read, write, link, search, remember
|
|
10
|
-
| `synap-schema` | Extend the data model — new profiles, new properties
|
|
11
|
-
| `synap-ui` | Build views, dashboards, workspaces, bento layouts
|
|
7
|
+
| Skill | Purpose | Trigger |
|
|
8
|
+
| -------------- | ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------- |
|
|
9
|
+
| `synap` | Core data operations — read, write, link, search, remember | "Save this", "Find my X", "Who is Y", "Remind me to Z" |
|
|
10
|
+
| `synap-schema` | Extend the data model — new profiles, new properties | "I need a type for X", "Add a field to tasks" |
|
|
11
|
+
| `synap-ui` | Build views, dashboards, workspaces, bento layouts | "Make me a dashboard", "Build a kanban", "Create a CRM workspace" |
|
|
12
|
+
| `synap-design` | Design and build UI: principles, the component catalog and tokens, the design-to-code loop | "Design the proposal page", "Is this screen right?", "Implement this design" |
|
|
12
13
|
|
|
13
14
|
Each skill has its own SKILL.md with a trigger-first description. The harness loads only the skills whose descriptions match the user's intent — so a data-fetch turn doesn't load the UI skill, and vice versa.
|
|
14
15
|
|
|
@@ -29,6 +30,7 @@ skills/
|
|
|
29
30
|
│ └── property-types.md ← valueType reference + constraints + uiHints + scope
|
|
30
31
|
│
|
|
31
32
|
├── synap-ui/ ← build interface over data
|
|
33
|
+
├── synap-design/ ← design principles, design system, design loop
|
|
32
34
|
│ ├── SKILL.md
|
|
33
35
|
│ ├── view-types.md ← the 12 implemented view types + configs
|
|
34
36
|
│ ├── widget-catalog.md ← cells/widgets reference
|
|
@@ -66,12 +68,12 @@ Provision a key via `npx @synap-core/cli connect --target=<client>` or directly
|
|
|
66
68
|
|
|
67
69
|
Each skill is portable and works unchanged in:
|
|
68
70
|
|
|
69
|
-
- **
|
|
70
|
-
- **Claude Code** — install to `~/.claude/skills/synap/`
|
|
71
|
+
- **Any agent that reads skill folders** — drop into its skill directory; env vars pick up the pod URL and key
|
|
72
|
+
- **Claude Code** — install to `~/.claude/skills/synap/`
|
|
71
73
|
- **Claude Desktop** — does NOT read local skill folders. Skills in Claude Desktop sync from claude.ai — upload the three skill directories there (Settings → Skills → Upload). Claude Desktop CAN still use the pod via an MCP bridge — see `synap-cli/src/lib/targets.ts` `installClaudeDesktop` for the stdio-bridge config.
|
|
72
|
-
- **Raycast** — the
|
|
74
|
+
- **Raycast** — Raycast AI connects to the pod's `/mcp` as an HTTP MCP server (`synap connect --target=raycast`) and reads these skills through `synap_load_skill`, like any MCP client
|
|
73
75
|
|
|
74
|
-
The
|
|
76
|
+
The install metadata (required env, capabilities) is namespaced under `metadata.synap`, so consumers that don't recognize it ignore it cleanly.
|
|
75
77
|
|
|
76
78
|
## When to install which
|
|
77
79
|
|