@ytinnovation/harness-core 0.0.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/README.md +17 -0
- package/dist/assets/fetch-published-by-name.d.ts +16 -0
- package/dist/assets/fetch-published-by-name.d.ts.map +1 -0
- package/dist/assets/fetch-published-by-name.js +40 -0
- package/dist/assets/fetch-published-by-name.js.map +1 -0
- package/dist/assets/install-content.d.ts +7 -0
- package/dist/assets/install-content.d.ts.map +1 -0
- package/dist/assets/install-content.js +24 -0
- package/dist/assets/install-content.js.map +1 -0
- package/dist/assets/install-from.d.ts +6 -0
- package/dist/assets/install-from.d.ts.map +1 -0
- package/dist/assets/install-from.js +13 -0
- package/dist/assets/install-from.js.map +1 -0
- package/dist/assets/install.d.ts +36 -0
- package/dist/assets/install.d.ts.map +1 -0
- package/dist/assets/install.js +199 -0
- package/dist/assets/install.js.map +1 -0
- package/dist/assets/mcp-config-format.d.ts +11 -0
- package/dist/assets/mcp-config-format.d.ts.map +1 -0
- package/dist/assets/mcp-config-format.js +101 -0
- package/dist/assets/mcp-config-format.js.map +1 -0
- package/dist/assets/metadata.d.ts +65 -0
- package/dist/assets/metadata.d.ts.map +1 -0
- package/dist/assets/metadata.js +164 -0
- package/dist/assets/metadata.js.map +1 -0
- package/dist/assets/project-manifest.d.ts +80 -0
- package/dist/assets/project-manifest.d.ts.map +1 -0
- package/dist/assets/project-manifest.js +556 -0
- package/dist/assets/project-manifest.js.map +1 -0
- package/dist/assets/published-content.d.ts +28 -0
- package/dist/assets/published-content.d.ts.map +1 -0
- package/dist/assets/published-content.js +137 -0
- package/dist/assets/published-content.js.map +1 -0
- package/dist/assets/registry-entry.d.ts +9 -0
- package/dist/assets/registry-entry.d.ts.map +1 -0
- package/dist/assets/registry-entry.js +72 -0
- package/dist/assets/registry-entry.js.map +1 -0
- package/dist/assets/remote-list.d.ts +15 -0
- package/dist/assets/remote-list.d.ts.map +1 -0
- package/dist/assets/remote-list.js +36 -0
- package/dist/assets/remote-list.js.map +1 -0
- package/dist/cli-output/clipboard.d.ts +9 -0
- package/dist/cli-output/clipboard.d.ts.map +1 -0
- package/dist/cli-output/clipboard.js +56 -0
- package/dist/cli-output/clipboard.js.map +1 -0
- package/dist/cli-output/renderers.d.ts +99 -0
- package/dist/cli-output/renderers.d.ts.map +1 -0
- package/dist/cli-output/renderers.js +267 -0
- package/dist/cli-output/renderers.js.map +1 -0
- package/dist/cloud/enterprise-asset-client.d.ts +32 -0
- package/dist/cloud/enterprise-asset-client.d.ts.map +1 -0
- package/dist/cloud/enterprise-asset-client.js +179 -0
- package/dist/cloud/enterprise-asset-client.js.map +1 -0
- package/dist/cloud/enterprise-asset-types.d.ts +74 -0
- package/dist/cloud/enterprise-asset-types.d.ts.map +1 -0
- package/dist/cloud/enterprise-asset-types.js +2 -0
- package/dist/cloud/enterprise-asset-types.js.map +1 -0
- package/dist/cloud/harness-service-url.d.ts +3 -0
- package/dist/cloud/harness-service-url.d.ts.map +1 -0
- package/dist/cloud/harness-service-url.js +13 -0
- package/dist/cloud/harness-service-url.js.map +1 -0
- package/dist/cloud/rag-client.d.ts +18 -0
- package/dist/cloud/rag-client.d.ts.map +1 -0
- package/dist/cloud/rag-client.js +57 -0
- package/dist/cloud/rag-client.js.map +1 -0
- package/dist/cloud/redaction.d.ts +2 -0
- package/dist/cloud/redaction.d.ts.map +1 -0
- package/dist/cloud/redaction.js +53 -0
- package/dist/cloud/redaction.js.map +1 -0
- package/dist/cloud/telemetry-client.d.ts +21 -0
- package/dist/cloud/telemetry-client.d.ts.map +1 -0
- package/dist/cloud/telemetry-client.js +39 -0
- package/dist/cloud/telemetry-client.js.map +1 -0
- package/dist/contracts/config.d.ts +9 -0
- package/dist/contracts/config.d.ts.map +1 -0
- package/dist/contracts/config.defaults.d.ts +5 -0
- package/dist/contracts/config.defaults.d.ts.map +1 -0
- package/dist/contracts/config.defaults.js +5 -0
- package/dist/contracts/config.defaults.js.map +1 -0
- package/dist/contracts/config.js +5 -0
- package/dist/contracts/config.js.map +1 -0
- package/dist/contracts/config.loader.d.ts +3 -0
- package/dist/contracts/config.loader.d.ts.map +1 -0
- package/dist/contracts/config.loader.js +38 -0
- package/dist/contracts/config.loader.js.map +1 -0
- package/dist/contracts/errors.d.ts +8 -0
- package/dist/contracts/errors.d.ts.map +1 -0
- package/dist/contracts/errors.js +10 -0
- package/dist/contracts/errors.js.map +1 -0
- package/dist/cursor-acp-demo/index.d.ts +2 -0
- package/dist/cursor-acp-demo/index.d.ts.map +1 -0
- package/dist/cursor-acp-demo/index.js +63 -0
- package/dist/cursor-acp-demo/index.js.map +1 -0
- package/dist/dashboard/command.d.ts +15 -0
- package/dist/dashboard/command.d.ts.map +1 -0
- package/dist/dashboard/command.js +283 -0
- package/dist/dashboard/command.js.map +1 -0
- package/dist/dashboard/http-api.d.ts +3 -0
- package/dist/dashboard/http-api.d.ts.map +1 -0
- package/dist/dashboard/http-api.js +376 -0
- package/dist/dashboard/http-api.js.map +1 -0
- package/dist/dashboard/telemetry-snapshot.d.ts +11 -0
- package/dist/dashboard/telemetry-snapshot.d.ts.map +1 -0
- package/dist/dashboard/telemetry-snapshot.js +27 -0
- package/dist/dashboard/telemetry-snapshot.js.map +1 -0
- package/dist/dashboard-assets/assets/index-BNx5sFKx.css +1 -0
- package/dist/dashboard-assets/assets/index-ruRt5sDA.js +40 -0
- package/dist/dashboard-assets/index.html +13 -0
- package/dist/gateway/auth.d.ts +44 -0
- package/dist/gateway/auth.d.ts.map +1 -0
- package/dist/gateway/auth.js +2 -0
- package/dist/gateway/auth.js.map +1 -0
- package/dist/gateway/client.d.ts +65 -0
- package/dist/gateway/client.d.ts.map +1 -0
- package/dist/gateway/client.js +133 -0
- package/dist/gateway/client.js.map +1 -0
- package/dist/gateway/command.d.ts +4 -0
- package/dist/gateway/command.d.ts.map +1 -0
- package/dist/gateway/command.js +213 -0
- package/dist/gateway/command.js.map +1 -0
- package/dist/gateway/service-http-exchange.d.ts +17 -0
- package/dist/gateway/service-http-exchange.d.ts.map +1 -0
- package/dist/gateway/service-http-exchange.js +183 -0
- package/dist/gateway/service-http-exchange.js.map +1 -0
- package/dist/gateway/token-exchange.d.ts +10 -0
- package/dist/gateway/token-exchange.d.ts.map +1 -0
- package/dist/gateway/token-exchange.js +8 -0
- package/dist/gateway/token-exchange.js.map +1 -0
- package/dist/index.d.ts +111 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/init/cloud-asset-client.d.ts +74 -0
- package/dist/init/cloud-asset-client.d.ts.map +1 -0
- package/dist/init/cloud-asset-client.js +399 -0
- package/dist/init/cloud-asset-client.js.map +1 -0
- package/dist/init/cloud-auto.d.ts +16 -0
- package/dist/init/cloud-auto.d.ts.map +1 -0
- package/dist/init/cloud-auto.js +61 -0
- package/dist/init/cloud-auto.js.map +1 -0
- package/dist/init/command.d.ts +17 -0
- package/dist/init/command.d.ts.map +1 -0
- package/dist/init/command.js +783 -0
- package/dist/init/command.js.map +1 -0
- package/dist/init/cursor-adapter.d.ts +24 -0
- package/dist/init/cursor-adapter.d.ts.map +1 -0
- package/dist/init/cursor-adapter.js +71 -0
- package/dist/init/cursor-adapter.js.map +1 -0
- package/dist/init/fingerprint.d.ts +6 -0
- package/dist/init/fingerprint.d.ts.map +1 -0
- package/dist/init/fingerprint.js +157 -0
- package/dist/init/fingerprint.js.map +1 -0
- package/dist/init/git-identity-catalog.d.ts +17 -0
- package/dist/init/git-identity-catalog.d.ts.map +1 -0
- package/dist/init/git-identity-catalog.js +48 -0
- package/dist/init/git-identity-catalog.js.map +1 -0
- package/dist/init/local-fallback-config-packs.d.ts +5 -0
- package/dist/init/local-fallback-config-packs.d.ts.map +1 -0
- package/dist/init/local-fallback-config-packs.js +6 -0
- package/dist/init/local-fallback-config-packs.js.map +1 -0
- package/dist/init/manifest-records.d.ts +34 -0
- package/dist/init/manifest-records.d.ts.map +1 -0
- package/dist/init/manifest-records.js +296 -0
- package/dist/init/manifest-records.js.map +1 -0
- package/dist/init/matched-init.d.ts +64 -0
- package/dist/init/matched-init.d.ts.map +1 -0
- package/dist/init/matched-init.js +263 -0
- package/dist/init/matched-init.js.map +1 -0
- package/dist/init/plan.d.ts +8 -0
- package/dist/init/plan.d.ts.map +1 -0
- package/dist/init/plan.js +165 -0
- package/dist/init/plan.js.map +1 -0
- package/dist/init/project-fingerprint-catalog.d.ts +17 -0
- package/dist/init/project-fingerprint-catalog.d.ts.map +1 -0
- package/dist/init/project-fingerprint-catalog.js +105 -0
- package/dist/init/project-fingerprint-catalog.js.map +1 -0
- package/dist/init/prompt.d.ts +38 -0
- package/dist/init/prompt.d.ts.map +1 -0
- package/dist/init/prompt.js +217 -0
- package/dist/init/prompt.js.map +1 -0
- package/dist/init/questions.d.ts +5 -0
- package/dist/init/questions.d.ts.map +1 -0
- package/dist/init/questions.js +71 -0
- package/dist/init/questions.js.map +1 -0
- package/dist/init/template-match.d.ts +10 -0
- package/dist/init/template-match.d.ts.map +1 -0
- package/dist/init/template-match.js +125 -0
- package/dist/init/template-match.js.map +1 -0
- package/dist/init/types.d.ts +162 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +2 -0
- package/dist/init/types.js.map +1 -0
- package/dist/init/write.d.ts +7 -0
- package/dist/init/write.d.ts.map +1 -0
- package/dist/init/write.js +155 -0
- package/dist/init/write.js.map +1 -0
- package/dist/install/command.d.ts +25 -0
- package/dist/install/command.d.ts.map +1 -0
- package/dist/install/command.js +251 -0
- package/dist/install/command.js.map +1 -0
- package/dist/install/prompt.d.ts +21 -0
- package/dist/install/prompt.d.ts.map +1 -0
- package/dist/install/prompt.js +60 -0
- package/dist/install/prompt.js.map +1 -0
- package/dist/kernel/commands/init.d.ts +11 -0
- package/dist/kernel/commands/init.d.ts.map +1 -0
- package/dist/kernel/commands/init.js +144 -0
- package/dist/kernel/commands/init.js.map +1 -0
- package/dist/kernel/create.d.ts +3 -0
- package/dist/kernel/create.d.ts.map +1 -0
- package/dist/kernel/create.js +31 -0
- package/dist/kernel/create.js.map +1 -0
- package/dist/kernel/router.d.ts +14 -0
- package/dist/kernel/router.d.ts.map +1 -0
- package/dist/kernel/router.js +73 -0
- package/dist/kernel/router.js.map +1 -0
- package/dist/kernel/types.d.ts +6 -0
- package/dist/kernel/types.d.ts.map +1 -0
- package/dist/kernel/types.js +2 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/knowledge/command.d.ts +6 -0
- package/dist/knowledge/command.d.ts.map +1 -0
- package/dist/knowledge/command.js +151 -0
- package/dist/knowledge/command.js.map +1 -0
- package/dist/knowledge/query.d.ts +23 -0
- package/dist/knowledge/query.d.ts.map +1 -0
- package/dist/knowledge/query.js +133 -0
- package/dist/knowledge/query.js.map +1 -0
- package/dist/knowledge/rag.d.ts +74 -0
- package/dist/knowledge/rag.d.ts.map +1 -0
- package/dist/knowledge/rag.js +55 -0
- package/dist/knowledge/rag.js.map +1 -0
- package/dist/knowledge/types.d.ts +40 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +13 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/mcp/command.d.ts +19 -0
- package/dist/mcp/command.d.ts.map +1 -0
- package/dist/mcp/command.js +359 -0
- package/dist/mcp/command.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +44 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tool-registry.d.ts +38 -0
- package/dist/mcp/tool-registry.d.ts.map +1 -0
- package/dist/mcp/tool-registry.js +50 -0
- package/dist/mcp/tool-registry.js.map +1 -0
- package/dist/mcp/tools/add-skill.d.ts +29 -0
- package/dist/mcp/tools/add-skill.d.ts.map +1 -0
- package/dist/mcp/tools/add-skill.js +184 -0
- package/dist/mcp/tools/add-skill.js.map +1 -0
- package/dist/mcp/tools/assemble-init-assets.d.ts +26 -0
- package/dist/mcp/tools/assemble-init-assets.d.ts.map +1 -0
- package/dist/mcp/tools/assemble-init-assets.js +136 -0
- package/dist/mcp/tools/assemble-init-assets.js.map +1 -0
- package/dist/mcp/tools/query-knowledge.d.ts +28 -0
- package/dist/mcp/tools/query-knowledge.d.ts.map +1 -0
- package/dist/mcp/tools/query-knowledge.js +92 -0
- package/dist/mcp/tools/query-knowledge.js.map +1 -0
- package/dist/mcp/tools/read-instructions.d.ts +14 -0
- package/dist/mcp/tools/read-instructions.d.ts.map +1 -0
- package/dist/mcp/tools/read-instructions.js +81 -0
- package/dist/mcp/tools/read-instructions.js.map +1 -0
- package/dist/mcp/tools/sync-spec.d.ts +17 -0
- package/dist/mcp/tools/sync-spec.d.ts.map +1 -0
- package/dist/mcp/tools/sync-spec.js +80 -0
- package/dist/mcp/tools/sync-spec.js.map +1 -0
- package/dist/mcp/tools/update-rule.d.ts +49 -0
- package/dist/mcp/tools/update-rule.d.ts.map +1 -0
- package/dist/mcp/tools/update-rule.js +188 -0
- package/dist/mcp/tools/update-rule.js.map +1 -0
- package/dist/mcp/types.d.ts +21 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +8 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/prompt/command.d.ts +10 -0
- package/dist/prompt/command.d.ts.map +1 -0
- package/dist/prompt/command.js +260 -0
- package/dist/prompt/command.js.map +1 -0
- package/dist/rule/command.d.ts +10 -0
- package/dist/rule/command.d.ts.map +1 -0
- package/dist/rule/command.js +120 -0
- package/dist/rule/command.js.map +1 -0
- package/dist/skills/command.d.ts +23 -0
- package/dist/skills/command.d.ts.map +1 -0
- package/dist/skills/command.js +713 -0
- package/dist/skills/command.js.map +1 -0
- package/dist/skills/default-internal-skill-provider.d.ts +4 -0
- package/dist/skills/default-internal-skill-provider.d.ts.map +1 -0
- package/dist/skills/default-internal-skill-provider.js +23 -0
- package/dist/skills/default-internal-skill-provider.js.map +1 -0
- package/dist/skills/gitlab-skill-publish-client.d.ts +13 -0
- package/dist/skills/gitlab-skill-publish-client.d.ts.map +1 -0
- package/dist/skills/gitlab-skill-publish-client.js +255 -0
- package/dist/skills/gitlab-skill-publish-client.js.map +1 -0
- package/dist/skills/install.d.ts +23 -0
- package/dist/skills/install.d.ts.map +1 -0
- package/dist/skills/install.js +143 -0
- package/dist/skills/install.js.map +1 -0
- package/dist/skills/list-scan.d.ts +29 -0
- package/dist/skills/list-scan.d.ts.map +1 -0
- package/dist/skills/list-scan.js +230 -0
- package/dist/skills/list-scan.js.map +1 -0
- package/dist/skills/metadata.d.ts +5 -0
- package/dist/skills/metadata.d.ts.map +1 -0
- package/dist/skills/metadata.js +44 -0
- package/dist/skills/metadata.js.map +1 -0
- package/dist/skills/providers/harness-service.d.ts +11 -0
- package/dist/skills/providers/harness-service.d.ts.map +1 -0
- package/dist/skills/providers/harness-service.js +111 -0
- package/dist/skills/providers/harness-service.js.map +1 -0
- package/dist/skills/providers/stub.d.ts +4 -0
- package/dist/skills/providers/stub.d.ts.map +1 -0
- package/dist/skills/providers/stub.js +18 -0
- package/dist/skills/providers/stub.js.map +1 -0
- package/dist/skills/publish.d.ts +35 -0
- package/dist/skills/publish.d.ts.map +1 -0
- package/dist/skills/publish.js +115 -0
- package/dist/skills/publish.js.map +1 -0
- package/dist/skills/registry.d.ts +24 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +124 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/remove.d.ts +14 -0
- package/dist/skills/remove.d.ts.map +1 -0
- package/dist/skills/remove.js +44 -0
- package/dist/skills/remove.js.map +1 -0
- package/dist/skills/search.d.ts +9 -0
- package/dist/skills/search.d.ts.map +1 -0
- package/dist/skills/search.js +65 -0
- package/dist/skills/search.js.map +1 -0
- package/dist/skills/skill-markdown-manifest.d.ts +6 -0
- package/dist/skills/skill-markdown-manifest.d.ts.map +1 -0
- package/dist/skills/skill-markdown-manifest.js +57 -0
- package/dist/skills/skill-markdown-manifest.js.map +1 -0
- package/dist/skills/types.d.ts +138 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/update.d.ts +11 -0
- package/dist/skills/update.d.ts.map +1 -0
- package/dist/skills/update.js +55 -0
- package/dist/skills/update.js.map +1 -0
- package/dist/spec/command.d.ts +11 -0
- package/dist/spec/command.d.ts.map +1 -0
- package/dist/spec/command.js +201 -0
- package/dist/spec/command.js.map +1 -0
- package/dist/telemetry/reporter.d.ts +14 -0
- package/dist/telemetry/reporter.d.ts.map +1 -0
- package/dist/telemetry/reporter.js +31 -0
- package/dist/telemetry/reporter.js.map +1 -0
- package/dist/telemetry/sink.d.ts +7 -0
- package/dist/telemetry/sink.d.ts.map +1 -0
- package/dist/telemetry/sink.js +309 -0
- package/dist/telemetry/sink.js.map +1 -0
- package/dist/telemetry/types.d.ts +48 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/update/apply.d.ts +11 -0
- package/dist/update/apply.d.ts.map +1 -0
- package/dist/update/apply.js +94 -0
- package/dist/update/apply.js.map +1 -0
- package/dist/update/command.d.ts +43 -0
- package/dist/update/command.d.ts.map +1 -0
- package/dist/update/command.js +524 -0
- package/dist/update/command.js.map +1 -0
- package/dist/update/config-pack-sync.d.ts +11 -0
- package/dist/update/config-pack-sync.d.ts.map +1 -0
- package/dist/update/config-pack-sync.js +88 -0
- package/dist/update/config-pack-sync.js.map +1 -0
- package/dist/update/enterprise-update-provider.d.ts +8 -0
- package/dist/update/enterprise-update-provider.d.ts.map +1 -0
- package/dist/update/enterprise-update-provider.js +76 -0
- package/dist/update/enterprise-update-provider.js.map +1 -0
- package/dist/update/manifest-source.d.ts +33 -0
- package/dist/update/manifest-source.d.ts.map +1 -0
- package/dist/update/manifest-source.js +111 -0
- package/dist/update/manifest-source.js.map +1 -0
- package/dist/update/plan-utils.d.ts +5 -0
- package/dist/update/plan-utils.d.ts.map +1 -0
- package/dist/update/plan-utils.js +13 -0
- package/dist/update/plan-utils.js.map +1 -0
- package/dist/update/prompt.d.ts +19 -0
- package/dist/update/prompt.d.ts.map +1 -0
- package/dist/update/prompt.js +72 -0
- package/dist/update/prompt.js.map +1 -0
- package/dist/update/resolve-action.d.ts +7 -0
- package/dist/update/resolve-action.d.ts.map +1 -0
- package/dist/update/resolve-action.js +14 -0
- package/dist/update/resolve-action.js.map +1 -0
- package/dist/update/types.d.ts +33 -0
- package/dist/update/types.d.ts.map +1 -0
- package/dist/update/types.js +2 -0
- package/dist/update/types.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @ytinnovation/harness-core
|
|
2
|
+
|
|
3
|
+
Harness CLI 的核心运行时包,包含命令路由、初始化、资产、MCP、知识库、telemetry 与 dashboard 托管能力。
|
|
4
|
+
|
|
5
|
+
通常不需要直接安装该包。请安装 CLI:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @ytinnovation/harness-cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Dashboard 静态资源
|
|
12
|
+
|
|
13
|
+
发布准备脚本会将 `apps/harness-dashboard/dist` 复制到本包的 `dist/dashboard-assets`。因此安装 `@ytinnovation/harness-cli` 后可以直接运行:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
harness dashboard serve --port 4242
|
|
17
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EnterpriseAssetClient } from '../cloud/enterprise-asset-client.js';
|
|
2
|
+
import type { HarnessServiceAssetType } from '../cloud/enterprise-asset-types.js';
|
|
3
|
+
export type PublishedAssetByName = {
|
|
4
|
+
readonly assetId: string;
|
|
5
|
+
readonly type: HarnessServiceAssetType;
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly version: string;
|
|
8
|
+
readonly description: string | null;
|
|
9
|
+
readonly content: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function fetchPublishedAssetByName(args: {
|
|
12
|
+
readonly client: EnterpriseAssetClient;
|
|
13
|
+
readonly type: HarnessServiceAssetType;
|
|
14
|
+
readonly name: string;
|
|
15
|
+
}): Promise<PublishedAssetByName>;
|
|
16
|
+
//# sourceMappingURL=fetch-published-by-name.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-published-by-name.d.ts","sourceRoot":"","sources":["../../src/assets/fetch-published-by-name.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAGlF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2ChC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { HarnessError } from '../contracts/errors.js';
|
|
2
|
+
import { resolvePublishedAssetBody } from './published-content.js';
|
|
3
|
+
export async function fetchPublishedAssetByName(args) {
|
|
4
|
+
const name = args.name.trim();
|
|
5
|
+
if (!name) {
|
|
6
|
+
throw new HarnessError('ASSET_NOT_FOUND', 'Asset name is required.');
|
|
7
|
+
}
|
|
8
|
+
const candidates = await args.client.searchPublished({
|
|
9
|
+
type: args.type,
|
|
10
|
+
query: name,
|
|
11
|
+
limit: 20,
|
|
12
|
+
});
|
|
13
|
+
const exactMatches = candidates.filter((item) => item.name === name);
|
|
14
|
+
if (exactMatches.length === 0) {
|
|
15
|
+
throw new HarnessError('ASSET_NOT_FOUND', `Published ${args.type} "${name}" was not found.`);
|
|
16
|
+
}
|
|
17
|
+
if (exactMatches.length > 1) {
|
|
18
|
+
throw new HarnessError('ASSET_AMBIGUOUS', `Multiple published ${args.type} assets named "${name}" were found; refine by scope or use asset id.`);
|
|
19
|
+
}
|
|
20
|
+
const asset = exactMatches[0];
|
|
21
|
+
const detail = await args.client.getAssetDetail(asset.id);
|
|
22
|
+
const version = detail?.latestPublished?.version ?? asset.latestPublished?.version;
|
|
23
|
+
if (!version) {
|
|
24
|
+
throw new HarnessError('ASSET_NOT_FOUND', `Published ${args.type} "${name}" has no published version.`);
|
|
25
|
+
}
|
|
26
|
+
const published = await args.client.getPublishedVersion(asset.id, version);
|
|
27
|
+
if (!published?.content) {
|
|
28
|
+
throw new HarnessError('ASSET_NOT_FOUND', `Published ${args.type} "${name}" has no published body.`);
|
|
29
|
+
}
|
|
30
|
+
const resolved = resolvePublishedAssetBody(published.content, { assetName: asset.name });
|
|
31
|
+
return {
|
|
32
|
+
assetId: asset.id,
|
|
33
|
+
type: args.type,
|
|
34
|
+
name: asset.name,
|
|
35
|
+
version,
|
|
36
|
+
description: detail?.description ?? asset.description ?? null,
|
|
37
|
+
content: resolved.content,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=fetch-published-by-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-published-by-name.js","sourceRoot":"","sources":["../../src/assets/fetch-published-by-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAWnE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAI/C;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QACnD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACrE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,IAAI,KAAK,IAAI,kBAAkB,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,YAAY,CACpB,iBAAiB,EACjB,sBAAsB,IAAI,CAAC,IAAI,kBAAkB,IAAI,gDAAgD,CACtG,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,eAAe,EAAE,OAAO,IAAI,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC;IACnF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,IAAI,KAAK,IAAI,6BAA6B,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3E,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,IAAI,KAAK,IAAI,0BAA0B,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,QAAQ,GAAG,yBAAyB,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzF,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO;QACP,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI;QAC7D,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 安装时向 Markdown/MDC 正文注入最小 manifest(仅 `id`)。
|
|
3
|
+
* 源仓库 master 分支文件不含此头;元数据写入 `.cursor/harness-assets.json`。
|
|
4
|
+
*/
|
|
5
|
+
export declare function injectInstalledAssetIdHeader(content: string, assetId: string): string;
|
|
6
|
+
export declare function isMarkdownLikeAssetPath(targetPath: string): boolean;
|
|
7
|
+
//# sourceMappingURL=install-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-content.d.ts","sourceRoot":"","sources":["../../src/assets/install-content.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBrF;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEnE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 安装时向 Markdown/MDC 正文注入最小 manifest(仅 `id`)。
|
|
3
|
+
* 源仓库 master 分支文件不含此头;元数据写入 `.cursor/harness-assets.json`。
|
|
4
|
+
*/
|
|
5
|
+
export function injectInstalledAssetIdHeader(content, assetId) {
|
|
6
|
+
const normalizedId = assetId.trim();
|
|
7
|
+
if (!normalizedId) {
|
|
8
|
+
return content;
|
|
9
|
+
}
|
|
10
|
+
const trimmed = content.trimStart();
|
|
11
|
+
const frontmatterMatch = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(trimmed);
|
|
12
|
+
if (frontmatterMatch) {
|
|
13
|
+
const existingLines = (frontmatterMatch[1] ?? '')
|
|
14
|
+
.split(/\r?\n/)
|
|
15
|
+
.filter((line) => !line.trimStart().startsWith('id:'));
|
|
16
|
+
const body = trimmed.slice(frontmatterMatch[0].length);
|
|
17
|
+
return ['---', `id: ${normalizedId}`, ...existingLines, '---', '', body.trimStart()].join('\n');
|
|
18
|
+
}
|
|
19
|
+
return `---\nid: ${normalizedId}\n---\n\n${trimmed}`;
|
|
20
|
+
}
|
|
21
|
+
export function isMarkdownLikeAssetPath(targetPath) {
|
|
22
|
+
return /\.(?:md|mdc|markdown)$/i.test(targetPath);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=install-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-content.js","sourceRoot":"","sources":["../../src/assets/install-content.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAe,EAAE,OAAe;IAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACpC,MAAM,gBAAgB,GAAG,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3E,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,aAAa,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAC9C,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,EAAE,OAAO,YAAY,EAAE,EAAE,GAAG,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,YAAY,YAAY,YAAY,OAAO,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,OAAO,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** 用户通过 `harness skill install` 等手动路径安装的资产来源标识(写入 manifest,更新时不可变)。 */
|
|
2
|
+
export declare const MANUAL_INSTALL_FROM: "\u7528\u6237\u624B\u52A8\u5B89\u88C5";
|
|
3
|
+
export type AssetInstallFrom = typeof MANUAL_INSTALL_FROM | (string & {});
|
|
4
|
+
export declare function isManualInstallFrom(installFrom: string | undefined): boolean;
|
|
5
|
+
export declare function resolveConfigPackInstallFrom(packId: string): string;
|
|
6
|
+
//# sourceMappingURL=install-from.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-from.d.ts","sourceRoot":"","sources":["../../src/assets/install-from.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,EAAG,sCAAiB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG,OAAO,mBAAmB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE1E,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE5E;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMnE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** 用户通过 `harness skill install` 等手动路径安装的资产来源标识(写入 manifest,更新时不可变)。 */
|
|
2
|
+
export const MANUAL_INSTALL_FROM = '用户手动安装';
|
|
3
|
+
export function isManualInstallFrom(installFrom) {
|
|
4
|
+
return installFrom === MANUAL_INSTALL_FROM;
|
|
5
|
+
}
|
|
6
|
+
export function resolveConfigPackInstallFrom(packId) {
|
|
7
|
+
const trimmed = packId.trim();
|
|
8
|
+
if (!trimmed) {
|
|
9
|
+
throw new Error('Config pack id is required for installFrom.');
|
|
10
|
+
}
|
|
11
|
+
return trimmed;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=install-from.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-from.js","sourceRoot":"","sources":["../../src/assets/install-from.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAiB,CAAC;AAIrD,MAAM,UAAU,mBAAmB,CAAC,WAA+B;IACjE,OAAO,WAAW,KAAK,mBAAmB,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAc;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { EnterpriseAssetClient } from '../cloud/enterprise-asset-client.js';
|
|
2
|
+
export type InstallableAssetType = 'skill' | 'rule' | 'spec' | 'mcp-config';
|
|
3
|
+
export type InstallTarget = 'cursor' | 'agents';
|
|
4
|
+
export interface InstalledAssetResult {
|
|
5
|
+
assetType: InstallableAssetType;
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
sourceRef: string;
|
|
9
|
+
targetPaths: string[];
|
|
10
|
+
action: 'create' | 'skip';
|
|
11
|
+
}
|
|
12
|
+
export declare function parseInstallTargets(args: string[]): {
|
|
13
|
+
targets: InstallTarget[];
|
|
14
|
+
rest: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function resolveSkillRegistryPath(args: {
|
|
17
|
+
workspaceRoot: string;
|
|
18
|
+
homeRegistryPath: string;
|
|
19
|
+
explicitRegistryPath?: string;
|
|
20
|
+
global: boolean;
|
|
21
|
+
}): string;
|
|
22
|
+
export declare function resolveSkillTargetDir(args: {
|
|
23
|
+
workspaceRoot: string;
|
|
24
|
+
homeDir: string;
|
|
25
|
+
installTargetDir?: string;
|
|
26
|
+
target: InstallTarget;
|
|
27
|
+
global: boolean;
|
|
28
|
+
}): string;
|
|
29
|
+
export declare function installPublishedAssetByName(args: {
|
|
30
|
+
assetType: InstallableAssetType;
|
|
31
|
+
name: string;
|
|
32
|
+
workspaceRoot: string;
|
|
33
|
+
targets: InstallTarget[];
|
|
34
|
+
client: EnterpriseAssetClient;
|
|
35
|
+
}): Promise<InstalledAssetResult>;
|
|
36
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/assets/install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAM5E,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;AAC5E,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,oBAAoB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC3B;AAiBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAmChG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,MAAM,CAQT;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,MAAM,CAUT;AA2ED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,SAAS,EAAE,oBAAoB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,qBAAqB,CAAC;CAC/B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA4DhC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, isAbsolute, join } from 'node:path';
|
|
3
|
+
import { HarnessError } from '../contracts/errors.js';
|
|
4
|
+
import { EnterpriseAssetClient } from '../cloud/enterprise-asset-client.js';
|
|
5
|
+
import { mergeCursorMcpConfigContent, parseCursorMcpConfigContent } from './mcp-config-format.js';
|
|
6
|
+
import { resolvePublishedAssetBody } from './published-content.js';
|
|
7
|
+
import { resolveProjectManifestPath } from './project-manifest.js';
|
|
8
|
+
const SERVICE_TYPE_BY_ASSET_TYPE = {
|
|
9
|
+
skill: 'skill',
|
|
10
|
+
rule: 'rule',
|
|
11
|
+
spec: 'spec_template',
|
|
12
|
+
'mcp-config': 'mcp_config',
|
|
13
|
+
};
|
|
14
|
+
function sanitizeName(value) {
|
|
15
|
+
return value
|
|
16
|
+
.trim()
|
|
17
|
+
.toLowerCase()
|
|
18
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
19
|
+
.replace(/^-+|-+$/g, '');
|
|
20
|
+
}
|
|
21
|
+
export function parseInstallTargets(args) {
|
|
22
|
+
const targets = new Set(['cursor']);
|
|
23
|
+
const rest = [];
|
|
24
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
25
|
+
const arg = args[index];
|
|
26
|
+
if (!arg) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (arg === '--target') {
|
|
30
|
+
const value = args[index + 1];
|
|
31
|
+
if (!value || value.startsWith('--')) {
|
|
32
|
+
throw new HarnessError('ASSET_INSTALL_INVALID_ARGS', 'Missing value for --target.');
|
|
33
|
+
}
|
|
34
|
+
for (const item of value.split(',')) {
|
|
35
|
+
const normalized = item.trim();
|
|
36
|
+
if (normalized === 'cursor' || normalized === '.cursor') {
|
|
37
|
+
targets.add('cursor');
|
|
38
|
+
}
|
|
39
|
+
else if (normalized === 'agents' || normalized === '.agents') {
|
|
40
|
+
targets.add('agents');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
throw new HarnessError('ASSET_INSTALL_INVALID_ARGS', `Unknown install target: ${item}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
index += 1;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (arg === '--agents') {
|
|
50
|
+
targets.add('agents');
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
rest.push(arg);
|
|
54
|
+
}
|
|
55
|
+
return { targets: [...targets], rest };
|
|
56
|
+
}
|
|
57
|
+
export function resolveSkillRegistryPath(args) {
|
|
58
|
+
if (args.explicitRegistryPath) {
|
|
59
|
+
return args.explicitRegistryPath;
|
|
60
|
+
}
|
|
61
|
+
if (args.global) {
|
|
62
|
+
return args.homeRegistryPath;
|
|
63
|
+
}
|
|
64
|
+
return resolveProjectManifestPath(args.workspaceRoot);
|
|
65
|
+
}
|
|
66
|
+
export function resolveSkillTargetDir(args) {
|
|
67
|
+
if (args.installTargetDir) {
|
|
68
|
+
return isAbsolute(args.installTargetDir)
|
|
69
|
+
? args.installTargetDir
|
|
70
|
+
: join(args.workspaceRoot, args.installTargetDir);
|
|
71
|
+
}
|
|
72
|
+
if (args.global) {
|
|
73
|
+
return join(args.homeDir, '.agents', 'skills');
|
|
74
|
+
}
|
|
75
|
+
return join(args.workspaceRoot, args.target === 'agents' ? '.agents' : '.cursor', 'skills');
|
|
76
|
+
}
|
|
77
|
+
function targetRelativePath(assetType, name, target) {
|
|
78
|
+
const safeName = sanitizeName(name) || 'asset';
|
|
79
|
+
if (assetType === 'skill') {
|
|
80
|
+
return join(target === 'agents' ? '.agents' : '.cursor', 'skills', safeName, 'SKILL.md');
|
|
81
|
+
}
|
|
82
|
+
if (assetType === 'rule') {
|
|
83
|
+
return join(target === 'agents' ? '.agents' : '.cursor', 'rules', `${safeName}.mdc`);
|
|
84
|
+
}
|
|
85
|
+
if (assetType === 'spec') {
|
|
86
|
+
return join(target === 'agents' ? '.agents' : '.cursor', 'specs', `${safeName}.md`);
|
|
87
|
+
}
|
|
88
|
+
if (assetType === 'mcp-config') {
|
|
89
|
+
return join(target === 'agents' ? '.agents' : '.cursor', 'mcp.json');
|
|
90
|
+
}
|
|
91
|
+
return join(target === 'agents' ? '.agents' : '.cursor', 'assets', `${safeName}.json`);
|
|
92
|
+
}
|
|
93
|
+
async function readFileOrNull(targetPath) {
|
|
94
|
+
try {
|
|
95
|
+
return await readFile(targetPath, 'utf8');
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error.code !== 'ENOENT') {
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function writeIfChanged(targetPath, content) {
|
|
105
|
+
try {
|
|
106
|
+
const existing = await readFile(targetPath, 'utf8');
|
|
107
|
+
if (existing === content) {
|
|
108
|
+
return 'skip';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (error.code !== 'ENOENT') {
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
117
|
+
await writeFile(targetPath, content, 'utf8');
|
|
118
|
+
return 'create';
|
|
119
|
+
}
|
|
120
|
+
async function installMcpConfigContent(args) {
|
|
121
|
+
const resolved = resolvePublishedAssetBody(args.content);
|
|
122
|
+
try {
|
|
123
|
+
parseCursorMcpConfigContent(resolved.content);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
127
|
+
throw new HarnessError('MCP_CONFIG_INVALID', message);
|
|
128
|
+
}
|
|
129
|
+
const targetPaths = [];
|
|
130
|
+
let action = 'skip';
|
|
131
|
+
for (const target of args.targets) {
|
|
132
|
+
const targetPath = join(args.workspaceRoot, targetRelativePath('mcp-config', 'mcp', target));
|
|
133
|
+
const existing = await readFileOrNull(targetPath);
|
|
134
|
+
const merged = mergeCursorMcpConfigContent(existing, resolved.content);
|
|
135
|
+
const writeAction = await writeIfChanged(targetPath, merged);
|
|
136
|
+
targetPaths.push(targetPath);
|
|
137
|
+
if (writeAction === 'create') {
|
|
138
|
+
action = 'create';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return { targetPaths, action };
|
|
142
|
+
}
|
|
143
|
+
export async function installPublishedAssetByName(args) {
|
|
144
|
+
const name = args.name.trim();
|
|
145
|
+
if (!name) {
|
|
146
|
+
throw new HarnessError('ASSET_INSTALL_INVALID_ARGS', 'Asset name is required.');
|
|
147
|
+
}
|
|
148
|
+
const candidates = await args.client.searchPublished({
|
|
149
|
+
type: SERVICE_TYPE_BY_ASSET_TYPE[args.assetType],
|
|
150
|
+
query: name,
|
|
151
|
+
});
|
|
152
|
+
const exact = candidates.find((item) => item.name === name) ?? candidates[0];
|
|
153
|
+
if (!exact) {
|
|
154
|
+
throw new HarnessError('ASSET_NOT_FOUND', `Published ${args.assetType} "${name}" was not found.`);
|
|
155
|
+
}
|
|
156
|
+
const detail = await args.client.getAssetDetail(exact.id);
|
|
157
|
+
const version = detail?.latestPublished?.version ?? exact.latestPublished?.version;
|
|
158
|
+
if (!version) {
|
|
159
|
+
throw new HarnessError('ASSET_NOT_FOUND', `Published ${args.assetType} "${name}" has no published version.`);
|
|
160
|
+
}
|
|
161
|
+
const published = await args.client.getPublishedVersion(exact.id, version);
|
|
162
|
+
if (!published?.content) {
|
|
163
|
+
throw new HarnessError('ASSET_NOT_FOUND', `Published ${args.assetType} "${name}" has no published body.`);
|
|
164
|
+
}
|
|
165
|
+
if (args.assetType === 'mcp-config') {
|
|
166
|
+
const { targetPaths, action } = await installMcpConfigContent({
|
|
167
|
+
workspaceRoot: args.workspaceRoot,
|
|
168
|
+
targets: args.targets,
|
|
169
|
+
content: published.content,
|
|
170
|
+
});
|
|
171
|
+
return {
|
|
172
|
+
assetType: args.assetType,
|
|
173
|
+
name: exact.name,
|
|
174
|
+
version,
|
|
175
|
+
sourceRef: `harness-service://asset/${exact.id}`,
|
|
176
|
+
targetPaths,
|
|
177
|
+
action,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const targetPaths = [];
|
|
181
|
+
let action = 'skip';
|
|
182
|
+
for (const target of args.targets) {
|
|
183
|
+
const targetPath = join(args.workspaceRoot, targetRelativePath(args.assetType, exact.name, target));
|
|
184
|
+
const writeAction = await writeIfChanged(targetPath, published.content);
|
|
185
|
+
targetPaths.push(targetPath);
|
|
186
|
+
if (writeAction === 'create') {
|
|
187
|
+
action = 'create';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
assetType: args.assetType,
|
|
192
|
+
name: exact.name,
|
|
193
|
+
version,
|
|
194
|
+
sourceRef: `harness-service://asset/${exact.id}`,
|
|
195
|
+
targetPaths,
|
|
196
|
+
action,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/assets/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAcnE,MAAM,0BAA0B,GAA0D;IACxF,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,eAAe;IACrB,YAAY,EAAE,YAAY;CAC3B,CAAC;AAEF,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,YAAY,CAAC,4BAA4B,EAAE,6BAA6B,CAAC,CAAC;YACtF,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBACxD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,CAAC;qBAAM,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC/D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,YAAY,CAAC,4BAA4B,EAAE,2BAA2B,IAAI,EAAE,CAAC,CAAC;gBAC1F,CAAC;YACH,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAKxC;IACC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IACD,OAAO,0BAA0B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAMrC;IACC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC,gBAAgB;YACvB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,kBAAkB,CAAC,SAA+B,EAAE,IAAY,EAAE,MAAqB;IAC9F,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;IAC/C,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,UAAkB;IAC9C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,OAAe;IAC/D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,IAItC;IACC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,2BAA2B,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,MAAM,GAAsB,MAAM,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7F,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC7D,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,IAMjD;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,YAAY,CAAC,4BAA4B,EAAE,yBAAyB,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QACnD,IAAI,EAAE,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC;QAChD,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,SAAS,KAAK,IAAI,kBAAkB,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,eAAe,EAAE,OAAO,IAAI,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC;IACnF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,SAAS,KAAK,IAAI,6BAA6B,CAAC,CAAC;IAC/G,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3E,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,SAAS,KAAK,IAAI,0BAA0B,CAAC,CAAC;IAC5G,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC;YAC5D,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,SAAS,CAAC,OAAO;SAC3B,CAAC,CAAC;QACH,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO;YACP,SAAS,EAAE,2BAA2B,KAAK,CAAC,EAAE,EAAE;YAChD,WAAW;YACX,MAAM;SACP,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,MAAM,GAAsB,MAAM,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACpG,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QACxE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO;QACP,SAAS,EAAE,2BAA2B,KAAK,CAAC,EAAE,EAAE;QAChD,WAAW;QACX,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class McpConfigFormatError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
/** 与 Cursor `.cursor/mcp.json` 对齐:根对象含非空 `mcpServers`。 */
|
|
5
|
+
export declare function parseCursorMcpConfigContent(raw: string): {
|
|
6
|
+
mcpServers: Record<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
export declare function validateCursorMcpConfigContent(raw: string): void;
|
|
9
|
+
/** 将 incoming 的 mcpServers 合并进现有 `.cursor/mcp.json` 内容。 */
|
|
10
|
+
export declare function mergeCursorMcpConfigContent(existingContent: string | null, incomingContent: string): string;
|
|
11
|
+
//# sourceMappingURL=mcp-config-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config-format.d.ts","sourceRoot":"","sources":["../../src/assets/mcp-config-format.ts"],"names":[],"mappings":"AAAA,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AA+CD,0DAA0D;AAC1D,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,CAyBhH;AAED,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED,2DAA2D;AAC3D,wBAAgB,2BAA2B,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAkC3G"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export class McpConfigFormatError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'McpConfigFormatError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
function sortRecordKeys(record) {
|
|
11
|
+
const sortedEntries = Object.entries(record).sort(([left], [right]) => left.localeCompare(right));
|
|
12
|
+
const output = {};
|
|
13
|
+
for (const [key, value] of sortedEntries) {
|
|
14
|
+
if (isRecord(value)) {
|
|
15
|
+
output[key] = sortRecordKeys(value);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
output[key] = value;
|
|
19
|
+
}
|
|
20
|
+
return output;
|
|
21
|
+
}
|
|
22
|
+
function validateServerConfig(serverName, value) {
|
|
23
|
+
if (!isRecord(value)) {
|
|
24
|
+
throw new McpConfigFormatError(`mcpServers.${serverName} must be an object.`);
|
|
25
|
+
}
|
|
26
|
+
if (typeof value.command !== 'string' || value.command.trim().length === 0) {
|
|
27
|
+
throw new McpConfigFormatError(`mcpServers.${serverName}.command must be a non-empty string.`);
|
|
28
|
+
}
|
|
29
|
+
if (value.args !== undefined) {
|
|
30
|
+
if (!Array.isArray(value.args) || !value.args.every((arg) => typeof arg === 'string')) {
|
|
31
|
+
throw new McpConfigFormatError(`mcpServers.${serverName}.args must be an array of strings.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (value.cwd !== undefined && typeof value.cwd !== 'string') {
|
|
35
|
+
throw new McpConfigFormatError(`mcpServers.${serverName}.cwd must be a string.`);
|
|
36
|
+
}
|
|
37
|
+
if (value.env !== undefined) {
|
|
38
|
+
if (!isRecord(value.env) || Object.values(value.env).some((entry) => typeof entry !== 'string')) {
|
|
39
|
+
throw new McpConfigFormatError(`mcpServers.${serverName}.env must be an object of string values.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** 与 Cursor `.cursor/mcp.json` 对齐:根对象含非空 `mcpServers`。 */
|
|
44
|
+
export function parseCursorMcpConfigContent(raw) {
|
|
45
|
+
let parsed;
|
|
46
|
+
try {
|
|
47
|
+
parsed = JSON.parse(raw);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
throw new McpConfigFormatError('MCP config must be valid JSON.');
|
|
51
|
+
}
|
|
52
|
+
if (!isRecord(parsed)) {
|
|
53
|
+
throw new McpConfigFormatError('MCP config root must be a JSON object.');
|
|
54
|
+
}
|
|
55
|
+
const mcpServers = parsed.mcpServers;
|
|
56
|
+
if (!isRecord(mcpServers) || Object.keys(mcpServers).length === 0) {
|
|
57
|
+
throw new McpConfigFormatError('MCP config must include a non-empty mcpServers object.');
|
|
58
|
+
}
|
|
59
|
+
for (const [serverName, serverConfig] of Object.entries(mcpServers)) {
|
|
60
|
+
if (serverName.trim().length === 0) {
|
|
61
|
+
throw new McpConfigFormatError('mcpServers keys must be non-empty strings.');
|
|
62
|
+
}
|
|
63
|
+
validateServerConfig(serverName, serverConfig);
|
|
64
|
+
}
|
|
65
|
+
return { mcpServers: mcpServers };
|
|
66
|
+
}
|
|
67
|
+
export function validateCursorMcpConfigContent(raw) {
|
|
68
|
+
parseCursorMcpConfigContent(raw);
|
|
69
|
+
}
|
|
70
|
+
/** 将 incoming 的 mcpServers 合并进现有 `.cursor/mcp.json` 内容。 */
|
|
71
|
+
export function mergeCursorMcpConfigContent(existingContent, incomingContent) {
|
|
72
|
+
const incoming = parseCursorMcpConfigContent(incomingContent);
|
|
73
|
+
if (!existingContent) {
|
|
74
|
+
return incomingContent;
|
|
75
|
+
}
|
|
76
|
+
let existingParsed;
|
|
77
|
+
try {
|
|
78
|
+
existingParsed = JSON.parse(existingContent);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return incomingContent;
|
|
82
|
+
}
|
|
83
|
+
if (!isRecord(existingParsed)) {
|
|
84
|
+
return incomingContent;
|
|
85
|
+
}
|
|
86
|
+
const existingServersRaw = existingParsed.mcpServers;
|
|
87
|
+
const existingServers = isRecord(existingServersRaw) ? existingServersRaw : {};
|
|
88
|
+
const mergedServers = {
|
|
89
|
+
...existingServers,
|
|
90
|
+
...incoming.mcpServers,
|
|
91
|
+
};
|
|
92
|
+
const mergedConfig = {};
|
|
93
|
+
for (const [key, value] of Object.entries(existingParsed)) {
|
|
94
|
+
if (key !== 'mcpServers') {
|
|
95
|
+
mergedConfig[key] = value;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
mergedConfig.mcpServers = sortRecordKeys(mergedServers);
|
|
99
|
+
return JSON.stringify(sortRecordKeys(mergedConfig), null, 2);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=mcp-config-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config-format.js","sourceRoot":"","sources":["../../src/assets/mcp-config-format.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,MAA+B;IACrD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAClG,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB,EAAE,KAAc;IAC9D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,oBAAoB,CAAC,cAAc,UAAU,qBAAqB,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,oBAAoB,CAAC,cAAc,UAAU,sCAAsC,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC;YACtF,MAAM,IAAI,oBAAoB,CAAC,cAAc,UAAU,oCAAoC,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,IAAI,oBAAoB,CAAC,cAAc,UAAU,wBAAwB,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;YAChG,MAAM,IAAI,oBAAoB,CAAC,cAAc,UAAU,0CAA0C,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACrD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,oBAAoB,CAAC,gCAAgC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,oBAAoB,CAAC,wCAAwC,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,oBAAoB,CAAC,wDAAwD,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,oBAAoB,CAAC,4CAA4C,CAAC,CAAC;QAC/E,CAAC;QACD,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,UAAqD,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,GAAW;IACxD,2BAA2B,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,2BAA2B,CAAC,eAA8B,EAAE,eAAuB;IACjG,MAAM,QAAQ,GAAG,2BAA2B,CAAC,eAAe,CAAC,CAAC;IAE9D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,IAAI,cAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAY,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9B,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,kBAAkB,GAAG,cAAc,CAAC,UAAU,CAAC;IACrD,MAAM,eAAe,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,MAAM,aAAa,GAA4B;QAC7C,GAAG,eAAe;QAClB,GAAG,QAAQ,CAAC,UAAU;KACvB,CAAC;IAEF,MAAM,YAAY,GAA4B,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1D,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,YAAY,CAAC,UAAU,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export type AssetType = 'skill' | 'rule' | 'spec' | 'command' | 'mcp-config' | 'prompt';
|
|
2
|
+
export type AssetReviewStatus = 'unreviewed' | 'approved' | 'rejected' | 'deprecated';
|
|
3
|
+
export interface AssetMetadata {
|
|
4
|
+
assetType: AssetType;
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
hash: string;
|
|
8
|
+
source: string;
|
|
9
|
+
revision: string | null;
|
|
10
|
+
reviewStatus: AssetReviewStatus;
|
|
11
|
+
installedAt: string;
|
|
12
|
+
/** 企业资产 URI(`harness-service://asset/<uuid>`),供 update 解析 assetId。 */
|
|
13
|
+
sourceRef?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
entrypoint?: string;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
managedBy?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface LocalRuleMetadataRecord {
|
|
20
|
+
ruleName: string;
|
|
21
|
+
targetPath: string;
|
|
22
|
+
metadata: AssetMetadata;
|
|
23
|
+
}
|
|
24
|
+
export interface LocalCommandMetadataRecord {
|
|
25
|
+
commandName: string;
|
|
26
|
+
targetPath: string;
|
|
27
|
+
metadata: AssetMetadata;
|
|
28
|
+
}
|
|
29
|
+
export interface LocalPromptMetadataRecord {
|
|
30
|
+
promptName: string;
|
|
31
|
+
targetPath: string;
|
|
32
|
+
metadata: AssetMetadata;
|
|
33
|
+
}
|
|
34
|
+
export interface LocalMcpConfigMetadataRecord {
|
|
35
|
+
mcpConfigName: string;
|
|
36
|
+
targetPath: string;
|
|
37
|
+
metadata: AssetMetadata;
|
|
38
|
+
}
|
|
39
|
+
export interface LocalRuleMetadataStore {
|
|
40
|
+
version: 1;
|
|
41
|
+
records: LocalRuleMetadataRecord[];
|
|
42
|
+
}
|
|
43
|
+
export interface LocalCommandMetadataStore {
|
|
44
|
+
version: 1;
|
|
45
|
+
records: LocalCommandMetadataRecord[];
|
|
46
|
+
}
|
|
47
|
+
export interface LocalPromptMetadataStore {
|
|
48
|
+
version: 1;
|
|
49
|
+
records: LocalPromptMetadataRecord[];
|
|
50
|
+
}
|
|
51
|
+
export interface LocalMcpConfigMetadataStore {
|
|
52
|
+
version: 1;
|
|
53
|
+
records: LocalMcpConfigMetadataRecord[];
|
|
54
|
+
}
|
|
55
|
+
export declare function isAssetMetadata(value: unknown): value is AssetMetadata;
|
|
56
|
+
export declare function assertAssetMetadata(value: unknown, context: string): asserts value is AssetMetadata;
|
|
57
|
+
export declare function serializeAssetMetadata(metadata: AssetMetadata): string;
|
|
58
|
+
export declare function parseAssetMetadata(serialized: string): AssetMetadata;
|
|
59
|
+
export declare function serializeLocalRuleMetadataStore(store: LocalRuleMetadataStore): string;
|
|
60
|
+
export declare function serializeLocalCommandMetadataStore(store: LocalCommandMetadataStore): string;
|
|
61
|
+
export declare function parseLocalRuleMetadataStore(serialized: string): LocalRuleMetadataStore;
|
|
62
|
+
export declare function parseLocalPromptMetadataStore(serialized: string): LocalPromptMetadataStore;
|
|
63
|
+
export declare function parseLocalMcpConfigMetadataStore(serialized: string): LocalMcpConfigMetadataStore;
|
|
64
|
+
export declare function parseLocalCommandMetadataStore(serialized: string): LocalCommandMetadataStore;
|
|
65
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/assets/metadata.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;AACxF,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,uBAAuB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,0BAA0B,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,yBAAyB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,4BAA4B,EAAE,CAAC;CACzC;AAmBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CA0BtE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAOnG;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAGtE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAIpE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAgBrF;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,yBAAyB,GAAG,MAAM,CAoB3F;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAyBtF;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,wBAAwB,CAyB1F;AAED,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,MAAM,GAAG,2BAA2B,CAyBhG;AAED,wBAAgB,8BAA8B,CAAC,UAAU,EAAE,MAAM,GAAG,yBAAyB,CA6B5F"}
|