@revealui/ai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/LICENSE.commercial +112 -0
- package/README.md +314 -0
- package/dist/a2a/card.d.ts +26 -0
- package/dist/a2a/card.d.ts.map +1 -0
- package/dist/a2a/card.js +173 -0
- package/dist/a2a/handler.d.ts +26 -0
- package/dist/a2a/handler.d.ts.map +1 -0
- package/dist/a2a/handler.js +170 -0
- package/dist/a2a/index.d.ts +10 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +9 -0
- package/dist/a2a/task-store.d.ts +42 -0
- package/dist/a2a/task-store.d.ts.map +1 -0
- package/dist/a2a/task-store.js +99 -0
- package/dist/audit/emitter.d.ts +34 -0
- package/dist/audit/emitter.d.ts.map +1 -0
- package/dist/audit/emitter.js +34 -0
- package/dist/audit/index.d.ts +44 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +48 -0
- package/dist/audit/observer.d.ts +108 -0
- package/dist/audit/observer.d.ts.map +1 -0
- package/dist/audit/observer.js +271 -0
- package/dist/audit/policy.d.ts +70 -0
- package/dist/audit/policy.d.ts.map +1 -0
- package/dist/audit/policy.js +209 -0
- package/dist/audit/store.d.ts +42 -0
- package/dist/audit/store.d.ts.map +1 -0
- package/dist/audit/store.js +80 -0
- package/dist/audit/types.d.ts +169 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +80 -0
- package/dist/client/hooks/index.d.ts +22 -0
- package/dist/client/hooks/index.d.ts.map +1 -0
- package/dist/client/hooks/index.js +21 -0
- package/dist/client/hooks/useAgentContext.d.ts +30 -0
- package/dist/client/hooks/useAgentContext.d.ts.map +1 -0
- package/dist/client/hooks/useAgentContext.js +161 -0
- package/dist/client/hooks/useAgentEvents.d.ts +126 -0
- package/dist/client/hooks/useAgentEvents.d.ts.map +1 -0
- package/dist/client/hooks/useAgentEvents.js +232 -0
- package/dist/client/hooks/useAgentStream.d.ts +44 -0
- package/dist/client/hooks/useAgentStream.d.ts.map +1 -0
- package/dist/client/hooks/useAgentStream.js +101 -0
- package/dist/client/hooks/useEpisodicMemory.d.ts +25 -0
- package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -0
- package/dist/client/hooks/useEpisodicMemory.js +174 -0
- package/dist/client/hooks/useWorkingMemory.d.ts +57 -0
- package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -0
- package/dist/client/hooks/useWorkingMemory.js +276 -0
- package/dist/client/index.d.ts +14 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/embeddings/index.d.ts +51 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +73 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/inference/context-assembly.d.ts +27 -0
- package/dist/inference/context-assembly.d.ts.map +1 -0
- package/dist/inference/context-assembly.js +81 -0
- package/dist/inference/overflow-compressor.d.ts +17 -0
- package/dist/inference/overflow-compressor.d.ts.map +1 -0
- package/dist/inference/overflow-compressor.js +40 -0
- package/dist/inference/runRag.d.ts +35 -0
- package/dist/inference/runRag.d.ts.map +1 -0
- package/dist/inference/runRag.js +53 -0
- package/dist/ingestion/bm25.d.ts +29 -0
- package/dist/ingestion/bm25.d.ts.map +1 -0
- package/dist/ingestion/bm25.js +161 -0
- package/dist/ingestion/cms-indexer.d.ts +39 -0
- package/dist/ingestion/cms-indexer.d.ts.map +1 -0
- package/dist/ingestion/cms-indexer.js +74 -0
- package/dist/ingestion/file-parsers.d.ts +51 -0
- package/dist/ingestion/file-parsers.d.ts.map +1 -0
- package/dist/ingestion/file-parsers.js +247 -0
- package/dist/ingestion/hybrid-search.d.ts +22 -0
- package/dist/ingestion/hybrid-search.d.ts.map +1 -0
- package/dist/ingestion/hybrid-search.js +63 -0
- package/dist/ingestion/index.d.ts +9 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +8 -0
- package/dist/ingestion/pipeline.d.ts +35 -0
- package/dist/ingestion/pipeline.d.ts.map +1 -0
- package/dist/ingestion/pipeline.js +114 -0
- package/dist/ingestion/rag-vector-service.d.ts +34 -0
- package/dist/ingestion/rag-vector-service.d.ts.map +1 -0
- package/dist/ingestion/rag-vector-service.js +98 -0
- package/dist/ingestion/reranker.d.ts +10 -0
- package/dist/ingestion/reranker.d.ts.map +1 -0
- package/dist/ingestion/reranker.js +41 -0
- package/dist/ingestion/text-splitter.d.ts +25 -0
- package/dist/ingestion/text-splitter.d.ts.map +1 -0
- package/dist/ingestion/text-splitter.js +119 -0
- package/dist/llm/cache-utils.d.ts +146 -0
- package/dist/llm/cache-utils.d.ts.map +1 -0
- package/dist/llm/cache-utils.js +204 -0
- package/dist/llm/client.d.ts +134 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +497 -0
- package/dist/llm/key-validator.d.ts +25 -0
- package/dist/llm/key-validator.d.ts.map +1 -0
- package/dist/llm/key-validator.js +101 -0
- package/dist/llm/provider-health.d.ts +40 -0
- package/dist/llm/provider-health.d.ts.map +1 -0
- package/dist/llm/provider-health.js +97 -0
- package/dist/llm/providers/anthropic.d.ts +31 -0
- package/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/anthropic.js +248 -0
- package/dist/llm/providers/base.d.ts +111 -0
- package/dist/llm/providers/base.d.ts.map +1 -0
- package/dist/llm/providers/base.js +6 -0
- package/dist/llm/providers/groq.d.ts +23 -0
- package/dist/llm/providers/groq.d.ts.map +1 -0
- package/dist/llm/providers/groq.js +27 -0
- package/dist/llm/providers/ollama.d.ts +27 -0
- package/dist/llm/providers/ollama.d.ts.map +1 -0
- package/dist/llm/providers/ollama.js +48 -0
- package/dist/llm/providers/openai.d.ts +19 -0
- package/dist/llm/providers/openai.d.ts.map +1 -0
- package/dist/llm/providers/openai.js +245 -0
- package/dist/llm/providers/vultr.d.ts +18 -0
- package/dist/llm/providers/vultr.d.ts.map +1 -0
- package/dist/llm/providers/vultr.js +168 -0
- package/dist/llm/response-cache.d.ts +166 -0
- package/dist/llm/response-cache.d.ts.map +1 -0
- package/dist/llm/response-cache.js +233 -0
- package/dist/llm/semantic-cache.d.ts +179 -0
- package/dist/llm/semantic-cache.d.ts.map +1 -0
- package/dist/llm/semantic-cache.js +306 -0
- package/dist/llm/server.d.ts +14 -0
- package/dist/llm/server.d.ts.map +1 -0
- package/dist/llm/server.js +15 -0
- package/dist/llm/token-counter.d.ts +48 -0
- package/dist/llm/token-counter.d.ts.map +1 -0
- package/dist/llm/token-counter.js +77 -0
- package/dist/llm/workspace-provider-config.d.ts +38 -0
- package/dist/llm/workspace-provider-config.d.ts.map +1 -0
- package/dist/llm/workspace-provider-config.js +47 -0
- package/dist/memory/agent/context-manager.d.ts +148 -0
- package/dist/memory/agent/context-manager.d.ts.map +1 -0
- package/dist/memory/agent/context-manager.js +284 -0
- package/dist/memory/agent/index.d.ts +7 -0
- package/dist/memory/agent/index.d.ts.map +1 -0
- package/dist/memory/agent/index.js +6 -0
- package/dist/memory/crdt/index.d.ts +13 -0
- package/dist/memory/crdt/index.d.ts.map +1 -0
- package/dist/memory/crdt/index.js +12 -0
- package/dist/memory/crdt/lww-register.d.ts +108 -0
- package/dist/memory/crdt/lww-register.d.ts.map +1 -0
- package/dist/memory/crdt/lww-register.js +169 -0
- package/dist/memory/crdt/or-set.d.ts +141 -0
- package/dist/memory/crdt/or-set.d.ts.map +1 -0
- package/dist/memory/crdt/or-set.js +291 -0
- package/dist/memory/crdt/pn-counter.d.ts +116 -0
- package/dist/memory/crdt/pn-counter.d.ts.map +1 -0
- package/dist/memory/crdt/pn-counter.js +174 -0
- package/dist/memory/crdt/vector-clock.d.ts +115 -0
- package/dist/memory/crdt/vector-clock.d.ts.map +1 -0
- package/dist/memory/crdt/vector-clock.js +179 -0
- package/dist/memory/errors/index.d.ts +56 -0
- package/dist/memory/errors/index.d.ts.map +1 -0
- package/dist/memory/errors/index.js +85 -0
- package/dist/memory/index.d.ts +21 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +20 -0
- package/dist/memory/persistence/crdt-persistence.d.ts +85 -0
- package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -0
- package/dist/memory/persistence/crdt-persistence.js +204 -0
- package/dist/memory/persistence/index.d.ts +7 -0
- package/dist/memory/persistence/index.d.ts.map +1 -0
- package/dist/memory/persistence/index.js +6 -0
- package/dist/memory/preferences/index.d.ts +7 -0
- package/dist/memory/preferences/index.d.ts.map +1 -0
- package/dist/memory/preferences/index.js +6 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts +133 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -0
- package/dist/memory/preferences/user-preferences-manager.js +342 -0
- package/dist/memory/services/index.d.ts +8 -0
- package/dist/memory/services/index.d.ts.map +1 -0
- package/dist/memory/services/index.js +6 -0
- package/dist/memory/services/node-id-service.d.ts +75 -0
- package/dist/memory/services/node-id-service.d.ts.map +1 -0
- package/dist/memory/services/node-id-service.js +190 -0
- package/dist/memory/stores/episodic-memory.d.ts +182 -0
- package/dist/memory/stores/episodic-memory.d.ts.map +1 -0
- package/dist/memory/stores/episodic-memory.js +378 -0
- package/dist/memory/stores/index.d.ts +16 -0
- package/dist/memory/stores/index.d.ts.map +1 -0
- package/dist/memory/stores/index.js +15 -0
- package/dist/memory/stores/procedural-memory.d.ts +89 -0
- package/dist/memory/stores/procedural-memory.d.ts.map +1 -0
- package/dist/memory/stores/procedural-memory.js +152 -0
- package/dist/memory/stores/semantic-memory.d.ts +92 -0
- package/dist/memory/stores/semantic-memory.d.ts.map +1 -0
- package/dist/memory/stores/semantic-memory.js +155 -0
- package/dist/memory/stores/working-memory.d.ts +225 -0
- package/dist/memory/stores/working-memory.d.ts.map +1 -0
- package/dist/memory/stores/working-memory.js +336 -0
- package/dist/memory/utils/deep-clone.d.ts +10 -0
- package/dist/memory/utils/deep-clone.d.ts.map +1 -0
- package/dist/memory/utils/deep-clone.js +9 -0
- package/dist/memory/utils/index.d.ts +8 -0
- package/dist/memory/utils/index.d.ts.map +1 -0
- package/dist/memory/utils/index.js +7 -0
- package/dist/memory/utils/logger.d.ts +21 -0
- package/dist/memory/utils/logger.d.ts.map +1 -0
- package/dist/memory/utils/logger.js +62 -0
- package/dist/memory/utils/sql-helpers.d.ts +97 -0
- package/dist/memory/utils/sql-helpers.d.ts.map +1 -0
- package/dist/memory/utils/sql-helpers.js +214 -0
- package/dist/memory/utils/validation.d.ts +62 -0
- package/dist/memory/utils/validation.d.ts.map +1 -0
- package/dist/memory/utils/validation.js +244 -0
- package/dist/memory/vector/index.d.ts +12 -0
- package/dist/memory/vector/index.d.ts.map +1 -0
- package/dist/memory/vector/index.js +14 -0
- package/dist/memory/vector/vector-memory-service.d.ts +88 -0
- package/dist/memory/vector/vector-memory-service.d.ts.map +1 -0
- package/dist/memory/vector/vector-memory-service.js +335 -0
- package/dist/observability/logger.d.ts +79 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +165 -0
- package/dist/observability/metrics.d.ts +43 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +197 -0
- package/dist/observability/query.d.ts +150 -0
- package/dist/observability/query.d.ts.map +1 -0
- package/dist/observability/query.js +339 -0
- package/dist/observability/types.d.ts +140 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +6 -0
- package/dist/orchestration/agent.d.ts +98 -0
- package/dist/orchestration/agent.d.ts.map +1 -0
- package/dist/orchestration/agent.js +6 -0
- package/dist/orchestration/defaults.d.ts +21 -0
- package/dist/orchestration/defaults.d.ts.map +1 -0
- package/dist/orchestration/defaults.js +22 -0
- package/dist/orchestration/memory-integration.d.ts +58 -0
- package/dist/orchestration/memory-integration.d.ts.map +1 -0
- package/dist/orchestration/memory-integration.js +130 -0
- package/dist/orchestration/orchestrator.d.ts +67 -0
- package/dist/orchestration/orchestrator.d.ts.map +1 -0
- package/dist/orchestration/orchestrator.js +174 -0
- package/dist/orchestration/runtime.d.ts +82 -0
- package/dist/orchestration/runtime.d.ts.map +1 -0
- package/dist/orchestration/runtime.js +251 -0
- package/dist/orchestration/streaming-runtime.d.ts +36 -0
- package/dist/orchestration/streaming-runtime.d.ts.map +1 -0
- package/dist/orchestration/streaming-runtime.js +175 -0
- package/dist/orchestration/ticket-agent.d.ts +70 -0
- package/dist/orchestration/ticket-agent.d.ts.map +1 -0
- package/dist/orchestration/ticket-agent.js +146 -0
- package/dist/skills/activation/index.d.ts +7 -0
- package/dist/skills/activation/index.d.ts.map +1 -0
- package/dist/skills/activation/index.js +6 -0
- package/dist/skills/activation/skill-activator.d.ts +68 -0
- package/dist/skills/activation/skill-activator.d.ts.map +1 -0
- package/dist/skills/activation/skill-activator.js +224 -0
- package/dist/skills/catalog/catalog-search.d.ts +55 -0
- package/dist/skills/catalog/catalog-search.d.ts.map +1 -0
- package/dist/skills/catalog/catalog-search.js +111 -0
- package/dist/skills/catalog/catalog-types.d.ts +81 -0
- package/dist/skills/catalog/catalog-types.d.ts.map +1 -0
- package/dist/skills/catalog/catalog-types.js +66 -0
- package/dist/skills/catalog/index.d.ts +9 -0
- package/dist/skills/catalog/index.d.ts.map +1 -0
- package/dist/skills/catalog/index.js +7 -0
- package/dist/skills/catalog/vercel-catalog.d.ts +42 -0
- package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -0
- package/dist/skills/catalog/vercel-catalog.js +189 -0
- package/dist/skills/compat/index.d.ts +9 -0
- package/dist/skills/compat/index.d.ts.map +1 -0
- package/dist/skills/compat/index.js +8 -0
- package/dist/skills/compat/skill-enhancer.d.ts +37 -0
- package/dist/skills/compat/skill-enhancer.d.ts.map +1 -0
- package/dist/skills/compat/skill-enhancer.js +76 -0
- package/dist/skills/compat/tool-mapper.d.ts +61 -0
- package/dist/skills/compat/tool-mapper.d.ts.map +1 -0
- package/dist/skills/compat/tool-mapper.js +168 -0
- package/dist/skills/compat/vercel-compat.d.ts +33 -0
- package/dist/skills/compat/vercel-compat.d.ts.map +1 -0
- package/dist/skills/compat/vercel-compat.js +132 -0
- package/dist/skills/index.d.ts +40 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +47 -0
- package/dist/skills/integration/agent-skill-provider.d.ts +94 -0
- package/dist/skills/integration/agent-skill-provider.d.ts.map +1 -0
- package/dist/skills/integration/agent-skill-provider.js +161 -0
- package/dist/skills/integration/index.d.ts +7 -0
- package/dist/skills/integration/index.d.ts.map +1 -0
- package/dist/skills/integration/index.js +6 -0
- package/dist/skills/loader/github-loader.d.ts +61 -0
- package/dist/skills/loader/github-loader.d.ts.map +1 -0
- package/dist/skills/loader/github-loader.js +176 -0
- package/dist/skills/loader/index.d.ts +10 -0
- package/dist/skills/loader/index.d.ts.map +1 -0
- package/dist/skills/loader/index.js +9 -0
- package/dist/skills/loader/local-loader.d.ts +56 -0
- package/dist/skills/loader/local-loader.d.ts.map +1 -0
- package/dist/skills/loader/local-loader.js +186 -0
- package/dist/skills/loader/vercel-loader.d.ts +64 -0
- package/dist/skills/loader/vercel-loader.d.ts.map +1 -0
- package/dist/skills/loader/vercel-loader.js +313 -0
- package/dist/skills/loader/vercel-types.d.ts +64 -0
- package/dist/skills/loader/vercel-types.d.ts.map +1 -0
- package/dist/skills/loader/vercel-types.js +55 -0
- package/dist/skills/parser/index.d.ts +7 -0
- package/dist/skills/parser/index.d.ts.map +1 -0
- package/dist/skills/parser/index.js +6 -0
- package/dist/skills/parser/skill-md-parser.d.ts +64 -0
- package/dist/skills/parser/skill-md-parser.d.ts.map +1 -0
- package/dist/skills/parser/skill-md-parser.js +242 -0
- package/dist/skills/registry/index.d.ts +7 -0
- package/dist/skills/registry/index.d.ts.map +1 -0
- package/dist/skills/registry/index.js +6 -0
- package/dist/skills/registry/skill-registry.d.ts +133 -0
- package/dist/skills/registry/skill-registry.d.ts.map +1 -0
- package/dist/skills/registry/skill-registry.js +373 -0
- package/dist/skills/types.d.ts +216 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +176 -0
- package/dist/templates/agent-spec.d.ts +138 -0
- package/dist/templates/agent-spec.d.ts.map +1 -0
- package/dist/templates/agent-spec.js +138 -0
- package/dist/templates/index.d.ts +56 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +58 -0
- package/dist/templates/prompt-spec.d.ts +140 -0
- package/dist/templates/prompt-spec.d.ts.map +1 -0
- package/dist/templates/prompt-spec.js +210 -0
- package/dist/templates/skill-spec.d.ts +106 -0
- package/dist/templates/skill-spec.d.ts.map +1 -0
- package/dist/templates/skill-spec.js +119 -0
- package/dist/tools/base.d.ts +74 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +6 -0
- package/dist/tools/cms/collection-tools.d.ts +36 -0
- package/dist/tools/cms/collection-tools.d.ts.map +1 -0
- package/dist/tools/cms/collection-tools.js +178 -0
- package/dist/tools/cms/factory.d.ts +89 -0
- package/dist/tools/cms/factory.d.ts.map +1 -0
- package/dist/tools/cms/factory.js +462 -0
- package/dist/tools/cms/global-tools.d.ts +21 -0
- package/dist/tools/cms/global-tools.d.ts.map +1 -0
- package/dist/tools/cms/global-tools.js +92 -0
- package/dist/tools/cms/index.d.ts +11 -0
- package/dist/tools/cms/index.d.ts.map +1 -0
- package/dist/tools/cms/index.js +11 -0
- package/dist/tools/cms/media-tools.d.ts +31 -0
- package/dist/tools/cms/media-tools.d.ts.map +1 -0
- package/dist/tools/cms/media-tools.js +140 -0
- package/dist/tools/cms/user-tools.d.ts +31 -0
- package/dist/tools/cms/user-tools.d.ts.map +1 -0
- package/dist/tools/cms/user-tools.js +135 -0
- package/dist/tools/deduplicator.d.ts +19 -0
- package/dist/tools/deduplicator.d.ts.map +1 -0
- package/dist/tools/deduplicator.js +53 -0
- package/dist/tools/document-summarizer.d.ts +11 -0
- package/dist/tools/document-summarizer.d.ts.map +1 -0
- package/dist/tools/document-summarizer.js +82 -0
- package/dist/tools/mcp-adapter.d.ts +66 -0
- package/dist/tools/mcp-adapter.d.ts.map +1 -0
- package/dist/tools/mcp-adapter.js +152 -0
- package/dist/tools/memory/index.d.ts +3 -0
- package/dist/tools/memory/index.d.ts.map +1 -0
- package/dist/tools/memory/index.js +1 -0
- package/dist/tools/memory/store-memory.d.ts +39 -0
- package/dist/tools/memory/store-memory.d.ts.map +1 -0
- package/dist/tools/memory/store-memory.js +94 -0
- package/dist/tools/registry.d.ts +14 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +48 -0
- package/dist/tools/ticket-tools.d.ts +31 -0
- package/dist/tools/ticket-tools.d.ts.map +1 -0
- package/dist/tools/ticket-tools.js +74 -0
- package/dist/tools/web/duck-duck-go.d.ts +52 -0
- package/dist/tools/web/duck-duck-go.d.ts.map +1 -0
- package/dist/tools/web/duck-duck-go.js +202 -0
- package/dist/tools/web/exa.d.ts +34 -0
- package/dist/tools/web/exa.d.ts.map +1 -0
- package/dist/tools/web/exa.js +80 -0
- package/dist/tools/web/index.d.ts +6 -0
- package/dist/tools/web/index.d.ts.map +1 -0
- package/dist/tools/web/index.js +4 -0
- package/dist/tools/web/scraper.d.ts +9 -0
- package/dist/tools/web/scraper.d.ts.map +1 -0
- package/dist/tools/web/scraper.js +118 -0
- package/dist/tools/web/tavily.d.ts +32 -0
- package/dist/tools/web/tavily.d.ts.map +1 -0
- package/dist/tools/web/tavily.js +73 -0
- package/dist/tools/web/types.d.ts +31 -0
- package/dist/tools/web/types.d.ts.map +1 -0
- package/dist/tools/web/types.js +9 -0
- package/package.json +143 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Skill Loader
|
|
3
|
+
*
|
|
4
|
+
* Install skills from GitHub repositories.
|
|
5
|
+
*/
|
|
6
|
+
import { exec } from 'node:child_process';
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { promisify } from 'node:util';
|
|
10
|
+
import { parseSkillMd } from '../parser/index.js';
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
/**
|
|
13
|
+
* Parse a GitHub source string into components.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* parseGitHubSource("vercel-labs/agent-skills")
|
|
17
|
+
* // { owner: "vercel-labs", repo: "agent-skills" }
|
|
18
|
+
*
|
|
19
|
+
* parseGitHubSource("vercel-labs/agent-skills/skills/react-best-practices")
|
|
20
|
+
* // { owner: "vercel-labs", repo: "agent-skills", path: "skills/react-best-practices" }
|
|
21
|
+
*/
|
|
22
|
+
export function parseGitHubSource(source) {
|
|
23
|
+
// Handle @ref suffix for specific branch/tag
|
|
24
|
+
let ref;
|
|
25
|
+
let sourcePath = source;
|
|
26
|
+
if (source.includes('@')) {
|
|
27
|
+
const atIndex = source.lastIndexOf('@');
|
|
28
|
+
ref = source.slice(atIndex + 1);
|
|
29
|
+
sourcePath = source.slice(0, atIndex);
|
|
30
|
+
}
|
|
31
|
+
const parts = sourcePath.split('/');
|
|
32
|
+
if (parts.length < 2) {
|
|
33
|
+
throw new Error(`Invalid GitHub source: ${source}. Expected format: owner/repo[/path][@ref]`);
|
|
34
|
+
}
|
|
35
|
+
const owner = parts[0];
|
|
36
|
+
const repo = parts[1];
|
|
37
|
+
const pathParts = parts.slice(2);
|
|
38
|
+
if (!(owner && repo)) {
|
|
39
|
+
throw new Error(`Invalid GitHub source: ${source}. Expected format: owner/repo[/path][@ref]`);
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
owner,
|
|
43
|
+
repo,
|
|
44
|
+
path: pathParts.length > 0 ? pathParts.join('/') : undefined,
|
|
45
|
+
ref,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load a skill from a GitHub repository.
|
|
50
|
+
*
|
|
51
|
+
* Uses git sparse checkout for efficiency when loading from a subdirectory.
|
|
52
|
+
*/
|
|
53
|
+
export async function loadFromGitHub(source, options) {
|
|
54
|
+
const parsed = parseGitHubSource(source);
|
|
55
|
+
const repoUrl = `https://github.com/${parsed.owner}/${parsed.repo}.git`;
|
|
56
|
+
// Determine skill name from path or repo name
|
|
57
|
+
const skillName = parsed.path ? path.basename(parsed.path) : parsed.repo;
|
|
58
|
+
const targetPath = path.join(options.targetDir, skillName);
|
|
59
|
+
// Check if already exists
|
|
60
|
+
if (fs.existsSync(targetPath)) {
|
|
61
|
+
if (options.force) {
|
|
62
|
+
fs.rmSync(targetPath, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new Error(`Skill "${skillName}" already exists. Use --force to overwrite.`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Ensure target directory exists
|
|
69
|
+
if (!fs.existsSync(options.targetDir)) {
|
|
70
|
+
fs.mkdirSync(options.targetDir, { recursive: true });
|
|
71
|
+
}
|
|
72
|
+
if (parsed.path) {
|
|
73
|
+
// Use sparse checkout for subdirectory
|
|
74
|
+
await sparseClone(repoUrl, targetPath, parsed.path, parsed.ref);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Clone entire repo
|
|
78
|
+
await fullClone(repoUrl, targetPath, parsed.ref);
|
|
79
|
+
}
|
|
80
|
+
// Find and validate SKILL.md
|
|
81
|
+
const skillMdPath = path.join(targetPath, 'SKILL.md');
|
|
82
|
+
if (!fs.existsSync(skillMdPath)) {
|
|
83
|
+
// Clean up failed install
|
|
84
|
+
fs.rmSync(targetPath, { recursive: true });
|
|
85
|
+
throw new Error(`No SKILL.md found in ${source}`);
|
|
86
|
+
}
|
|
87
|
+
// Parse and validate
|
|
88
|
+
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
89
|
+
const parsedSkill = parseSkillMd(content);
|
|
90
|
+
// Create skill object
|
|
91
|
+
const skill = {
|
|
92
|
+
metadata: parsedSkill.metadata,
|
|
93
|
+
instructions: parsedSkill.instructions,
|
|
94
|
+
sourcePath: targetPath,
|
|
95
|
+
scope: options.scope,
|
|
96
|
+
source: 'github',
|
|
97
|
+
sourceIdentifier: source,
|
|
98
|
+
installedAt: new Date().toISOString(),
|
|
99
|
+
};
|
|
100
|
+
// Register with registry
|
|
101
|
+
if (options.registry.has(skill.metadata.name)) {
|
|
102
|
+
options.registry.unregister(skill.metadata.name);
|
|
103
|
+
}
|
|
104
|
+
options.registry.register(skill);
|
|
105
|
+
// Load fully (with resources and optionally embedding)
|
|
106
|
+
return (await options.registry.loadSkill(skill.metadata.name, options.generateEmbedding)) ?? skill;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Perform a sparse checkout for a specific path.
|
|
110
|
+
*/
|
|
111
|
+
async function sparseClone(repoUrl, targetPath, subPath, ref) {
|
|
112
|
+
// Create a temp directory for the sparse checkout
|
|
113
|
+
const tempDir = `${targetPath}.tmp`;
|
|
114
|
+
try {
|
|
115
|
+
// Initialize sparse checkout
|
|
116
|
+
await execAsync(`git clone --depth 1 --filter=blob:none --sparse ${repoUrl} ${tempDir}`);
|
|
117
|
+
// Configure sparse checkout
|
|
118
|
+
await execAsync(`git -C ${tempDir} sparse-checkout set ${subPath}`);
|
|
119
|
+
// Checkout specific ref if provided
|
|
120
|
+
if (ref) {
|
|
121
|
+
await execAsync(`git -C ${tempDir} fetch --depth 1 origin ${ref}`);
|
|
122
|
+
await execAsync(`git -C ${tempDir} checkout ${ref}`);
|
|
123
|
+
}
|
|
124
|
+
// Move the skill directory to target
|
|
125
|
+
const sourcePath = path.join(tempDir, subPath);
|
|
126
|
+
if (!fs.existsSync(sourcePath)) {
|
|
127
|
+
throw new Error(`Path "${subPath}" not found in repository`);
|
|
128
|
+
}
|
|
129
|
+
fs.renameSync(sourcePath, targetPath);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
// Clean up temp directory
|
|
133
|
+
if (fs.existsSync(tempDir)) {
|
|
134
|
+
fs.rmSync(tempDir, { recursive: true });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Perform a full shallow clone.
|
|
140
|
+
*/
|
|
141
|
+
async function fullClone(repoUrl, targetPath, ref) {
|
|
142
|
+
const refArg = ref ? `--branch ${ref}` : '';
|
|
143
|
+
await execAsync(`git clone --depth 1 ${refArg} ${repoUrl} ${targetPath}`);
|
|
144
|
+
// Remove .git directory to save space
|
|
145
|
+
const gitDir = path.join(targetPath, '.git');
|
|
146
|
+
if (fs.existsSync(gitDir)) {
|
|
147
|
+
fs.rmSync(gitDir, { recursive: true });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Update an installed skill from GitHub.
|
|
152
|
+
*/
|
|
153
|
+
export async function updateFromGitHub(skillName, registry) {
|
|
154
|
+
const skill = registry.get(skillName);
|
|
155
|
+
if (!skill) {
|
|
156
|
+
throw new Error(`Skill "${skillName}" is not installed`);
|
|
157
|
+
}
|
|
158
|
+
// For now, we don't track the original source URL
|
|
159
|
+
// This would require storing metadata about where the skill came from
|
|
160
|
+
throw new Error('Update not yet implemented. Please reinstall with --force.');
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if a GitHub source is valid and accessible.
|
|
164
|
+
*/
|
|
165
|
+
export async function validateGitHubSource(source) {
|
|
166
|
+
try {
|
|
167
|
+
const parsed = parseGitHubSource(source);
|
|
168
|
+
const repoUrl = `https://github.com/${parsed.owner}/${parsed.repo}.git`;
|
|
169
|
+
// Use git ls-remote to check if repo exists
|
|
170
|
+
await execAsync(`git ls-remote --exit-code ${repoUrl} HEAD`);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Loaders
|
|
3
|
+
*
|
|
4
|
+
* Load skills from various sources (GitHub, local directories, Vercel Skills ecosystem).
|
|
5
|
+
*/
|
|
6
|
+
export { type GitHubLoadOptions, type GitHubSource, loadFromGitHub, parseGitHubSource, updateFromGitHub, validateGitHubSource, } from './github-loader.js';
|
|
7
|
+
export { createSkill, type LocalLoadOptions, loadAllFromDirectory, loadFromLocal, removeSkill, type SkillTemplate, } from './local-loader.js';
|
|
8
|
+
export { checkVercelSkillUpdates, isVercelCliAvailable, loadFromVercelSkills, updateVercelSkill, type VercelLoadOptions, } from './vercel-loader.js';
|
|
9
|
+
export { parseVercelSource, type UpdateInfo, type VercelSource } from './vercel-types.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/skills/loader/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,iBAAiB,GACvB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Loaders
|
|
3
|
+
*
|
|
4
|
+
* Load skills from various sources (GitHub, local directories, Vercel Skills ecosystem).
|
|
5
|
+
*/
|
|
6
|
+
export { loadFromGitHub, parseGitHubSource, updateFromGitHub, validateGitHubSource, } from './github-loader.js';
|
|
7
|
+
export { createSkill, loadAllFromDirectory, loadFromLocal, removeSkill, } from './local-loader.js';
|
|
8
|
+
export { checkVercelSkillUpdates, isVercelCliAvailable, loadFromVercelSkills, updateVercelSkill, } from './vercel-loader.js';
|
|
9
|
+
export { parseVercelSource } from './vercel-types.js';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Skill Loader
|
|
3
|
+
*
|
|
4
|
+
* Load skills from local directories.
|
|
5
|
+
*/
|
|
6
|
+
import type { SkillRegistry } from '../registry/index.js';
|
|
7
|
+
import type { Skill } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Options for loading from local directory.
|
|
10
|
+
*/
|
|
11
|
+
export interface LocalLoadOptions {
|
|
12
|
+
/** Target directory for installation (if copying) */
|
|
13
|
+
targetDir?: string;
|
|
14
|
+
/** Scope: local (project) or global */
|
|
15
|
+
scope: 'local' | 'global';
|
|
16
|
+
/** Registry to register skill with */
|
|
17
|
+
registry: SkillRegistry;
|
|
18
|
+
/** Generate embedding for semantic search */
|
|
19
|
+
generateEmbedding?: boolean;
|
|
20
|
+
/** Copy files instead of referencing in place */
|
|
21
|
+
copy?: boolean;
|
|
22
|
+
/** Force reinstall if already exists */
|
|
23
|
+
force?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load a skill from a local directory.
|
|
27
|
+
*
|
|
28
|
+
* @param sourcePath - Path to skill directory containing SKILL.md
|
|
29
|
+
* @param options - Load options
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadFromLocal(sourcePath: string, options: LocalLoadOptions): Promise<Skill>;
|
|
32
|
+
/**
|
|
33
|
+
* Load all skills from a directory.
|
|
34
|
+
*
|
|
35
|
+
* @param dir - Directory containing skill subdirectories
|
|
36
|
+
* @param options - Load options
|
|
37
|
+
*/
|
|
38
|
+
export declare function loadAllFromDirectory(dir: string, options: Omit<LocalLoadOptions, 'copy'>): Promise<Skill[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Create a new skill from a template.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createSkill(name: string, targetDir: string, template?: SkillTemplate): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Template for creating new skills.
|
|
45
|
+
*/
|
|
46
|
+
export interface SkillTemplate {
|
|
47
|
+
skillMd?: string;
|
|
48
|
+
createScripts?: boolean;
|
|
49
|
+
createReferences?: boolean;
|
|
50
|
+
createAssets?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Remove an installed skill.
|
|
54
|
+
*/
|
|
55
|
+
export declare function removeSkill(name: string, registry: SkillRegistry): boolean;
|
|
56
|
+
//# sourceMappingURL=local-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-loader.d.ts","sourceRoot":"","sources":["../../../src/skills/loader/local-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,uCAAuC;IACvC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAA;IAEzB,sCAAsC;IACtC,QAAQ,EAAE,aAAa,CAAA;IAEvB,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAE3B,iDAAiD;IACjD,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd,wCAAwC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CA+DjG;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,KAAK,EAAE,CAAC,CA8BlB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAkDD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAe1E"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Skill Loader
|
|
3
|
+
*
|
|
4
|
+
* Load skills from local directories.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { parseSkillMd } from '../parser/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Load a skill from a local directory.
|
|
11
|
+
*
|
|
12
|
+
* @param sourcePath - Path to skill directory containing SKILL.md
|
|
13
|
+
* @param options - Load options
|
|
14
|
+
*/
|
|
15
|
+
export async function loadFromLocal(sourcePath, options) {
|
|
16
|
+
const resolvedSource = path.resolve(sourcePath);
|
|
17
|
+
// Validate source exists
|
|
18
|
+
if (!fs.existsSync(resolvedSource)) {
|
|
19
|
+
throw new Error(`Source directory does not exist: ${resolvedSource}`);
|
|
20
|
+
}
|
|
21
|
+
// Check for SKILL.md
|
|
22
|
+
const skillMdPath = path.join(resolvedSource, 'SKILL.md');
|
|
23
|
+
if (!fs.existsSync(skillMdPath)) {
|
|
24
|
+
throw new Error(`No SKILL.md found in ${resolvedSource}`);
|
|
25
|
+
}
|
|
26
|
+
// Parse skill
|
|
27
|
+
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
28
|
+
const parsed = parseSkillMd(content);
|
|
29
|
+
const skillName = parsed.metadata.name;
|
|
30
|
+
let finalPath = resolvedSource;
|
|
31
|
+
// Copy files if requested
|
|
32
|
+
if (options.copy && options.targetDir) {
|
|
33
|
+
const targetPath = path.join(options.targetDir, skillName);
|
|
34
|
+
// Check if already exists
|
|
35
|
+
if (fs.existsSync(targetPath)) {
|
|
36
|
+
if (options.force) {
|
|
37
|
+
fs.rmSync(targetPath, { recursive: true });
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw new Error(`Skill "${skillName}" already exists. Use --force to overwrite.`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Ensure target directory exists
|
|
44
|
+
if (!fs.existsSync(options.targetDir)) {
|
|
45
|
+
fs.mkdirSync(options.targetDir, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
// Copy directory
|
|
48
|
+
copyDirectory(resolvedSource, targetPath);
|
|
49
|
+
finalPath = targetPath;
|
|
50
|
+
}
|
|
51
|
+
// Create skill object
|
|
52
|
+
const skill = {
|
|
53
|
+
metadata: parsed.metadata,
|
|
54
|
+
instructions: parsed.instructions,
|
|
55
|
+
sourcePath: finalPath,
|
|
56
|
+
scope: options.scope,
|
|
57
|
+
source: 'local',
|
|
58
|
+
sourceIdentifier: sourcePath,
|
|
59
|
+
installedAt: new Date().toISOString(),
|
|
60
|
+
};
|
|
61
|
+
// Register with registry
|
|
62
|
+
if (options.registry.has(skillName)) {
|
|
63
|
+
options.registry.unregister(skillName);
|
|
64
|
+
}
|
|
65
|
+
options.registry.register(skill);
|
|
66
|
+
// Load fully (with resources and optionally embedding)
|
|
67
|
+
return (await options.registry.loadSkill(skillName, options.generateEmbedding)) ?? skill;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Load all skills from a directory.
|
|
71
|
+
*
|
|
72
|
+
* @param dir - Directory containing skill subdirectories
|
|
73
|
+
* @param options - Load options
|
|
74
|
+
*/
|
|
75
|
+
export async function loadAllFromDirectory(dir, options) {
|
|
76
|
+
const resolvedDir = path.resolve(dir);
|
|
77
|
+
if (!fs.existsSync(resolvedDir)) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
const entries = fs.readdirSync(resolvedDir, { withFileTypes: true });
|
|
81
|
+
const skills = [];
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
if (!entry.isDirectory())
|
|
84
|
+
continue;
|
|
85
|
+
const skillPath = path.join(resolvedDir, entry.name);
|
|
86
|
+
const skillMdPath = path.join(skillPath, 'SKILL.md');
|
|
87
|
+
if (!fs.existsSync(skillMdPath))
|
|
88
|
+
continue;
|
|
89
|
+
try {
|
|
90
|
+
const skill = await loadFromLocal(skillPath, {
|
|
91
|
+
...options,
|
|
92
|
+
copy: false, // Don't copy when loading from installed directory
|
|
93
|
+
});
|
|
94
|
+
skills.push(skill);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Skip malformed or unreadable skill files — partial load is better than a hard crash
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return skills;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create a new skill from a template.
|
|
104
|
+
*/
|
|
105
|
+
export async function createSkill(name, targetDir, template) {
|
|
106
|
+
const skillDir = path.join(targetDir, name);
|
|
107
|
+
if (fs.existsSync(skillDir)) {
|
|
108
|
+
throw new Error(`Directory already exists: ${skillDir}`);
|
|
109
|
+
}
|
|
110
|
+
fs.mkdirSync(skillDir, { recursive: true });
|
|
111
|
+
// Create SKILL.md
|
|
112
|
+
const skillMd = template?.skillMd ?? generateDefaultSkillMd(name);
|
|
113
|
+
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), skillMd);
|
|
114
|
+
// Create optional directories
|
|
115
|
+
if (template?.createScripts) {
|
|
116
|
+
fs.mkdirSync(path.join(skillDir, 'scripts'));
|
|
117
|
+
}
|
|
118
|
+
if (template?.createReferences) {
|
|
119
|
+
fs.mkdirSync(path.join(skillDir, 'references'));
|
|
120
|
+
}
|
|
121
|
+
if (template?.createAssets) {
|
|
122
|
+
fs.mkdirSync(path.join(skillDir, 'assets'));
|
|
123
|
+
}
|
|
124
|
+
return skillDir;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Generate a default SKILL.md file.
|
|
128
|
+
*/
|
|
129
|
+
function generateDefaultSkillMd(name) {
|
|
130
|
+
return `---
|
|
131
|
+
name: ${name}
|
|
132
|
+
description: A new skill for agents
|
|
133
|
+
version: "0.1.0"
|
|
134
|
+
compatibility:
|
|
135
|
+
- universal
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
# ${name}
|
|
139
|
+
|
|
140
|
+
Instructions for the agent go here.
|
|
141
|
+
|
|
142
|
+
## Overview
|
|
143
|
+
|
|
144
|
+
Describe what this skill does.
|
|
145
|
+
|
|
146
|
+
## Usage
|
|
147
|
+
|
|
148
|
+
Explain how to use this skill.
|
|
149
|
+
`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Copy a directory recursively.
|
|
153
|
+
*/
|
|
154
|
+
function copyDirectory(src, dest) {
|
|
155
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
156
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
157
|
+
for (const entry of entries) {
|
|
158
|
+
const srcPath = path.join(src, entry.name);
|
|
159
|
+
const destPath = path.join(dest, entry.name);
|
|
160
|
+
if (entry.isDirectory()) {
|
|
161
|
+
// Skip .git directory
|
|
162
|
+
if (entry.name === '.git')
|
|
163
|
+
continue;
|
|
164
|
+
copyDirectory(srcPath, destPath);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
fs.copyFileSync(srcPath, destPath);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Remove an installed skill.
|
|
173
|
+
*/
|
|
174
|
+
export function removeSkill(name, registry) {
|
|
175
|
+
const skill = registry.get(name);
|
|
176
|
+
if (!skill) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
// Remove from filesystem
|
|
180
|
+
if (fs.existsSync(skill.sourcePath)) {
|
|
181
|
+
fs.rmSync(skill.sourcePath, { recursive: true });
|
|
182
|
+
}
|
|
183
|
+
// Unregister
|
|
184
|
+
registry.unregister(name);
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel Skills Loader
|
|
3
|
+
*
|
|
4
|
+
* Bridge layer to load skills from the Vercel Skills ecosystem (skills.sh)
|
|
5
|
+
* and convert them to RevealUI's format.
|
|
6
|
+
*/
|
|
7
|
+
import type { SkillRegistry } from '../registry/index.js';
|
|
8
|
+
import type { Skill } from '../types.js';
|
|
9
|
+
import type { UpdateInfo } from './vercel-types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Options for loading from Vercel Skills ecosystem.
|
|
12
|
+
*/
|
|
13
|
+
export interface VercelLoadOptions {
|
|
14
|
+
/** Target directory for installation */
|
|
15
|
+
targetDir: string;
|
|
16
|
+
/** Scope: local (project) or global */
|
|
17
|
+
scope: 'local' | 'global';
|
|
18
|
+
/** Registry to register skill with */
|
|
19
|
+
registry: SkillRegistry;
|
|
20
|
+
/** Generate embedding for semantic search */
|
|
21
|
+
generateEmbedding?: boolean;
|
|
22
|
+
/** Force reinstall if already exists */
|
|
23
|
+
force?: boolean;
|
|
24
|
+
/** Specific ref/version to install */
|
|
25
|
+
ref?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load a skill from the Vercel Skills ecosystem.
|
|
29
|
+
*
|
|
30
|
+
* This function:
|
|
31
|
+
* 1. Executes `npx skills add <source>` to install the skill
|
|
32
|
+
* 2. Detects the installation location
|
|
33
|
+
* 3. Parses the installed SKILL.md
|
|
34
|
+
* 4. Registers with RevealUI's SkillRegistry
|
|
35
|
+
* 5. Optionally generates embeddings for semantic search
|
|
36
|
+
*
|
|
37
|
+
* @param source - Vercel skill source (e.g., "vercel-labs/agent-skills/react-best-practices")
|
|
38
|
+
* @param options - Load options
|
|
39
|
+
* @returns Fully loaded Skill object
|
|
40
|
+
*/
|
|
41
|
+
export declare function loadFromVercelSkills(source: string, options: VercelLoadOptions): Promise<Skill>;
|
|
42
|
+
/**
|
|
43
|
+
* Check for updates to an installed Vercel skill.
|
|
44
|
+
*
|
|
45
|
+
* @param skillName - Name of the installed skill
|
|
46
|
+
* @param registry - Skill registry
|
|
47
|
+
* @returns Update information
|
|
48
|
+
*/
|
|
49
|
+
export declare function checkVercelSkillUpdates(skillName: string, registry: SkillRegistry): Promise<UpdateInfo>;
|
|
50
|
+
/**
|
|
51
|
+
* Update an installed Vercel skill to the latest version.
|
|
52
|
+
*
|
|
53
|
+
* @param skillName - Name of the skill to update
|
|
54
|
+
* @param registry - Skill registry
|
|
55
|
+
* @returns Updated skill object
|
|
56
|
+
*/
|
|
57
|
+
export declare function updateVercelSkill(skillName: string, registry: SkillRegistry): Promise<Skill>;
|
|
58
|
+
/**
|
|
59
|
+
* Check if npx skills CLI is available.
|
|
60
|
+
*
|
|
61
|
+
* @returns True if available, false otherwise
|
|
62
|
+
*/
|
|
63
|
+
export declare function isVercelCliAvailable(): Promise<boolean>;
|
|
64
|
+
//# sourceMappingURL=vercel-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel-loader.d.ts","sourceRoot":"","sources":["../../../src/skills/loader/vercel-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EACV,UAAU,EAIX,MAAM,mBAAmB,CAAA;AAK1B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;IAEjB,uCAAuC;IACvC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAA;IAEzB,sCAAsC;IACtC,QAAQ,EAAE,aAAa,CAAA;IAEvB,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAE3B,wCAAwC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,KAAK,CAAC,CA8EhB;AAsKD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,UAAU,CAAC,CAyCrB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,KAAK,CAAC,CAwBhB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO7D"}
|