@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,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `synap market` — the template AUTHORING loop.
|
|
3
|
+
* =============================================
|
|
4
|
+
*
|
|
5
|
+
* The other half of `market` (browse/install/update/installed lives in
|
|
6
|
+
* `market.ts`): the create→publish path an author walks.
|
|
7
|
+
*
|
|
8
|
+
* synap market scaffold <slug> — write a minimal valid <slug>.template.yaml
|
|
9
|
+
* synap market validate <file> — run the ONE shared validator, fast feedback
|
|
10
|
+
* synap market publish <file> — validate, then upsert to the CP (private by default)
|
|
11
|
+
* synap market publish --from-workspace <id> — serialize a LIVE workspace, then publish
|
|
12
|
+
* synap market unpublish <slug> — flip a published package back to private
|
|
13
|
+
*
|
|
14
|
+
* REUSE: validation is the shared `validateTemplate` (via `lib/template-file`);
|
|
15
|
+
* CP transport is `lib/cp-packages` (`publishPackage`/`unpublishPackage`); the
|
|
16
|
+
* pod `to-template` serializer is reached through the standard hub client. No
|
|
17
|
+
* fetch is hand-rolled here.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, writeFileSync } from "node:fs";
|
|
20
|
+
import { resolve as resolvePath } from "node:path";
|
|
21
|
+
import chalk from "chalk";
|
|
22
|
+
import { log } from "../utils/logger.js";
|
|
23
|
+
import { parseTemplateFile, validateTemplateYaml, templateToPackageDefinition, packageDefinitionToYaml, scaffoldTemplateYaml, } from "../lib/template-file.js";
|
|
24
|
+
import { publishPackage, unpublishPackage, CpWriteError, } from "../lib/cp-packages.js";
|
|
25
|
+
import { resolveHubConfig, hubPost, renderHubError } from "../lib/hub-client.js";
|
|
26
|
+
/** Print a validator failure list human-readably: `rule` · `path` — `message`. */
|
|
27
|
+
function printValidationErrors(errors) {
|
|
28
|
+
for (const e of errors) {
|
|
29
|
+
console.error(` ${chalk.red("✗")} ${chalk.yellow(e.rule)} ${chalk.dim(e.path)}\n ${e.message}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// ─── validate ────────────────────────────────────────────────────────────────
|
|
33
|
+
export async function marketValidate(file, opts) {
|
|
34
|
+
let tpl;
|
|
35
|
+
try {
|
|
36
|
+
tpl = parseTemplateFile(file);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
if (opts.json) {
|
|
40
|
+
console.log(JSON.stringify({ ok: false, errors: [{ rule: "parse", path: file, message: e.message }] }, null, 2));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
log.error(e.message);
|
|
44
|
+
}
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
const result = validateTemplateYaml(tpl);
|
|
48
|
+
if (opts.json) {
|
|
49
|
+
console.log(JSON.stringify(result, null, 2));
|
|
50
|
+
if (!result.ok)
|
|
51
|
+
process.exit(1);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (result.ok) {
|
|
55
|
+
log.success(`${file} is valid.`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
log.error(`${file} has ${result.errors.length} validation error${result.errors.length === 1 ? "" : "s"}:`);
|
|
59
|
+
printValidationErrors(result.errors);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
// ─── scaffold ──────────────────────────────────────────────────────────────
|
|
63
|
+
export async function marketScaffold(slug, opts) {
|
|
64
|
+
const fileName = `${slug}.template.yaml`;
|
|
65
|
+
const target = resolvePath(process.cwd(), fileName);
|
|
66
|
+
// Create-then-configure: refuse to clobber, never overwrite an author's work.
|
|
67
|
+
if (existsSync(target)) {
|
|
68
|
+
if (opts.json) {
|
|
69
|
+
console.log(JSON.stringify({ ok: false, error: "exists", path: target }, null, 2));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
log.error(`${fileName} already exists — refusing to overwrite.`);
|
|
73
|
+
log.hint("Edit it in place, or choose a different slug.");
|
|
74
|
+
}
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
writeFileSync(target, scaffoldTemplateYaml(slug), "utf-8");
|
|
78
|
+
if (opts.json) {
|
|
79
|
+
console.log(JSON.stringify({ ok: true, path: target, slug }, null, 2));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
log.success(`Wrote ${fileName}`);
|
|
83
|
+
log.dim("Edit it in place, then:");
|
|
84
|
+
log.dim(` synap market validate ${fileName}`);
|
|
85
|
+
log.dim(` synap market publish ${fileName}`);
|
|
86
|
+
}
|
|
87
|
+
// ─── publish ─────────────────────────────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* POST `/api/hub/workspaces/:id/to-template` — the pod-native serializer that
|
|
90
|
+
* turns a LIVE workspace into a full `PackageDefinition`. The one door for the
|
|
91
|
+
* `--from-workspace` publish path; mirrors every other `/api/hub/*` call.
|
|
92
|
+
*/
|
|
93
|
+
export async function fetchWorkspaceAsTemplate(workspaceId, opts) {
|
|
94
|
+
const cfg = await resolveHubConfig(opts);
|
|
95
|
+
const res = (await hubPost(`/workspaces/${encodeURIComponent(workspaceId)}/to-template`, {}, cfg, 60_000));
|
|
96
|
+
if (!res?.definition) {
|
|
97
|
+
throw new Error(`Workspace ${workspaceId} produced no template definition.`);
|
|
98
|
+
}
|
|
99
|
+
return res.definition;
|
|
100
|
+
}
|
|
101
|
+
/** Surface a publish outcome (created/updated/no-op) uniformly. */
|
|
102
|
+
function reportPublish(r) {
|
|
103
|
+
const vis = r.isPublic ? chalk.green("public") : chalk.dim("private");
|
|
104
|
+
switch (r.outcome) {
|
|
105
|
+
case "created":
|
|
106
|
+
log.success(`Published ${chalk.bold(r.slug)} ${chalk.dim(r.version)} (${vis})`);
|
|
107
|
+
break;
|
|
108
|
+
case "updated":
|
|
109
|
+
log.success(`Updated ${chalk.bold(r.slug)} → ${chalk.dim(r.version)} (${vis})`);
|
|
110
|
+
break;
|
|
111
|
+
case "no-op":
|
|
112
|
+
log.info(`${chalk.bold(r.slug)} is already up to date at ${chalk.dim(r.version)} (${vis}) — nothing to publish.`);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Turn a CP write failure into a clear, honest message — never swallow the server `detail`; special-case the reserved-slug 403. */
|
|
117
|
+
function reportCpWriteError(err, slug) {
|
|
118
|
+
if (err.status === 403 && /reserved/i.test(err.serverMessage) && slug) {
|
|
119
|
+
log.error(`"${slug}" is a reserved Synap bedrock template — publish under a different slug.`);
|
|
120
|
+
log.hint("Reserved: foundation, crm, operations, content-os, enterprise-os, research-base.");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
log.error(`Publish failed${err.status ? ` (HTTP ${err.status})` : ""}: ${err.serverMessage}`);
|
|
124
|
+
}
|
|
125
|
+
export async function marketPublish(file, opts) {
|
|
126
|
+
// Default PRIVATE; `--public` flips it. `--private` is accepted as the explicit
|
|
127
|
+
// default so a script can state intent.
|
|
128
|
+
const isPublic = opts.public === true;
|
|
129
|
+
// 1. Obtain the definition + a WorkspaceYaml view to validate.
|
|
130
|
+
let def;
|
|
131
|
+
let yamlForValidate;
|
|
132
|
+
let sourceLabel;
|
|
133
|
+
if (opts.fromWorkspace) {
|
|
134
|
+
try {
|
|
135
|
+
def = await fetchWorkspaceAsTemplate(opts.fromWorkspace, opts);
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
renderHubError(e);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
yamlForValidate = packageDefinitionToYaml(def);
|
|
142
|
+
sourceLabel = `workspace ${opts.fromWorkspace}`;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
if (!file) {
|
|
146
|
+
log.error("Provide a template file, or --from-workspace <id>.");
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const tpl = parseTemplateFile(file);
|
|
151
|
+
yamlForValidate = tpl;
|
|
152
|
+
def = templateToPackageDefinition(tpl);
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
log.error(e.message);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
sourceLabel = file;
|
|
159
|
+
}
|
|
160
|
+
// 2. Validate BEFORE any publish network call (the fast author-feedback gate).
|
|
161
|
+
const result = validateTemplateYaml(yamlForValidate);
|
|
162
|
+
if (!result.ok) {
|
|
163
|
+
if (opts.json) {
|
|
164
|
+
console.log(JSON.stringify({ ok: false, stage: "validate", errors: result.errors }, null, 2));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
log.error(`${sourceLabel} failed validation — not published:`);
|
|
168
|
+
printValidationErrors(result.errors);
|
|
169
|
+
}
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
// 3. Publish.
|
|
173
|
+
const slug = def._meta?.slug;
|
|
174
|
+
try {
|
|
175
|
+
const r = await publishPackage(def, { isPublic });
|
|
176
|
+
if (opts.json) {
|
|
177
|
+
console.log(JSON.stringify({ ok: true, ...r }, null, 2));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
reportPublish(r);
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
if (e instanceof CpWriteError) {
|
|
184
|
+
if (opts.json) {
|
|
185
|
+
console.log(JSON.stringify({ ok: false, stage: "publish", status: e.status, error: e.serverMessage, slug }, null, 2));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
reportCpWriteError(e, slug);
|
|
189
|
+
}
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
log.error(`Publish failed: ${e.message}`);
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// ─── unpublish ───────────────────────────────────────────────────────────────
|
|
197
|
+
export async function marketUnpublish(slug, opts) {
|
|
198
|
+
try {
|
|
199
|
+
const r = await unpublishPackage(slug);
|
|
200
|
+
if (opts.json) {
|
|
201
|
+
console.log(JSON.stringify({ ok: true, ...r }, null, 2));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
log.success(`${chalk.bold(slug)} is now ${r.isPublic ? "public" : "private"}.`);
|
|
205
|
+
}
|
|
206
|
+
catch (e) {
|
|
207
|
+
if (e instanceof CpWriteError) {
|
|
208
|
+
if (opts.json) {
|
|
209
|
+
console.log(JSON.stringify({ ok: false, status: e.status, error: e.serverMessage, slug }, null, 2));
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
log.error(`Unpublish failed${e.status ? ` (HTTP ${e.status})` : ""}: ${e.serverMessage}`);
|
|
213
|
+
// The CP PATCH door does not yet accept `isPublic` (only `podId`) — say so
|
|
214
|
+
// rather than leaving a bare validation error.
|
|
215
|
+
if (e.status === 400) {
|
|
216
|
+
log.hint("The control-plane PATCH door needs `isPublic` added to its allow-list (TODO cp).");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
log.error(`Unpublish failed: ${e.message}`);
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=market-authoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-authoring.js","sourceRoot":"","sources":["../../src/commands/market-authoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `synap market` — discover + install ANY package type.
|
|
3
|
+
* =====================================================
|
|
4
|
+
*
|
|
5
|
+
* `synap launch` is workspace-first: it turns an empty pod into a company from
|
|
6
|
+
* BUNDLED workspace templates (offline). `market` is the superset browser — it
|
|
7
|
+
* reaches EVERY package type the control-plane registry carries
|
|
8
|
+
* (capability / skill / workflow / view / cell / workspace), public or private,
|
|
9
|
+
* over the shared catalog door (`assembleCatalog` + the CP `/api/packages`
|
|
10
|
+
* transport). Suites (`enterprise-os`, `the-arch`) headline via the `suite` tag,
|
|
11
|
+
* not a hardcoded slug.
|
|
12
|
+
*
|
|
13
|
+
* synap market [--search q] [--type t] [--list] [--json] — browse
|
|
14
|
+
* synap market install <slug> — install
|
|
15
|
+
* synap market update [slug] [--yes] [--json] — check/apply drift
|
|
16
|
+
*
|
|
17
|
+
* INSTALL SCOPE: WORKSPACE-type packages install via `/packages/apply` (the
|
|
18
|
+
* same door `launch` uses), which provisions a workspace from the definition.
|
|
19
|
+
* Non-workspace kinds (capability / automation / cell / template) install via
|
|
20
|
+
* the pod's kind-agnostic `market.install` verb on `/capabilities/execute`,
|
|
21
|
+
* which resolves the definition from `cp_catalog_cache`. Types the verb doesn't
|
|
22
|
+
* handle fall back to a route-to-browser message.
|
|
23
|
+
*/
|
|
24
|
+
import { type CatalogEntry, type TemplateUpdateCheck } from "@synap-core/workspace-templates";
|
|
25
|
+
import { type PackageFilters, type TierInfo } from "../lib/cp-packages.js";
|
|
26
|
+
import { type InstalledTemplateInfo } from "../lib/installed.js";
|
|
27
|
+
export interface MarketCatalog {
|
|
28
|
+
entries: CatalogEntry[];
|
|
29
|
+
tierBySlug: Map<string, TierInfo>;
|
|
30
|
+
lockedSlugs: Set<string>;
|
|
31
|
+
installed: Set<string>;
|
|
32
|
+
/** Bundled slugs (public + private) — the offline-installable workspace set. */
|
|
33
|
+
bundledSlugs: Set<string>;
|
|
34
|
+
loggedIn: boolean;
|
|
35
|
+
reachedCp: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Slug → CP row's OWN `version`, read straight off `CpBrowseRow`/`CpMineRow`
|
|
38
|
+
* (NOT off the merged `entries[]`). Needed because `mergeCatalog`'s
|
|
39
|
+
* squatting-defense makes the BUNDLE win the merged entry for every OFFICIAL
|
|
40
|
+
* public template that also exists on the CP (list-route rows never carry
|
|
41
|
+
* `definition`, so `computeTemplateUpdates` sees no remote version for them
|
|
42
|
+
* via `entries[]` and would silently hide a real CP-side update). `market
|
|
43
|
+
* update` compares against THIS map directly instead.
|
|
44
|
+
*/
|
|
45
|
+
remoteVersionBySlug: Map<string, string>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Assemble the market catalog: bundled workspace templates ∪ public CP browse
|
|
49
|
+
* (all types) ∪ the caller's own packages (when logged in), through the shared
|
|
50
|
+
* `assembleCatalog` door. Unlike `launch`, PUBLIC CP rows are fetched even when
|
|
51
|
+
* logged out — the bundle only carries workspaces, so all-types discovery needs
|
|
52
|
+
* the CP browse route (which needs no auth).
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildMarketCatalog(filters?: PackageFilters): Promise<MarketCatalog>;
|
|
55
|
+
/** The `kind` values the pod's `market.install` verb provisions (see
|
|
56
|
+
* cp-catalog-sync.ts `CatalogKind`). */
|
|
57
|
+
export type MarketInstallKind = "capability" | "automation" | "template" | "cell";
|
|
58
|
+
/**
|
|
59
|
+
* Map a CP package `category` (what {@link typeOf} returns) → the pod
|
|
60
|
+
* `market.install` verb's `kind` vocabulary, or `null` when the verb can't
|
|
61
|
+
* install that type. The CP's live PACKAGE_TYPES and the pod's cache `kind`
|
|
62
|
+
* diverge (see cp-catalog-sync.ts): the CP's `workflow` is the pod's
|
|
63
|
+
* `automation`; the CP's `workspace` is the pod's `template` — but a workspace
|
|
64
|
+
* installs through the dedicated `/packages/apply` create path, so it never
|
|
65
|
+
* routes through here. `automation`/`template` are also accepted verbatim so a
|
|
66
|
+
* row already speaking the pod's cache vocabulary still resolves.
|
|
67
|
+
*/
|
|
68
|
+
export declare function marketInstallKind(type: string): MarketInstallKind | null;
|
|
69
|
+
interface DependencySeedOutcome {
|
|
70
|
+
slug: string;
|
|
71
|
+
status: "no-layers" | "seeded" | "failed";
|
|
72
|
+
layers?: string[];
|
|
73
|
+
error?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface ResolvedDependencyLike {
|
|
76
|
+
slug: string;
|
|
77
|
+
seedOutcome?: DependencySeedOutcome;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Top-level rollup the backend now sends alongside `dependencies[]` — same
|
|
81
|
+
* info, pre-aggregated. Kept local for the same reason as the types above:
|
|
82
|
+
* a structural match is all `/packages/apply`'s JSON needs, and this CLI
|
|
83
|
+
* doesn't carry api-types. Optional — older pod builds won't send it.
|
|
84
|
+
*/
|
|
85
|
+
export interface SeedSummary {
|
|
86
|
+
attempted: number;
|
|
87
|
+
seeded: number;
|
|
88
|
+
failed: Array<{
|
|
89
|
+
slug: string;
|
|
90
|
+
error: string;
|
|
91
|
+
}>;
|
|
92
|
+
}
|
|
93
|
+
/** The two new honest-outcome fields `/packages/apply` may return. Both optional — a legacy pod build may omit them. */
|
|
94
|
+
export interface WorkspaceApplyResult {
|
|
95
|
+
status?: string;
|
|
96
|
+
workspaceId?: string;
|
|
97
|
+
onto?: string;
|
|
98
|
+
outcome?: "created" | "reconciled" | "unchanged";
|
|
99
|
+
}
|
|
100
|
+
export interface ApplyVerdict {
|
|
101
|
+
/** Honest coarse status — JSON consumers should branch on this, never guess from `workspace.outcome` alone. */
|
|
102
|
+
status: "installed" | "installed-with-failures" | "updated" | "updated-with-failures" | "unchanged" | "composed" | "composed-with-failures" | "stamp-contradiction" | "legacy-unknown" | "no-workspace";
|
|
103
|
+
/** Non-fatal warnings — a stamp contradiction or a compose-overlay note. Seed failures are reported separately via `printSeedOutcomes`. */
|
|
104
|
+
warnings: string[];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Classify one `/packages/apply` response into the honest verdict both
|
|
108
|
+
* `marketInstall` and `applyOnePackage` print (and both put in `--json`).
|
|
109
|
+
* `wasUnstamped` = the slug was already installed with no recorded version
|
|
110
|
+
* BEFORE this call (only `marketInstall` can detect this today — see its
|
|
111
|
+
* `fetchInstalledTemplates` call; `applyOnePackage` only ever re-applies
|
|
112
|
+
* already-versioned slugs, so it always passes `false`).
|
|
113
|
+
*/
|
|
114
|
+
export declare function classifyApplyResult(entry: CatalogEntry, ws: WorkspaceApplyResult | undefined, dependencies: ResolvedDependencyLike[] | undefined, seedSummary: SeedSummary | undefined, ctx: {
|
|
115
|
+
remoteVersionSent?: string;
|
|
116
|
+
wasUnstamped: boolean;
|
|
117
|
+
}): ApplyVerdict;
|
|
118
|
+
/** Render a `classifyApplyResult` verdict — the ONE honest-text door for both `marketInstall` and `applyOnePackage`. */
|
|
119
|
+
export declare function printApplyVerdict(entry: CatalogEntry, verdict: ApplyVerdict): void;
|
|
120
|
+
export declare function market(opts: {
|
|
121
|
+
list?: boolean;
|
|
122
|
+
json?: boolean;
|
|
123
|
+
search?: string;
|
|
124
|
+
type?: string;
|
|
125
|
+
}): Promise<void>;
|
|
126
|
+
export declare function marketInstall(slug: string, opts: {
|
|
127
|
+
podUrl?: string;
|
|
128
|
+
apiKey?: string;
|
|
129
|
+
json?: boolean;
|
|
130
|
+
project?: string;
|
|
131
|
+
timeout?: string;
|
|
132
|
+
/** Reconcile this template ONTO an existing workspace (additive) instead of creating a new one — passed through to `/packages/apply` as `targetWorkspaceId`. */
|
|
133
|
+
onto?: string;
|
|
134
|
+
/** Preview the create path write-free (`/packages/preflight`) — reports would-create / reuse / conflicts and writes nothing. */
|
|
135
|
+
dryRun?: boolean;
|
|
136
|
+
}): Promise<void>;
|
|
137
|
+
export interface UpdateCheck extends TemplateUpdateCheck {
|
|
138
|
+
/**
|
|
139
|
+
* True when the installed workspace carries no version stamp at all — the
|
|
140
|
+
* pod can't say whether it's stale. Distinct from `updateAvailable: false`
|
|
141
|
+
* (checked, and it IS current). Every CLI/Hub-door install is `true` today —
|
|
142
|
+
* see `InstalledTemplateInfo.version`'s doc in `lib/installed.ts`.
|
|
143
|
+
*/
|
|
144
|
+
noVersionInfo: boolean;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Per-installed-slug drift check. Starts from the shared `computeTemplateUpdates`
|
|
148
|
+
* (handles bundled-only / private-only slugs via `bundleVersion`), then
|
|
149
|
+
* overrides `latestVersion`/`updateAvailable` with the CP row's OWN version for
|
|
150
|
+
* any slug in `remoteVersionBySlug` — the merge-winner bypass this command
|
|
151
|
+
* needs (see `MarketCatalog.remoteVersionBySlug`'s doc). A slug the pod never
|
|
152
|
+
* version-stamped is reported `noVersionInfo: true`, never silently "outdated".
|
|
153
|
+
*/
|
|
154
|
+
export declare function computeUpdates(installedTemplates: InstalledTemplateInfo[], cat: MarketCatalog): UpdateCheck[];
|
|
155
|
+
export declare function marketUpdate(slugsArg: string[] | undefined, opts: {
|
|
156
|
+
yes?: boolean;
|
|
157
|
+
dryRun?: boolean;
|
|
158
|
+
json?: boolean;
|
|
159
|
+
podUrl?: string;
|
|
160
|
+
apiKey?: string;
|
|
161
|
+
timeout?: string;
|
|
162
|
+
}): Promise<void>;
|
|
163
|
+
export interface TreeNode {
|
|
164
|
+
slug: string;
|
|
165
|
+
name: string;
|
|
166
|
+
relation: "compose" | "require";
|
|
167
|
+
depKind?: string;
|
|
168
|
+
installed: boolean;
|
|
169
|
+
workspaceId?: string;
|
|
170
|
+
workspaceName?: string;
|
|
171
|
+
installedVersion?: string;
|
|
172
|
+
latestVersion?: string | null;
|
|
173
|
+
updateAvailable: boolean;
|
|
174
|
+
noVersionInfo: boolean;
|
|
175
|
+
/** Names of OTHER top-level packages whose tree also carries this slug. */
|
|
176
|
+
shared: string[];
|
|
177
|
+
children: TreeNode[];
|
|
178
|
+
}
|
|
179
|
+
export interface TreePackage {
|
|
180
|
+
slug: string;
|
|
181
|
+
name: string;
|
|
182
|
+
installedVersion: string;
|
|
183
|
+
latestVersion: string | null;
|
|
184
|
+
updateAvailable: boolean;
|
|
185
|
+
noVersionInfo: boolean;
|
|
186
|
+
workspaceCount: number;
|
|
187
|
+
isSuite: boolean;
|
|
188
|
+
children: TreeNode[];
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* The nested composition-tree view: one tree per installed TOP-LEVEL package
|
|
192
|
+
* (a suite, or any installed package whose `edgesOf` resolves at least one
|
|
193
|
+
* dependency — bundled OR remote). Everything else stays a flat leaf
|
|
194
|
+
* (`leafRows`, rendered like a plain `market installed` row). This is the
|
|
195
|
+
* SAME "top-level" rule the old walker used (kept verbatim for `--tree`'s
|
|
196
|
+
* JSON/text backward compatibility — see `marketInstalled`'s before/after
|
|
197
|
+
* diff check), just evaluated against the fixed `edgesOf` instead of the
|
|
198
|
+
* bundled-only map.
|
|
199
|
+
*
|
|
200
|
+
* Nested `TreeNode`s are built by walking `graph.edges` (both `require` and
|
|
201
|
+
* `compose` relations — the engine excludes compose SOURCES from `nodes`,
|
|
202
|
+
* rule 2, but never from `edges`, so the nested view still shows them exactly
|
|
203
|
+
* where the old walker did) and `shared` reads straight off each node's
|
|
204
|
+
* `roots` (the engine's true reachability set), replacing the old walker's
|
|
205
|
+
* bespoke reverse index.
|
|
206
|
+
*/
|
|
207
|
+
export declare function buildCompositionTrees(rows: UpdateCheck[], cat: MarketCatalog, installedTemplates: InstalledTemplateInfo[], workspaceCountBySlug: Map<string, number>): Promise<{
|
|
208
|
+
packages: TreePackage[];
|
|
209
|
+
leafRows: UpdateCheck[];
|
|
210
|
+
}>;
|
|
211
|
+
export declare function printCompositionTree(pkg: TreePackage): void;
|
|
212
|
+
/**
|
|
213
|
+
* Pure-read inventory of what's installed on this pod — reuses
|
|
214
|
+
* `buildMarketCatalog` + `fetchInstalledTemplates` + `computeUpdates`
|
|
215
|
+
* (`market update`'s own drift check), never writes anything. Pairs with
|
|
216
|
+
* `market update` to apply what this surfaces.
|
|
217
|
+
*/
|
|
218
|
+
export declare function marketInstalled(opts: {
|
|
219
|
+
json?: boolean;
|
|
220
|
+
outdated?: boolean;
|
|
221
|
+
tree?: boolean;
|
|
222
|
+
layers?: boolean;
|
|
223
|
+
}): Promise<void>;
|
|
224
|
+
export {};
|