@synap-core/cli 1.8.0 → 1.11.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/dist/commands/agent-chat.d.ts +47 -0
- package/dist/commands/agent-chat.js +250 -0
- package/dist/commands/agent-chat.js.map +1 -0
- package/dist/commands/agent-run.js +3 -4
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/agents.js +85 -46
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/automation.js +2 -1
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/bridge-setup.d.ts +66 -0
- package/dist/commands/bridge-setup.js +1112 -0
- package/dist/commands/bridge-setup.js.map +1 -0
- package/dist/commands/cap-connections.d.ts +28 -0
- package/dist/commands/cap-connections.js +224 -0
- package/dist/commands/cap-connections.js.map +1 -0
- package/dist/commands/capability.d.ts +89 -0
- package/dist/commands/capability.js +1594 -0
- package/dist/commands/capability.js.map +1 -0
- package/dist/commands/centrality.d.ts +20 -0
- package/dist/commands/centrality.js +95 -0
- package/dist/commands/centrality.js.map +1 -0
- package/dist/commands/connect.d.ts +2 -0
- package/dist/commands/connect.js +16 -35
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/context.js +6 -7
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +1 -0
- package/dist/commands/data-extra.js +41 -14
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +4 -4
- package/dist/commands/data.js +254 -187
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +20 -0
- package/dist/commands/diagnose.js +186 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/digest.d.ts +17 -0
- package/dist/commands/digest.js +122 -0
- package/dist/commands/digest.js.map +1 -0
- package/dist/commands/discover.d.ts +2 -0
- package/dist/commands/discover.js +25 -8
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/doc.d.ts +14 -0
- package/dist/commands/doc.js +61 -4
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/doctor.d.ts +21 -0
- package/dist/commands/doctor.js +189 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.js +5 -2
- package/dist/commands/events.js.map +1 -1
- package/dist/commands/explain.d.ts +1 -1
- package/dist/commands/explain.js +18 -15
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/facet.d.ts +29 -0
- package/dist/commands/facet.js +113 -0
- package/dist/commands/facet.js.map +1 -0
- package/dist/commands/graph.js +7 -4
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/import.d.ts +38 -0
- package/dist/commands/import.js +471 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.js +35 -16
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.js +3 -4
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/knowledge.d.ts +8 -0
- package/dist/commands/knowledge.js +308 -33
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/launch.d.ts +50 -0
- package/dist/commands/launch.js +790 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/lens.d.ts +45 -0
- package/dist/commands/lens.js +386 -0
- package/dist/commands/lens.js.map +1 -0
- package/dist/commands/market-authoring.d.ts +45 -0
- package/dist/commands/market-authoring.js +225 -0
- package/dist/commands/market-authoring.js.map +1 -0
- package/dist/commands/market.d.ts +224 -0
- package/dist/commands/market.js +1643 -0
- package/dist/commands/market.js.map +1 -0
- package/dist/commands/mcp.d.ts +64 -0
- package/dist/commands/mcp.js +265 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/observe.js +14 -11
- package/dist/commands/observe.js.map +1 -1
- package/dist/commands/open.d.ts +21 -4
- package/dist/commands/open.js +45 -4
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/pod.d.ts +100 -0
- package/dist/commands/pod.js +359 -0
- package/dist/commands/pod.js.map +1 -0
- package/dist/commands/pods.d.ts +15 -0
- package/dist/commands/pods.js +233 -17
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.js +43 -3
- package/dist/commands/proposals-actions.js.map +1 -1
- package/dist/commands/purge.d.ts +23 -0
- package/dist/commands/purge.js +148 -0
- package/dist/commands/purge.js.map +1 -0
- package/dist/commands/raycast.d.ts +15 -0
- package/dist/commands/raycast.js +153 -0
- package/dist/commands/raycast.js.map +1 -0
- package/dist/commands/sessions.js +47 -22
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/skill-manage.d.ts +21 -0
- package/dist/commands/skill-manage.js +195 -0
- package/dist/commands/skill-manage.js.map +1 -0
- package/dist/commands/skills-commands.js +2 -1
- package/dist/commands/skills-commands.js.map +1 -1
- package/dist/commands/skills.js +7 -4
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/status.d.ts +3 -1
- package/dist/commands/status.js +166 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.d.ts +24 -0
- package/dist/commands/statusline.js +450 -0
- package/dist/commands/statusline.js.map +1 -0
- package/dist/commands/subscribe.js +2 -2
- package/dist/commands/subscribe.js.map +1 -1
- package/dist/commands/template.d.ts +42 -0
- package/dist/commands/template.js +191 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/tools.d.ts +30 -0
- package/dist/commands/tools.js +315 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/upload.d.ts +30 -0
- package/dist/commands/upload.js +155 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/versions.d.ts +27 -0
- package/dist/commands/versions.js +277 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/commands/view.js +3 -2
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/whoami.d.ts +21 -0
- package/dist/commands/whoami.js +129 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +894 -60
- package/dist/index.js.map +1 -1
- package/dist/lib/approval-poll.d.ts +42 -0
- package/dist/lib/approval-poll.js +52 -0
- package/dist/lib/approval-poll.js.map +1 -0
- package/dist/lib/auth.d.ts +29 -6
- package/dist/lib/auth.js +105 -94
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/bundle-version.d.ts +11 -0
- package/dist/lib/bundle-version.js +33 -0
- package/dist/lib/bundle-version.js.map +1 -0
- package/dist/lib/capture-lane.d.ts +30 -12
- package/dist/lib/capture-lane.js +73 -14
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/capture-structure.d.ts +123 -0
- package/dist/lib/capture-structure.js +57 -0
- package/dist/lib/capture-structure.js.map +1 -0
- package/dist/lib/cp-packages.d.ts +177 -0
- package/dist/lib/cp-packages.js +389 -0
- package/dist/lib/cp-packages.js.map +1 -0
- package/dist/lib/describe-lens.d.ts +46 -0
- package/dist/lib/describe-lens.js +33 -0
- package/dist/lib/describe-lens.js.map +1 -0
- package/dist/lib/hub-client.d.ts +91 -1
- package/dist/lib/hub-client.js +565 -22
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/id.d.ts +23 -0
- package/dist/lib/id.js +35 -0
- package/dist/lib/id.js.map +1 -0
- package/dist/lib/installed.d.ts +51 -0
- package/dist/lib/installed.js +70 -0
- package/dist/lib/installed.js.map +1 -0
- package/dist/lib/next-steps.d.ts +61 -0
- package/dist/lib/next-steps.js +146 -0
- package/dist/lib/next-steps.js.map +1 -0
- package/dist/lib/pod.d.ts +144 -22
- package/dist/lib/pod.js +302 -64
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/project-ref.d.ts +95 -0
- package/dist/lib/project-ref.js +144 -0
- package/dist/lib/project-ref.js.map +1 -0
- package/dist/lib/project.d.ts +35 -0
- package/dist/lib/project.js +39 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/session-lens.d.ts +33 -0
- package/dist/lib/session-lens.js +76 -0
- package/dist/lib/session-lens.js.map +1 -0
- package/dist/lib/skill-import.d.ts +40 -0
- package/dist/lib/skill-import.js +203 -0
- package/dist/lib/skill-import.js.map +1 -0
- package/dist/lib/skills-installer.d.ts +17 -6
- package/dist/lib/skills-installer.js +133 -19
- package/dist/lib/skills-installer.js.map +1 -1
- package/dist/lib/suite.d.ts +28 -0
- package/dist/lib/suite.js +29 -0
- package/dist/lib/suite.js.map +1 -0
- package/dist/lib/superwhisper-import.d.ts +40 -0
- package/dist/lib/superwhisper-import.js +389 -0
- package/dist/lib/superwhisper-import.js.map +1 -0
- package/dist/lib/targets.d.ts +49 -1
- package/dist/lib/targets.js +420 -288
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/template-file.d.ts +74 -0
- package/dist/lib/template-file.js +140 -0
- package/dist/lib/template-file.js.map +1 -0
- package/dist/lib/unwrapList.d.ts +1 -0
- package/dist/lib/unwrapList.js +20 -0
- package/dist/lib/unwrapList.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.js +10 -2
- package/dist/utils/logger.js.map +1 -1
- package/node_modules/@synap/hub-rest-client/dist/index.cjs +414 -34
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +762 -22
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +762 -22
- package/node_modules/@synap/hub-rest-client/dist/index.js +414 -34
- package/node_modules/@synap/hub-rest-client/package.json +1 -1
- package/node_modules/@synap/hub-rest-client/src/client.ts +525 -37
- package/node_modules/@synap/hub-rest-client/src/index.ts +42 -0
- package/node_modules/@synap/hub-rest-client/src/setup.ts +57 -1
- package/node_modules/@synap/hub-rest-client/src/types.ts +697 -37
- package/package.json +11 -5
- package/skills/agent-os/SKILL.md +218 -0
- package/skills/manifest.json +5 -0
- package/skills/onboard/SKILL.md +193 -0
- package/skills/synap/SKILL.md +1284 -58
- package/skills/synap/_order.txt +37 -0
- package/skills/synap/_skill.yaml +24 -0
- package/skills/synap/authentication.md +10 -0
- package/skills/synap/automations.md +264 -0
- package/skills/synap/capabilities.md +107 -0
- package/skills/synap/capture.md +50 -142
- package/skills/synap/cli-operations.md +107 -0
- package/skills/synap/common-mistakes.md +13 -0
- package/skills/synap/content-os.md +83 -0
- package/skills/synap/creative-loop.md +43 -0
- package/skills/synap/crm.md +117 -0
- package/skills/synap/diagnostics.md +35 -0
- package/skills/synap/digesting-a-channel.md +63 -0
- package/skills/synap/document-embeds.md +123 -0
- package/skills/synap/escalation-ladder.md +71 -0
- package/skills/synap/focus-sessions.md +47 -0
- package/skills/synap/governance-rules.md +64 -0
- package/skills/synap/governance.md +6 -6
- package/skills/synap/graph-gardening.md +21 -0
- package/skills/synap/inline-patterns.md +38 -0
- package/skills/synap/lenses.md +38 -0
- package/skills/synap/linking-principle.md +39 -0
- package/skills/synap/linking.md +1 -0
- package/skills/synap/mental-model.md +45 -0
- package/skills/synap/more.md +7 -0
- package/skills/synap/multi-entity-capture.md +12 -0
- package/skills/synap/next-action.md +37 -0
- package/skills/synap/north-star.md +17 -0
- package/skills/synap/operating-mode-rules.md +45 -0
- package/skills/synap/operating-mode.md +9 -0
- package/skills/synap/quick-reference.md +67 -0
- package/skills/synap/reading.md +43 -0
- package/skills/synap/recap.md +21 -0
- package/skills/synap/reflexes.md +46 -0
- package/skills/synap/response-style.md +21 -0
- package/skills/synap/scope.md +13 -0
- package/skills/synap/showing.md +17 -0
- package/skills/synap/user-model.md +25 -0
- package/skills/synap/viewframe-cells.md +290 -0
- package/skills/synap/work-flow.md +113 -0
- package/skills/synap/worked-examples.md +74 -0
- package/skills/synap/workspace-design.md +45 -0
- package/skills/synap/workspace-edges.md +49 -0
- package/skills/synap/writes.md +213 -0
- package/skills/synap-app/SKILL.md +319 -0
- package/skills/synap-app/_order.txt +5 -0
- package/skills/synap-app/_skill.yaml +20 -0
- package/skills/synap-app/creating-the-base-app.md +64 -0
- package/skills/synap-app/governance.md +42 -0
- package/skills/synap-app/install-commands.md +55 -0
- package/skills/synap-app/overview.md +50 -0
- package/skills/synap-app/using-the-sdk.md +73 -0
- package/skills/synap-market/SKILL.md +335 -0
- package/skills/synap-market/_order.txt +5 -0
- package/skills/synap-market/_skill.yaml +24 -0
- package/skills/synap-market/author-and-publish.md +75 -0
- package/skills/synap-market/discover-and-fetch.md +59 -0
- package/skills/synap-market/governance-and-catalog.md +56 -0
- package/skills/synap-market/install.md +55 -0
- package/skills/synap-market/overview.md +51 -0
- package/skills/synap-schema/SKILL.md +97 -6
- package/skills/synap-schema/_order.txt +13 -0
- package/skills/synap-schema/_skill.yaml +22 -0
- package/skills/synap-schema/before-you-touch.md +14 -0
- package/skills/synap-schema/common-mistakes.md +9 -0
- package/skills/synap-schema/creating-profiles.md +17 -0
- package/skills/synap-schema/discover-profiles.md +24 -0
- package/skills/synap-schema/entity-scope.md +8 -0
- package/skills/synap-schema/extend-vs-create.md +31 -0
- package/skills/synap-schema/more.md +6 -0
- package/skills/synap-schema/overlay-properties.md +22 -0
- package/skills/synap-schema/profiles.md +3 -0
- package/skills/synap-schema/property-defs.md +29 -0
- package/skills/synap-schema/read-before-write.md +50 -0
- package/skills/synap-schema/relations.md +18 -0
- package/skills/synap-schema/worked-example.md +30 -0
- package/skills/synap-ui/SKILL.md +26 -2
- package/skills/synap-ui/_order.txt +13 -0
- package/skills/synap-ui/_skill.yaml +23 -0
- package/skills/synap-ui/ai-companion.md +27 -0
- package/skills/synap-ui/arranging-bento.md +8 -0
- package/skills/synap-ui/before-you-build.md +20 -0
- package/skills/synap-ui/bento-layouts.md +35 -0
- package/skills/synap-ui/common-mistakes.md +10 -0
- package/skills/synap-ui/creating-views.md +26 -0
- package/skills/synap-ui/four-builds.md +24 -0
- package/skills/synap-ui/more.md +7 -0
- package/skills/synap-ui/proposing-vs-extending.md +11 -0
- package/skills/synap-ui/view-list.md +24 -0
- package/skills/synap-ui/views.md +3 -0
- package/skills/synap-ui/worked-example.md +18 -0
- package/skills/synap-ui/workspaces.md +47 -0
- package/templates/automations/bookmark-enrichment.automation.json +44 -0
- package/templates/automations/mail-feed.automation.json +86 -0
- package/templates/automations/url-bookmark-capture.automation.json +70 -0
- package/templates/skills/README.md +21 -0
- package/templates/skills/authoring-automations/SKILL.md +95 -0
- package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
- package/templates/skills/authoring-capabilities/SKILL.md +93 -0
- package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
- package/templates/skills/authoring-playbooks/SKILL.md +102 -0
- package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
- package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
- package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
- package/templates/skills/coordinating-agents/SKILL.md +32 -0
- package/templates/skills/coordinating-branches/SKILL.md +27 -0
- package/templates/skills/mapping-the-server/SKILL.md +54 -0
- package/templates/skills/reading-client-progress/SKILL.md +65 -0
- package/templates/skills/routing-to-channels/SKILL.md +54 -0
- package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
- package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
- package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
- package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
- package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
- package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
- package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
- package/dist/commands/connectors.d.ts +0 -31
- package/dist/commands/connectors.js +0 -276
- package/dist/commands/connectors.js.map +0 -1
- package/dist/commands/finish.d.ts +0 -25
- package/dist/commands/finish.js +0 -274
- package/dist/commands/finish.js.map +0 -1
- package/dist/commands/openclaw.d.ts +0 -40
- package/dist/commands/openclaw.js +0 -1148
- package/dist/commands/openclaw.js.map +0 -1
- package/dist/commands/security-audit.d.ts +0 -12
- package/dist/commands/security-audit.js +0 -100
- package/dist/commands/security-audit.js.map +0 -1
- package/dist/lib/hardening.d.ts +0 -18
- package/dist/lib/hardening.js +0 -214
- package/dist/lib/hardening.js.map +0 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap skill add / list / remove — manage instruction skills on the pod.
|
|
3
|
+
*
|
|
4
|
+
* Skills follow the Agent Skills open standard (SKILL.md directories), so users
|
|
5
|
+
* can add skills from many sources — the bundled Synap-native set, a local
|
|
6
|
+
* folder, their existing ~/.claude/skills/, or any GitHub repo — and the agent
|
|
7
|
+
* loads them. One dedicated command, not buried in bridge-setup.
|
|
8
|
+
*/
|
|
9
|
+
import os from "node:os";
|
|
10
|
+
import fs from "node:fs";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { execFileSync } from "node:child_process";
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import ora from "ora";
|
|
15
|
+
import { log } from "../utils/logger.js";
|
|
16
|
+
import { resolveHubConfig, resolveUserId, hubGet, hubDelete, } from "../lib/hub-client.js";
|
|
17
|
+
import { unwrapList } from "../lib/unwrapList.js";
|
|
18
|
+
import { discoverSkillDirs, parseSkillDir, importSkill, } from "../lib/skill-import.js";
|
|
19
|
+
import { resolveBundledSkillsDir } from "./bridge-setup.js";
|
|
20
|
+
/** Expand ~ and resolve a local path. */
|
|
21
|
+
function expandPath(p) {
|
|
22
|
+
if (p.startsWith("~"))
|
|
23
|
+
return path.join(os.homedir(), p.slice(1));
|
|
24
|
+
return path.resolve(p);
|
|
25
|
+
}
|
|
26
|
+
/** GitHub `owner/repo` (and `owner/repo/skill`) shorthand — no dots, no leading ./ or ~. */
|
|
27
|
+
function parseGitHubShorthand(source) {
|
|
28
|
+
if (source.startsWith(".") || source.startsWith("/") || source.startsWith("~"))
|
|
29
|
+
return null;
|
|
30
|
+
if (source.startsWith("http") || source.startsWith("git@"))
|
|
31
|
+
return null;
|
|
32
|
+
const [pathPart, ref] = source.split("@");
|
|
33
|
+
const parts = pathPart.split("/").filter(Boolean);
|
|
34
|
+
if (parts.length < 2)
|
|
35
|
+
return null;
|
|
36
|
+
return {
|
|
37
|
+
repo: `${parts[0]}/${parts[1]}`,
|
|
38
|
+
skill: parts.length > 2 ? parts.slice(2).join("/") : undefined,
|
|
39
|
+
ref,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a source to a list of SKILL.md directories on local disk.
|
|
44
|
+
* Returns { dirs, cleanup } — cleanup removes any temp clone.
|
|
45
|
+
*/
|
|
46
|
+
function resolveSource(source) {
|
|
47
|
+
// 1. Bundled Synap-native skills
|
|
48
|
+
if (source === "bundled" || source === "synap") {
|
|
49
|
+
const dir = resolveBundledSkillsDir();
|
|
50
|
+
if (!dir)
|
|
51
|
+
throw new Error("Bundled skills not found in this CLI install");
|
|
52
|
+
return { dirs: discoverSkillDirs(dir) };
|
|
53
|
+
}
|
|
54
|
+
// 2. Local path (incl. ~/.claude/skills/)
|
|
55
|
+
if (source.startsWith(".") || source.startsWith("/") || source.startsWith("~")) {
|
|
56
|
+
const abs = expandPath(source);
|
|
57
|
+
if (!fs.existsSync(abs))
|
|
58
|
+
throw new Error(`Path not found: ${abs}`);
|
|
59
|
+
return { dirs: discoverSkillDirs(abs) };
|
|
60
|
+
}
|
|
61
|
+
// 3. GitHub shorthand or full git URL → shallow clone to a temp dir
|
|
62
|
+
const gh = parseGitHubShorthand(source);
|
|
63
|
+
const cloneUrl = gh
|
|
64
|
+
? `https://github.com/${gh.repo}.git`
|
|
65
|
+
: source.startsWith("http") || source.startsWith("git@")
|
|
66
|
+
? source
|
|
67
|
+
: null;
|
|
68
|
+
if (cloneUrl) {
|
|
69
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "synap-skill-"));
|
|
70
|
+
const args = ["clone", "--depth", "1"];
|
|
71
|
+
if (gh?.ref)
|
|
72
|
+
args.push("--branch", gh.ref);
|
|
73
|
+
args.push(cloneUrl, tmp);
|
|
74
|
+
try {
|
|
75
|
+
execFileSync("git", args, { stdio: "pipe" });
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
79
|
+
throw new Error(`git clone failed: ${err.message}`);
|
|
80
|
+
}
|
|
81
|
+
const root = gh?.skill ? path.join(tmp, gh.skill) : tmp;
|
|
82
|
+
return {
|
|
83
|
+
dirs: discoverSkillDirs(root),
|
|
84
|
+
cleanup: () => fs.rmSync(tmp, { recursive: true, force: true }),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
throw new Error(`Unrecognized source "${source}". Use: bundled · a local path · ~/.claude/skills/ · owner/repo · a git URL.`);
|
|
88
|
+
}
|
|
89
|
+
/** synap skill add <source> */
|
|
90
|
+
export async function addSkill(source, opts) {
|
|
91
|
+
const cfg = await resolveHubConfig(opts);
|
|
92
|
+
const userId = await resolveUserId(cfg);
|
|
93
|
+
let resolved;
|
|
94
|
+
try {
|
|
95
|
+
resolved = resolveSource(source);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
log.error(err.message);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
if (resolved.dirs.length === 0) {
|
|
102
|
+
log.warn(`No SKILL.md skill directories found in "${source}".`);
|
|
103
|
+
resolved.cleanup?.();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const spinner = ora(`Importing ${resolved.dirs.length} skill(s)…`).start();
|
|
107
|
+
let imported = 0, existed = 0, errored = 0;
|
|
108
|
+
const lines = [];
|
|
109
|
+
for (const dir of resolved.dirs) {
|
|
110
|
+
const parsed = parseSkillDir(dir);
|
|
111
|
+
if (!parsed)
|
|
112
|
+
continue;
|
|
113
|
+
const res = await importSkill(parsed, userId, cfg);
|
|
114
|
+
if (res.status === "imported") {
|
|
115
|
+
imported++;
|
|
116
|
+
lines.push(` ${chalk.green("✓")} ${parsed.slug}${res.docs ? chalk.dim(` · ${res.docs} docs`) : ""}${parsed.autoLoad ? chalk.dim(" · core") : ""}`);
|
|
117
|
+
}
|
|
118
|
+
else if (res.status === "exists") {
|
|
119
|
+
existed++;
|
|
120
|
+
lines.push(` ${chalk.dim("•")} ${chalk.dim(parsed.slug + " (already on pod)")}`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
errored++;
|
|
124
|
+
lines.push(` ${chalk.red("✗")} ${parsed.slug} — ${chalk.red(res.error ?? "error")}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
resolved.cleanup?.();
|
|
128
|
+
spinner.stop();
|
|
129
|
+
lines.forEach((l) => console.log(l));
|
|
130
|
+
log.success(`Added ${imported} skill(s)${existed ? `, ${existed} already present` : ""}${errored ? chalk.red(`, ${errored} failed`) : ""}.`);
|
|
131
|
+
}
|
|
132
|
+
/** synap skill list */
|
|
133
|
+
export async function listSkills(opts) {
|
|
134
|
+
const cfg = await resolveHubConfig(opts);
|
|
135
|
+
if (opts.debug)
|
|
136
|
+
log.dim(`key prefix: ${cfg.apiKey.slice(0, 16)}... userId: ${cfg.userId} pod: ${cfg.podUrl}`);
|
|
137
|
+
// Resolve the operator userId from the key context. The executable route
|
|
138
|
+
// returns ALL pod-scoped skills regardless of userId, but the scope filter
|
|
139
|
+
// in the tRPC procedure uses the ACTING userId from the key context.
|
|
140
|
+
// We send the userId explicitly so the filter includes user-scoped skills
|
|
141
|
+
// matching the resolved user, not just pod-scoped ones.
|
|
142
|
+
const userId = await resolveUserId(cfg);
|
|
143
|
+
const res = (await hubGet(`/agent-skills/executable?userId=${encodeURIComponent(userId)}&status=active&approved=true`, {}, cfg));
|
|
144
|
+
const skills = unwrapList(res);
|
|
145
|
+
const core = skills.filter((s) => s.metadata?.autoLoad === true);
|
|
146
|
+
const onDemand = skills.filter((s) => s.metadata?.autoLoad !== true);
|
|
147
|
+
if (skills.length === 0) {
|
|
148
|
+
log.dim("No skills on the pod yet. Add some: synap skill add bundled");
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const summary = `${skills.length} total (${core.length} core auto-load, ${onDemand.length} on-demand)`;
|
|
152
|
+
console.log(chalk.bold(`\nSkills on your pod — ${summary}\n`));
|
|
153
|
+
const print = (skills, badge) => {
|
|
154
|
+
for (const s of skills) {
|
|
155
|
+
const slug = s.name;
|
|
156
|
+
const kind = s.kind ?? (s.body ? "instruction" : s.code ? "code" : "?");
|
|
157
|
+
const desc = s.description?.slice(0, 120) ?? "";
|
|
158
|
+
console.log(` ${chalk.cyan(slug.padEnd(42))} ${chalk.dim(kind)} ${badge}`);
|
|
159
|
+
if (desc)
|
|
160
|
+
console.log(` ${" ".repeat(42)} ${chalk.dim(desc)}`);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
if (core.length > 0) {
|
|
164
|
+
console.log(chalk.bold("Core (auto-injected every turn)"));
|
|
165
|
+
print(core, chalk.green("● core"));
|
|
166
|
+
}
|
|
167
|
+
if (onDemand.length > 0) {
|
|
168
|
+
if (core.length > 0)
|
|
169
|
+
console.log("");
|
|
170
|
+
console.log(chalk.bold("On-demand (catalog — agent calls load_skill when relevant)"));
|
|
171
|
+
print(onDemand, chalk.yellow("○ on-demand"));
|
|
172
|
+
}
|
|
173
|
+
console.log("");
|
|
174
|
+
}
|
|
175
|
+
/** synap skill remove <slug> */
|
|
176
|
+
export async function removeSkill(slug, opts) {
|
|
177
|
+
const cfg = await resolveHubConfig(opts);
|
|
178
|
+
// Resolve slug → id, then delete by id.
|
|
179
|
+
let id;
|
|
180
|
+
try {
|
|
181
|
+
const skill = (await hubGet(`/agent-skills/by-slug/${encodeURIComponent(slug)}`, {}, cfg));
|
|
182
|
+
if (!skill.id) {
|
|
183
|
+
log.error(`No skill found with slug "${slug}".`);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
id = skill.id;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
log.error(`No skill found with slug "${slug}".`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
await hubDelete(`/agent-skills/${id}`, cfg);
|
|
193
|
+
log.success(`Removed skill "${slug}".`);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=skill-manage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manage.js","sourceRoot":"","sources":["../../src/commands/skill-manage.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,13 +16,14 @@ import os from "node:os";
|
|
|
16
16
|
import { readFile } from "node:fs/promises";
|
|
17
17
|
import { log } from "../utils/logger.js";
|
|
18
18
|
import { resolveHubConfig, hubGet, hubPost } from "../lib/hub-client.js";
|
|
19
|
+
import { unwrapList } from "../lib/unwrapList.js";
|
|
19
20
|
import ora from "ora";
|
|
20
21
|
// ─── suggest ───────────────────────────────────────────────────────────────
|
|
21
22
|
export async function suggestSkills(topic, opts) {
|
|
22
23
|
try {
|
|
23
24
|
const cfg = await resolveHubConfig(opts);
|
|
24
25
|
const result = await hubGet("/agent-skills", { topic, limit: 20 }, cfg);
|
|
25
|
-
const skills = result
|
|
26
|
+
const skills = unwrapList(result, ["skills"]);
|
|
26
27
|
if (skills.length === 0) {
|
|
27
28
|
log.info(`No skills found for topic "${topic}".`);
|
|
28
29
|
log.dim("Try: synap skill sync — to import skills from ~/.claude/skills/");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-commands.js","sourceRoot":"","sources":["../../src/commands/skills-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills-commands.js","sourceRoot":"","sources":["../../src/commands/skills-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/skills.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { log } from "../utils/logger.js";
|
|
3
|
-
import { resolveHubConfig, hubPatch, hubPost, } from "../lib/hub-client.js";
|
|
3
|
+
import { resolveHubConfig, hubPatch, hubPost, renderHubError, } from "../lib/hub-client.js";
|
|
4
|
+
import { unwrapList } from "../lib/unwrapList.js";
|
|
4
5
|
import { readFileSync, existsSync } from "fs";
|
|
5
6
|
import { resolve } from "path";
|
|
6
7
|
// ─── gatherContext ────────────────────────────────────────────────────────────
|
|
@@ -32,12 +33,14 @@ export async function gatherContext(opts) {
|
|
|
32
33
|
contextReport += "## Pod Knowledge Graph\n\n";
|
|
33
34
|
try {
|
|
34
35
|
const recallRes = (await hubPost("/entities/recall", { workspaceId, limit: 10 }, cfg));
|
|
35
|
-
const entities = recallRes
|
|
36
|
+
const entities = unwrapList(recallRes, ["entities"]);
|
|
36
37
|
if (entities.length > 0) {
|
|
37
38
|
contextReport += "### Recent Entities\n\n";
|
|
38
39
|
for (const e of entities) {
|
|
39
40
|
const type = String(e.profileSlug ?? "unknown");
|
|
40
|
-
|
|
41
|
+
// Full id — this context report is read by an agent that may act
|
|
42
|
+
// on the entity next (e.g. `synap get entity <id>`).
|
|
43
|
+
contextReport += `- **${String(e.title ?? e.id)}** (${type}): ${String(e.id)}\n`;
|
|
41
44
|
}
|
|
42
45
|
}
|
|
43
46
|
else {
|
|
@@ -119,7 +122,7 @@ export async function gatherContext(opts) {
|
|
|
119
122
|
log.dim(`Report: ${contextReport.length} bytes`);
|
|
120
123
|
}
|
|
121
124
|
catch (e) {
|
|
122
|
-
|
|
125
|
+
renderHubError(e);
|
|
123
126
|
process.exit(1);
|
|
124
127
|
}
|
|
125
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EACL,gBAAgB,EAEhB,QAAQ,EACR,OAAO,
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,4 +16,6 @@
|
|
|
16
16
|
* - `docker exec openclaw openclaw skills list` (was isSynapSkillInstalledInDocker)
|
|
17
17
|
* For those, the user runs `./synap health` on the pod host.
|
|
18
18
|
*/
|
|
19
|
-
export declare function status(
|
|
19
|
+
export declare function status(opts?: {
|
|
20
|
+
json?: boolean;
|
|
21
|
+
}): Promise<void>;
|
package/dist/commands/status.js
CHANGED
|
@@ -22,7 +22,7 @@ import { fileURLToPath } from "url";
|
|
|
22
22
|
import { dirname, join } from "path";
|
|
23
23
|
import { log, banner } from "../utils/logger.js";
|
|
24
24
|
import { checkPodHealth, getActivePodConfig, listPodProfiles, getAgentWorkspaceRouting } from "../lib/pod.js";
|
|
25
|
-
import { resolveHubConfig, hubGet } from "../lib/hub-client.js";
|
|
25
|
+
import { resolveHubConfig, hubGet, HubError, renderHubError } from "../lib/hub-client.js";
|
|
26
26
|
import { isLoggedIn, getStoredToken, isTokenLocallyExpired, } from "../lib/auth.js";
|
|
27
27
|
const __filename = fileURLToPath(import.meta.url);
|
|
28
28
|
const __dirname = dirname(__filename);
|
|
@@ -35,6 +35,24 @@ function getCliVersion() {
|
|
|
35
35
|
return "0.1.0";
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Fetch the pod's deploy-verification detail (version + migration + schema
|
|
40
|
+
* coherence). Degrades to null on any error — an older pod without the route,
|
|
41
|
+
* or an unreachable pod, simply omits the extra detail from `synap status`.
|
|
42
|
+
*/
|
|
43
|
+
async function fetchReleaseStatus(podUrl) {
|
|
44
|
+
try {
|
|
45
|
+
const res = await fetch(`${podUrl}/status/release`, {
|
|
46
|
+
signal: AbortSignal.timeout(5000),
|
|
47
|
+
});
|
|
48
|
+
if (!res.ok)
|
|
49
|
+
return null;
|
|
50
|
+
return (await res.json());
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
38
56
|
function timeAgo(isoDate) {
|
|
39
57
|
const diff = Date.now() - new Date(isoDate).getTime();
|
|
40
58
|
const minutes = Math.floor(diff / 60_000);
|
|
@@ -48,7 +66,18 @@ function timeAgo(isoDate) {
|
|
|
48
66
|
const days = Math.floor(hours / 24);
|
|
49
67
|
return `${days} day${days === 1 ? "" : "s"} ago`;
|
|
50
68
|
}
|
|
51
|
-
export async function status() {
|
|
69
|
+
export async function status(opts = {}) {
|
|
70
|
+
// ── JSON mode: raw dump, no banner/pretty output ─────────────────────────
|
|
71
|
+
// Focused on the "is the latest actually deployed?" question — pod health +
|
|
72
|
+
// release/migration/coherence detail as one machine-readable object.
|
|
73
|
+
if (opts.json) {
|
|
74
|
+
const cfg = getActivePodConfig();
|
|
75
|
+
const url = cfg?.podUrl ?? process.env.SYNAP_POD_URL ?? null;
|
|
76
|
+
const health = url ? await checkPodHealth(url) : null;
|
|
77
|
+
const release = url ? await fetchReleaseStatus(url) : null;
|
|
78
|
+
process.stdout.write(JSON.stringify({ podUrl: url, health, release }, null, 2) + "\n");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
52
81
|
banner();
|
|
53
82
|
// CLI version + update hint
|
|
54
83
|
const cliVersion = getCliVersion();
|
|
@@ -56,16 +85,21 @@ export async function status() {
|
|
|
56
85
|
log.dim("Remote / API-only view. For local docker health, run ./synap health on the pod host.");
|
|
57
86
|
const creds = getStoredToken();
|
|
58
87
|
// ── Account ────────────────────────────────────────────────────────────
|
|
88
|
+
// This is the synap.live CONTROL-PLANE account (~/.synap/credentials.json) —
|
|
89
|
+
// a different identity axis from the pod API key (~/.synap/config.json). A
|
|
90
|
+
// self-hosted pod added via `synap pods add` never has one, and works fine
|
|
91
|
+
// without it. Never render the two axes as one, and never gate Next Steps on
|
|
92
|
+
// this one — that's what made a healthy pod report "Not logged in".
|
|
59
93
|
log.heading("Account");
|
|
60
|
-
let
|
|
94
|
+
let cpLinked = false;
|
|
61
95
|
if (creds) {
|
|
62
|
-
log.success(`Logged in as ${chalk.bold(creds.email)}`);
|
|
96
|
+
log.success(`Logged in as ${chalk.bold(creds.email)} ${chalk.dim("(synap.live)")}`);
|
|
63
97
|
log.dim(`User ID: ${creds.userId}`);
|
|
64
98
|
if (isTokenLocallyExpired(creds)) {
|
|
65
99
|
// Local expiry passed — confirm with CP before declaring dead.
|
|
66
100
|
const authStatus = await isLoggedIn();
|
|
67
101
|
if (authStatus.valid) {
|
|
68
|
-
|
|
102
|
+
cpLinked = true;
|
|
69
103
|
log.dim(`Token refreshed (valid until ${new Date(creds.expiresAt).toLocaleDateString()})`);
|
|
70
104
|
}
|
|
71
105
|
else {
|
|
@@ -75,7 +109,7 @@ export async function status() {
|
|
|
75
109
|
}
|
|
76
110
|
else {
|
|
77
111
|
// Token is locally fresh — validate in background but don't block on failure.
|
|
78
|
-
|
|
112
|
+
cpLinked = true;
|
|
79
113
|
const authStatus = await isLoggedIn().catch(() => ({ valid: false }));
|
|
80
114
|
if (authStatus.valid) {
|
|
81
115
|
log.dim(`Token valid until ${new Date(creds.expiresAt).toLocaleDateString()}`);
|
|
@@ -86,7 +120,8 @@ export async function status() {
|
|
|
86
120
|
}
|
|
87
121
|
}
|
|
88
122
|
else {
|
|
89
|
-
log.dim("
|
|
123
|
+
log.dim("Account (synap.live): not linked — optional for self-hosted pods.");
|
|
124
|
+
log.dim("Needed only for managed pods, provisioning and the marketplace. Link with: synap login");
|
|
90
125
|
}
|
|
91
126
|
// ── Pod ────────────────────────────────────────────────────────────────
|
|
92
127
|
const localConfig = getActivePodConfig();
|
|
@@ -110,6 +145,48 @@ export async function status() {
|
|
|
110
145
|
log.info(`Version: ${pod.version}`);
|
|
111
146
|
if (localConfig?.workspaceId)
|
|
112
147
|
log.dim(`Workspace: ${localConfig.workspaceId}`);
|
|
148
|
+
// ── Release / deploy verification ──────────────────────────────────────
|
|
149
|
+
// Answers "is the latest actually deployed, and did the migration apply?"
|
|
150
|
+
// from the pod's own runtime state. Older pods without the route just skip.
|
|
151
|
+
if (pod.healthy) {
|
|
152
|
+
const release = await fetchReleaseStatus(podUrl);
|
|
153
|
+
if (release) {
|
|
154
|
+
if (release.version) {
|
|
155
|
+
log.info(`API build: ${chalk.bold(release.version)} ${chalk.dim("(@synap/api)")}`);
|
|
156
|
+
}
|
|
157
|
+
if (release.buildStamp) {
|
|
158
|
+
log.dim(`Build stamp: ${release.buildStamp}`);
|
|
159
|
+
}
|
|
160
|
+
const mig = release.migrations;
|
|
161
|
+
if (mig?.note) {
|
|
162
|
+
log.dim(`Migrations: ${mig.note}`);
|
|
163
|
+
}
|
|
164
|
+
else if (mig) {
|
|
165
|
+
const when = mig.lastAppliedAt ? ` ${chalk.dim(`(${timeAgo(mig.lastAppliedAt)})`)}` : "";
|
|
166
|
+
log.info(`Last migration: ${chalk.bold(mig.lastApplied ?? "none")} ${chalk.dim(`[${mig.count} applied]`)}${when}`);
|
|
167
|
+
}
|
|
168
|
+
const sc = release.schemaCoherence;
|
|
169
|
+
if (sc?.note) {
|
|
170
|
+
log.dim(`Schema: ${sc.note}`);
|
|
171
|
+
}
|
|
172
|
+
else if (sc) {
|
|
173
|
+
if (sc.ok === true) {
|
|
174
|
+
log.info(`Schema: ${chalk.green("OK")}${sc.checked ? chalk.dim(` (${sc.checked} columns checked)`) : ""}`);
|
|
175
|
+
}
|
|
176
|
+
else if (sc.ok === false) {
|
|
177
|
+
log.warn(`Schema: ${chalk.red(`DRIFT — ${sc.drift.length} missing column${sc.drift.length === 1 ? "" : "s"}`)}`);
|
|
178
|
+
for (const d of sc.drift.slice(0, 10)) {
|
|
179
|
+
log.dim(` • ${d.table}.${d.column} ← ${d.addedBy}`);
|
|
180
|
+
}
|
|
181
|
+
if (sc.drift.length > 10)
|
|
182
|
+
log.dim(` … and ${sc.drift.length - 10} more`);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
log.dim("Schema: unknown");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
113
190
|
}
|
|
114
191
|
// ── Workspace Config ───────────────────────────────────────────────────
|
|
115
192
|
log.heading("Workspace Config");
|
|
@@ -126,6 +203,9 @@ export async function status() {
|
|
|
126
203
|
// means the key was rotated or revoked — surface the exact reconnect command
|
|
127
204
|
// so the user doesn't have to diagnose it themselves.
|
|
128
205
|
log.heading("API Key");
|
|
206
|
+
// null = not checked (no pod / unreachable), true/false = probe result.
|
|
207
|
+
// This is the axis Next Steps cares about — not the synap.live account.
|
|
208
|
+
let keyValid = null;
|
|
129
209
|
if (!localConfig) {
|
|
130
210
|
log.dim("No pod configured.");
|
|
131
211
|
}
|
|
@@ -136,19 +216,26 @@ export async function status() {
|
|
|
136
216
|
try {
|
|
137
217
|
const cfg = await resolveHubConfig();
|
|
138
218
|
await hubGet("/users/me", {}, cfg);
|
|
219
|
+
keyValid = true;
|
|
139
220
|
log.success("Valid");
|
|
140
221
|
log.dim(`Key saved: ${timeAgo(localConfig.savedAt)}`);
|
|
141
222
|
}
|
|
142
223
|
catch (err) {
|
|
143
224
|
const msg = err instanceof Error ? err.message : String(err);
|
|
144
|
-
|
|
225
|
+
// A non-HubError (transport, DNS) can still be an auth failure worded by
|
|
226
|
+
// another layer — keep the text check as the fallback arm.
|
|
227
|
+
const is401 = err instanceof HubError
|
|
228
|
+
? err.status === 401
|
|
229
|
+
: msg.toLowerCase().includes("unauthorized");
|
|
145
230
|
if (is401) {
|
|
231
|
+
keyValid = false;
|
|
146
232
|
const activeName = allProfiles.find((p) => p.active)?.name ?? "default";
|
|
147
233
|
log.warn(chalk.red("Invalid or expired — credentials must be refreshed."));
|
|
148
234
|
log.info(`Run: ${chalk.cyan(`synap login --reconnect ${activeName}`)}`);
|
|
149
235
|
}
|
|
150
236
|
else {
|
|
151
|
-
|
|
237
|
+
// Verification itself failed — key state stays unknown, not invalid.
|
|
238
|
+
renderHubError(err);
|
|
152
239
|
}
|
|
153
240
|
}
|
|
154
241
|
}
|
|
@@ -168,13 +255,15 @@ export async function status() {
|
|
|
168
255
|
if (isRes?.ok) {
|
|
169
256
|
const isData = (await isRes.json());
|
|
170
257
|
const svc = isData?.intelligenceService;
|
|
258
|
+
// Gate on `status`, not on the object: an older pod still ships a
|
|
259
|
+
// status-less `{}` here, and that is "not provisioned", not a status.
|
|
171
260
|
if (svc?.status === "active") {
|
|
172
261
|
log.success(`Active${svc.url ? ` (${svc.url})` : ""}`);
|
|
173
262
|
if (isData.credentialsValid === false) {
|
|
174
263
|
log.warn("Credentials invalid — reprovision from Browser Settings");
|
|
175
264
|
}
|
|
176
265
|
}
|
|
177
|
-
else if (svc) {
|
|
266
|
+
else if (svc?.status) {
|
|
178
267
|
log.warn(`Status: ${svc.status}`);
|
|
179
268
|
}
|
|
180
269
|
else {
|
|
@@ -186,6 +275,13 @@ export async function status() {
|
|
|
186
275
|
log.dim("Sign in with 'synap login' then run 'synap init' to provision");
|
|
187
276
|
}
|
|
188
277
|
}
|
|
278
|
+
// The pod already computed a next action for each issue — show it.
|
|
279
|
+
if (isData.connectionState && isData.connectionState !== "connected") {
|
|
280
|
+
log.dim(`Connection state: ${isData.connectionState}`);
|
|
281
|
+
}
|
|
282
|
+
for (const issue of isData.connectionIssueDetails ?? []) {
|
|
283
|
+
log.warn(`${issue.code}: ${issue.hint}`);
|
|
284
|
+
}
|
|
189
285
|
}
|
|
190
286
|
else {
|
|
191
287
|
log.dim("Could not check (pod may not support this endpoint)");
|
|
@@ -195,6 +291,50 @@ export async function status() {
|
|
|
195
291
|
log.dim("Could not check IS status");
|
|
196
292
|
}
|
|
197
293
|
}
|
|
294
|
+
// ── Connectors ─────────────────────────────────────────────────────────
|
|
295
|
+
// Without this, `synap status` says "All set" on a pod where every OAuth
|
|
296
|
+
// connect is doomed because no provider is configured server-side.
|
|
297
|
+
log.heading("Connectors");
|
|
298
|
+
if (!localConfig) {
|
|
299
|
+
log.dim("No pod configured.");
|
|
300
|
+
}
|
|
301
|
+
else if (!podHealthy) {
|
|
302
|
+
log.dim("Pod unreachable — cannot check connectors.");
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
try {
|
|
306
|
+
const cfg = await resolveHubConfig();
|
|
307
|
+
const params = {};
|
|
308
|
+
if (localConfig.workspaceId)
|
|
309
|
+
params.workspaceId = localConfig.workspaceId;
|
|
310
|
+
const res = (await hubGet("/connectors/providers", params, cfg));
|
|
311
|
+
const providers = (res.providers ?? []);
|
|
312
|
+
const nangoError = res.nangoError;
|
|
313
|
+
// An empty list is only "nothing is declared" when Nango ANSWERED. On a
|
|
314
|
+
// lookup failure the list is ALSO empty — asserting "none configured"
|
|
315
|
+
// there is a false diagnosis, and false diagnoses are the whole bug.
|
|
316
|
+
if (res.nangoStatus === "error") {
|
|
317
|
+
log.warn(`Could not check connectors (${nangoError?.reason ?? "unknown"}) — connection state is unknown.`);
|
|
318
|
+
if (nangoError?.message)
|
|
319
|
+
log.dim(nangoError.message);
|
|
320
|
+
}
|
|
321
|
+
else if (providers.length === 0) {
|
|
322
|
+
log.warn("No providers available — connecting a service will not work.");
|
|
323
|
+
log.dim("This pod's Nango declares no integrations. They're declared in the Nango dashboard.");
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
const connectedProviders = providers.filter((p) => p.connected);
|
|
327
|
+
log.info(`${providers.length} provider${providers.length === 1 ? "" : "s"} available ${chalk.dim(`[${connectedProviders.length} connected]`)}`);
|
|
328
|
+
// Name the connected ones — a bare count doesn't tell the user WHAT is wired up.
|
|
329
|
+
for (const p of connectedProviders) {
|
|
330
|
+
log.dim(` ${chalk.green("✓")} ${p.displayName ?? p.provider ?? p.id}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
log.warn(`Could not check connectors: ${err instanceof Error ? err.message : String(err)}`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
198
338
|
// ── Data Context ───────────────────────────────────────────────────────
|
|
199
339
|
// Show who the agent is, what workspace is active, and pending proposals.
|
|
200
340
|
log.heading("Data Context");
|
|
@@ -236,17 +376,29 @@ export async function status() {
|
|
|
236
376
|
}
|
|
237
377
|
// ── Next Steps ─────────────────────────────────────────────────────────
|
|
238
378
|
log.heading("Next Steps");
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
379
|
+
// Ordered by the POD axis — reachability, then config, then key validity.
|
|
380
|
+
// The synap.live account is deliberately NOT a gate here: a self-hosted pod
|
|
381
|
+
// is fully usable without one, and telling that user to `synap login` is the
|
|
382
|
+
// misleading advice this section used to lead with.
|
|
383
|
+
if (!podUrl) {
|
|
243
384
|
log.info("Connect to a pod: synap init");
|
|
385
|
+
log.dim("Already have a self-hosted pod? Add it with: synap pods add");
|
|
244
386
|
}
|
|
245
387
|
else if (!podHealthy) {
|
|
246
388
|
log.info("Pod unreachable — check it with: ./synap health on the pod host");
|
|
247
389
|
}
|
|
390
|
+
else if (!localConfig) {
|
|
391
|
+
log.info("Pod reachable but no local config — run: synap init");
|
|
392
|
+
}
|
|
393
|
+
else if (keyValid === false) {
|
|
394
|
+
const activeName = allProfiles.find((p) => p.active)?.name ?? "default";
|
|
395
|
+
log.info(`Refresh pod credentials: ${chalk.cyan(`synap login --reconnect ${activeName}`)}`);
|
|
396
|
+
}
|
|
248
397
|
else {
|
|
249
398
|
log.dim("All set. Run: synap context to load workspace context for an agent session.");
|
|
399
|
+
if (!cpLinked) {
|
|
400
|
+
log.dim("Optional: link a synap.live account with 'synap login' for managed pods + marketplace.");
|
|
401
|
+
}
|
|
250
402
|
}
|
|
251
403
|
log.blank();
|
|
252
404
|
}
|