@hashicorp/kits 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +619 -0
- package/bin/kits.js +8 -0
- package/dist/adapters/base-adapter.d.ts +231 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +703 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/claude-code/detection.d.ts +63 -0
- package/dist/adapters/claude-code/detection.d.ts.map +1 -0
- package/dist/adapters/claude-code/detection.js +154 -0
- package/dist/adapters/claude-code/detection.js.map +1 -0
- package/dist/adapters/claude-code/index.d.ts +178 -0
- package/dist/adapters/claude-code/index.d.ts.map +1 -0
- package/dist/adapters/claude-code/index.js +643 -0
- package/dist/adapters/claude-code/index.js.map +1 -0
- package/dist/adapters/claude-code/installer.d.ts +161 -0
- package/dist/adapters/claude-code/installer.d.ts.map +1 -0
- package/dist/adapters/claude-code/installer.js +413 -0
- package/dist/adapters/claude-code/installer.js.map +1 -0
- package/dist/adapters/claude-code/model-mapping.d.ts +7 -0
- package/dist/adapters/claude-code/model-mapping.d.ts.map +1 -0
- package/dist/adapters/claude-code/model-mapping.js +14 -0
- package/dist/adapters/claude-code/model-mapping.js.map +1 -0
- package/dist/adapters/claude-code/tool-mapping.d.ts +18 -0
- package/dist/adapters/claude-code/tool-mapping.d.ts.map +1 -0
- package/dist/adapters/claude-code/tool-mapping.js +31 -0
- package/dist/adapters/claude-code/tool-mapping.js.map +1 -0
- package/dist/adapters/codex/detection.d.ts +60 -0
- package/dist/adapters/codex/detection.d.ts.map +1 -0
- package/dist/adapters/codex/detection.js +146 -0
- package/dist/adapters/codex/detection.js.map +1 -0
- package/dist/adapters/codex/index.d.ts +167 -0
- package/dist/adapters/codex/index.d.ts.map +1 -0
- package/dist/adapters/codex/index.js +344 -0
- package/dist/adapters/codex/index.js.map +1 -0
- package/dist/adapters/codex/installer.d.ts +147 -0
- package/dist/adapters/codex/installer.d.ts.map +1 -0
- package/dist/adapters/codex/installer.js +229 -0
- package/dist/adapters/codex/installer.js.map +1 -0
- package/dist/adapters/codex/model-mapping.d.ts +7 -0
- package/dist/adapters/codex/model-mapping.d.ts.map +1 -0
- package/dist/adapters/codex/model-mapping.js +14 -0
- package/dist/adapters/codex/model-mapping.js.map +1 -0
- package/dist/adapters/codex/tool-mapping.d.ts +19 -0
- package/dist/adapters/codex/tool-mapping.d.ts.map +1 -0
- package/dist/adapters/codex/tool-mapping.js +32 -0
- package/dist/adapters/codex/tool-mapping.js.map +1 -0
- package/dist/adapters/command-parser.d.ts +72 -0
- package/dist/adapters/command-parser.d.ts.map +1 -0
- package/dist/adapters/command-parser.js +222 -0
- package/dist/adapters/command-parser.js.map +1 -0
- package/dist/adapters/file-operations.d.ts +164 -0
- package/dist/adapters/file-operations.d.ts.map +1 -0
- package/dist/adapters/file-operations.js +526 -0
- package/dist/adapters/file-operations.js.map +1 -0
- package/dist/adapters/gemini-cli/detection.d.ts +57 -0
- package/dist/adapters/gemini-cli/detection.d.ts.map +1 -0
- package/dist/adapters/gemini-cli/detection.js +143 -0
- package/dist/adapters/gemini-cli/detection.js.map +1 -0
- package/dist/adapters/gemini-cli/index.d.ts +182 -0
- package/dist/adapters/gemini-cli/index.d.ts.map +1 -0
- package/dist/adapters/gemini-cli/index.js +598 -0
- package/dist/adapters/gemini-cli/index.js.map +1 -0
- package/dist/adapters/gemini-cli/installer.d.ts +158 -0
- package/dist/adapters/gemini-cli/installer.d.ts.map +1 -0
- package/dist/adapters/gemini-cli/installer.js +457 -0
- package/dist/adapters/gemini-cli/installer.js.map +1 -0
- package/dist/adapters/gemini-cli/model-mapping.d.ts +7 -0
- package/dist/adapters/gemini-cli/model-mapping.d.ts.map +1 -0
- package/dist/adapters/gemini-cli/model-mapping.js +14 -0
- package/dist/adapters/gemini-cli/model-mapping.js.map +1 -0
- package/dist/adapters/gemini-cli/tool-mapping.d.ts +18 -0
- package/dist/adapters/gemini-cli/tool-mapping.d.ts.map +1 -0
- package/dist/adapters/gemini-cli/tool-mapping.js +31 -0
- package/dist/adapters/gemini-cli/tool-mapping.js.map +1 -0
- package/dist/adapters/github-copilot/detection.d.ts +58 -0
- package/dist/adapters/github-copilot/detection.d.ts.map +1 -0
- package/dist/adapters/github-copilot/detection.js +144 -0
- package/dist/adapters/github-copilot/detection.js.map +1 -0
- package/dist/adapters/github-copilot/index.d.ts +203 -0
- package/dist/adapters/github-copilot/index.d.ts.map +1 -0
- package/dist/adapters/github-copilot/index.js +595 -0
- package/dist/adapters/github-copilot/index.js.map +1 -0
- package/dist/adapters/github-copilot/installer.d.ts +124 -0
- package/dist/adapters/github-copilot/installer.d.ts.map +1 -0
- package/dist/adapters/github-copilot/installer.js +343 -0
- package/dist/adapters/github-copilot/installer.js.map +1 -0
- package/dist/adapters/github-copilot/model-mapping.d.ts +7 -0
- package/dist/adapters/github-copilot/model-mapping.d.ts.map +1 -0
- package/dist/adapters/github-copilot/model-mapping.js +14 -0
- package/dist/adapters/github-copilot/model-mapping.js.map +1 -0
- package/dist/adapters/github-copilot/tool-mapping.d.ts +18 -0
- package/dist/adapters/github-copilot/tool-mapping.d.ts.map +1 -0
- package/dist/adapters/github-copilot/tool-mapping.js +31 -0
- package/dist/adapters/github-copilot/tool-mapping.js.map +1 -0
- package/dist/adapters/index.d.ts +39 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +76 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/interface.d.ts +9 -0
- package/dist/adapters/interface.d.ts.map +1 -0
- package/dist/adapters/interface.js +8 -0
- package/dist/adapters/interface.js.map +1 -0
- package/dist/adapters/model-templating.d.ts +16 -0
- package/dist/adapters/model-templating.d.ts.map +1 -0
- package/dist/adapters/model-templating.js +52 -0
- package/dist/adapters/model-templating.js.map +1 -0
- package/dist/adapters/opencode/detection.d.ts +57 -0
- package/dist/adapters/opencode/detection.d.ts.map +1 -0
- package/dist/adapters/opencode/detection.js +140 -0
- package/dist/adapters/opencode/detection.js.map +1 -0
- package/dist/adapters/opencode/index.d.ts +168 -0
- package/dist/adapters/opencode/index.d.ts.map +1 -0
- package/dist/adapters/opencode/index.js +494 -0
- package/dist/adapters/opencode/index.js.map +1 -0
- package/dist/adapters/opencode/installer.d.ts +91 -0
- package/dist/adapters/opencode/installer.d.ts.map +1 -0
- package/dist/adapters/opencode/installer.js +290 -0
- package/dist/adapters/opencode/installer.js.map +1 -0
- package/dist/adapters/opencode/model-mapping.d.ts +7 -0
- package/dist/adapters/opencode/model-mapping.d.ts.map +1 -0
- package/dist/adapters/opencode/model-mapping.js +14 -0
- package/dist/adapters/opencode/model-mapping.js.map +1 -0
- package/dist/adapters/opencode/tool-mapping.d.ts +18 -0
- package/dist/adapters/opencode/tool-mapping.d.ts.map +1 -0
- package/dist/adapters/opencode/tool-mapping.js +31 -0
- package/dist/adapters/opencode/tool-mapping.js.map +1 -0
- package/dist/adapters/registry.d.ts +154 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +223 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/skill-frontmatter.d.ts +34 -0
- package/dist/adapters/skill-frontmatter.d.ts.map +1 -0
- package/dist/adapters/skill-frontmatter.js +110 -0
- package/dist/adapters/skill-frontmatter.js.map +1 -0
- package/dist/adapters/subagent-frontmatter.d.ts +22 -0
- package/dist/adapters/subagent-frontmatter.d.ts.map +1 -0
- package/dist/adapters/subagent-frontmatter.js +80 -0
- package/dist/adapters/subagent-frontmatter.js.map +1 -0
- package/dist/adapters/tool-templating.d.ts +162 -0
- package/dist/adapters/tool-templating.d.ts.map +1 -0
- package/dist/adapters/tool-templating.js +273 -0
- package/dist/adapters/tool-templating.js.map +1 -0
- package/dist/adapters/types.d.ts +347 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +33 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +261 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/info.d.ts +20 -0
- package/dist/cli/info.d.ts.map +1 -0
- package/dist/cli/info.js +194 -0
- package/dist/cli/info.js.map +1 -0
- package/dist/cli/install.d.ts +21 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +1624 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/list.d.ts +19 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +216 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/types.d.ts +246 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +25 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/uninstall.d.ts +20 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +393 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/upgrade.d.ts +20 -0
- package/dist/cli/upgrade.d.ts.map +1 -0
- package/dist/cli/upgrade.js +372 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/cli/validate.d.ts +14 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +307 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/core/debug.d.ts +23 -0
- package/dist/core/debug.d.ts.map +1 -0
- package/dist/core/debug.js +69 -0
- package/dist/core/debug.js.map +1 -0
- package/dist/core/hook-instance.d.ts +8 -0
- package/dist/core/hook-instance.d.ts.map +1 -0
- package/dist/core/hook-instance.js +62 -0
- package/dist/core/hook-instance.js.map +1 -0
- package/dist/core/mcp-instance.d.ts +13 -0
- package/dist/core/mcp-instance.d.ts.map +1 -0
- package/dist/core/mcp-instance.js +80 -0
- package/dist/core/mcp-instance.js.map +1 -0
- package/dist/core/types.d.ts +461 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +42 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/upgrade-executor.d.ts +70 -0
- package/dist/core/upgrade-executor.d.ts.map +1 -0
- package/dist/core/upgrade-executor.js +368 -0
- package/dist/core/upgrade-executor.js.map +1 -0
- package/dist/discovery/fetcher-registry.d.ts +87 -0
- package/dist/discovery/fetcher-registry.d.ts.map +1 -0
- package/dist/discovery/fetcher-registry.js +119 -0
- package/dist/discovery/fetcher-registry.js.map +1 -0
- package/dist/discovery/git-fetcher.d.ts +61 -0
- package/dist/discovery/git-fetcher.d.ts.map +1 -0
- package/dist/discovery/git-fetcher.js +150 -0
- package/dist/discovery/git-fetcher.js.map +1 -0
- package/dist/discovery/index.d.ts +13 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +15 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/kit-scanner.d.ts +55 -0
- package/dist/discovery/kit-scanner.d.ts.map +1 -0
- package/dist/discovery/kit-scanner.js +305 -0
- package/dist/discovery/kit-scanner.js.map +1 -0
- package/dist/discovery/local-fetcher.d.ts +38 -0
- package/dist/discovery/local-fetcher.d.ts.map +1 -0
- package/dist/discovery/local-fetcher.js +100 -0
- package/dist/discovery/local-fetcher.js.map +1 -0
- package/dist/discovery/source-parser.d.ts +33 -0
- package/dist/discovery/source-parser.d.ts.map +1 -0
- package/dist/discovery/source-parser.js +136 -0
- package/dist/discovery/source-parser.js.map +1 -0
- package/dist/discovery/types.d.ts +145 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +18 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/index.d.ts +79 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +200 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/read.d.ts +32 -0
- package/dist/manifest/read.d.ts.map +1 -0
- package/dist/manifest/read.js +88 -0
- package/dist/manifest/read.js.map +1 -0
- package/dist/manifest/types.d.ts +119 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +44 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/manifest/upgrade-check.d.ts +72 -0
- package/dist/manifest/upgrade-check.d.ts.map +1 -0
- package/dist/manifest/upgrade-check.js +215 -0
- package/dist/manifest/upgrade-check.js.map +1 -0
- package/dist/manifest/utils.d.ts +35 -0
- package/dist/manifest/utils.d.ts.map +1 -0
- package/dist/manifest/utils.js +57 -0
- package/dist/manifest/utils.js.map +1 -0
- package/dist/manifest/write.d.ts +44 -0
- package/dist/manifest/write.d.ts.map +1 -0
- package/dist/manifest/write.js +77 -0
- package/dist/manifest/write.js.map +1 -0
- package/dist/resolution/env-resolver.d.ts +81 -0
- package/dist/resolution/env-resolver.d.ts.map +1 -0
- package/dist/resolution/env-resolver.js +233 -0
- package/dist/resolution/env-resolver.js.map +1 -0
- package/dist/resolution/index.d.ts +55 -0
- package/dist/resolution/index.d.ts.map +1 -0
- package/dist/resolution/index.js +412 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/resolution/multi-kit-resolver.d.ts +43 -0
- package/dist/resolution/multi-kit-resolver.d.ts.map +1 -0
- package/dist/resolution/multi-kit-resolver.js +258 -0
- package/dist/resolution/multi-kit-resolver.js.map +1 -0
- package/dist/resolution/primitive-paths.d.ts +17 -0
- package/dist/resolution/primitive-paths.d.ts.map +1 -0
- package/dist/resolution/primitive-paths.js +59 -0
- package/dist/resolution/primitive-paths.js.map +1 -0
- package/dist/resolution/primitives-registry.d.ts +137 -0
- package/dist/resolution/primitives-registry.d.ts.map +1 -0
- package/dist/resolution/primitives-registry.js +295 -0
- package/dist/resolution/primitives-registry.js.map +1 -0
- package/dist/resolution/reference-parser.d.ts +62 -0
- package/dist/resolution/reference-parser.d.ts.map +1 -0
- package/dist/resolution/reference-parser.js +182 -0
- package/dist/resolution/reference-parser.js.map +1 -0
- package/dist/resolution/types.d.ts +77 -0
- package/dist/resolution/types.d.ts.map +1 -0
- package/dist/resolution/types.js +13 -0
- package/dist/resolution/types.js.map +1 -0
- package/dist/resolution/version-resolver.d.ts +76 -0
- package/dist/resolution/version-resolver.d.ts.map +1 -0
- package/dist/resolution/version-resolver.js +269 -0
- package/dist/resolution/version-resolver.js.map +1 -0
- package/dist/tui/compatibility.d.ts +80 -0
- package/dist/tui/compatibility.d.ts.map +1 -0
- package/dist/tui/compatibility.js +355 -0
- package/dist/tui/compatibility.js.map +1 -0
- package/dist/tui/env-prompt.d.ts +129 -0
- package/dist/tui/env-prompt.d.ts.map +1 -0
- package/dist/tui/env-prompt.js +488 -0
- package/dist/tui/env-prompt.js.map +1 -0
- package/dist/tui/harness-select.d.ts +54 -0
- package/dist/tui/harness-select.d.ts.map +1 -0
- package/dist/tui/harness-select.js +171 -0
- package/dist/tui/harness-select.js.map +1 -0
- package/dist/tui/index.d.ts +112 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +213 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/kit-select.d.ts +72 -0
- package/dist/tui/kit-select.d.ts.map +1 -0
- package/dist/tui/kit-select.js +209 -0
- package/dist/tui/kit-select.js.map +1 -0
- package/dist/tui/progress.d.ts +75 -0
- package/dist/tui/progress.d.ts.map +1 -0
- package/dist/tui/progress.js +267 -0
- package/dist/tui/progress.js.map +1 -0
- package/dist/tui/resolution.d.ts +62 -0
- package/dist/tui/resolution.d.ts.map +1 -0
- package/dist/tui/resolution.js +261 -0
- package/dist/tui/resolution.js.map +1 -0
- package/dist/tui/scope-compatibility.d.ts +139 -0
- package/dist/tui/scope-compatibility.d.ts.map +1 -0
- package/dist/tui/scope-compatibility.js +230 -0
- package/dist/tui/scope-compatibility.js.map +1 -0
- package/dist/tui/scope-select.d.ts +67 -0
- package/dist/tui/scope-select.d.ts.map +1 -0
- package/dist/tui/scope-select.js +134 -0
- package/dist/tui/scope-select.js.map +1 -0
- package/dist/tui/spinner.d.ts +114 -0
- package/dist/tui/spinner.d.ts.map +1 -0
- package/dist/tui/spinner.js +186 -0
- package/dist/tui/spinner.js.map +1 -0
- package/dist/tui/summary.d.ts +71 -0
- package/dist/tui/summary.d.ts.map +1 -0
- package/dist/tui/summary.js +343 -0
- package/dist/tui/summary.js.map +1 -0
- package/dist/tui/types.d.ts +234 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +7 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui/upgrade-select.d.ts +73 -0
- package/dist/tui/upgrade-select.d.ts.map +1 -0
- package/dist/tui/upgrade-select.js +324 -0
- package/dist/tui/upgrade-select.js.map +1 -0
- package/dist/validation/index.d.ts +13 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +13 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/source.d.ts +14 -0
- package/dist/validation/source.d.ts.map +1 -0
- package/dist/validation/source.js +51 -0
- package/dist/validation/source.js.map +1 -0
- package/dist/validation/utils.d.ts +29 -0
- package/dist/validation/utils.d.ts.map +1 -0
- package/dist/validation/utils.js +89 -0
- package/dist/validation/utils.js.map +1 -0
- package/dist/validation/validate-commands.d.ts +28 -0
- package/dist/validation/validate-commands.d.ts.map +1 -0
- package/dist/validation/validate-commands.js +151 -0
- package/dist/validation/validate-commands.js.map +1 -0
- package/dist/validation/validate-hooks.d.ts +13 -0
- package/dist/validation/validate-hooks.d.ts.map +1 -0
- package/dist/validation/validate-hooks.js +272 -0
- package/dist/validation/validate-hooks.js.map +1 -0
- package/dist/validation/validate-kits.d.ts +15 -0
- package/dist/validation/validate-kits.d.ts.map +1 -0
- package/dist/validation/validate-kits.js +185 -0
- package/dist/validation/validate-kits.js.map +1 -0
- package/dist/validation/validate-mcp.d.ts +12 -0
- package/dist/validation/validate-mcp.d.ts.map +1 -0
- package/dist/validation/validate-mcp.js +132 -0
- package/dist/validation/validate-mcp.js.map +1 -0
- package/dist/validation/validate-skills.d.ts +24 -0
- package/dist/validation/validate-skills.d.ts.map +1 -0
- package/dist/validation/validate-skills.js +223 -0
- package/dist/validation/validate-skills.js.map +1 -0
- package/dist/validation/validate-subagents.d.ts +27 -0
- package/dist/validation/validate-subagents.d.ts.map +1 -0
- package/dist/validation/validate-subagents.js +269 -0
- package/dist/validation/validate-subagents.js.map +1 -0
- package/package.json +91 -0
- package/schemas/command.schema.json +23 -0
- package/schemas/examples/hook-binding-valid.json +20 -0
- package/schemas/examples/hook-program-valid.json +25 -0
- package/schemas/examples/http-server-valid.json +82 -0
- package/schemas/examples/invalid-sensitive-header-no-envvar.json +16 -0
- package/schemas/examples/invalid-sensitive-header-with-value.json +17 -0
- package/schemas/examples/invalid-sensitive-var-with-default.json +19 -0
- package/schemas/examples/stdio-server-valid.json +55 -0
- package/schemas/hook-binding.schema.json +63 -0
- package/schemas/hook-program.schema.json +104 -0
- package/schemas/kit.schema.json +338 -0
- package/schemas/kits.schema.json +117 -0
- package/schemas/manifest.schema.json +200 -0
- package/schemas/mcp-server.schema.json +305 -0
- package/schemas/primitives.schema.json +118 -0
- package/schemas/skill.schema.json +96 -0
- package/schemas/subagent.schema.json +107 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kit manifest and registry validation script.
|
|
3
|
+
*
|
|
4
|
+
* Validates kit.json files and kits.json registries in a kit repository
|
|
5
|
+
* against their canonical JSON schemas.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "node:fs/promises";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
11
|
+
import addFormats from "ajv-formats";
|
|
12
|
+
import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json" with { type: "json" };
|
|
13
|
+
import pc from "picocolors";
|
|
14
|
+
import { formatValidationSourceError, resolveValidationSource } from "./source.js";
|
|
15
|
+
import { summarizeResults, printValidationResults, } from "./utils.js";
|
|
16
|
+
async function pathExists(filePath) {
|
|
17
|
+
try {
|
|
18
|
+
const stat = await fs.stat(filePath);
|
|
19
|
+
return stat.isFile();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function findKitsRegistryFile(agentKitsPath) {
|
|
26
|
+
const registryPath = path.join(agentKitsPath, "kits.json");
|
|
27
|
+
return (await pathExists(registryPath)) ? registryPath : undefined;
|
|
28
|
+
}
|
|
29
|
+
async function findKitManifestFiles(agentKitsPath) {
|
|
30
|
+
const files = [];
|
|
31
|
+
const rootKitPath = path.join(agentKitsPath, "kit.json");
|
|
32
|
+
if (await pathExists(rootKitPath)) {
|
|
33
|
+
files.push(rootKitPath);
|
|
34
|
+
}
|
|
35
|
+
const kitsDir = path.join(agentKitsPath, "kits");
|
|
36
|
+
try {
|
|
37
|
+
const kitEntries = await fs.readdir(kitsDir, { withFileTypes: true });
|
|
38
|
+
for (const kitEntry of kitEntries) {
|
|
39
|
+
if (!kitEntry.isDirectory()) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const kitPath = path.join(kitsDir, kitEntry.name, "kit.json");
|
|
43
|
+
if (await pathExists(kitPath)) {
|
|
44
|
+
files.push(kitPath);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// kits directory doesn't exist - ignore
|
|
50
|
+
}
|
|
51
|
+
return files;
|
|
52
|
+
}
|
|
53
|
+
function formatSchemaErrors(errors = []) {
|
|
54
|
+
return errors
|
|
55
|
+
.map((err) => {
|
|
56
|
+
const instancePath = err.instancePath ? `${err.instancePath} ` : "";
|
|
57
|
+
return `${instancePath}${err.message ?? "schema validation error"}`;
|
|
58
|
+
})
|
|
59
|
+
.join("; ");
|
|
60
|
+
}
|
|
61
|
+
export async function validateKitsRegistryFile(filePath, validateSchema) {
|
|
62
|
+
try {
|
|
63
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
64
|
+
const data = JSON.parse(content);
|
|
65
|
+
const valid = validateSchema(data);
|
|
66
|
+
if (!valid) {
|
|
67
|
+
const errorText = formatSchemaErrors((validateSchema.errors ?? []));
|
|
68
|
+
return {
|
|
69
|
+
file: filePath,
|
|
70
|
+
valid: false,
|
|
71
|
+
error: `Schema validation failed: ${errorText}`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return { file: filePath, valid: true };
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
78
|
+
return { file: filePath, valid: false, error: errorMessage };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export async function validateKitManifestFile(filePath, validateSchema) {
|
|
82
|
+
try {
|
|
83
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
84
|
+
const data = JSON.parse(content);
|
|
85
|
+
const valid = validateSchema(data);
|
|
86
|
+
if (!valid) {
|
|
87
|
+
const errorText = formatSchemaErrors((validateSchema.errors ?? []));
|
|
88
|
+
return {
|
|
89
|
+
file: filePath,
|
|
90
|
+
valid: false,
|
|
91
|
+
error: `Schema validation failed: ${errorText}`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return { file: filePath, valid: true };
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
98
|
+
return { file: filePath, valid: false, error: errorMessage };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export async function validateKits(agentKitsPath, options = {}) {
|
|
102
|
+
const schemaRoot = options.schemaRoot ??
|
|
103
|
+
path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../schemas");
|
|
104
|
+
const kitSchemaPath = path.join(schemaRoot, "kit.schema.json");
|
|
105
|
+
const kitsSchemaPath = path.join(schemaRoot, "kits.schema.json");
|
|
106
|
+
const kitSchemaContent = await fs.readFile(kitSchemaPath, "utf-8");
|
|
107
|
+
const kitsSchemaContent = await fs.readFile(kitsSchemaPath, "utf-8");
|
|
108
|
+
const kitSchema = JSON.parse(kitSchemaContent);
|
|
109
|
+
const kitsSchema = JSON.parse(kitsSchemaContent);
|
|
110
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false, unicodeRegExp: false });
|
|
111
|
+
ajv.addMetaSchema(draft7MetaSchema);
|
|
112
|
+
ajv.addMetaSchema({
|
|
113
|
+
...draft7MetaSchema,
|
|
114
|
+
$id: "https://json-schema.org/draft-07/schema#",
|
|
115
|
+
});
|
|
116
|
+
const applyFormats = addFormats;
|
|
117
|
+
applyFormats(ajv);
|
|
118
|
+
const validateKitSchema = ajv.compile(kitSchema);
|
|
119
|
+
const validateKitsSchema = ajv.compile(kitsSchema);
|
|
120
|
+
const results = [];
|
|
121
|
+
const kitsRegistry = await findKitsRegistryFile(agentKitsPath);
|
|
122
|
+
if (kitsRegistry) {
|
|
123
|
+
results.push(await validateKitsRegistryFile(kitsRegistry, validateKitsSchema));
|
|
124
|
+
}
|
|
125
|
+
const kitFiles = await findKitManifestFiles(agentKitsPath);
|
|
126
|
+
for (const file of kitFiles) {
|
|
127
|
+
results.push(await validateKitManifestFile(file, validateKitSchema));
|
|
128
|
+
}
|
|
129
|
+
return summarizeResults(results);
|
|
130
|
+
}
|
|
131
|
+
export async function main(args) {
|
|
132
|
+
let source = args[0];
|
|
133
|
+
if (!source) {
|
|
134
|
+
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
|
|
135
|
+
const fallbackPath = path.resolve(scriptDir, "../../test-kits");
|
|
136
|
+
try {
|
|
137
|
+
const stat = await fs.stat(fallbackPath);
|
|
138
|
+
if (stat.isDirectory()) {
|
|
139
|
+
source = fallbackPath;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
source = undefined;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!source) {
|
|
147
|
+
console.error(pc.red("Error: no kit repository path provided"));
|
|
148
|
+
console.error(pc.dim("Usage: validate-kits <path-to-kits-repo | org/repo[@ref]>"));
|
|
149
|
+
return 1;
|
|
150
|
+
}
|
|
151
|
+
let fetchResult;
|
|
152
|
+
try {
|
|
153
|
+
fetchResult = await resolveValidationSource(source);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const message = formatValidationSourceError(error);
|
|
157
|
+
console.error(pc.red(`Error: ${message}`));
|
|
158
|
+
console.error(pc.dim("Usage: validate-kits <path-to-kits-repo | org/repo[@ref]>"));
|
|
159
|
+
return 1;
|
|
160
|
+
}
|
|
161
|
+
const agentKitsPath = fetchResult.localPath;
|
|
162
|
+
console.log(pc.dim(`Validating kit manifests in: ${agentKitsPath}`));
|
|
163
|
+
try {
|
|
164
|
+
const summary = await validateKits(agentKitsPath);
|
|
165
|
+
printValidationResults("Kit Registry & Manifest Validation", summary, agentKitsPath);
|
|
166
|
+
if (summary.failed > 0) {
|
|
167
|
+
console.error(pc.red(`Validation failed: ${summary.failed} kit file(s) have invalid format`));
|
|
168
|
+
return 1;
|
|
169
|
+
}
|
|
170
|
+
if (summary.total === 0) {
|
|
171
|
+
console.log(pc.yellow("Warning: No kit manifests or registries found"));
|
|
172
|
+
return 0;
|
|
173
|
+
}
|
|
174
|
+
console.log(pc.green("All kit files are valid"));
|
|
175
|
+
return 0;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.error(pc.red(`Error during validation: ${error}`));
|
|
179
|
+
return 1;
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
await fetchResult.cleanup?.();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=validate-kits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-kits.js","sourceRoot":"","sources":["../../src/validation/validate-kits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server primitive validation script.
|
|
3
|
+
*
|
|
4
|
+
* Validates all MCP config.json files in a kit repository against
|
|
5
|
+
* the canonical MCP server JSON schema.
|
|
6
|
+
*/
|
|
7
|
+
import { type ValidationSummary } from "./utils.js";
|
|
8
|
+
export declare function validateMcp(agentKitsPath: string, options?: {
|
|
9
|
+
schemaRoot?: string;
|
|
10
|
+
}): Promise<ValidationSummary>;
|
|
11
|
+
export declare function main(args: string[]): Promise<number>;
|
|
12
|
+
//# sourceMappingURL=validate-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-mcp.d.ts","sourceRoot":"","sources":["../../src/validation/validate-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAwDpB,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAqB5B;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkE1D"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server primitive validation script.
|
|
3
|
+
*
|
|
4
|
+
* Validates all MCP config.json files in a kit repository against
|
|
5
|
+
* the canonical MCP server JSON schema.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "fs/promises";
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
11
|
+
import addFormats from "ajv-formats";
|
|
12
|
+
import pc from "picocolors";
|
|
13
|
+
import { formatValidationSourceError, resolveValidationSource, } from "./source.js";
|
|
14
|
+
import { findFilesByName, summarizeResults, printValidationResults, } from "./utils.js";
|
|
15
|
+
async function findMcpConfigFiles(agentKitsPath) {
|
|
16
|
+
const files = [];
|
|
17
|
+
const sharedMcpDir = path.join(agentKitsPath, "primitives/mcp");
|
|
18
|
+
files.push(...(await findFilesByName(sharedMcpDir, "config.json")));
|
|
19
|
+
const kitsDir = path.join(agentKitsPath, "kits");
|
|
20
|
+
try {
|
|
21
|
+
const kitEntries = await fs.readdir(kitsDir, { withFileTypes: true });
|
|
22
|
+
for (const kitEntry of kitEntries) {
|
|
23
|
+
if (!kitEntry.isDirectory()) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const kitMcpDir = path.join(kitsDir, kitEntry.name, "primitives/mcp");
|
|
27
|
+
files.push(...(await findFilesByName(kitMcpDir, "config.json")));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// kits directory doesn't exist - ignore
|
|
32
|
+
}
|
|
33
|
+
return files;
|
|
34
|
+
}
|
|
35
|
+
async function validateMcpFile(filePath, validateSchema) {
|
|
36
|
+
try {
|
|
37
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
38
|
+
const data = JSON.parse(content);
|
|
39
|
+
const valid = validateSchema(data);
|
|
40
|
+
if (!valid) {
|
|
41
|
+
const errors = (validateSchema.errors ?? []);
|
|
42
|
+
const errorText = errors
|
|
43
|
+
.map((err) => {
|
|
44
|
+
const instancePath = err.instancePath ? `${err.instancePath} ` : "";
|
|
45
|
+
return `${instancePath}${err.message ?? "schema validation error"}`;
|
|
46
|
+
})
|
|
47
|
+
.join("; ");
|
|
48
|
+
return {
|
|
49
|
+
file: filePath,
|
|
50
|
+
valid: false,
|
|
51
|
+
error: `Schema validation failed: ${errorText}`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return { file: filePath, valid: true };
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
58
|
+
return { file: filePath, valid: false, error: errorMessage };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function validateMcp(agentKitsPath, options = {}) {
|
|
62
|
+
const schemaRoot = options.schemaRoot ??
|
|
63
|
+
path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../schemas");
|
|
64
|
+
const schemaPath = path.join(schemaRoot, "mcp-server.schema.json");
|
|
65
|
+
const schemaContent = await fs.readFile(schemaPath, "utf-8");
|
|
66
|
+
const schema = JSON.parse(schemaContent);
|
|
67
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
68
|
+
const applyFormats = addFormats;
|
|
69
|
+
applyFormats(ajv);
|
|
70
|
+
const validateSchema = ajv.compile(schema);
|
|
71
|
+
const mcpFiles = await findMcpConfigFiles(agentKitsPath);
|
|
72
|
+
const results = [];
|
|
73
|
+
for (const file of mcpFiles) {
|
|
74
|
+
results.push(await validateMcpFile(file, validateSchema));
|
|
75
|
+
}
|
|
76
|
+
return summarizeResults(results);
|
|
77
|
+
}
|
|
78
|
+
export async function main(args) {
|
|
79
|
+
let source = args[0];
|
|
80
|
+
if (!source) {
|
|
81
|
+
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
|
|
82
|
+
const fallbackPath = path.resolve(scriptDir, "../../test-kits");
|
|
83
|
+
try {
|
|
84
|
+
const stat = await fs.stat(fallbackPath);
|
|
85
|
+
if (stat.isDirectory()) {
|
|
86
|
+
source = fallbackPath;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
source = undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (!source) {
|
|
94
|
+
console.error(pc.red("Error: no kit repository path provided"));
|
|
95
|
+
console.error(pc.dim("Usage: validate-mcp <path-to-kits-repo | org/repo[@ref]>"));
|
|
96
|
+
return 1;
|
|
97
|
+
}
|
|
98
|
+
let fetchResult;
|
|
99
|
+
try {
|
|
100
|
+
fetchResult = await resolveValidationSource(source);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const message = formatValidationSourceError(error);
|
|
104
|
+
console.error(pc.red(`Error: ${message}`));
|
|
105
|
+
console.error(pc.dim("Usage: validate-mcp <path-to-kits-repo | org/repo[@ref]>"));
|
|
106
|
+
return 1;
|
|
107
|
+
}
|
|
108
|
+
const agentKitsPath = fetchResult.localPath;
|
|
109
|
+
console.log(pc.dim(`Validating MCP configs in: ${agentKitsPath}`));
|
|
110
|
+
try {
|
|
111
|
+
const summary = await validateMcp(agentKitsPath);
|
|
112
|
+
printValidationResults("MCP Primitive Validation", summary, agentKitsPath);
|
|
113
|
+
if (summary.failed > 0) {
|
|
114
|
+
console.error(pc.red(`Validation failed: ${summary.failed} MCP config(s) have invalid format`));
|
|
115
|
+
return 1;
|
|
116
|
+
}
|
|
117
|
+
if (summary.total === 0) {
|
|
118
|
+
console.log(pc.yellow("Warning: No MCP config files found"));
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
console.log(pc.green("All MCP config files are valid"));
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
console.error(pc.red(`Error during validation: ${error}`));
|
|
126
|
+
return 1;
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
await fetchResult.cleanup?.();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=validate-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-mcp.js","sourceRoot":"","sources":["../../src/validation/validate-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill primitive validation script.
|
|
3
|
+
*
|
|
4
|
+
* Validates all SKILL.md files in a kit repository against
|
|
5
|
+
* the canonical format specification:
|
|
6
|
+
* - YAML frontmatter required
|
|
7
|
+
* - `name` field required and non-empty
|
|
8
|
+
* - `description` field required and non-empty
|
|
9
|
+
* - `allowedTools` optional but must be string or array of strings if present
|
|
10
|
+
* - `hooks` optional but must be an array of bindings if present
|
|
11
|
+
* - Body content required and non-empty
|
|
12
|
+
*
|
|
13
|
+
* Exits with code 0 on success, 1 on validation failure.
|
|
14
|
+
*/
|
|
15
|
+
import { type ValidationSummary } from "./utils.js";
|
|
16
|
+
/**
|
|
17
|
+
* Validate all skill files in a kit repository.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateSkills(agentKitsPath: string): Promise<ValidationSummary>;
|
|
20
|
+
/**
|
|
21
|
+
* Main entry point for CLI execution.
|
|
22
|
+
*/
|
|
23
|
+
export declare function main(args: string[]): Promise<number>;
|
|
24
|
+
//# sourceMappingURL=validate-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-skills.d.ts","sourceRoot":"","sources":["../../src/validation/validate-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAiKpB;;GAEG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAS5B;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkE1D"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill primitive validation script.
|
|
3
|
+
*
|
|
4
|
+
* Validates all SKILL.md files in a kit repository against
|
|
5
|
+
* the canonical format specification:
|
|
6
|
+
* - YAML frontmatter required
|
|
7
|
+
* - `name` field required and non-empty
|
|
8
|
+
* - `description` field required and non-empty
|
|
9
|
+
* - `allowedTools` optional but must be string or array of strings if present
|
|
10
|
+
* - `hooks` optional but must be an array of bindings if present
|
|
11
|
+
* - Body content required and non-empty
|
|
12
|
+
*
|
|
13
|
+
* Exits with code 0 on success, 1 on validation failure.
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from "fs/promises";
|
|
16
|
+
import * as path from "path";
|
|
17
|
+
import { fileURLToPath } from "node:url";
|
|
18
|
+
import pc from "picocolors";
|
|
19
|
+
import { parseSkillFrontmatter } from "../adapters/skill-frontmatter.js";
|
|
20
|
+
import { formatValidationSourceError, resolveValidationSource, } from "./source.js";
|
|
21
|
+
import { findMarkdownFiles, summarizeResults, printValidationResults, } from "./utils.js";
|
|
22
|
+
/**
|
|
23
|
+
* Find all skill files in a kit repository.
|
|
24
|
+
*
|
|
25
|
+
* Searches for:
|
|
26
|
+
* - Shared primitives: primitives/skills/{name}/v{version}/SKILL.md
|
|
27
|
+
* - Inline kit primitives: kits/{kit}/primitives/skills/{name}/SKILL.md
|
|
28
|
+
*/
|
|
29
|
+
async function findSkillFiles(agentKitsPath) {
|
|
30
|
+
const skillFiles = [];
|
|
31
|
+
const sharedSkillsDir = path.join(agentKitsPath, "primitives/skills");
|
|
32
|
+
skillFiles.push(...(await findMarkdownFiles(sharedSkillsDir, { fileName: "SKILL.md" })));
|
|
33
|
+
const kitsDir = path.join(agentKitsPath, "kits");
|
|
34
|
+
try {
|
|
35
|
+
const kitEntries = await fs.readdir(kitsDir, { withFileTypes: true });
|
|
36
|
+
for (const kitEntry of kitEntries) {
|
|
37
|
+
if (!kitEntry.isDirectory()) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const kitSkillsDir = path.join(kitsDir, kitEntry.name, "primitives/skills");
|
|
41
|
+
skillFiles.push(...(await findMarkdownFiles(kitSkillsDir, { fileName: "SKILL.md" })));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// kits directory doesn't exist - ignore
|
|
46
|
+
}
|
|
47
|
+
return skillFiles;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate a single SKILL.md file.
|
|
51
|
+
*/
|
|
52
|
+
async function validateSkillFile(filePath) {
|
|
53
|
+
try {
|
|
54
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
55
|
+
const { frontmatter, body, hasFrontmatter } = parseSkillFrontmatter(content);
|
|
56
|
+
if (!hasFrontmatter) {
|
|
57
|
+
return {
|
|
58
|
+
file: filePath,
|
|
59
|
+
valid: false,
|
|
60
|
+
error: "skill missing YAML frontmatter; expected ---\\n...\\n--- at start of file",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const name = frontmatter["name"];
|
|
64
|
+
if (typeof name !== "string" || name.trim().length === 0) {
|
|
65
|
+
return {
|
|
66
|
+
file: filePath,
|
|
67
|
+
valid: false,
|
|
68
|
+
error: "skill missing required 'name' field in frontmatter",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const description = frontmatter["description"];
|
|
72
|
+
if (typeof description !== "string" || description.trim().length === 0) {
|
|
73
|
+
return {
|
|
74
|
+
file: filePath,
|
|
75
|
+
valid: false,
|
|
76
|
+
error: "skill missing required 'description' field in frontmatter",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (Object.prototype.hasOwnProperty.call(frontmatter, "allowedTools")) {
|
|
80
|
+
const allowedTools = frontmatter["allowedTools"];
|
|
81
|
+
if (!(typeof allowedTools === "string" ||
|
|
82
|
+
(Array.isArray(allowedTools) &&
|
|
83
|
+
allowedTools.every((entry) => typeof entry === "string")))) {
|
|
84
|
+
return {
|
|
85
|
+
file: filePath,
|
|
86
|
+
valid: false,
|
|
87
|
+
error: "skill 'allowedTools' must be a string or array of strings when present",
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (Object.prototype.hasOwnProperty.call(frontmatter, "hooks")) {
|
|
92
|
+
const hooks = frontmatter["hooks"];
|
|
93
|
+
if (!Array.isArray(hooks)) {
|
|
94
|
+
return {
|
|
95
|
+
file: filePath,
|
|
96
|
+
valid: false,
|
|
97
|
+
error: "skill 'hooks' must be an array when present",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
for (const hookEntry of hooks) {
|
|
101
|
+
if (!hookEntry || typeof hookEntry !== "object") {
|
|
102
|
+
return {
|
|
103
|
+
file: filePath,
|
|
104
|
+
valid: false,
|
|
105
|
+
error: "skill 'hooks' entries must be objects",
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const ref = hookEntry["ref"];
|
|
109
|
+
if (typeof ref !== "string" || ref.trim().length === 0) {
|
|
110
|
+
return {
|
|
111
|
+
file: filePath,
|
|
112
|
+
valid: false,
|
|
113
|
+
error: "skill 'hooks' entries must include a non-empty 'ref' string",
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const binding = hookEntry["binding"];
|
|
117
|
+
if (!binding || typeof binding !== "object") {
|
|
118
|
+
return {
|
|
119
|
+
file: filePath,
|
|
120
|
+
valid: false,
|
|
121
|
+
error: "skill 'hooks' entries must include a 'binding' object",
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const event = binding["event"];
|
|
125
|
+
if (typeof event !== "string" || event.trim().length === 0) {
|
|
126
|
+
return {
|
|
127
|
+
file: filePath,
|
|
128
|
+
valid: false,
|
|
129
|
+
error: "skill hook binding requires an 'event' string",
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (!["tool.before", "tool.after", "subagent.stop"].includes(event)) {
|
|
133
|
+
return {
|
|
134
|
+
file: filePath,
|
|
135
|
+
valid: false,
|
|
136
|
+
error: "skill hook binding event must be one of: tool.before, tool.after, subagent.stop",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (body.trim().length === 0) {
|
|
142
|
+
return {
|
|
143
|
+
file: filePath,
|
|
144
|
+
valid: false,
|
|
145
|
+
error: "skill body cannot be empty; content after frontmatter is required",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return { file: filePath, valid: true };
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
152
|
+
return { file: filePath, valid: false, error: errorMessage };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Validate all skill files in a kit repository.
|
|
157
|
+
*/
|
|
158
|
+
export async function validateSkills(agentKitsPath) {
|
|
159
|
+
const skillFiles = await findSkillFiles(agentKitsPath);
|
|
160
|
+
const results = [];
|
|
161
|
+
for (const file of skillFiles) {
|
|
162
|
+
results.push(await validateSkillFile(file));
|
|
163
|
+
}
|
|
164
|
+
return summarizeResults(results);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Main entry point for CLI execution.
|
|
168
|
+
*/
|
|
169
|
+
export async function main(args) {
|
|
170
|
+
let source = args[0];
|
|
171
|
+
if (!source) {
|
|
172
|
+
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
|
|
173
|
+
const fallbackPath = path.resolve(scriptDir, "../../test-kits");
|
|
174
|
+
try {
|
|
175
|
+
const stat = await fs.stat(fallbackPath);
|
|
176
|
+
if (stat.isDirectory()) {
|
|
177
|
+
source = fallbackPath;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
source = undefined;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!source) {
|
|
185
|
+
console.error(pc.red("Error: no kit repository path provided"));
|
|
186
|
+
console.error(pc.dim("Usage: validate-skills <path-to-kits-repo | org/repo[@ref]>"));
|
|
187
|
+
return 1;
|
|
188
|
+
}
|
|
189
|
+
let fetchResult;
|
|
190
|
+
try {
|
|
191
|
+
fetchResult = await resolveValidationSource(source);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
const message = formatValidationSourceError(error);
|
|
195
|
+
console.error(pc.red(`Error: ${message}`));
|
|
196
|
+
console.error(pc.dim("Usage: validate-skills <path-to-kits-repo | org/repo[@ref]>"));
|
|
197
|
+
return 1;
|
|
198
|
+
}
|
|
199
|
+
const agentKitsPath = fetchResult.localPath;
|
|
200
|
+
console.log(pc.dim(`Validating skills in: ${agentKitsPath}`));
|
|
201
|
+
try {
|
|
202
|
+
const summary = await validateSkills(agentKitsPath);
|
|
203
|
+
printValidationResults("Skill Primitive Validation", summary, agentKitsPath);
|
|
204
|
+
if (summary.failed > 0) {
|
|
205
|
+
console.error(pc.red(`Validation failed: ${summary.failed} skill(s) have invalid format`));
|
|
206
|
+
return 1;
|
|
207
|
+
}
|
|
208
|
+
if (summary.total === 0) {
|
|
209
|
+
console.log(pc.yellow("Warning: No skill files found"));
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
console.log(pc.green("All skill files are valid"));
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
console.error(pc.red(`Error during validation: ${error}`));
|
|
217
|
+
return 1;
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
await fetchResult.cleanup?.();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=validate-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-skills.js","sourceRoot":"","sources":["../../src/validation/validate-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent primitive validation script.
|
|
3
|
+
*
|
|
4
|
+
* Validates all subagent Markdown files in a kit repository against
|
|
5
|
+
* the canonical format specification:
|
|
6
|
+
* - YAML frontmatter required
|
|
7
|
+
* - `name` field required and non-empty
|
|
8
|
+
* - `description` field required and non-empty
|
|
9
|
+
* - `allowedTools`/`disallowedTools` optional but must be string or array of strings if present
|
|
10
|
+
* - `skills` optional but must be array of strings if present
|
|
11
|
+
* - `hooks` optional but must be an array of bindings if present
|
|
12
|
+
* - hook binding `event` limited to tool.before, tool.after, subagent.stop
|
|
13
|
+
* - Body content required and non-empty
|
|
14
|
+
* - Body must include <agent_role> tags
|
|
15
|
+
*
|
|
16
|
+
* Exits with code 0 on success, 1 on validation failure.
|
|
17
|
+
*/
|
|
18
|
+
import { type ValidationSummary } from "./utils.js";
|
|
19
|
+
/**
|
|
20
|
+
* Validate all subagent files in a kit repository.
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateSubagents(agentKitsPath: string): Promise<ValidationSummary>;
|
|
23
|
+
/**
|
|
24
|
+
* Main entry point for CLI execution.
|
|
25
|
+
*/
|
|
26
|
+
export declare function main(args: string[]): Promise<number>;
|
|
27
|
+
//# sourceMappingURL=validate-subagents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-subagents.d.ts","sourceRoot":"","sources":["../../src/validation/validate-subagents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAoNpB;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAS5B;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4D1D"}
|