@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,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill import — read standard SKILL.md skill directories and push them to the pod.
|
|
3
|
+
*
|
|
4
|
+
* Follows the Agent Skills open standard (agentskills.io): a skill is a DIRECTORY
|
|
5
|
+
* with a `SKILL.md` at its root (YAML frontmatter + markdown body) and optional
|
|
6
|
+
* nested files/subdirs for reference docs, examples, templates, and code. Every
|
|
7
|
+
* non-SKILL.md file becomes a linked document (the agent reads them on demand via
|
|
8
|
+
* get_document). This is the same format Claude Code, Codex, Gemini CLI, Copilot
|
|
9
|
+
* and others use.
|
|
10
|
+
*
|
|
11
|
+
* The pod stores them via POST /agent-skills/import: the SKILL.md body becomes
|
|
12
|
+
* the instruction skill, every other file becomes a linked document.
|
|
13
|
+
*/
|
|
14
|
+
import fs from "node:fs";
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import { hubPost } from "./hub-client.js";
|
|
17
|
+
/**
|
|
18
|
+
* Minimal YAML frontmatter parser for SKILL.md. The frontmatter is intentionally
|
|
19
|
+
* simple (name, description, a flat `metadata:` block) so we avoid a YAML dep.
|
|
20
|
+
*/
|
|
21
|
+
function parseFrontmatter(raw) {
|
|
22
|
+
if (!raw.startsWith("---"))
|
|
23
|
+
return { fm: {}, body: raw };
|
|
24
|
+
const end = raw.indexOf("\n---", 3);
|
|
25
|
+
if (end === -1)
|
|
26
|
+
return { fm: {}, body: raw };
|
|
27
|
+
const fmBlock = raw.slice(3, end).trim();
|
|
28
|
+
const body = raw.slice(end + 4).replace(/^\s*\n/, "");
|
|
29
|
+
const fm = {};
|
|
30
|
+
for (const line of fmBlock.split("\n")) {
|
|
31
|
+
const m = line.match(/^\s*([a-zA-Z0-9_-]+):\s*(.*)$/);
|
|
32
|
+
if (m && m[2] !== "")
|
|
33
|
+
fm[m[1].trim()] = m[2].trim().replace(/^["']|["']$/g, "");
|
|
34
|
+
}
|
|
35
|
+
return { fm, body };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Recursively walk a directory, collecting every file (except SKILL.md) as a
|
|
39
|
+
* document. Preserves the relative path from `root` as the document title so the
|
|
40
|
+
* agent can reference files exactly as they appear in the skill (e.g.
|
|
41
|
+
* "reference/02-scoring-framework.md", "examples/q2-description-rewrites.md",
|
|
42
|
+
* "templates/abstract-review-builder.py").
|
|
43
|
+
*
|
|
44
|
+
* Binary files are skipped. Files over 512KB are skipped (anti-bloat guard).
|
|
45
|
+
*/
|
|
46
|
+
function collectAllDocuments(root, skillMdPath) {
|
|
47
|
+
const docs = [];
|
|
48
|
+
const MAX_BYTES = 512 * 1024;
|
|
49
|
+
function walk(dir, prefix) {
|
|
50
|
+
let entries;
|
|
51
|
+
try {
|
|
52
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
const full = path.join(dir, entry.name);
|
|
59
|
+
const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
60
|
+
if (entry.isDirectory() || entry.isSymbolicLink()) {
|
|
61
|
+
// Follow symlink dirs; skip node_modules + .git
|
|
62
|
+
try {
|
|
63
|
+
const stat = entry.isSymbolicLink() ? fs.statSync(full) : null;
|
|
64
|
+
const isDir = entry.isDirectory() || (stat?.isDirectory() ?? false);
|
|
65
|
+
if (isDir && !["node_modules", ".git"].includes(entry.name)) {
|
|
66
|
+
walk(full, relPath);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch { /* broken symlink — skip */ }
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (!entry.isFile())
|
|
73
|
+
continue;
|
|
74
|
+
if (full === skillMdPath)
|
|
75
|
+
continue; // body, not a document
|
|
76
|
+
if (entry.name.startsWith("."))
|
|
77
|
+
continue; // hidden files
|
|
78
|
+
try {
|
|
79
|
+
const stat = fs.statSync(full);
|
|
80
|
+
if (stat.size > MAX_BYTES)
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// Map extension → document type
|
|
87
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
88
|
+
let type = "markdown";
|
|
89
|
+
let language;
|
|
90
|
+
if (ext === ".md") {
|
|
91
|
+
type = "markdown";
|
|
92
|
+
}
|
|
93
|
+
else if (ext === ".py") {
|
|
94
|
+
type = "code";
|
|
95
|
+
language = "python";
|
|
96
|
+
}
|
|
97
|
+
else if (ext === ".js" || ext === ".ts") {
|
|
98
|
+
type = "code";
|
|
99
|
+
language = ext === ".ts" ? "typescript" : "javascript";
|
|
100
|
+
}
|
|
101
|
+
else if (ext === ".json") {
|
|
102
|
+
type = "code";
|
|
103
|
+
language = "json";
|
|
104
|
+
}
|
|
105
|
+
else if (ext === ".txt") {
|
|
106
|
+
type = "text";
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
continue;
|
|
110
|
+
} // skip binary/unrecognized
|
|
111
|
+
let content;
|
|
112
|
+
try {
|
|
113
|
+
content = fs.readFileSync(full, "utf-8");
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
continue;
|
|
117
|
+
} // binary file detected at read time — skip
|
|
118
|
+
docs.push({ title: relPath, content, type, language });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
walk(root, "");
|
|
122
|
+
return docs;
|
|
123
|
+
}
|
|
124
|
+
/** Parse a single SKILL.md skill directory into an import payload. */
|
|
125
|
+
export function parseSkillDir(dir) {
|
|
126
|
+
const skillMd = path.join(dir, "SKILL.md");
|
|
127
|
+
if (!fs.existsSync(skillMd))
|
|
128
|
+
return null;
|
|
129
|
+
const raw = fs.readFileSync(skillMd, "utf-8");
|
|
130
|
+
const { fm, body } = parseFrontmatter(raw);
|
|
131
|
+
return {
|
|
132
|
+
slug: fm.name || path.basename(dir),
|
|
133
|
+
name: fm.name || path.basename(dir),
|
|
134
|
+
description: fm.description || "",
|
|
135
|
+
body: body.trim(),
|
|
136
|
+
autoLoad: fm.auto_load === "true",
|
|
137
|
+
documents: collectAllDocuments(dir, skillMd),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** Find every skill directory (one containing SKILL.md) under a root, one level deep. */
|
|
141
|
+
export function discoverSkillDirs(root) {
|
|
142
|
+
if (!fs.existsSync(root))
|
|
143
|
+
return [];
|
|
144
|
+
if (fs.existsSync(path.join(root, "SKILL.md")))
|
|
145
|
+
return [root];
|
|
146
|
+
const out = [];
|
|
147
|
+
for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
|
|
148
|
+
const full = path.join(root, entry.name);
|
|
149
|
+
const isDir = entry.isDirectory() ||
|
|
150
|
+
(entry.isSymbolicLink() && fs.statSync(full).isDirectory());
|
|
151
|
+
if (isDir && fs.existsSync(path.join(full, "SKILL.md")))
|
|
152
|
+
out.push(full);
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
/** Import a parsed skill into the pod via POST /agent-skills/import. */
|
|
157
|
+
export async function importSkill(parsed, userId, cfg) {
|
|
158
|
+
try {
|
|
159
|
+
const res = (await hubPost("/agent-skills/import", {
|
|
160
|
+
userId,
|
|
161
|
+
skill: {
|
|
162
|
+
slug: parsed.slug,
|
|
163
|
+
name: parsed.name,
|
|
164
|
+
description: parsed.description,
|
|
165
|
+
body: parsed.body,
|
|
166
|
+
autoLoad: parsed.autoLoad,
|
|
167
|
+
},
|
|
168
|
+
documents: parsed.documents,
|
|
169
|
+
}, cfg));
|
|
170
|
+
if (res.error && /already exists/i.test(res.error)) {
|
|
171
|
+
return { slug: parsed.slug, status: "exists", docs: 0 };
|
|
172
|
+
}
|
|
173
|
+
if (res.skill) {
|
|
174
|
+
return {
|
|
175
|
+
slug: parsed.slug,
|
|
176
|
+
status: "imported",
|
|
177
|
+
docs: res.documents?.length ?? 0,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
slug: parsed.slug,
|
|
182
|
+
status: "error",
|
|
183
|
+
docs: 0,
|
|
184
|
+
error: res.error ?? "unknown",
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
// Idempotent re-seed: the hub returns HTTP 409 ("already exists") when the
|
|
189
|
+
// skill slug is present. hubPost throws on non-2xx, so the 409 lands here —
|
|
190
|
+
// treat it as a no-op success, not an error.
|
|
191
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
192
|
+
if (/already exists/i.test(msg) || /\b409\b/.test(msg)) {
|
|
193
|
+
return { slug: parsed.slug, status: "exists", docs: 0 };
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
slug: parsed.slug,
|
|
197
|
+
status: "error",
|
|
198
|
+
docs: 0,
|
|
199
|
+
error: msg,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=skill-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-import.js","sourceRoot":"","sources":["../../src/lib/skill-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,28 @@
|
|
|
2
2
|
* Skill installer — copies the synap skill tree into a target's skills directory.
|
|
3
3
|
*
|
|
4
4
|
* Source resolution order:
|
|
5
|
-
* 1. $SYNAP_SKILLS_DIR (explicit override)
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* 1. $SYNAP_SKILLS_DIR (explicit override) or an adjacent ../synap-backend/skills/
|
|
6
|
+
* checkout (monorepo dev mode) — both are local disk, dev escape hatches.
|
|
7
|
+
* 2. the connected pod — GET /api/hub/skills/system (pod-first: production
|
|
8
|
+
* users get whatever skill packages their pod actually serves, not a
|
|
9
|
+
* snapshot baked into this CLI's npm release).
|
|
10
|
+
* 3. bundled skills/ inside this package (production / published npm,
|
|
11
|
+
* offline, or pod unreachable).
|
|
9
12
|
*
|
|
10
13
|
* If none resolve, prints a manual install command and returns false.
|
|
11
14
|
*/
|
|
12
|
-
|
|
15
|
+
/** Last-resort constant — only used when no manifest.json can be found on
|
|
16
|
+
* disk (dev or bundled) AND the pod is unreachable/unconfigured. */
|
|
17
|
+
export declare const SKILL_NAMES: readonly ["synap", "synap-schema", "synap-ui"];
|
|
13
18
|
export type SkillName = (typeof SKILL_NAMES)[number];
|
|
19
|
+
/**
|
|
20
|
+
* Baseline skills are safe to install into every agent context. Workflow
|
|
21
|
+
* packages are intentionally loaded only when the target/user asks for them;
|
|
22
|
+
* installing them by default turns progressive teaching back into prompt bulk.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getDeliverableSkills(): string[];
|
|
14
25
|
export interface InstallOpts {
|
|
15
26
|
destDir: string;
|
|
16
|
-
skills
|
|
27
|
+
skills?: readonly string[];
|
|
17
28
|
}
|
|
18
29
|
export declare function installSkills(opts: InstallOpts): Promise<boolean>;
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
* Skill installer — copies the synap skill tree into a target's skills directory.
|
|
3
3
|
*
|
|
4
4
|
* Source resolution order:
|
|
5
|
-
* 1. $SYNAP_SKILLS_DIR (explicit override)
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* 1. $SYNAP_SKILLS_DIR (explicit override) or an adjacent ../synap-backend/skills/
|
|
6
|
+
* checkout (monorepo dev mode) — both are local disk, dev escape hatches.
|
|
7
|
+
* 2. the connected pod — GET /api/hub/skills/system (pod-first: production
|
|
8
|
+
* users get whatever skill packages their pod actually serves, not a
|
|
9
|
+
* snapshot baked into this CLI's npm release).
|
|
10
|
+
* 3. bundled skills/ inside this package (production / published npm,
|
|
11
|
+
* offline, or pod unreachable).
|
|
9
12
|
*
|
|
10
13
|
* If none resolve, prints a manual install command and returns false.
|
|
11
14
|
*/
|
|
@@ -13,20 +16,129 @@ import fs from "node:fs";
|
|
|
13
16
|
import path from "node:path";
|
|
14
17
|
import { fileURLToPath } from "node:url";
|
|
15
18
|
import { log } from "../utils/logger.js";
|
|
16
|
-
|
|
19
|
+
import { resolveHubConfig } from "./hub-client.js";
|
|
20
|
+
/** Last-resort constant — only used when no manifest.json can be found on
|
|
21
|
+
* disk (dev or bundled) AND the pod is unreachable/unconfigured. */
|
|
22
|
+
export const SKILL_NAMES = ["synap", "synap-schema", "synap-ui"];
|
|
17
23
|
const __filename = fileURLToPath(import.meta.url);
|
|
18
24
|
const __dirname = path.dirname(__filename);
|
|
25
|
+
/**
|
|
26
|
+
* Baseline skills are safe to install into every agent context. Workflow
|
|
27
|
+
* packages are intentionally loaded only when the target/user asks for them;
|
|
28
|
+
* installing them by default turns progressive teaching back into prompt bulk.
|
|
29
|
+
*/
|
|
30
|
+
export function getDeliverableSkills() {
|
|
31
|
+
const srcDir = resolveDiskSource();
|
|
32
|
+
if (srcDir) {
|
|
33
|
+
const manifestPath = path.join(srcDir, "manifest.json");
|
|
34
|
+
try {
|
|
35
|
+
const raw = fs.readFileSync(manifestPath, "utf8");
|
|
36
|
+
const manifest = JSON.parse(raw);
|
|
37
|
+
const baseline = Array.isArray(manifest.baseline) ? manifest.baseline : [];
|
|
38
|
+
if (baseline.length > 0)
|
|
39
|
+
return baseline;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// manifest absent or malformed — fall through to hardcoded list
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return [...SKILL_NAMES];
|
|
46
|
+
}
|
|
19
47
|
export async function installSkills(opts) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
log.dim("
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
48
|
+
// 1. Local disk source — explicit override or monorepo dev checkout.
|
|
49
|
+
const diskSrc = resolveDiskSource();
|
|
50
|
+
if (diskSrc) {
|
|
51
|
+
log.dim("Skill source: local disk");
|
|
52
|
+
return installFromDisk(diskSrc, opts);
|
|
53
|
+
}
|
|
54
|
+
// 2. The connected pod.
|
|
55
|
+
const podPackages = await fetchSkillsFromPod();
|
|
56
|
+
if (podPackages && podPackages.length > 0) {
|
|
57
|
+
const names = opts.skills ?? getDeliverableSkills();
|
|
58
|
+
const installed = installFromPackages(podPackages, names, opts.destDir);
|
|
59
|
+
if (installed > 0) {
|
|
60
|
+
log.dim("Skill source: pod (/api/hub/skills/system)");
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// 3. Bundled fallback inside this package.
|
|
65
|
+
const bundledSrc = resolveBundledSource();
|
|
66
|
+
if (bundledSrc) {
|
|
67
|
+
log.dim("Skill source: bundled fallback");
|
|
68
|
+
return installFromDisk(bundledSrc, opts);
|
|
69
|
+
}
|
|
70
|
+
log.warn("Could not locate skills source.");
|
|
71
|
+
log.dim("Set SYNAP_SKILLS_DIR to the folder containing synap/, synap-schema/, synap-ui/");
|
|
72
|
+
log.dim("Or connect a pod: synap pods add");
|
|
73
|
+
log.dim("Or clone: git clone https://github.com/Synap-core/synap.git");
|
|
74
|
+
log.dim(`Then copy synap/synap-backend/skills/* → ${opts.destDir}/`);
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
/** Fetch the pod's system skill packages over Hub Protocol. Returns null on
|
|
78
|
+
* any failure (no pod configured, unreachable, non-2xx, bad payload) so
|
|
79
|
+
* installSkills() can fall through to the bundled tier gracefully. */
|
|
80
|
+
async function fetchSkillsFromPod() {
|
|
81
|
+
try {
|
|
82
|
+
const cfg = await resolveHubConfig();
|
|
83
|
+
if (!cfg.podUrl || !cfg.apiKey)
|
|
84
|
+
return null;
|
|
85
|
+
const res = await fetch(`${cfg.podUrl}/api/hub/skills/system?scope=full`, {
|
|
86
|
+
headers: { Authorization: `Bearer ${cfg.apiKey}` },
|
|
87
|
+
signal: AbortSignal.timeout(5000),
|
|
88
|
+
});
|
|
89
|
+
if (!res.ok)
|
|
90
|
+
return null;
|
|
91
|
+
const data = (await res.json());
|
|
92
|
+
if (!Array.isArray(data))
|
|
93
|
+
return null;
|
|
94
|
+
return data;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Write the requested packages' files to destDir, same on-disk layout as
|
|
101
|
+
* installFromDisk (destDir/<slug>/<file>). Returns count installed. */
|
|
102
|
+
function installFromPackages(packages, names, destDir) {
|
|
103
|
+
let installed = 0;
|
|
104
|
+
for (const name of names) {
|
|
105
|
+
const pkg = packages.find((p) => p.slug === name);
|
|
106
|
+
if (!pkg || pkg.files.length === 0) {
|
|
107
|
+
log.warn(`Skill '${name}' not found on pod (skipping)`);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const dst = resolveWithin(destDir, name);
|
|
111
|
+
if (!dst) {
|
|
112
|
+
log.warn(`Skill '${name}' has an unsafe destination (skipping)`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
fs.mkdirSync(dst, { recursive: true });
|
|
116
|
+
for (const file of pkg.files) {
|
|
117
|
+
const filePath = resolveWithin(dst, file.path);
|
|
118
|
+
if (!filePath) {
|
|
119
|
+
log.warn(`Skill '${name}' contains unsafe file path '${file.path}' (skipping)`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
123
|
+
fs.writeFileSync(filePath, file.content, "utf8");
|
|
124
|
+
}
|
|
125
|
+
installed++;
|
|
126
|
+
log.success(`Installed ${name} → ${shortenHome(dst)}`);
|
|
27
127
|
}
|
|
128
|
+
return installed;
|
|
129
|
+
}
|
|
130
|
+
/** Resolve a pod-supplied package/file name without allowing directory escape. */
|
|
131
|
+
function resolveWithin(root, relativePath) {
|
|
132
|
+
if (!relativePath || path.isAbsolute(relativePath))
|
|
133
|
+
return null;
|
|
134
|
+
const rootPath = path.resolve(root);
|
|
135
|
+
const target = path.resolve(rootPath, relativePath);
|
|
136
|
+
return target.startsWith(rootPath + path.sep) ? target : null;
|
|
137
|
+
}
|
|
138
|
+
function installFromDisk(srcDir, opts) {
|
|
139
|
+
const skills = opts.skills ?? getDeliverableSkills();
|
|
28
140
|
let installed = 0;
|
|
29
|
-
for (const name of
|
|
141
|
+
for (const name of skills) {
|
|
30
142
|
const src = path.join(srcDir, name);
|
|
31
143
|
if (!fs.existsSync(src)) {
|
|
32
144
|
log.warn(`Skill '${name}' not found in source (skipping)`);
|
|
@@ -43,14 +155,14 @@ export async function installSkills(opts) {
|
|
|
43
155
|
}
|
|
44
156
|
return true;
|
|
45
157
|
}
|
|
46
|
-
|
|
47
|
-
|
|
158
|
+
/** Explicit override ($SYNAP_SKILLS_DIR) or the adjacent ../synap-backend/skills/
|
|
159
|
+
* checkout (monorepo dev mode). Both are local-disk, dev-only escape hatches. */
|
|
160
|
+
function resolveDiskSource() {
|
|
48
161
|
const override = process.env.SYNAP_SKILLS_DIR;
|
|
49
162
|
if (override && fs.existsSync(override)) {
|
|
50
163
|
return override;
|
|
51
164
|
}
|
|
52
|
-
//
|
|
53
|
-
// __dirname is .../synap-cli/dist/lib OR .../synap-cli/src/lib
|
|
165
|
+
// __dirname is .../synap-cli/dist/lib OR .../synap-cli/src/lib
|
|
54
166
|
const candidates = [
|
|
55
167
|
path.resolve(__dirname, "..", "..", "..", "synap-backend", "skills"),
|
|
56
168
|
path.resolve(__dirname, "..", "..", "..", "..", "synap-backend", "skills"),
|
|
@@ -60,12 +172,14 @@ function resolveSkillsSource() {
|
|
|
60
172
|
return c;
|
|
61
173
|
}
|
|
62
174
|
}
|
|
63
|
-
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
/** Bundled inside the package — synap-cli/skills/ (production / published npm). */
|
|
178
|
+
function resolveBundledSource() {
|
|
64
179
|
const bundled = path.resolve(__dirname, "..", "..", "skills");
|
|
65
180
|
if (fs.existsSync(path.join(bundled, "synap", "SKILL.md"))) {
|
|
66
181
|
return bundled;
|
|
67
182
|
}
|
|
68
|
-
// 4. TODO: remote fetch fallback
|
|
69
183
|
return null;
|
|
70
184
|
}
|
|
71
185
|
function copyDir(src, dst) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-installer.js","sourceRoot":"","sources":["../../src/lib/skills-installer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skills-installer.js","sourceRoot":"","sources":["../../src/lib/skills-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Suite detection — data-driven, not a hardcoded slug allowlist.
|
|
3
|
+
* =============================================================
|
|
4
|
+
*
|
|
5
|
+
* A SUITE is a headline package that installs a whole operating core by
|
|
6
|
+
* composing/requiring several constituent workspaces (e.g. `enterprise-os`,
|
|
7
|
+
* `the-arch`). It is authored in the template YAML's `meta.tags` and mirrored
|
|
8
|
+
* onto every catalog surface, so "is this a suite?" is a first-class signal
|
|
9
|
+
* rather than the `COMPANY_SUITE` / `PRIVATE_SUITE` slug constants the CLI used
|
|
10
|
+
* to hand-maintain.
|
|
11
|
+
*
|
|
12
|
+
* This is a MIRROR, not a second source of truth. The SSOT is
|
|
13
|
+
* `@synap-core/marketplace` (`SUITE_TAG` / `isSuite` in `src/types.ts`). That
|
|
14
|
+
* package is a React feature package with no build output and a barrel that
|
|
15
|
+
* drags in `react` / JSX, so a Node CLI compiled with `tsc` cannot import it
|
|
16
|
+
* without breaking its build. The value is a single string — mirrored here the
|
|
17
|
+
* same way `marketplace/types.ts` itself mirrors the CP's schema vocabulary.
|
|
18
|
+
*/
|
|
19
|
+
/** The tag that marks a package as a suite. SSOT: `@synap-core/marketplace`. */
|
|
20
|
+
export declare const SUITE_TAG: "suite";
|
|
21
|
+
/**
|
|
22
|
+
* A suite is identified by the presence of `SUITE_TAG` in its tags. Works on any
|
|
23
|
+
* catalog shape carrying tags — a bundled `CatalogEntry`, a `RemoteEntry`, or a
|
|
24
|
+
* raw `{ tags }` projection.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isSuite(entry: {
|
|
27
|
+
tags?: readonly string[] | null;
|
|
28
|
+
}): boolean;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Suite detection — data-driven, not a hardcoded slug allowlist.
|
|
3
|
+
* =============================================================
|
|
4
|
+
*
|
|
5
|
+
* A SUITE is a headline package that installs a whole operating core by
|
|
6
|
+
* composing/requiring several constituent workspaces (e.g. `enterprise-os`,
|
|
7
|
+
* `the-arch`). It is authored in the template YAML's `meta.tags` and mirrored
|
|
8
|
+
* onto every catalog surface, so "is this a suite?" is a first-class signal
|
|
9
|
+
* rather than the `COMPANY_SUITE` / `PRIVATE_SUITE` slug constants the CLI used
|
|
10
|
+
* to hand-maintain.
|
|
11
|
+
*
|
|
12
|
+
* This is a MIRROR, not a second source of truth. The SSOT is
|
|
13
|
+
* `@synap-core/marketplace` (`SUITE_TAG` / `isSuite` in `src/types.ts`). That
|
|
14
|
+
* package is a React feature package with no build output and a barrel that
|
|
15
|
+
* drags in `react` / JSX, so a Node CLI compiled with `tsc` cannot import it
|
|
16
|
+
* without breaking its build. The value is a single string — mirrored here the
|
|
17
|
+
* same way `marketplace/types.ts` itself mirrors the CP's schema vocabulary.
|
|
18
|
+
*/
|
|
19
|
+
/** The tag that marks a package as a suite. SSOT: `@synap-core/marketplace`. */
|
|
20
|
+
export const SUITE_TAG = "suite";
|
|
21
|
+
/**
|
|
22
|
+
* A suite is identified by the presence of `SUITE_TAG` in its tags. Works on any
|
|
23
|
+
* catalog shape carrying tags — a bundled `CatalogEntry`, a `RemoteEntry`, or a
|
|
24
|
+
* raw `{ tags }` projection.
|
|
25
|
+
*/
|
|
26
|
+
export function isSuite(entry) {
|
|
27
|
+
return entry.tags?.includes(SUITE_TAG) ?? false;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suite.js","sourceRoot":"","sources":["../../src/lib/suite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,SAAS,GAAG,OAAgB,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAA0C;IAChE,OAAO,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Superwhisper store-first import — pair meta.json + output.wav into pod-wide
|
|
3
|
+
* notes with optional audio provenance. No AI structure on the WAV (IS STT is
|
|
4
|
+
* a stub); transcript comes from Superwhisper's meta.
|
|
5
|
+
*
|
|
6
|
+
* Idempotency: local ledger (~/.synap/import-ledger/superwhisper.json) maps
|
|
7
|
+
* recordingId → entityId so resume/re-run skips completed units. Server-side
|
|
8
|
+
* external_links land in Wave 3; ledger is the v1 resume story.
|
|
9
|
+
*/
|
|
10
|
+
export interface SuperwhisperImportOpts {
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
yes?: boolean;
|
|
13
|
+
json?: boolean;
|
|
14
|
+
withAudio?: boolean;
|
|
15
|
+
/** Max units to process (for probes). */
|
|
16
|
+
limit?: number;
|
|
17
|
+
/** Max concurrent unit uploads (default 2). */
|
|
18
|
+
concurrency?: number;
|
|
19
|
+
/** Skip units already in the local ledger. Default true. */
|
|
20
|
+
resume?: boolean;
|
|
21
|
+
podUrl?: string;
|
|
22
|
+
apiKey?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface SuperwhisperUnit {
|
|
25
|
+
recordingId: string;
|
|
26
|
+
dir: string;
|
|
27
|
+
metaPath: string;
|
|
28
|
+
wavPath: string | null;
|
|
29
|
+
wavSize: number;
|
|
30
|
+
datetime?: string;
|
|
31
|
+
language?: string;
|
|
32
|
+
duration?: number;
|
|
33
|
+
modeName?: string;
|
|
34
|
+
transcript: string;
|
|
35
|
+
title: string;
|
|
36
|
+
}
|
|
37
|
+
/** Expand a Superwhisper recordings root (or a single clip dir) into units. */
|
|
38
|
+
export declare function collectSuperwhisperUnits(root: string): SuperwhisperUnit[];
|
|
39
|
+
/** Run store-first Superwhisper import for one or more roots. */
|
|
40
|
+
export declare function importSuperwhisperStoreFirst(roots: string[], opts: SuperwhisperImportOpts): Promise<void>;
|