@xopcai/xopc 0.0.29 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/telegram/src/adapters/config-surface.js +3 -1
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/onboard-cli.js +23 -21
- package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/setup-wizard.js +3 -4
- package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +0 -1
- package/dist/extensions/telegram/src/config-schema.js +17 -4
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/plugin.js +4 -17
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js +216 -0
- package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js.map +1 -0
- package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js → apps-page-CWegY6Kp.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js.map → apps-page-CWegY6Kp.js.map} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js +9 -0
- package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js +3 -0
- package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js +2 -0
- package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js.map +1 -0
- package/dist/gateway/static/root/assets/dist-D0jxbvuz.js +2 -0
- package/dist/gateway/static/root/assets/{dist--p2HQ2QF.js.map → dist-D0jxbvuz.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js → extension-debug-page-DB630cW8.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js.map → extension-debug-page-DB630cW8.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js → extension-page-CnoPUBul.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js.map → extension-page-CnoPUBul.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js → extension-settings-page-BsiOkvBe.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js.map → extension-settings-page-BsiOkvBe.js.map} +1 -1
- package/dist/gateway/static/root/assets/{index-CR8zUHGR.js → index-DHLmAIQl.js} +63 -63
- package/dist/gateway/static/root/assets/{index-CR8zUHGR.js.map → index-DHLmAIQl.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-DoPwy4aU.css +1 -0
- package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js +2 -0
- package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js.map +1 -0
- package/dist/gateway/static/root/assets/sessions-page-Q201-_lP.js +2 -0
- package/dist/gateway/static/root/assets/{sessions-page-Be5kIGl_.js.map → sessions-page-Q201-_lP.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js +2 -0
- package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js.map +1 -0
- package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js.map +1 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +5 -7
- package/dist/src/agent/agent-manager.js +21 -19
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +4 -2
- package/dist/src/agent/ipc/inbox.js.map +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +0 -2
- package/dist/src/agent/prompt/system-prompt.js +3 -17
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service/btw-query.d.ts +16 -0
- package/dist/src/agent/service/btw-query.js +88 -0
- package/dist/src/agent/service/btw-query.js.map +1 -0
- package/dist/src/agent/service/build-direct-message-content.d.ts +30 -0
- package/dist/src/agent/service/build-direct-message-content.js +75 -0
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -0
- package/dist/src/agent/service/parse-outbound-session-key.d.ts +8 -0
- package/dist/src/agent/service/parse-outbound-session-key.js +41 -0
- package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -0
- package/dist/src/agent/service/process-direct-one-shot.d.ts +34 -0
- package/dist/src/agent/service/process-direct-one-shot.js +67 -0
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +12 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +6 -0
- package/dist/src/agent/service/reconcile-dreaming-cron.js +70 -0
- package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -0
- package/dist/src/agent/service/session-context-report.d.ts +19 -0
- package/dist/src/agent/service/session-context-report.js +47 -0
- package/dist/src/agent/service/session-context-report.js.map +1 -0
- package/dist/src/agent/service/webchat-tts.d.ts +28 -0
- package/dist/src/agent/service/webchat-tts.js +73 -0
- package/dist/src/agent/service/webchat-tts.js.map +1 -0
- package/dist/src/agent/service.d.ts +8 -12
- package/dist/src/agent/service.js +74 -379
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/skills/config.js +4 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +0 -2
- package/dist/src/agent/skills/format-skills-prompt.js +3 -24
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-lock.js +4 -5
- package/dist/src/agent/skills/hub-lock.js.map +1 -1
- package/dist/src/agent/skills/index.js +9 -21
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapter.types.d.ts +17 -0
- package/dist/src/agent/skills/marketplace/adapter.types.js +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.d.ts +2 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +292 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.d.ts +73 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js +200 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.d.ts +137 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js +217 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.d.ts +12 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js +90 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.d.ts +2 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +35 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +124 -0
- package/dist/src/agent/skills/{skills-store-client.js → marketplace/adapters/store/store-api-client.js} +4 -3
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.d.ts +6 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.js +26 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -0
- package/dist/src/agent/skills/parse-skill-metadata.d.ts +5 -0
- package/dist/src/agent/skills/parse-skill-metadata.js +27 -0
- package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.d.ts +6 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +64 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +1 -0
- package/dist/src/agent/skills/skill-view-path.d.ts +17 -1
- package/dist/src/agent/skills/skill-view-path.js +66 -3
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/skills-marketplace.d.ts +21 -0
- package/dist/src/agent/skills/skills-marketplace.js +18 -0
- package/dist/src/agent/skills/skills-marketplace.js.map +1 -0
- package/dist/src/agent/skills/test-framework.d.ts +0 -1
- package/dist/src/agent/skills/test-framework.js +2 -20
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/skills/types.d.ts +12 -6
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +2 -2
- package/dist/src/auth/credentials.js +8 -6
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/profiles/store.js +5 -3
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/channels/manager.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +4 -4
- package/dist/src/channels/outbound/persist-store.js.map +1 -1
- package/dist/src/cli/commands/config.js +8 -6
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +3 -4
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/init.js +4 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/config/loader.js +3 -1
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.js +4 -5
- package/dist/src/config/models-json.js.map +1 -1
- package/dist/src/config/schema.d.ts +12 -4
- package/dist/src/config/schema.js +31 -5
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/cron/persistence.d.ts +1 -3
- package/dist/src/cron/persistence.js +6 -17
- package/dist/src/cron/persistence.js.map +1 -1
- package/dist/src/cron/validation.js +1 -1
- package/dist/src/cron/validation.js.map +1 -1
- package/dist/src/extensions/activation-context.js +0 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/lockfile.js +4 -2
- package/dist/src/extensions/lockfile.js.map +1 -1
- package/dist/src/gateway/auth.d.ts +0 -9
- package/dist/src/gateway/auth.js +1 -12
- package/dist/src/gateway/auth.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +4 -4
- package/dist/src/gateway/hono/lib/extension-store.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +5 -3
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +28 -3
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +23 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +124 -2
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +9 -2
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/index.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +37 -0
- package/dist/src/gateway/service/run-gateway-agent.js +163 -0
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -0
- package/dist/src/gateway/service/save-webchat-user-message.d.ts +9 -0
- package/dist/src/gateway/service/save-webchat-user-message.js +34 -0
- package/dist/src/gateway/service/save-webchat-user-message.js.map +1 -0
- package/dist/src/gateway/service/session-chat-ids.d.ts +9 -0
- package/dist/src/gateway/service/session-chat-ids.js +33 -0
- package/dist/src/gateway/service/session-chat-ids.js.map +1 -0
- package/dist/src/gateway/service/sse-hub.d.ts +10 -0
- package/dist/src/gateway/service/sse-hub.js +55 -0
- package/dist/src/gateway/service/sse-hub.js.map +1 -0
- package/dist/src/gateway/service/types.d.ts +9 -0
- package/dist/src/gateway/service/types.js +1 -0
- package/dist/src/gateway/service.d.ts +42 -33
- package/dist/src/gateway/service.js +92 -246
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/infra/update-lock.js +4 -2
- package/dist/src/infra/update-lock.js.map +1 -1
- package/dist/src/infra/update-startup.js +5 -14
- package/dist/src/infra/update-startup.js.map +1 -1
- package/dist/src/infra/write-file-atomic.d.ts +18 -0
- package/dist/src/infra/write-file-atomic.js +115 -0
- package/dist/src/infra/write-file-atomic.js.map +1 -0
- package/dist/src/session/abort-cutoff.d.ts +6 -0
- package/dist/src/session/abort-cutoff.js +10 -0
- package/dist/src/session/abort-cutoff.js.map +1 -0
- package/dist/src/session/compaction-checkpoints.d.ts +8 -0
- package/dist/src/session/compaction-checkpoints.js +21 -0
- package/dist/src/session/compaction-checkpoints.js.map +1 -0
- package/dist/src/session/config-store.js +4 -2
- package/dist/src/session/config-store.js.map +1 -1
- package/dist/src/session/index.d.ts +8 -1
- package/dist/src/session/index.js +7 -1
- package/dist/src/session/manager.d.ts +26 -1
- package/dist/src/session/manager.js +39 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/patch-metadata.d.ts +12 -0
- package/dist/src/session/patch-metadata.js +23 -0
- package/dist/src/session/patch-metadata.js.map +1 -0
- package/dist/src/session/search-index.d.ts +2 -0
- package/dist/src/session/search-index.js +30 -2
- package/dist/src/session/search-index.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +32 -0
- package/dist/src/session/session-context-for-llm.js +60 -0
- package/dist/src/session/session-context-for-llm.js.map +1 -0
- package/dist/src/session/store.d.ts +53 -2
- package/dist/src/session/store.js +427 -145
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/strip-webchat-early-save.d.ts +5 -0
- package/dist/src/session/strip-webchat-early-save.js +17 -0
- package/dist/src/session/strip-webchat-early-save.js.map +1 -0
- package/dist/src/session/transcript-format.d.ts +46 -0
- package/dist/src/session/transcript-format.js +88 -0
- package/dist/src/session/transcript-format.js.map +1 -0
- package/dist/src/session/types.d.ts +37 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/utils/logger/log-store.js +4 -3
- package/dist/src/utils/logger/log-store.js.map +1 -1
- package/dist/src/voice/tts/merge-config.js +0 -1
- package/dist/src/voice/tts/merge-config.js.map +1 -1
- package/dist/src/voice/tts/service.js +1 -2
- package/dist/src/voice/tts/service.js.map +1 -1
- package/package.json +1 -1
- package/skills/business/company-values/SKILL-zh.md +80 -0
- package/skills/business/company-values/SKILL.md +80 -0
- package/skills/business/find-community/SKILL-zh.md +50 -0
- package/skills/business/find-community/SKILL.md +50 -0
- package/skills/business/first-customers/SKILL-zh.md +76 -0
- package/skills/business/first-customers/SKILL.md +76 -0
- package/skills/business/grow-sustainably/SKILL-zh.md +92 -0
- package/skills/business/grow-sustainably/SKILL.md +92 -0
- package/skills/business/marketing-plan/SKILL-zh.md +100 -0
- package/skills/business/marketing-plan/SKILL.md +100 -0
- package/skills/business/minimalist-review/SKILL-zh.md +82 -0
- package/skills/business/minimalist-review/SKILL.md +82 -0
- package/skills/business/mvp/SKILL-zh.md +81 -0
- package/skills/business/mvp/SKILL.md +81 -0
- package/skills/business/pricing/SKILL-zh.md +64 -0
- package/skills/business/pricing/SKILL.md +64 -0
- package/skills/business/processize/SKILL-zh.md +91 -0
- package/skills/business/processize/SKILL.md +91 -0
- package/skills/business/validate-idea/SKILL-zh.md +68 -0
- package/skills/business/validate-idea/SKILL.md +68 -0
- package/skills/{skill-creator → creative/algorithmic-art}/LICENSE.txt +1 -1
- package/skills/creative/algorithmic-art/SKILL-zh.md +405 -0
- package/skills/creative/algorithmic-art/SKILL.md +405 -0
- package/skills/creative/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/creative/algorithmic-art/templates/viewer.html +599 -0
- package/skills/creative/canvas-design/LICENSE.txt +202 -0
- package/skills/creative/canvas-design/SKILL-zh.md +130 -0
- package/skills/creative/canvas-design/SKILL.md +130 -0
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/creative/frontend-design/LICENSE.txt +177 -0
- package/skills/creative/frontend-design/SKILL-zh.md +42 -0
- package/skills/creative/frontend-design/SKILL.md +42 -0
- package/skills/creative/theme-factory/LICENSE.txt +202 -0
- package/skills/creative/theme-factory/SKILL-zh.md +59 -0
- package/skills/creative/theme-factory/SKILL.md +59 -0
- package/skills/creative/theme-factory/theme-showcase.pdf +0 -0
- package/skills/creative/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/creative/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/creative/theme-factory/themes/desert-rose.md +19 -0
- package/skills/creative/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/creative/theme-factory/themes/golden-hour.md +19 -0
- package/skills/creative/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/creative/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/creative/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/creative/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/creative/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/creative/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +74 -0
- package/skills/creative/web-artifacts-builder/SKILL.md +74 -0
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +375 -0
- package/skills/documents/doc-coauthoring/SKILL.md +375 -0
- package/skills/documents/docx/SKILL-zh.md +590 -0
- package/skills/{docx → documents/docx}/SKILL.md +11 -11
- package/skills/{docx → documents/docx}/scripts/comment.py +2 -2
- package/skills/{docx → documents/docx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{docx → documents/docx}/scripts/office/pack.py +2 -2
- package/skills/{xlsx → documents/docx}/scripts/office/validate.py +2 -2
- package/skills/{xlsx → documents/docx}/scripts/office/validators/redlining.py +1 -1
- package/skills/documents/pdf/SKILL-zh.md +314 -0
- package/skills/documents/pptx/SKILL-zh.md +232 -0
- package/skills/{pptx → documents/pptx}/editing.md +3 -3
- package/skills/{pptx → documents/pptx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{xlsx → documents/pptx}/scripts/office/pack.py +2 -2
- package/skills/{pptx → documents/pptx}/scripts/office/validate.py +2 -2
- package/skills/{docx → documents/pptx}/scripts/office/validators/redlining.py +1 -1
- package/skills/documents/xlsx/SKILL-zh.md +292 -0
- package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{pptx → documents/xlsx}/scripts/office/pack.py +2 -2
- package/skills/{docx → documents/xlsx}/scripts/office/validate.py +2 -2
- package/skills/{pptx → documents/xlsx}/scripts/office/validators/redlining.py +1 -1
- package/skills/meta/skill-creator/LICENSE.txt +202 -0
- package/skills/meta/skill-creator/SKILL-zh.md +483 -0
- package/skills/{skill-creator → meta/skill-creator}/SKILL.md +0 -1
- package/skills/tools/find-skills/SKILL-zh.md +440 -0
- package/skills/tools/github/SKILL-zh.md +48 -0
- package/skills/tools/internal-comms/LICENSE.txt +202 -0
- package/skills/tools/internal-comms/SKILL-zh.md +32 -0
- package/skills/tools/internal-comms/SKILL.md +32 -0
- package/skills/tools/internal-comms/examples/3p-updates.md +47 -0
- package/skills/tools/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/tools/internal-comms/examples/faq-answers.md +30 -0
- package/skills/tools/internal-comms/examples/general-comms.md +16 -0
- package/skills/tools/summarize/SKILL-zh.md +47 -0
- package/skills/tools/weather/SKILL-zh.md +46 -0
- package/skills/tools/webapp-testing/LICENSE.txt +202 -0
- package/skills/tools/webapp-testing/SKILL-zh.md +96 -0
- package/skills/tools/webapp-testing/SKILL.md +96 -0
- package/skills/tools/webapp-testing/examples/console_logging.py +35 -0
- package/skills/tools/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/tools/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/tools/webapp-testing/scripts/with_server.py +106 -0
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js +0 -216
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js.map +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js +0 -9
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js +0 -3
- package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js.map +0 -1
- package/dist/gateway/static/root/assets/dist--p2HQ2QF.js +0 -2
- package/dist/gateway/static/root/assets/index-Dnfha4O2.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js.map +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js.map +0 -1
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js.map +0 -1
- package/dist/src/agent/skills/skills-store-client.d.ts +0 -66
- package/dist/src/agent/skills/skills-store-client.js.map +0 -1
- package/dist/src/stt/index.d.ts +0 -1
- package/dist/src/stt/index.js +0 -8
- /package/skills/{docx → documents/docx}/LICENSE.txt +0 -0
- /package/skills/{docx → documents/docx}/scripts/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/accept_changes.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/helpers/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/soffice.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/unpack.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/base.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/comments.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsExtended.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsExtensible.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsIds.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/people.xml +0 -0
- /package/skills/{pdf → documents/pdf}/LICENSE.txt +0 -0
- /package/skills/{pdf → documents/pdf}/SKILL.md +0 -0
- /package/skills/{pdf → documents/pdf}/forms.md +0 -0
- /package/skills/{pdf → documents/pdf}/reference.md +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/check_bounding_boxes.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/check_fillable_fields.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/convert_pdf_to_images.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/create_validation_image.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/extract_form_field_info.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/extract_form_structure.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/fill_fillable_fields.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/fill_pdf_form_with_annotations.py +0 -0
- /package/skills/{pptx → documents/pptx}/LICENSE.txt +0 -0
- /package/skills/{pptx → documents/pptx}/SKILL.md +0 -0
- /package/skills/{pptx → documents/pptx}/pptxgenjs.md +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/add_slide.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/clean.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/helpers/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/soffice.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/unpack.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/base.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/thumbnail.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/LICENSE.txt +0 -0
- /package/skills/{xlsx → documents/xlsx}/SKILL.md +0 -0
- /package/skills/{skill-creator/scripts → documents/xlsx/scripts/office/helpers}/__init__.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/soffice.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/unpack.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/base.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/recalc.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/analyzer.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/comparator.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/grader.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/assets/eval_review.html +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/generate_review.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/viewer.html +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/references/schemas.md +0 -0
- /package/skills/{xlsx/scripts/office/helpers → meta/skill-creator/scripts}/__init__.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/aggregate_benchmark.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/generate_report.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/improve_description.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/package_skill.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/quick_validate.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/run_eval.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/run_loop.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/utils.py +0 -0
- /package/skills/{find-skills → tools/find-skills}/SKILL.md +0 -0
- /package/skills/{github → tools/github}/SKILL.md +0 -0
- /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
- /package/skills/{weather → tools/weather}/SKILL.md +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-skills-prompt.js","names":[],"sources":["../../../../src/agent/skills/format-skills-prompt.ts"],"sourcesContent":["/**\n * Build `<available_skills>` XML block for the system prompt.\n */\n\nimport { isSkillEnabled } from './config.js';\nimport { skillVisibleForRegisteredTools } from './skill-tool-gating.js';\nimport type { Skill } from './types.js';\nimport type { SkillsConfig } from './types.js';\n\nexport interface FormatSkillsForPromptOptions {\n skillAllowlist?: string[];\n /** When set (including empty array), applies tool gating from skill frontmatter. */\n registeredToolNames?: string[];\n}\n\nexport function selectSkillsVisibleInPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): Skill[] {\n let list = skills;\n\n if (options?.skillAllowlist?.length) {\n const allow = new Set(options.skillAllowlist.map((s) => s.toLowerCase()));\n list = list.filter((s) => allow.has(s.name.toLowerCase()));\n } else if (options?.skillAllowlist?.length === 0) {\n return [];\n }\n\n list = list.filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig));\n\n if (skillsConfig?.toolGating !== false && options?.registeredToolNames !== undefined) {\n const at = new Set(options.registeredToolNames);\n list = list.filter((s) => skillVisibleForRegisteredTools(s, at));\n }\n\n return list;\n}\n\
|
|
1
|
+
{"version":3,"file":"format-skills-prompt.js","names":[],"sources":["../../../../src/agent/skills/format-skills-prompt.ts"],"sourcesContent":["/**\n * Build `<available_skills>` XML block for the system prompt.\n */\n\nimport { isSkillEnabled } from './config.js';\nimport { skillVisibleForRegisteredTools } from './skill-tool-gating.js';\nimport type { Skill } from './types.js';\nimport type { SkillsConfig } from './types.js';\n\nexport interface FormatSkillsForPromptOptions {\n skillAllowlist?: string[];\n /** When set (including empty array), applies tool gating from skill frontmatter. */\n registeredToolNames?: string[];\n}\n\nexport function selectSkillsVisibleInPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): Skill[] {\n let list = skills;\n\n if (options?.skillAllowlist?.length) {\n const allow = new Set(options.skillAllowlist.map((s) => s.toLowerCase()));\n list = list.filter((s) => allow.has(s.name.toLowerCase()));\n } else if (options?.skillAllowlist?.length === 0) {\n return [];\n }\n\n list = list.filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig));\n\n if (skillsConfig?.toolGating !== false && options?.registeredToolNames !== undefined) {\n const at = new Set(options.registeredToolNames);\n list = list.filter((s) => skillVisibleForRegisteredTools(s, at));\n }\n\n return list;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction formatSkillXmlMetadataOnly(skill: Skill): string {\n const emoji = skill.metadata.emoji || '';\n const emojiStr = emoji ? `${emoji} ` : '';\n\n return [\n ' <skill>',\n ` <name>${escapeXml(skill.name)}</name>`,\n ` <description>${emojiStr}${escapeXml(skill.description)}</description>`,\n ' </skill>',\n ].join('\\n');\n}\n\nexport function formatSkillsForPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): string {\n const visibleSkills = selectSkillsVisibleInPrompt(skills, skillsConfig, options);\n if (visibleSkills.length === 0) return '';\n\n const lines = [\n '\\n\\n<available_skills>',\n 'Skills are folders of instructions, scripts, and resources.',\n 'Use skills_list to browse; use skill_view(name) for SKILL.md or skill_view(name, path) for references/, templates/, scripts/, or assets/.',\n '',\n ];\n\n for (const skill of visibleSkills) {\n lines.push(formatSkillXmlMetadataOnly(skill));\n }\n\n lines.push('</available_skills>');\n return lines.join('\\n');\n}\n"],"mappings":";;;;;;AAeA,SAAgB,4BACd,QACA,cACA,SACS;CACT,IAAI,OAAO;AAEX,KAAI,SAAS,gBAAgB,QAAQ;EACnC,MAAM,QAAQ,IAAI,IAAI,QAAQ,eAAe,KAAK,MAAM,EAAE,aAAa,CAAC,CAAC;AACzE,SAAO,KAAK,QAAQ,MAAM,MAAM,IAAI,EAAE,KAAK,aAAa,CAAC,CAAC;YACjD,SAAS,gBAAgB,WAAW,EAC7C,QAAO,EAAE;AAGX,QAAO,KAAK,QAAQ,MAAM,CAAC,EAAE,0BAA0B,eAAe,GAAG,aAAa,CAAC;AAEvF,KAAI,cAAc,eAAe,SAAS,SAAS,wBAAwB,KAAA,GAAW;EACpF,MAAM,KAAK,IAAI,IAAI,QAAQ,oBAAoB;AAC/C,SAAO,KAAK,QAAQ,MAAM,+BAA+B,GAAG,GAAG,CAAC;;AAGlE,QAAO;;AAGT,SAAS,UAAU,KAAqB;AACtC,QAAO,IACJ,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,SAAS;;AAG5B,SAAS,2BAA2B,OAAsB;CACxD,MAAM,QAAQ,MAAM,SAAS,SAAS;CACtC,MAAM,WAAW,QAAQ,GAAG,MAAM,KAAK;AAEvC,QAAO;EACL;EACA,aAAa,UAAU,MAAM,KAAK,CAAC;EACnC,oBAAoB,WAAW,UAAU,MAAM,YAAY,CAAC;EAC5D;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,sBACd,QACA,cACA,SACQ;CACR,MAAM,gBAAgB,4BAA4B,QAAQ,cAAc,QAAQ;AAChF,KAAI,cAAc,WAAW,EAAG,QAAO;CAEvC,MAAM,QAAQ;EACZ;EACA;EACA;EACA;EACD;AAED,MAAK,MAAM,SAAS,cAClB,OAAM,KAAK,2BAA2B,MAAM,CAAC;AAG/C,OAAM,KAAK,sBAAsB;AACjC,QAAO,MAAM,KAAK,KAAK"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
|
|
2
|
-
import {
|
|
3
|
-
import { existsSync,
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
4
|
//#region src/agent/skills/hub-lock.ts
|
|
5
5
|
/**
|
|
6
6
|
* Skills hub lock (~/.xopc/skills-lock.json): records install source + tree hash per managed skill id.
|
|
7
7
|
*/
|
|
8
8
|
init_paths();
|
|
9
|
+
init_write_file_atomic();
|
|
9
10
|
function emptyLock() {
|
|
10
11
|
return {
|
|
11
12
|
version: 1,
|
|
@@ -28,9 +29,7 @@ function loadSkillsLock() {
|
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
function saveSkillsLock(lock) {
|
|
31
|
-
|
|
32
|
-
mkdirSync(dirname(p), { recursive: true });
|
|
33
|
-
writeFileSync(p, `${JSON.stringify(lock, null, 2)}\n`, "utf-8");
|
|
32
|
+
writeTextAtomicSync(resolveSkillsLockPath(), `${JSON.stringify(lock, null, 2)}\n`);
|
|
34
33
|
}
|
|
35
34
|
/** Record or replace hub metadata for a managed skill directory id (folder name under ~/.xopc/skills). */
|
|
36
35
|
function recordSkillsHubInstall(skillId, meta, contentHash) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-lock.js","names":[],"sources":["../../../../src/agent/skills/hub-lock.ts"],"sourcesContent":["/**\n * Skills hub lock (~/.xopc/skills-lock.json): records install source + tree hash per managed skill id.\n */\n\nimport { existsSync,
|
|
1
|
+
{"version":3,"file":"hub-lock.js","names":[],"sources":["../../../../src/agent/skills/hub-lock.ts"],"sourcesContent":["/**\n * Skills hub lock (~/.xopc/skills-lock.json): records install source + tree hash per managed skill id.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\n\nimport { resolveSkillsLockPath } from '../../config/paths.js';\nimport { writeTextAtomicSync } from '../../infra/write-file-atomic.js';\n\nexport type SkillHubKind = 'git' | 'archive';\n\nexport interface SkillHubLockEntry {\n kind: SkillHubKind;\n /** Clone URL, tarball URL, or file path (as given at install time). */\n source: string;\n /** Git branch / tag / ref (optional). */\n ref?: string;\n /** Path inside the cloned repo (POSIX, no leading slash). */\n subpath?: string;\n /** Deterministic tree hash from {@link computeSkillTreeHash}. */\n contentHash: string;\n installedAt: string;\n updatedAt: string;\n}\n\nexport interface SkillsLockFile {\n version: 1;\n entries: Record<string, SkillHubLockEntry>;\n}\n\nfunction emptyLock(): SkillsLockFile {\n return { version: 1, entries: {} };\n}\n\nexport function loadSkillsLock(): SkillsLockFile {\n const p = resolveSkillsLockPath();\n if (!existsSync(p)) return emptyLock();\n try {\n const raw = readFileSync(p, 'utf-8');\n const j = JSON.parse(raw) as Partial<SkillsLockFile>;\n if (j.version !== 1 || !j.entries || typeof j.entries !== 'object') {\n return emptyLock();\n }\n return { version: 1, entries: { ...j.entries } };\n } catch {\n return emptyLock();\n }\n}\n\nexport function saveSkillsLock(lock: SkillsLockFile): void {\n const p = resolveSkillsLockPath();\n writeTextAtomicSync(p, `${JSON.stringify(lock, null, 2)}\\n`);\n}\n\n/** Record or replace hub metadata for a managed skill directory id (folder name under ~/.xopc/skills). */\nexport function recordSkillsHubInstall(\n skillId: string,\n meta: Pick<SkillHubLockEntry, 'kind' | 'source' | 'ref' | 'subpath'>,\n contentHash: string,\n): void {\n const lock = loadSkillsLock();\n const now = new Date().toISOString();\n const prev = lock.entries[skillId];\n lock.entries[skillId] = {\n kind: meta.kind,\n source: meta.source,\n ref: meta.ref,\n subpath: meta.subpath,\n contentHash,\n installedAt: prev?.installedAt ?? now,\n updatedAt: now,\n };\n saveSkillsLock(lock);\n}\n\nexport function removeSkillsLockEntry(skillId: string): void {\n const lock = loadSkillsLock();\n if (!lock.entries[skillId]) return;\n delete lock.entries[skillId];\n saveSkillsLock(lock);\n}\n\nexport function getSkillsLockEntry(skillId: string): SkillHubLockEntry | undefined {\n return loadSkillsLock().entries[skillId];\n}\n"],"mappings":";;;;;;;YAM8D;wBACS;AAuBvE,SAAS,YAA4B;AACnC,QAAO;EAAE,SAAS;EAAG,SAAS,EAAE;EAAE;;AAGpC,SAAgB,iBAAiC;CAC/C,MAAM,IAAI,uBAAuB;AACjC,KAAI,CAAC,WAAW,EAAE,CAAE,QAAO,WAAW;AACtC,KAAI;EACF,MAAM,MAAM,aAAa,GAAG,QAAQ;EACpC,MAAM,IAAI,KAAK,MAAM,IAAI;AACzB,MAAI,EAAE,YAAY,KAAK,CAAC,EAAE,WAAW,OAAO,EAAE,YAAY,SACxD,QAAO,WAAW;AAEpB,SAAO;GAAE,SAAS;GAAG,SAAS,EAAE,GAAG,EAAE,SAAS;GAAE;SAC1C;AACN,SAAO,WAAW;;;AAItB,SAAgB,eAAe,MAA4B;AAEzD,qBADU,uBACW,EAAE,GAAG,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC,IAAI;;;AAI9D,SAAgB,uBACd,SACA,MACA,aACM;CACN,MAAM,OAAO,gBAAgB;CAC7B,MAAM,uBAAM,IAAI,MAAM,EAAC,aAAa;CACpC,MAAM,OAAO,KAAK,QAAQ;AAC1B,MAAK,QAAQ,WAAW;EACtB,MAAM,KAAK;EACX,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,SAAS,KAAK;EACd;EACA,aAAa,MAAM,eAAe;EAClC,WAAW;EACZ;AACD,gBAAe,KAAK;;AAGtB,SAAgB,sBAAsB,SAAuB;CAC3D,MAAM,OAAO,gBAAgB;AAC7B,KAAI,CAAC,KAAK,QAAQ,SAAU;AAC5B,QAAO,KAAK,QAAQ;AACpB,gBAAe,KAAK;;AAGtB,SAAgB,mBAAmB,SAAgD;AACjF,QAAO,gBAAgB,CAAC,QAAQ"}
|
|
@@ -8,6 +8,7 @@ import { applySkillEnvOverrides, createSkillConfigManager, getSkillEnvironment,
|
|
|
8
8
|
import { parseSkillToolConditions } from "./skill-tool-gating.js";
|
|
9
9
|
import { formatSkillsForPrompt } from "./format-skills-prompt.js";
|
|
10
10
|
import { parseRequiredEnvVarNames } from "./required-env-vars.js";
|
|
11
|
+
import { parseSkillMetadata } from "./parse-skill-metadata.js";
|
|
11
12
|
import { SkillManager } from "./skill-manager.js";
|
|
12
13
|
import { collectSkillInstallWarnings, formatScanSummary, scanSkillDirectory } from "./scanner.js";
|
|
13
14
|
import { createSkillWatcher, createWatcherFromLoader } from "./watcher.js";
|
|
@@ -88,7 +89,7 @@ function discoverSkills(dir, source) {
|
|
|
88
89
|
for (const rule of subRules) subIgnoredPaths.add(`${skillRelPath}${rule}`);
|
|
89
90
|
}
|
|
90
91
|
if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {
|
|
91
|
-
const skill = loadSkillFromFile(skillMdPath, source);
|
|
92
|
+
const skill = loadSkillFromFile(skillMdPath, source, dir);
|
|
92
93
|
if (skill) skills.push(skill);
|
|
93
94
|
}
|
|
94
95
|
scan(fullPath, subIgnoredPaths);
|
|
@@ -99,26 +100,7 @@ function discoverSkills(dir, source) {
|
|
|
99
100
|
scan(dir, loadIgnoreRules(dir, dir));
|
|
100
101
|
return skills;
|
|
101
102
|
}
|
|
102
|
-
function
|
|
103
|
-
const xopcMeta = frontmatter.metadata?.xopc;
|
|
104
|
-
const metadata = {
|
|
105
|
-
name: frontmatter.name || "",
|
|
106
|
-
description: frontmatter.description || "",
|
|
107
|
-
emoji: xopcMeta?.emoji || frontmatter.emoji || void 0,
|
|
108
|
-
homepage: frontmatter.homepage || void 0,
|
|
109
|
-
os: xopcMeta?.os || frontmatter.os || void 0,
|
|
110
|
-
requires: xopcMeta?.requires || frontmatter.requires || void 0,
|
|
111
|
-
install: xopcMeta?.install || frontmatter.install || void 0
|
|
112
|
-
};
|
|
113
|
-
if (xopcMeta) metadata.xopc = {
|
|
114
|
-
emoji: xopcMeta.emoji || void 0,
|
|
115
|
-
requires: xopcMeta.requires || void 0,
|
|
116
|
-
install: xopcMeta.install || void 0,
|
|
117
|
-
os: xopcMeta.os || void 0
|
|
118
|
-
};
|
|
119
|
-
return metadata;
|
|
120
|
-
}
|
|
121
|
-
function loadSkillFromFile(filePath, source) {
|
|
103
|
+
function loadSkillFromFile(filePath, source, rootDir) {
|
|
122
104
|
try {
|
|
123
105
|
const { frontmatter, content } = parseFrontmatter(readFileSync(filePath, "utf-8"));
|
|
124
106
|
const skillDir = dirname(filePath);
|
|
@@ -126,12 +108,18 @@ function loadSkillFromFile(filePath, source) {
|
|
|
126
108
|
const name = frontmatter.name || parentDirName;
|
|
127
109
|
const description = frontmatter.description;
|
|
128
110
|
if (!description?.trim()) return null;
|
|
111
|
+
let category;
|
|
112
|
+
if (rootDir) {
|
|
113
|
+
const segments = toPosixPath(relative(rootDir, skillDir)).split("/");
|
|
114
|
+
if (segments.length > 1) category = segments[0];
|
|
115
|
+
}
|
|
129
116
|
const metadata = parseSkillMetadata(frontmatter);
|
|
130
117
|
const toolConditions = parseSkillToolConditions(frontmatter);
|
|
131
118
|
const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);
|
|
132
119
|
return {
|
|
133
120
|
name,
|
|
134
121
|
description: description.trim(),
|
|
122
|
+
category,
|
|
135
123
|
filePath,
|
|
136
124
|
baseDir: skillDir,
|
|
137
125
|
source,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/skills/index.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'fs';\nimport { basename, dirname, join, relative, sep } from 'path';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt } from './format-skills-prompt.js';\nimport { parseRequiredEnvVarNames } from './required-env-vars.js';\nimport { parseSkillToolConditions } from './skill-tool-gating.js';\nimport type {\n Skill,\n SkillMetadata,\n SkillDiagnostic,\n LoadSkillsResult,\n SkillConfig,\n SkillInstallSpec,\n SkillRequires,\n SkillsConfig,\n} from './types.js';\n\nconst log = createLogger('SkillLoader');\n\nconst IGNORE_FILES = ['.gitignore', '.ignore', '.fdignore'];\n\nfunction toPosixPath(p: string): string {\n return p.split(sep).join('/');\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('#') && !trimmed.startsWith('\\\\#')) return null;\n\n let pattern = line;\n let negated = false;\n\n if (pattern.startsWith('!')) {\n negated = true;\n pattern = pattern.slice(1);\n } else if (pattern.startsWith('\\\\!')) {\n pattern = pattern.slice(1);\n }\n\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n const prefixed = prefix ? `${prefix}${pattern}` : pattern;\n return negated ? `!${prefixed}` : prefixed;\n}\n\nfunction loadIgnoreRules(dir: string, rootDir: string): Set<string> {\n const ignoredPaths = new Set<string>();\n const relativeDir = relative(rootDir, dir);\n const prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : '';\n\n for (const filename of IGNORE_FILES) {\n const ignorePath = join(dir, filename);\n if (!existsSync(ignorePath)) continue;\n\n try {\n const content = readFileSync(ignorePath, 'utf-8');\n for (const line of content.split(/\\r?\\n/)) {\n const pattern = prefixIgnorePattern(line, prefix);\n if (pattern) {\n const fullPattern = pattern.startsWith('!')\n ? `!${prefix}${pattern.slice(1)}`\n : `${prefix}${pattern}`;\n ignoredPaths.add(fullPattern);\n }\n }\n } catch {}\n }\n\n return ignoredPaths;\n}\n\nfunction shouldIgnore(path: string, ignoredPaths: Set<string>): boolean {\n for (const pattern of ignoredPaths) {\n if (pattern.startsWith('!')) {\n const positive = pattern.slice(1);\n if (path === positive || path.startsWith(`${positive}/`)) {\n return false;\n }\n } else {\n if (path === pattern || path.startsWith(`${pattern}/`)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction discoverSkills(dir: string, source: 'builtin' | 'workspace' | 'global'): Skill[] {\n const skills: Skill[] = [];\n if (!existsSync(dir)) return skills;\n\n function scan(currentDir: string, currentIgnoredPaths: Set<string>) {\n try {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;\n\n const fullPath = join(currentDir, entry.name);\n const relPath = toPosixPath(relative(dir, fullPath));\n\n if (shouldIgnore(relPath, currentIgnoredPaths)) continue;\n\n if (entry.isDirectory()) {\n const skillMdPath = join(fullPath, 'SKILL.md');\n const skillRelPath = `${relPath}/`;\n\n const subIgnoredPaths = new Set(currentIgnoredPaths);\n const subIgnoreFile = join(fullPath, '.gitignore');\n if (existsSync(subIgnoreFile)) {\n const subRules = loadIgnoreRules(fullPath, dir);\n for (const rule of subRules) {\n subIgnoredPaths.add(`${skillRelPath}${rule}`);\n }\n }\n\n if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {\n const skill = loadSkillFromFile(skillMdPath, source);\n if (skill) skills.push(skill);\n }\n\n scan(fullPath, subIgnoredPaths);\n }\n }\n } catch {}\n }\n\n scan(dir, loadIgnoreRules(dir, dir));\n return skills;\n}\n\nfunction parseSkillMetadata(frontmatter: Record<string, unknown>): SkillMetadata {\n // Only support metadata.xopc nested structure\n const meta = frontmatter.metadata as Record<string, unknown> | undefined;\n const xopcMeta = meta?.xopc as Record<string, unknown> | undefined;\n \n const metadata: SkillMetadata = {\n name: frontmatter.name as string || '',\n description: frontmatter.description as string || '',\n emoji: xopcMeta?.emoji as string || frontmatter.emoji as string || undefined,\n homepage: frontmatter.homepage as string || undefined,\n os: xopcMeta?.os as Array<'darwin' | 'linux' | 'win32'> || frontmatter.os as Array<'darwin' | 'linux' | 'win32'> || undefined,\n requires: xopcMeta?.requires as SkillRequires || frontmatter.requires as SkillRequires || undefined,\n install: xopcMeta?.install as SkillInstallSpec[] || frontmatter.install as SkillInstallSpec[] || undefined,\n };\n\n // Store xopc metadata for reference\n if (xopcMeta) {\n metadata.xopc = {\n emoji: xopcMeta.emoji as string || undefined,\n requires: xopcMeta.requires as SkillRequires || undefined,\n install: xopcMeta.install as SkillInstallSpec[] || undefined,\n os: xopcMeta.os as Array<'darwin' | 'linux' | 'win32'> || undefined,\n };\n }\n\n return metadata;\n}\n\nfunction loadSkillFromFile(filePath: string, source: 'builtin' | 'workspace' | 'global'): Skill | null {\n try {\n const rawContent = readFileSync(filePath, 'utf-8');\n const { frontmatter, content } = parseFrontmatter(rawContent);\n const skillDir = dirname(filePath);\n const parentDirName = basename(skillDir);\n\n const name = (frontmatter.name as string | undefined) || parentDirName;\n const description = frontmatter.description as string | undefined;\n if (!description?.trim()) return null;\n\n const metadata = parseSkillMetadata(frontmatter);\n const toolConditions = parseSkillToolConditions(frontmatter);\n const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);\n\n return {\n name,\n description: description.trim(),\n filePath,\n baseDir: skillDir,\n source,\n disableModelInvocation: frontmatter['disable-model-invocation'] === true,\n metadata,\n toolConditions,\n requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : undefined,\n content,\n };\n } catch {\n return null;\n }\n}\n\nexport function loadSkills(options: {\n workspaceDir?: string;\n globalDir?: string;\n builtinDir?: string;\n extraDirs?: string[];\n}): LoadSkillsResult {\n const { workspaceDir, builtinDir, extraDirs = [] } = options;\n\n const skillMap = new Map<string, Skill>();\n const diagnostics: SkillDiagnostic[] = [];\n\n if (builtinDir) {\n for (const skill of discoverSkills(builtinDir, 'builtin')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n\n const globalDirs = [\n options.globalDir,\n join(resolveStateDir(), 'skills'),\n ].filter((d): d is string => !!d && existsSync(d));\n\n for (const dir of globalDirs) {\n for (const skill of discoverSkills(dir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n // Global must win over bundled when names match (Workspace > Global > Bundled).\n skillMap.set(skill.name, skill);\n }\n }\n\n if (workspaceDir) {\n const workspaceSkills = discoverSkills(join(workspaceDir, 'skills'), 'workspace');\n for (const skill of workspaceSkills) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n skillMap.set(skill.name, skill);\n }\n }\n\n // Scan extra directories\n for (const extraDir of extraDirs) {\n if (existsSync(extraDir)) {\n for (const skill of discoverSkills(extraDir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n }\n\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const merged = Array.from(skillMap.values());\n\n return {\n skills: merged,\n prompt: formatSkillsForPrompt(merged, skillsConfig),\n diagnostics,\n };\n}\n\nexport interface SkillLoader {\n init: (workspace: string, builtin: string | null) => LoadSkillsResult;\n load: () => LoadSkillsResult;\n reload: () => LoadSkillsResult;\n /** Recompute `<available_skills>` from disk-loaded skills and current ~/.xopc/skills.json (no filesystem rescan). */\n refreshPromptFromConfig: () => void;\n getSkills: () => Skill[];\n getPrompt: () => string;\n getDiagnostics: () => SkillDiagnostic[];\n getLastLoadTime: () => number;\n getSkillByName: (name: string) => Skill | undefined;\n getEnabledSkills: (config?: Record<string, SkillConfig>) => Skill[];\n}\n\nexport function createSkillLoader(): SkillLoader {\n let cachedSkills: Skill[] = [];\n let cachedPrompt: string = '';\n let cachedDiagnostics: SkillDiagnostic[] = [];\n let lastLoadTime = 0;\n let workspaceDir: string | undefined;\n let builtinDir: string | undefined;\n let extraDirs: string[] = [];\n\n function updateCache(result: LoadSkillsResult): LoadSkillsResult {\n cachedSkills = result.skills;\n cachedPrompt = result.prompt;\n cachedDiagnostics = result.diagnostics;\n lastLoadTime = Date.now();\n return result;\n }\n\n return {\n init: (workspace: string, builtin: string | null) => {\n workspaceDir = workspace;\n builtinDir = builtin || undefined;\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n load: () => {\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n reload: () => {\n log.info('Reloading skills');\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n\n refreshPromptFromConfig: () => {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n cachedPrompt = formatSkillsForPrompt(cachedSkills, skillsConfig);\n lastLoadTime = Date.now();\n },\n\n getSkills: () => cachedSkills,\n getPrompt: () => cachedPrompt,\n getDiagnostics: () => cachedDiagnostics,\n getLastLoadTime: () => lastLoadTime,\n \n getSkillByName: (name: string) => {\n return cachedSkills.find(s => s.name === name);\n },\n \n getEnabledSkills: (entries?: Record<string, SkillConfig>) => {\n const skillsConfig: SkillsConfig =\n entries !== undefined ? { entries } : createSkillConfigManager(resolveStateDir()).load();\n return cachedSkills.filter(\n (skill) => !skill.disableModelInvocation && isSkillEnabled(skill, skillsConfig),\n );\n },\n };\n}\n\n// Export SkillManager\nexport { SkillManager, type SkillDiagnostic, type SkillLoadResult } from './skill-manager.js';\n\n// Re-export types for convenience\nexport type { \n Skill, \n SkillMetadata, \n SkillConfig,\n SkillInstallSpec,\n SkillInstallResult,\n SkillInstallRequest,\n LoadSkillsResult,\n // Note: SkillDiagnostic is re-exported from skill-manager.ts above\n SkillSnapshot,\n} from './types.js';\n\n// Re-export installer\nexport { \n installSkill, \n findInstallSpec,\n hasBinary,\n getDefaultInstallerPreferences,\n type InstallerPreferences,\n type InstallContext,\n} from './installer.js';\n\n// Re-export scanner\nexport {\n scanSkillDirectory,\n formatScanSummary,\n collectSkillInstallWarnings,\n type ScanSummary,\n type SecurityFinding,\n type Severity,\n} from './scanner.js';\n\n// Re-export config manager\nexport {\n resolveSkillConfig,\n applySkillEnvOverrides,\n getSkillEnvironment,\n createSkillConfigManager,\n isSkillEnabled,\n validateSkillConfig,\n type SkillConfigFile,\n} from './config.js';\n\n// Re-export watcher\nexport {\n createSkillWatcher,\n createWatcherFromLoader,\n type SkillWatcher,\n type SkillWatcherOptions,\n} from './watcher.js';\n\n// Re-export test framework\nexport {\n SkillTestFramework,\n SkillTestRunner,\n formatTestResults,\n formatTestResultsJson,\n formatTestResultsTap,\n type TestResult,\n type TestStatus,\n type SkillTestReport,\n type TestOptions,\n type TestRunnerOptions,\n} from './test-framework.js';\n"],"mappings":";;;;;;;;;;;;;;;;;YAGwD;aACH;gBA8X7B;AA9WxB,MAAM,MAAM,aAAa,cAAc;AAEvC,MAAM,eAAe;CAAC;CAAc;CAAW;CAAY;AAE3D,SAAS,YAAY,GAAmB;AACtC,QAAO,EAAE,MAAM,IAAI,CAAC,KAAK,IAAI;;AAG/B,SAAS,oBAAoB,MAAc,QAA+B;CACxE,MAAM,UAAU,KAAK,MAAM;AAC3B,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI,QAAQ,WAAW,IAAI,IAAI,CAAC,QAAQ,WAAW,MAAM,CAAE,QAAO;CAElE,IAAI,UAAU;CACd,IAAI,UAAU;AAEd,KAAI,QAAQ,WAAW,IAAI,EAAE;AAC3B,YAAU;AACV,YAAU,QAAQ,MAAM,EAAE;YACjB,QAAQ,WAAW,MAAM,CAClC,WAAU,QAAQ,MAAM,EAAE;AAG5B,KAAI,QAAQ,WAAW,IAAI,CACzB,WAAU,QAAQ,MAAM,EAAE;CAG5B,MAAM,WAAW,SAAS,GAAG,SAAS,YAAY;AAClD,QAAO,UAAU,IAAI,aAAa;;AAGpC,SAAS,gBAAgB,KAAa,SAA8B;CAClE,MAAM,+BAAe,IAAI,KAAa;CACtC,MAAM,cAAc,SAAS,SAAS,IAAI;CAC1C,MAAM,SAAS,cAAc,GAAG,YAAY,YAAY,CAAC,KAAK;AAE9D,MAAK,MAAM,YAAY,cAAc;EACnC,MAAM,aAAa,KAAK,KAAK,SAAS;AACtC,MAAI,CAAC,WAAW,WAAW,CAAE;AAE7B,MAAI;GACF,MAAM,UAAU,aAAa,YAAY,QAAQ;AACjD,QAAK,MAAM,QAAQ,QAAQ,MAAM,QAAQ,EAAE;IACzC,MAAM,UAAU,oBAAoB,MAAM,OAAO;AACjD,QAAI,SAAS;KACX,MAAM,cAAc,QAAQ,WAAW,IAAI,GACvC,IAAI,SAAS,QAAQ,MAAM,EAAE,KAC7B,GAAG,SAAS;AAChB,kBAAa,IAAI,YAAY;;;UAG3B;;AAGV,QAAO;;AAGT,SAAS,aAAa,MAAc,cAAoC;AACtE,MAAK,MAAM,WAAW,aACpB,KAAI,QAAQ,WAAW,IAAI,EAAE;EAC3B,MAAM,WAAW,QAAQ,MAAM,EAAE;AACjC,MAAI,SAAS,YAAY,KAAK,WAAW,GAAG,SAAS,GAAG,CACtD,QAAO;YAGL,SAAS,WAAW,KAAK,WAAW,GAAG,QAAQ,GAAG,CACpD,QAAO;AAIb,QAAO;;AAGT,SAAS,eAAe,KAAa,QAAqD;CACxF,MAAM,SAAkB,EAAE;AAC1B,KAAI,CAAC,WAAW,IAAI,CAAE,QAAO;CAE7B,SAAS,KAAK,YAAoB,qBAAkC;AAClE,MAAI;GACF,MAAM,UAAU,YAAY,YAAY,EAAE,eAAe,MAAM,CAAC;AAEhE,QAAK,MAAM,SAAS,SAAS;AAC3B,QAAI,MAAM,KAAK,WAAW,IAAI,IAAI,MAAM,SAAS,eAAgB;IAEjE,MAAM,WAAW,KAAK,YAAY,MAAM,KAAK;IAC7C,MAAM,UAAU,YAAY,SAAS,KAAK,SAAS,CAAC;AAEpD,QAAI,aAAa,SAAS,oBAAoB,CAAE;AAEhD,QAAI,MAAM,aAAa,EAAE;KACvB,MAAM,cAAc,KAAK,UAAU,WAAW;KAC9C,MAAM,eAAe,GAAG,QAAQ;KAEhC,MAAM,kBAAkB,IAAI,IAAI,oBAAoB;AAEpD,SAAI,WADkB,KAAK,UAAU,aACT,CAAC,EAAE;MAC7B,MAAM,WAAW,gBAAgB,UAAU,IAAI;AAC/C,WAAK,MAAM,QAAQ,SACjB,iBAAgB,IAAI,GAAG,eAAe,OAAO;;AAIjD,SAAI,WAAW,YAAY,IAAI,CAAC,aAAa,cAAc,oBAAoB,EAAE;MAC/E,MAAM,QAAQ,kBAAkB,aAAa,OAAO;AACpD,UAAI,MAAO,QAAO,KAAK,MAAM;;AAG/B,UAAK,UAAU,gBAAgB;;;UAG7B;;AAGV,MAAK,KAAK,gBAAgB,KAAK,IAAI,CAAC;AACpC,QAAO;;AAGT,SAAS,mBAAmB,aAAqD;CAG/E,MAAM,WADO,YAAY,UACF;CAEvB,MAAM,WAA0B;EAC9B,MAAM,YAAY,QAAkB;EACpC,aAAa,YAAY,eAAyB;EAClD,OAAO,UAAU,SAAmB,YAAY,SAAmB,KAAA;EACnE,UAAU,YAAY,YAAsB,KAAA;EAC5C,IAAI,UAAU,MAA6C,YAAY,MAA6C,KAAA;EACpH,UAAU,UAAU,YAA6B,YAAY,YAA6B,KAAA;EAC1F,SAAS,UAAU,WAAiC,YAAY,WAAiC,KAAA;EAClG;AAGD,KAAI,SACF,UAAS,OAAO;EACd,OAAO,SAAS,SAAmB,KAAA;EACnC,UAAU,SAAS,YAA6B,KAAA;EAChD,SAAS,SAAS,WAAiC,KAAA;EACnD,IAAI,SAAS,MAA6C,KAAA;EAC3D;AAGH,QAAO;;AAGT,SAAS,kBAAkB,UAAkB,QAA0D;AACrG,KAAI;EAEF,MAAM,EAAE,aAAa,YAAY,iBADd,aAAa,UAAU,QACkB,CAAC;EAC7D,MAAM,WAAW,QAAQ,SAAS;EAClC,MAAM,gBAAgB,SAAS,SAAS;EAExC,MAAM,OAAQ,YAAY,QAA+B;EACzD,MAAM,cAAc,YAAY;AAChC,MAAI,CAAC,aAAa,MAAM,CAAE,QAAO;EAEjC,MAAM,WAAW,mBAAmB,YAAY;EAChD,MAAM,iBAAiB,yBAAyB,YAAY;EAC5D,MAAM,sBAAsB,yBAAyB,YAAY;AAEjE,SAAO;GACL;GACA,aAAa,YAAY,MAAM;GAC/B;GACA,SAAS;GACT;GACA,wBAAwB,YAAY,gCAAgC;GACpE;GACA;GACA,qBAAqB,oBAAoB,SAAS,IAAI,sBAAsB,KAAA;GAC5E;GACD;SACK;AACN,SAAO;;;AAIX,SAAgB,WAAW,SAKN;CACnB,MAAM,EAAE,cAAc,YAAY,YAAY,EAAE,KAAK;CAErD,MAAM,2BAAW,IAAI,KAAoB;CACzC,MAAM,cAAiC,EAAE;AAEzC,KAAI,WACF,MAAK,MAAM,SAAS,eAAe,YAAY,UAAU,EAAE;EACzD,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,MAAI,SACF,aAAY,KAAK;GACf,MAAM;GACN,WAAW,MAAM;GACjB,SAAS,UAAU,MAAM,KAAK,eAAe,SAAS,OAAO,aAAa,MAAM;GAChF,MAAM,MAAM;GACb,CAAC;MAEF,UAAS,IAAI,MAAM,MAAM,MAAM;;CAKrC,MAAM,aAAa,CACjB,QAAQ,WACR,KAAK,iBAAiB,EAAE,SAAS,CAClC,CAAC,QAAQ,MAAmB,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;AAElD,MAAK,MAAM,OAAO,WAChB,MAAK,MAAM,SAAS,eAAe,KAAK,SAAS,EAAE;EACjD,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,MAAI,SACF,aAAY,KAAK;GACf,MAAM;GACN,WAAW,MAAM;GACjB,SAAS,UAAU,MAAM,KAAK,eAAe,MAAM,OAAO,aAAa,SAAS;GAChF,MAAM,MAAM;GACb,CAAC;AAGJ,WAAS,IAAI,MAAM,MAAM,MAAM;;AAInC,KAAI,cAAc;EAChB,MAAM,kBAAkB,eAAe,KAAK,cAAc,SAAS,EAAE,YAAY;AACjF,OAAK,MAAM,SAAS,iBAAiB;GACnC,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,OAAI,SACF,aAAY,KAAK;IACf,MAAM;IACN,WAAW,MAAM;IACjB,SAAS,UAAU,MAAM,KAAK,eAAe,MAAM,OAAO,aAAa,SAAS;IAChF,MAAM,MAAM;IACb,CAAC;AAEJ,YAAS,IAAI,MAAM,MAAM,MAAM;;;AAKnC,MAAK,MAAM,YAAY,UACrB,KAAI,WAAW,SAAS,CACtB,MAAK,MAAM,SAAS,eAAe,UAAU,SAAS,EAAE;EACtD,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,MAAI,SACF,aAAY,KAAK;GACf,MAAM;GACN,WAAW,MAAM;GACjB,SAAS,UAAU,MAAM,KAAK,eAAe,SAAS,OAAO,aAAa,MAAM;GAChF,MAAM,MAAM;GACb,CAAC;MAEF,UAAS,IAAI,MAAM,MAAM,MAAM;;CAMvC,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;CACvE,MAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,CAAC;AAE5C,QAAO;EACL,QAAQ;EACR,QAAQ,sBAAsB,QAAQ,aAAa;EACnD;EACD;;AAiBH,SAAgB,oBAAiC;CAC/C,IAAI,eAAwB,EAAE;CAC9B,IAAI,eAAuB;CAC3B,IAAI,oBAAuC,EAAE;CAC7C,IAAI,eAAe;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI,YAAsB,EAAE;CAE5B,SAAS,YAAY,QAA4C;AAC/D,iBAAe,OAAO;AACtB,iBAAe,OAAO;AACtB,sBAAoB,OAAO;AAC3B,iBAAe,KAAK,KAAK;AACzB,SAAO;;AAGT,QAAO;EACL,OAAO,WAAmB,YAA2B;AACnD,kBAAe;AACf,gBAAa,WAAW,KAAA;AACxB,UAAO,YAAY,WAAW;IAAE;IAAc;IAAY;IAAW,CAAC,CAAC;;EAGzE,YAAY;AACV,UAAO,YAAY,WAAW;IAAE;IAAc;IAAY;IAAW,CAAC,CAAC;;EAGzE,cAAc;AACZ,OAAI,KAAK,mBAAmB;AAC5B,UAAO,YAAY,WAAW;IAAE;IAAc;IAAY;IAAW,CAAC,CAAC;;EAGzE,+BAA+B;GAC7B,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AACvE,kBAAe,sBAAsB,cAAc,aAAa;AAChE,kBAAe,KAAK,KAAK;;EAG3B,iBAAiB;EACjB,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EAEvB,iBAAiB,SAAiB;AAChC,UAAO,aAAa,MAAK,MAAK,EAAE,SAAS,KAAK;;EAGhD,mBAAmB,YAA0C;GAC3D,MAAM,eACJ,YAAY,KAAA,IAAY,EAAE,SAAS,GAAG,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AAC1F,UAAO,aAAa,QACjB,UAAU,CAAC,MAAM,0BAA0B,eAAe,OAAO,aAAa,CAChF;;EAEJ"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/skills/index.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'fs';\nimport { basename, dirname, join, relative, sep } from 'path';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt } from './format-skills-prompt.js';\nimport { parseRequiredEnvVarNames } from './required-env-vars.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { parseSkillToolConditions } from './skill-tool-gating.js';\nimport type {\n Skill,\n SkillMetadata,\n SkillDiagnostic,\n LoadSkillsResult,\n SkillConfig,\n SkillInstallSpec,\n SkillsConfig,\n} from './types.js';\n\nconst log = createLogger('SkillLoader');\n\nconst IGNORE_FILES = ['.gitignore', '.ignore', '.fdignore'];\n\nfunction toPosixPath(p: string): string {\n return p.split(sep).join('/');\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('#') && !trimmed.startsWith('\\\\#')) return null;\n\n let pattern = line;\n let negated = false;\n\n if (pattern.startsWith('!')) {\n negated = true;\n pattern = pattern.slice(1);\n } else if (pattern.startsWith('\\\\!')) {\n pattern = pattern.slice(1);\n }\n\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n const prefixed = prefix ? `${prefix}${pattern}` : pattern;\n return negated ? `!${prefixed}` : prefixed;\n}\n\nfunction loadIgnoreRules(dir: string, rootDir: string): Set<string> {\n const ignoredPaths = new Set<string>();\n const relativeDir = relative(rootDir, dir);\n const prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : '';\n\n for (const filename of IGNORE_FILES) {\n const ignorePath = join(dir, filename);\n if (!existsSync(ignorePath)) continue;\n\n try {\n const content = readFileSync(ignorePath, 'utf-8');\n for (const line of content.split(/\\r?\\n/)) {\n const pattern = prefixIgnorePattern(line, prefix);\n if (pattern) {\n const fullPattern = pattern.startsWith('!')\n ? `!${prefix}${pattern.slice(1)}`\n : `${prefix}${pattern}`;\n ignoredPaths.add(fullPattern);\n }\n }\n } catch {}\n }\n\n return ignoredPaths;\n}\n\nfunction shouldIgnore(path: string, ignoredPaths: Set<string>): boolean {\n for (const pattern of ignoredPaths) {\n if (pattern.startsWith('!')) {\n const positive = pattern.slice(1);\n if (path === positive || path.startsWith(`${positive}/`)) {\n return false;\n }\n } else {\n if (path === pattern || path.startsWith(`${pattern}/`)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction discoverSkills(dir: string, source: 'builtin' | 'workspace' | 'global'): Skill[] {\n const skills: Skill[] = [];\n if (!existsSync(dir)) return skills;\n\n function scan(currentDir: string, currentIgnoredPaths: Set<string>) {\n try {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;\n\n const fullPath = join(currentDir, entry.name);\n const relPath = toPosixPath(relative(dir, fullPath));\n\n if (shouldIgnore(relPath, currentIgnoredPaths)) continue;\n\n if (entry.isDirectory()) {\n const skillMdPath = join(fullPath, 'SKILL.md');\n const skillRelPath = `${relPath}/`;\n\n const subIgnoredPaths = new Set(currentIgnoredPaths);\n const subIgnoreFile = join(fullPath, '.gitignore');\n if (existsSync(subIgnoreFile)) {\n const subRules = loadIgnoreRules(fullPath, dir);\n for (const rule of subRules) {\n subIgnoredPaths.add(`${skillRelPath}${rule}`);\n }\n }\n\n if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {\n const skill = loadSkillFromFile(skillMdPath, source, dir);\n if (skill) skills.push(skill);\n }\n\n scan(fullPath, subIgnoredPaths);\n }\n }\n } catch {}\n }\n\n scan(dir, loadIgnoreRules(dir, dir));\n return skills;\n}\n\nfunction loadSkillFromFile(filePath: string, source: 'builtin' | 'workspace' | 'global', rootDir?: string): Skill | null {\n try {\n const rawContent = readFileSync(filePath, 'utf-8');\n const { frontmatter, content } = parseFrontmatter(rawContent);\n const skillDir = dirname(filePath);\n const parentDirName = basename(skillDir);\n\n const name = (frontmatter.name as string | undefined) || parentDirName;\n const description = frontmatter.description as string | undefined;\n if (!description?.trim()) return null;\n\n // Derive category from directory path: skills/creative/algorithmic-art → 'creative'\n // Only assign a category when the skill is nested at least two levels below rootDir.\n let category: string | undefined;\n if (rootDir) {\n const relDir = toPosixPath(relative(rootDir, skillDir));\n const segments = relDir.split('/');\n if (segments.length > 1) {\n category = segments[0];\n }\n }\n\n const metadata = parseSkillMetadata(frontmatter);\n const toolConditions = parseSkillToolConditions(frontmatter);\n const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);\n\n return {\n name,\n description: description.trim(),\n category,\n filePath,\n baseDir: skillDir,\n source,\n disableModelInvocation: frontmatter['disable-model-invocation'] === true,\n metadata,\n toolConditions,\n requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : undefined,\n content,\n };\n } catch {\n return null;\n }\n}\n\nexport function loadSkills(options: {\n workspaceDir?: string;\n globalDir?: string;\n builtinDir?: string;\n extraDirs?: string[];\n}): LoadSkillsResult {\n const { workspaceDir, builtinDir, extraDirs = [] } = options;\n\n const skillMap = new Map<string, Skill>();\n const diagnostics: SkillDiagnostic[] = [];\n\n if (builtinDir) {\n for (const skill of discoverSkills(builtinDir, 'builtin')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n\n const globalDirs = [\n options.globalDir,\n join(resolveStateDir(), 'skills'),\n ].filter((d): d is string => !!d && existsSync(d));\n\n for (const dir of globalDirs) {\n for (const skill of discoverSkills(dir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n // Global must win over bundled when names match (Workspace > Global > Bundled).\n skillMap.set(skill.name, skill);\n }\n }\n\n if (workspaceDir) {\n const workspaceSkills = discoverSkills(join(workspaceDir, 'skills'), 'workspace');\n for (const skill of workspaceSkills) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n skillMap.set(skill.name, skill);\n }\n }\n\n // Scan extra directories\n for (const extraDir of extraDirs) {\n if (existsSync(extraDir)) {\n for (const skill of discoverSkills(extraDir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n }\n\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const merged = Array.from(skillMap.values());\n\n return {\n skills: merged,\n prompt: formatSkillsForPrompt(merged, skillsConfig),\n diagnostics,\n };\n}\n\nexport interface SkillLoader {\n init: (workspace: string, builtin: string | null) => LoadSkillsResult;\n load: () => LoadSkillsResult;\n reload: () => LoadSkillsResult;\n /** Recompute `<available_skills>` from disk-loaded skills and current ~/.xopc/skills.json (no filesystem rescan). */\n refreshPromptFromConfig: () => void;\n getSkills: () => Skill[];\n getPrompt: () => string;\n getDiagnostics: () => SkillDiagnostic[];\n getLastLoadTime: () => number;\n getSkillByName: (name: string) => Skill | undefined;\n getEnabledSkills: (config?: Record<string, SkillConfig>) => Skill[];\n}\n\nexport function createSkillLoader(): SkillLoader {\n let cachedSkills: Skill[] = [];\n let cachedPrompt: string = '';\n let cachedDiagnostics: SkillDiagnostic[] = [];\n let lastLoadTime = 0;\n let workspaceDir: string | undefined;\n let builtinDir: string | undefined;\n let extraDirs: string[] = [];\n\n function updateCache(result: LoadSkillsResult): LoadSkillsResult {\n cachedSkills = result.skills;\n cachedPrompt = result.prompt;\n cachedDiagnostics = result.diagnostics;\n lastLoadTime = Date.now();\n return result;\n }\n\n return {\n init: (workspace: string, builtin: string | null) => {\n workspaceDir = workspace;\n builtinDir = builtin || undefined;\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n load: () => {\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n reload: () => {\n log.info('Reloading skills');\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n\n refreshPromptFromConfig: () => {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n cachedPrompt = formatSkillsForPrompt(cachedSkills, skillsConfig);\n lastLoadTime = Date.now();\n },\n\n getSkills: () => cachedSkills,\n getPrompt: () => cachedPrompt,\n getDiagnostics: () => cachedDiagnostics,\n getLastLoadTime: () => lastLoadTime,\n \n getSkillByName: (name: string) => {\n return cachedSkills.find(s => s.name === name);\n },\n \n getEnabledSkills: (entries?: Record<string, SkillConfig>) => {\n const skillsConfig: SkillsConfig =\n entries !== undefined ? { entries } : createSkillConfigManager(resolveStateDir()).load();\n return cachedSkills.filter(\n (skill) => !skill.disableModelInvocation && isSkillEnabled(skill, skillsConfig),\n );\n },\n };\n}\n\n// Export SkillManager\nexport { SkillManager, type SkillDiagnostic, type SkillLoadResult } from './skill-manager.js';\n\n// Re-export types for convenience\nexport type { \n Skill, \n SkillMetadata, \n SkillConfig,\n SkillInstallSpec,\n SkillInstallResult,\n SkillInstallRequest,\n LoadSkillsResult,\n // Note: SkillDiagnostic is re-exported from skill-manager.ts above\n SkillSnapshot,\n} from './types.js';\n\n// Re-export installer\nexport { \n installSkill, \n findInstallSpec,\n hasBinary,\n getDefaultInstallerPreferences,\n type InstallerPreferences,\n type InstallContext,\n} from './installer.js';\n\n// Re-export scanner\nexport {\n scanSkillDirectory,\n formatScanSummary,\n collectSkillInstallWarnings,\n type ScanSummary,\n type SecurityFinding,\n type Severity,\n} from './scanner.js';\n\n// Re-export config manager\nexport {\n resolveSkillConfig,\n applySkillEnvOverrides,\n getSkillEnvironment,\n createSkillConfigManager,\n isSkillEnabled,\n validateSkillConfig,\n type SkillConfigFile,\n} from './config.js';\n\n// Re-export watcher\nexport {\n createSkillWatcher,\n createWatcherFromLoader,\n type SkillWatcher,\n type SkillWatcherOptions,\n} from './watcher.js';\n\n// Re-export test framework\nexport {\n SkillTestFramework,\n SkillTestRunner,\n formatTestResults,\n formatTestResultsJson,\n formatTestResultsTap,\n type TestResult,\n type TestStatus,\n type SkillTestReport,\n type TestOptions,\n type TestRunnerOptions,\n} from './test-framework.js';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Config } from '../../../config/schema.js';
|
|
2
|
+
import type { MarketplaceCategoryOption, SkillsStoreListParams, UnifiedMarketplaceListResponse, UnifiedMarketplacePackageDetail } from './adapters/store/store-api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Pluggable skills marketplace (catalog + install). Implementations: xopc Store, SkillHub.
|
|
5
|
+
*/
|
|
6
|
+
export interface SkillsMarketplaceAdapter {
|
|
7
|
+
readonly id: 'store' | 'skillhub';
|
|
8
|
+
/** Filter chips for the current provider (may be empty). */
|
|
9
|
+
listCategories(config: Config): Promise<MarketplaceCategoryOption[]>;
|
|
10
|
+
listPackages(config: Config, params: SkillsStoreListParams): Promise<UnifiedMarketplaceListResponse>;
|
|
11
|
+
getPackageDetail(config: Config, packageName: string): Promise<UnifiedMarketplacePackageDetail>;
|
|
12
|
+
downloadPackage(config: Config, packageName: string, version?: string): Promise<{
|
|
13
|
+
buffer: Buffer;
|
|
14
|
+
skillId: string;
|
|
15
|
+
version: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { isValidSkillId } from "../../../managed-store.js";
|
|
2
|
+
import { buildSkillMarkdownPreviewFromRaw } from "../../../skill-markdown-preview-from-raw.js";
|
|
3
|
+
import { curatedSkillsToPackageItems, downloadSkillHubZipFromEcosystem, resolveSkillHubEcosystemUrls, searchSkillHubLightmake } from "./ecosystem-client.js";
|
|
4
|
+
import { downloadSkillHubZipBuffer, getSkillHubSkill, getSkillHubSkillFileText, getSkillHubSkillFiles, pickSkillHubDocFilePath, searchSkillHubSkills } from "./registry-client.js";
|
|
5
|
+
import { cachedBatchGetSkillHubSkills, cachedFetchSkillHubCuratedIndex, cachedGetDefaultSkillSlugs, cachedListSkillHubRegistryCategories } from "./skillhub-fetch-cache.js";
|
|
6
|
+
import { basename } from "node:path";
|
|
7
|
+
//#region src/agent/skills/marketplace/adapters/skillhub/adapter.ts
|
|
8
|
+
/** Batch size for POST /api/v1/skills/batch (slug lists from default discovery). */
|
|
9
|
+
const REGISTRY_SKILL_BATCH_CHUNK = 80;
|
|
10
|
+
function humanizeRegistryCategoryKey(slug) {
|
|
11
|
+
return slug.replace(/_/g, "-").split("-").filter(Boolean).map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(" ");
|
|
12
|
+
}
|
|
13
|
+
function sourceLabelFromSkillSource(source) {
|
|
14
|
+
const s = source?.trim();
|
|
15
|
+
if (!s) return void 0;
|
|
16
|
+
const lower = s.toLowerCase();
|
|
17
|
+
if (lower === "clawhub") return "ClawHub";
|
|
18
|
+
if (lower === "lightmake") return "Lightmake";
|
|
19
|
+
if (lower === "skillhub") return "SkillHub";
|
|
20
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
21
|
+
}
|
|
22
|
+
function filterByCategory(rows, category) {
|
|
23
|
+
const want = category?.trim();
|
|
24
|
+
if (!want) return rows;
|
|
25
|
+
return rows.filter((r) => (r.categories ?? []).includes(want));
|
|
26
|
+
}
|
|
27
|
+
async function collectRegistryCategoryKeysFromSlugs(slugs) {
|
|
28
|
+
const used = /* @__PURE__ */ new Set();
|
|
29
|
+
for (let i = 0; i < slugs.length; i += REGISTRY_SKILL_BATCH_CHUNK) {
|
|
30
|
+
const details = await cachedBatchGetSkillHubSkills(slugs.slice(i, i + REGISTRY_SKILL_BATCH_CHUNK));
|
|
31
|
+
for (const d of details) {
|
|
32
|
+
const k = d.skill.category?.trim();
|
|
33
|
+
if (k) used.add(k);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return used;
|
|
37
|
+
}
|
|
38
|
+
function isPipelineOnlyChangelog(text) {
|
|
39
|
+
if (!text?.trim()) return true;
|
|
40
|
+
return /^synced by skillhub pipeline\.?$/i.test(text.trim());
|
|
41
|
+
}
|
|
42
|
+
function skillHubFallbackReadmeMarkdown(detail) {
|
|
43
|
+
const s = detail.skill;
|
|
44
|
+
const title = s.displayName?.trim() || s.slug;
|
|
45
|
+
const zh = s.summary_zh?.trim();
|
|
46
|
+
const en = s.summary?.trim();
|
|
47
|
+
const body = zh && en && zh !== en ? `${zh}\n\n${en}` : zh || en || "_No description._";
|
|
48
|
+
return `## ${title}\n\n**${s.slug}** · v${detail.latestVersion.version}\n\n${body}`;
|
|
49
|
+
}
|
|
50
|
+
function convertSkillHubToPackageListItem(detail) {
|
|
51
|
+
const cat = detail.category?.trim();
|
|
52
|
+
return {
|
|
53
|
+
id: detail.slug,
|
|
54
|
+
name: detail.displayName?.trim() || detail.slug,
|
|
55
|
+
type: "skill",
|
|
56
|
+
description: detail.summary_zh || detail.summary,
|
|
57
|
+
downloads: detail.stats.downloads,
|
|
58
|
+
author: {
|
|
59
|
+
username: detail.source || "skillhub",
|
|
60
|
+
avatarUrl: null
|
|
61
|
+
},
|
|
62
|
+
latestVersion: detail.tags.latest || "1.0.0",
|
|
63
|
+
updatedAt: String(detail.updatedAt),
|
|
64
|
+
categories: cat ? [cat] : [],
|
|
65
|
+
stars: detail.stats.stars,
|
|
66
|
+
sourceLabel: sourceLabelFromSkillSource(detail.source)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const skillhubMarketplaceAdapter = {
|
|
70
|
+
id: "skillhub",
|
|
71
|
+
async listCategories(_config) {
|
|
72
|
+
const sortByLabel = (a, b) => a.label.localeCompare(b.label, "zh-Hans-CN", { sensitivity: "base" });
|
|
73
|
+
const ecoUrls = resolveSkillHubEcosystemUrls();
|
|
74
|
+
try {
|
|
75
|
+
const idx = await cachedFetchSkillHubCuratedIndex(ecoUrls);
|
|
76
|
+
if (idx.skills?.length) {
|
|
77
|
+
const map = /* @__PURE__ */ new Map();
|
|
78
|
+
for (const s of idx.skills) for (const raw of s.categories ?? []) {
|
|
79
|
+
const label = String(raw).trim();
|
|
80
|
+
if (label) map.set(label, {
|
|
81
|
+
id: label,
|
|
82
|
+
label
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return Array.from(map.values()).filter((c) => c.id.trim() && c.label.trim()).sort(sortByLabel);
|
|
86
|
+
}
|
|
87
|
+
} catch {}
|
|
88
|
+
try {
|
|
89
|
+
const [taxonomy, slugs] = await Promise.all([cachedListSkillHubRegistryCategories(), cachedGetDefaultSkillSlugs()]);
|
|
90
|
+
const usedKeys = await collectRegistryCategoryKeysFromSlugs(slugs);
|
|
91
|
+
const taxByKey = new Map(taxonomy.map((t) => [t.key, t]));
|
|
92
|
+
const options = [];
|
|
93
|
+
for (const key of usedKeys) {
|
|
94
|
+
const t = taxByKey.get(key);
|
|
95
|
+
const label = t?.name?.trim() || t?.nameEn?.trim() || humanizeRegistryCategoryKey(key).trim();
|
|
96
|
+
if (!label) continue;
|
|
97
|
+
options.push({
|
|
98
|
+
id: key,
|
|
99
|
+
label
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
options.sort((a, b) => {
|
|
103
|
+
const oa = taxByKey.get(a.id)?.sortOrder ?? 999;
|
|
104
|
+
const ob = taxByKey.get(b.id)?.sortOrder ?? 999;
|
|
105
|
+
if (oa !== ob) return oa - ob;
|
|
106
|
+
return sortByLabel(a, b);
|
|
107
|
+
});
|
|
108
|
+
return options;
|
|
109
|
+
} catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
async listPackages(_config, params) {
|
|
114
|
+
const pageSize = params.pageSize ?? 20;
|
|
115
|
+
const page = params.page ?? 1;
|
|
116
|
+
const ecoUrls = resolveSkillHubEcosystemUrls();
|
|
117
|
+
if (params.q?.trim()) {
|
|
118
|
+
const q = params.q.trim();
|
|
119
|
+
let rows = [];
|
|
120
|
+
try {
|
|
121
|
+
rows = await searchSkillHubLightmake(ecoUrls, q, 100);
|
|
122
|
+
} catch {
|
|
123
|
+
rows = [];
|
|
124
|
+
}
|
|
125
|
+
if (rows.length === 0) rows = (await cachedBatchGetSkillHubSkills((await searchSkillHubSkills(q, 200)).slugs)).map((d) => convertSkillHubToPackageListItem(d.skill));
|
|
126
|
+
rows = filterByCategory(rows, params.category);
|
|
127
|
+
if (params.sort === "downloads") rows = [...rows].sort((a, b) => b.downloads - a.downloads);
|
|
128
|
+
else if (params.sort === "newest") rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
|
|
129
|
+
const total = rows.length;
|
|
130
|
+
const start = (page - 1) * pageSize;
|
|
131
|
+
return {
|
|
132
|
+
items: rows.slice(start, start + pageSize),
|
|
133
|
+
meta: {
|
|
134
|
+
page,
|
|
135
|
+
pageSize,
|
|
136
|
+
total,
|
|
137
|
+
totalPages: Math.max(1, Math.ceil(total / pageSize))
|
|
138
|
+
},
|
|
139
|
+
provider: "skillhub"
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
let skills = [...(await cachedFetchSkillHubCuratedIndex(ecoUrls)).skills].filter((s) => s.slug?.trim());
|
|
144
|
+
if (params.category?.trim()) {
|
|
145
|
+
const want = params.category.trim();
|
|
146
|
+
skills = skills.filter((s) => (s.categories ?? []).some((x) => String(x).trim() === want));
|
|
147
|
+
}
|
|
148
|
+
if (params.sort === "downloads") skills.sort((a, b) => (b.downloads ?? 0) - (a.downloads ?? 0));
|
|
149
|
+
else if (params.sort === "newest") skills.sort((a, b) => (a.rank ?? 999) - (b.rank ?? 999));
|
|
150
|
+
const rows = curatedSkillsToPackageItems(skills);
|
|
151
|
+
const total = rows.length;
|
|
152
|
+
const start = (page - 1) * pageSize;
|
|
153
|
+
return {
|
|
154
|
+
items: rows.slice(start, start + pageSize),
|
|
155
|
+
meta: {
|
|
156
|
+
page,
|
|
157
|
+
pageSize,
|
|
158
|
+
total,
|
|
159
|
+
totalPages: Math.max(1, Math.ceil(total / pageSize))
|
|
160
|
+
},
|
|
161
|
+
provider: "skillhub"
|
|
162
|
+
};
|
|
163
|
+
} catch {}
|
|
164
|
+
const slugs = await cachedGetDefaultSkillSlugs();
|
|
165
|
+
if (params.category?.trim()) {
|
|
166
|
+
let allItems = (await cachedBatchGetSkillHubSkills(slugs)).map((d) => convertSkillHubToPackageListItem(d.skill));
|
|
167
|
+
allItems = filterByCategory(allItems, params.category);
|
|
168
|
+
if (params.sort === "downloads") allItems = [...allItems].sort((a, b) => b.downloads - a.downloads);
|
|
169
|
+
else if (params.sort === "newest") allItems = [...allItems].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
|
|
170
|
+
const total = allItems.length;
|
|
171
|
+
const start = (page - 1) * pageSize;
|
|
172
|
+
return {
|
|
173
|
+
items: allItems.slice(start, start + pageSize),
|
|
174
|
+
meta: {
|
|
175
|
+
page,
|
|
176
|
+
pageSize,
|
|
177
|
+
total,
|
|
178
|
+
totalPages: Math.max(1, Math.ceil(total / pageSize))
|
|
179
|
+
},
|
|
180
|
+
provider: "skillhub"
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const total = slugs.length;
|
|
184
|
+
const start = (page - 1) * pageSize;
|
|
185
|
+
const paginatedSlugs = slugs.slice(start, start + pageSize);
|
|
186
|
+
const totalPages = Math.max(1, Math.ceil(total / pageSize));
|
|
187
|
+
return {
|
|
188
|
+
items: (await cachedBatchGetSkillHubSkills(paginatedSlugs)).map((d) => convertSkillHubToPackageListItem(d.skill)),
|
|
189
|
+
meta: {
|
|
190
|
+
page,
|
|
191
|
+
pageSize,
|
|
192
|
+
total,
|
|
193
|
+
totalPages
|
|
194
|
+
},
|
|
195
|
+
provider: "skillhub"
|
|
196
|
+
};
|
|
197
|
+
},
|
|
198
|
+
async getPackageDetail(_config, packageName) {
|
|
199
|
+
const detail = await getSkillHubSkill(packageName);
|
|
200
|
+
const slug = detail.skill.slug;
|
|
201
|
+
const version = detail.latestVersion.version;
|
|
202
|
+
const changelog = detail.latestVersion.changelog;
|
|
203
|
+
let readme = null;
|
|
204
|
+
let docPath = null;
|
|
205
|
+
try {
|
|
206
|
+
const { files } = await getSkillHubSkillFiles(slug, version);
|
|
207
|
+
docPath = pickSkillHubDocFilePath(files);
|
|
208
|
+
if (docPath) readme = await getSkillHubSkillFileText(slug, docPath, version);
|
|
209
|
+
} catch {
|
|
210
|
+
readme = null;
|
|
211
|
+
}
|
|
212
|
+
const trimmed = readme?.trim() ?? "";
|
|
213
|
+
const isSkillMd = (docPath ? basename(docPath.replace(/\\/g, "/")).toLowerCase() : "") === "skill.md";
|
|
214
|
+
let skillDocPreview;
|
|
215
|
+
if (!trimmed) readme = skillHubFallbackReadmeMarkdown(detail);
|
|
216
|
+
else if (isSkillMd) try {
|
|
217
|
+
skillDocPreview = buildSkillMarkdownPreviewFromRaw(trimmed, {
|
|
218
|
+
name: detail.skill.slug,
|
|
219
|
+
description: detail.skill.summary_zh || detail.skill.summary || ""
|
|
220
|
+
});
|
|
221
|
+
readme = skillDocPreview.bodyMarkdown;
|
|
222
|
+
if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) readme = `${readme}\n\n---\n\n## Changelog\n\n${changelog.trim()}`;
|
|
223
|
+
} catch {
|
|
224
|
+
readme = trimmed;
|
|
225
|
+
if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) readme = `${trimmed}\n\n---\n\n## Changelog\n\n${changelog.trim()}`;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
readme = trimmed;
|
|
229
|
+
if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) readme = `${trimmed}\n\n---\n\n## Changelog\n\n${changelog.trim()}`;
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
id: detail.skill.slug,
|
|
233
|
+
name: detail.skill.slug,
|
|
234
|
+
type: "skill",
|
|
235
|
+
description: detail.skill.summary_zh || detail.skill.summary,
|
|
236
|
+
readme,
|
|
237
|
+
skillDocPreview,
|
|
238
|
+
downloads: detail.skill.stats.downloads,
|
|
239
|
+
author: {
|
|
240
|
+
username: detail.owner.handle,
|
|
241
|
+
avatarUrl: detail.owner.image
|
|
242
|
+
},
|
|
243
|
+
latestVersion: {
|
|
244
|
+
version: detail.latestVersion.version,
|
|
245
|
+
changelog: detail.latestVersion.changelog,
|
|
246
|
+
publishedAt: String(detail.latestVersion.createdAt)
|
|
247
|
+
},
|
|
248
|
+
provider: "skillhub",
|
|
249
|
+
skillHubInfo: {
|
|
250
|
+
category: detail.skill.category,
|
|
251
|
+
installs: detail.skill.stats.installs,
|
|
252
|
+
stars: detail.skill.stats.stars,
|
|
253
|
+
securityReports: detail.latestVersion.securityReports
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
},
|
|
257
|
+
async downloadPackage(_config, packageName, version) {
|
|
258
|
+
const slug = packageName.trim();
|
|
259
|
+
if (version?.trim()) {
|
|
260
|
+
const { buffer, version: resolvedVersion } = await downloadSkillHubZipBuffer(slug, version);
|
|
261
|
+
return {
|
|
262
|
+
buffer,
|
|
263
|
+
skillId: isValidSkillId(slug) ? slug : "unknown",
|
|
264
|
+
version: resolvedVersion
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
const ecoUrls = resolveSkillHubEcosystemUrls();
|
|
268
|
+
try {
|
|
269
|
+
const buffer = await downloadSkillHubZipFromEcosystem(ecoUrls, slug);
|
|
270
|
+
let resolvedVersion = "1.0.0";
|
|
271
|
+
try {
|
|
272
|
+
resolvedVersion = (await getSkillHubSkillFiles(slug)).version;
|
|
273
|
+
} catch {}
|
|
274
|
+
return {
|
|
275
|
+
buffer,
|
|
276
|
+
skillId: isValidSkillId(slug) ? slug : "unknown",
|
|
277
|
+
version: resolvedVersion
|
|
278
|
+
};
|
|
279
|
+
} catch {
|
|
280
|
+
const { buffer, version: resolvedVersion } = await downloadSkillHubZipBuffer(slug);
|
|
281
|
+
return {
|
|
282
|
+
buffer,
|
|
283
|
+
skillId: isValidSkillId(slug) ? slug : "unknown",
|
|
284
|
+
version: resolvedVersion
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
//#endregion
|
|
290
|
+
export { skillhubMarketplaceAdapter };
|
|
291
|
+
|
|
292
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/skillhub/adapter.ts"],"sourcesContent":["import { basename } from 'node:path';\n\nimport { isValidSkillId } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\nimport { buildSkillMarkdownPreviewFromRaw } from '../../../skill-markdown-preview-from-raw.js';\nimport type { MarketplaceCategoryOption, MarketplacePackageListItem } from '../store/store-api-client.js';\nimport {\n curatedSkillsToPackageItems,\n downloadSkillHubZipFromEcosystem,\n resolveSkillHubEcosystemUrls,\n searchSkillHubLightmake,\n} from './ecosystem-client.js';\nimport {\n getSkillHubSkill,\n getSkillHubSkillFileText,\n getSkillHubSkillFiles,\n pickSkillHubDocFilePath,\n downloadSkillHubZipBuffer,\n searchSkillHubSkills,\n type SkillHubSkill,\n} from './registry-client.js';\nimport {\n cachedBatchGetSkillHubSkills,\n cachedFetchSkillHubCuratedIndex,\n cachedGetDefaultSkillSlugs,\n cachedListSkillHubRegistryCategories,\n} from './skillhub-fetch-cache.js';\n\nimport type { SkillsMarketplaceAdapter } from '../../adapter.types.js';\n\n/** Batch size for POST /api/v1/skills/batch (slug lists from default discovery). */\nconst REGISTRY_SKILL_BATCH_CHUNK = 80;\n\nfunction humanizeRegistryCategoryKey(slug: string): string {\n return slug\n .replace(/_/g, '-')\n .split('-')\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(' ');\n}\n\nfunction sourceLabelFromSkillSource(source: string | undefined): string | undefined {\n const s = source?.trim();\n if (!s) return undefined;\n const lower = s.toLowerCase();\n if (lower === 'clawhub') return 'ClawHub';\n if (lower === 'lightmake') return 'Lightmake';\n if (lower === 'skillhub') return 'SkillHub';\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction filterByCategory(\n rows: MarketplacePackageListItem[],\n category?: string,\n): MarketplacePackageListItem[] {\n const want = category?.trim();\n if (!want) return rows;\n return rows.filter((r) => (r.categories ?? []).includes(want));\n}\n\nasync function collectRegistryCategoryKeysFromSlugs(slugs: string[]): Promise<Set<string>> {\n const used = new Set<string>();\n for (let i = 0; i < slugs.length; i += REGISTRY_SKILL_BATCH_CHUNK) {\n const chunk = slugs.slice(i, i + REGISTRY_SKILL_BATCH_CHUNK);\n const details = await cachedBatchGetSkillHubSkills(chunk);\n for (const d of details) {\n const k = d.skill.category?.trim();\n if (k) used.add(k);\n }\n }\n return used;\n}\n\nfunction isPipelineOnlyChangelog(text: string | null | undefined): boolean {\n if (!text?.trim()) return true;\n return /^synced by skillhub pipeline\\.?$/i.test(text.trim());\n}\n\nfunction skillHubFallbackReadmeMarkdown(detail: {\n skill: SkillHubSkill;\n latestVersion: { version: string };\n}): string {\n const s = detail.skill;\n const title = s.displayName?.trim() || s.slug;\n const zh = s.summary_zh?.trim();\n const en = s.summary?.trim();\n const body =\n zh && en && zh !== en\n ? `${zh}\\n\\n${en}`\n : zh || en || '_No description._';\n return `## ${title}\\n\\n**${s.slug}** · v${detail.latestVersion.version}\\n\\n${body}`;\n}\n\nfunction convertSkillHubToPackageListItem(detail: SkillHubSkill): MarketplacePackageListItem {\n const cat = detail.category?.trim();\n return {\n id: detail.slug,\n name: detail.displayName?.trim() || detail.slug,\n type: 'skill',\n description: detail.summary_zh || detail.summary,\n downloads: detail.stats.downloads,\n author: {\n username: detail.source || 'skillhub',\n avatarUrl: null,\n },\n latestVersion: detail.tags.latest || '1.0.0',\n updatedAt: String(detail.updatedAt),\n categories: cat ? [cat] : [],\n stars: detail.stats.stars,\n sourceLabel: sourceLabelFromSkillSource(detail.source),\n };\n}\n\nexport const skillhubMarketplaceAdapter: SkillsMarketplaceAdapter = {\n id: 'skillhub',\n\n async listCategories(_config) {\n const sortByLabel = (a: MarketplaceCategoryOption, b: MarketplaceCategoryOption) =>\n a.label.localeCompare(b.label, 'zh-Hans-CN', { sensitivity: 'base' });\n\n const ecoUrls = resolveSkillHubEcosystemUrls();\n try {\n const idx = await cachedFetchSkillHubCuratedIndex(ecoUrls);\n if (idx.skills?.length) {\n const map = new Map<string, MarketplaceCategoryOption>();\n for (const s of idx.skills) {\n for (const raw of s.categories ?? []) {\n const label = String(raw).trim();\n if (label) map.set(label, { id: label, label });\n }\n }\n return Array.from(map.values())\n .filter((c) => c.id.trim() && c.label.trim())\n .sort(sortByLabel);\n }\n } catch {\n /* fall through: registry-backed catalog */\n }\n\n try {\n const [taxonomy, slugs] = await Promise.all([\n cachedListSkillHubRegistryCategories(),\n cachedGetDefaultSkillSlugs(),\n ]);\n const usedKeys = await collectRegistryCategoryKeysFromSlugs(slugs);\n const taxByKey = new Map(taxonomy.map((t) => [t.key, t] as const));\n const options: MarketplaceCategoryOption[] = [];\n for (const key of usedKeys) {\n const t = taxByKey.get(key);\n const label =\n t?.name?.trim() || t?.nameEn?.trim() || humanizeRegistryCategoryKey(key).trim();\n if (!label) continue;\n options.push({ id: key, label });\n }\n options.sort((a, b) => {\n const oa = taxByKey.get(a.id)?.sortOrder ?? 999;\n const ob = taxByKey.get(b.id)?.sortOrder ?? 999;\n if (oa !== ob) return oa - ob;\n return sortByLabel(a, b);\n });\n return options;\n } catch {\n return [];\n }\n },\n\n async listPackages(_config, params) {\n const pageSize = params.pageSize ?? 20;\n const page = params.page ?? 1;\n const ecoUrls = resolveSkillHubEcosystemUrls();\n\n if (params.q?.trim()) {\n const q = params.q.trim();\n let rows: MarketplacePackageListItem[] = [];\n try {\n const fromLightmake = await searchSkillHubLightmake(ecoUrls, q, 100);\n rows = fromLightmake as MarketplacePackageListItem[];\n } catch {\n rows = [];\n }\n if (rows.length === 0) {\n const searchResult = await searchSkillHubSkills(q, 200);\n const details = await cachedBatchGetSkillHubSkills(searchResult.slugs);\n rows = details.map((d) => convertSkillHubToPackageListItem(d.skill));\n }\n rows = filterByCategory(rows, params.category);\n if (params.sort === 'downloads') {\n rows = [...rows].sort((a, b) => b.downloads - a.downloads);\n } else if (params.sort === 'newest') {\n rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));\n }\n const total = rows.length;\n const start = (page - 1) * pageSize;\n const items = rows.slice(start, start + pageSize);\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n return {\n items,\n meta: { page, pageSize, total, totalPages },\n provider: 'skillhub',\n };\n }\n\n try {\n const idx = await cachedFetchSkillHubCuratedIndex(ecoUrls);\n let skills = [...idx.skills].filter((s) => s.slug?.trim());\n if (params.category?.trim()) {\n const want = params.category.trim();\n skills = skills.filter((s) =>\n (s.categories ?? []).some((x) => String(x).trim() === want),\n );\n }\n if (params.sort === 'downloads') {\n skills.sort((a, b) => (b.downloads ?? 0) - (a.downloads ?? 0));\n } else if (params.sort === 'newest') {\n skills.sort((a, b) => (a.rank ?? 999) - (b.rank ?? 999));\n }\n const rows = curatedSkillsToPackageItems(skills) as MarketplacePackageListItem[];\n const total = rows.length;\n const start = (page - 1) * pageSize;\n const items = rows.slice(start, start + pageSize);\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n return {\n items,\n meta: { page, pageSize, total, totalPages },\n provider: 'skillhub',\n };\n } catch {\n // fall through\n }\n\n const slugs = await cachedGetDefaultSkillSlugs();\n if (params.category?.trim()) {\n const details = await cachedBatchGetSkillHubSkills(slugs);\n let allItems = details.map((d) => convertSkillHubToPackageListItem(d.skill));\n allItems = filterByCategory(allItems, params.category);\n if (params.sort === 'downloads') {\n allItems = [...allItems].sort((a, b) => b.downloads - a.downloads);\n } else if (params.sort === 'newest') {\n allItems = [...allItems].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));\n }\n const total = allItems.length;\n const start = (page - 1) * pageSize;\n const items = allItems.slice(start, start + pageSize);\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n return {\n items,\n meta: { page, pageSize, total, totalPages },\n provider: 'skillhub',\n };\n }\n\n const total = slugs.length;\n const start = (page - 1) * pageSize;\n const paginatedSlugs = slugs.slice(start, start + pageSize);\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n const details = await cachedBatchGetSkillHubSkills(paginatedSlugs);\n const items = details.map((d) => convertSkillHubToPackageListItem(d.skill));\n\n return {\n items,\n meta: { page, pageSize, total, totalPages },\n provider: 'skillhub',\n };\n },\n\n async getPackageDetail(_config, packageName) {\n const detail = await getSkillHubSkill(packageName);\n const slug = detail.skill.slug;\n const version = detail.latestVersion.version;\n const changelog = detail.latestVersion.changelog;\n\n let readme: string | null = null;\n let docPath: string | null = null;\n try {\n const { files } = await getSkillHubSkillFiles(slug, version);\n docPath = pickSkillHubDocFilePath(files);\n if (docPath) {\n readme = await getSkillHubSkillFileText(slug, docPath, version);\n }\n } catch {\n readme = null;\n }\n\n const trimmed = readme?.trim() ?? '';\n const docBase = docPath ? basename(docPath.replace(/\\\\/g, '/')).toLowerCase() : '';\n const isSkillMd = docBase === 'skill.md';\n\n let skillDocPreview: SkillMarkdownPreviewPayload | undefined;\n\n if (!trimmed) {\n readme = skillHubFallbackReadmeMarkdown(detail);\n } else if (isSkillMd) {\n try {\n skillDocPreview = buildSkillMarkdownPreviewFromRaw(trimmed, {\n name: detail.skill.slug,\n description: detail.skill.summary_zh || detail.skill.summary || '',\n });\n readme = skillDocPreview.bodyMarkdown;\n if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) {\n readme = `${readme}\\n\\n---\\n\\n## Changelog\\n\\n${changelog.trim()}`;\n }\n } catch {\n readme = trimmed;\n if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) {\n readme = `${trimmed}\\n\\n---\\n\\n## Changelog\\n\\n${changelog.trim()}`;\n }\n }\n } else {\n readme = trimmed;\n if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) {\n readme = `${trimmed}\\n\\n---\\n\\n## Changelog\\n\\n${changelog.trim()}`;\n }\n }\n\n return {\n id: detail.skill.slug,\n name: detail.skill.slug,\n type: 'skill',\n description: detail.skill.summary_zh || detail.skill.summary,\n readme,\n skillDocPreview,\n downloads: detail.skill.stats.downloads,\n author: {\n username: detail.owner.handle,\n avatarUrl: detail.owner.image,\n },\n latestVersion: {\n version: detail.latestVersion.version,\n changelog: detail.latestVersion.changelog,\n publishedAt: String(detail.latestVersion.createdAt),\n },\n provider: 'skillhub',\n skillHubInfo: {\n category: detail.skill.category,\n installs: detail.skill.stats.installs,\n stars: detail.skill.stats.stars,\n securityReports: detail.latestVersion.securityReports,\n },\n };\n },\n\n async downloadPackage(_config, packageName, version) {\n const slug = packageName.trim();\n if (version?.trim()) {\n const { buffer, version: resolvedVersion } = await downloadSkillHubZipBuffer(slug, version);\n return {\n buffer,\n skillId: isValidSkillId(slug) ? slug : 'unknown',\n version: resolvedVersion,\n };\n }\n\n const ecoUrls = resolveSkillHubEcosystemUrls();\n try {\n const buffer = await downloadSkillHubZipFromEcosystem(ecoUrls, slug);\n let resolvedVersion = '1.0.0';\n try {\n resolvedVersion = (await getSkillHubSkillFiles(slug)).version;\n } catch {\n // keep default\n }\n return {\n buffer,\n skillId: isValidSkillId(slug) ? slug : 'unknown',\n version: resolvedVersion,\n };\n } catch {\n const { buffer, version: resolvedVersion } = await downloadSkillHubZipBuffer(slug);\n return {\n buffer,\n skillId: isValidSkillId(slug) ? slug : 'unknown',\n version: resolvedVersion,\n };\n }\n },\n};\n"],"mappings":"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"}
|