@qodo/sdk 0.13.4 → 2.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +31 -118
- package/README.md +133 -121
- package/bin/qodo-skills.mjs +13 -0
- package/bundled-skills/code-review/SKILL.md +41 -0
- package/bundled-skills/pr-summary/SKILL.md +59 -0
- package/bundled-skills/test-gen/SKILL.md +47 -0
- package/dist/auth/index.browser.d.ts +38 -0
- package/dist/auth/index.browser.d.ts.map +1 -0
- package/dist/auth/index.browser.js +62 -0
- package/dist/auth/index.browser.js.map +1 -0
- package/dist/auth/index.d.ts +44 -30
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +57 -110
- package/dist/auth/index.js.map +1 -1
- package/dist/client/AgentsClient.d.ts +33 -0
- package/dist/client/AgentsClient.d.ts.map +1 -0
- package/dist/client/AgentsClient.js +40 -0
- package/dist/client/AgentsClient.js.map +1 -0
- package/dist/client/ArtifactsClient.d.ts +43 -0
- package/dist/client/ArtifactsClient.d.ts.map +1 -0
- package/dist/client/ArtifactsClient.js +54 -0
- package/dist/client/ArtifactsClient.js.map +1 -0
- package/dist/client/BulletinClient.d.ts +45 -0
- package/dist/client/BulletinClient.d.ts.map +1 -0
- package/dist/client/BulletinClient.js +51 -0
- package/dist/client/BulletinClient.js.map +1 -0
- package/dist/client/InfoClient.d.ts +58 -0
- package/dist/client/InfoClient.d.ts.map +1 -0
- package/dist/client/InfoClient.js +135 -0
- package/dist/client/InfoClient.js.map +1 -0
- package/dist/client/PipelineClient.d.ts +162 -0
- package/dist/client/PipelineClient.d.ts.map +1 -0
- package/dist/client/PipelineClient.js +340 -0
- package/dist/client/PipelineClient.js.map +1 -0
- package/dist/client/QarRegistryClient.d.ts +396 -0
- package/dist/client/QarRegistryClient.d.ts.map +1 -0
- package/dist/client/QarRegistryClient.js +536 -0
- package/dist/client/QarRegistryClient.js.map +1 -0
- package/dist/client/QodoClient.d.ts +296 -0
- package/dist/client/QodoClient.d.ts.map +1 -0
- package/dist/client/QodoClient.js +803 -0
- package/dist/client/QodoClient.js.map +1 -0
- package/dist/client/SpecsClient.d.ts +121 -0
- package/dist/client/SpecsClient.d.ts.map +1 -0
- package/dist/client/SpecsClient.js +252 -0
- package/dist/client/SpecsClient.js.map +1 -0
- package/dist/client/StateClient.d.ts +35 -0
- package/dist/client/StateClient.d.ts.map +1 -0
- package/dist/client/StateClient.js +36 -0
- package/dist/client/StateClient.js.map +1 -0
- package/dist/client/TaskClient.d.ts +706 -0
- package/dist/client/TaskClient.d.ts.map +1 -0
- package/dist/client/TaskClient.js +2522 -0
- package/dist/client/TaskClient.js.map +1 -0
- package/dist/client/ToolClient.d.ts +278 -0
- package/dist/client/ToolClient.d.ts.map +1 -0
- package/dist/client/ToolClient.js +1115 -0
- package/dist/client/ToolClient.js.map +1 -0
- package/dist/client/a2a/index.d.ts +10 -0
- package/dist/client/a2a/index.d.ts.map +1 -0
- package/dist/client/a2a/index.js +9 -0
- package/dist/client/a2a/index.js.map +1 -0
- package/dist/client/a2a/registerA2A.d.ts +170 -0
- package/dist/client/a2a/registerA2A.d.ts.map +1 -0
- package/dist/client/a2a/registerA2A.js +85 -0
- package/dist/client/a2a/registerA2A.js.map +1 -0
- package/dist/client/connection.d.ts +800 -0
- package/dist/client/connection.d.ts.map +1 -0
- package/dist/client/connection.js +2020 -0
- package/dist/client/connection.js.map +1 -0
- package/dist/client/errors.d.ts +735 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +921 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/index.d.ts +26 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +20 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/inlineGraph.d.ts +66 -0
- package/dist/client/inlineGraph.d.ts.map +1 -0
- package/dist/client/inlineGraph.js +500 -0
- package/dist/client/inlineGraph.js.map +1 -0
- package/dist/client/internal/thenable.d.ts +27 -0
- package/dist/client/internal/thenable.d.ts.map +1 -0
- package/dist/client/internal/thenable.js +31 -0
- package/dist/client/internal/thenable.js.map +1 -0
- package/dist/client/iterator.d.ts +32 -0
- package/dist/client/iterator.d.ts.map +1 -0
- package/dist/client/iterator.js +73 -0
- package/dist/client/iterator.js.map +1 -0
- package/dist/client/mcp/McpClientPool.browser.d.ts +76 -0
- package/dist/client/mcp/McpClientPool.browser.d.ts.map +1 -0
- package/dist/client/mcp/McpClientPool.browser.js +78 -0
- package/dist/client/mcp/McpClientPool.browser.js.map +1 -0
- package/dist/client/mcp/McpClientPool.d.ts +236 -0
- package/dist/client/mcp/McpClientPool.d.ts.map +1 -0
- package/dist/client/mcp/McpClientPool.js +585 -0
- package/dist/client/mcp/McpClientPool.js.map +1 -0
- package/dist/client/mcp/projection.d.ts +109 -0
- package/dist/client/mcp/projection.d.ts.map +1 -0
- package/dist/client/mcp/projection.js +446 -0
- package/dist/client/mcp/projection.js.map +1 -0
- package/dist/client/mcp/substituteEnv.browser.d.ts +18 -0
- package/dist/client/mcp/substituteEnv.browser.d.ts.map +1 -0
- package/dist/client/mcp/substituteEnv.browser.js +20 -0
- package/dist/client/mcp/substituteEnv.browser.js.map +1 -0
- package/dist/client/mcp/substituteEnv.d.ts +45 -0
- package/dist/client/mcp/substituteEnv.d.ts.map +1 -0
- package/dist/client/mcp/substituteEnv.js +63 -0
- package/dist/client/mcp/substituteEnv.js.map +1 -0
- package/dist/client/observers.d.ts +57 -0
- package/dist/client/observers.d.ts.map +1 -0
- package/dist/client/observers.js +203 -0
- package/dist/client/observers.js.map +1 -0
- package/dist/client/options.d.ts +269 -0
- package/dist/client/options.d.ts.map +1 -0
- package/dist/client/options.js +9 -0
- package/dist/client/options.js.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts +17 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.js +24 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.js.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.d.ts +33 -0
- package/dist/client/tools/_readlineApprovalPrompt.d.ts.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.js +90 -0
- package/dist/client/tools/_readlineApprovalPrompt.js.map +1 -0
- package/dist/client/tools/approval.d.ts +280 -0
- package/dist/client/tools/approval.d.ts.map +1 -0
- package/dist/client/tools/approval.js +229 -0
- package/dist/client/tools/approval.js.map +1 -0
- package/dist/client/tools/bindFunctionToolDefs.d.ts +156 -0
- package/dist/client/tools/bindFunctionToolDefs.d.ts.map +1 -0
- package/dist/client/tools/bindFunctionToolDefs.js +360 -0
- package/dist/client/tools/bindFunctionToolDefs.js.map +1 -0
- package/dist/client/tools/defineFunctionTool.d.ts +277 -0
- package/dist/client/tools/defineFunctionTool.d.ts.map +1 -0
- package/dist/client/tools/defineFunctionTool.js +190 -0
- package/dist/client/tools/defineFunctionTool.js.map +1 -0
- package/dist/client/transport.browser.d.ts +20 -0
- package/dist/client/transport.browser.d.ts.map +1 -0
- package/dist/client/transport.browser.js +29 -0
- package/dist/client/transport.browser.js.map +1 -0
- package/dist/client/transport.d.ts +47 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +102 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/transport.shared.d.ts +30 -0
- package/dist/client/transport.shared.d.ts.map +1 -0
- package/dist/client/transport.shared.js +40 -0
- package/dist/client/transport.shared.js.map +1 -0
- package/dist/client/uuid.d.ts +32 -0
- package/dist/client/uuid.d.ts.map +1 -0
- package/dist/client/uuid.js +65 -0
- package/dist/client/uuid.js.map +1 -0
- package/dist/index.d.ts +88 -39
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +166 -43
- package/dist/index.js.map +1 -1
- package/dist/observability/attributes.d.ts +136 -0
- package/dist/observability/attributes.d.ts.map +1 -0
- package/dist/observability/attributes.js +184 -0
- package/dist/observability/attributes.js.map +1 -0
- package/dist/observability/index.d.ts +14 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +11 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/resolveOTel.browser.d.ts +13 -0
- package/dist/observability/resolveOTel.browser.d.ts.map +1 -0
- package/dist/observability/resolveOTel.browser.js +14 -0
- package/dist/observability/resolveOTel.browser.js.map +1 -0
- package/dist/observability/resolveOTel.d.ts +28 -0
- package/dist/observability/resolveOTel.d.ts.map +1 -0
- package/dist/observability/resolveOTel.js +74 -0
- package/dist/observability/resolveOTel.js.map +1 -0
- package/dist/observability/spans.d.ts +198 -0
- package/dist/observability/spans.d.ts.map +1 -0
- package/dist/observability/spans.js +300 -0
- package/dist/observability/spans.js.map +1 -0
- package/dist/observability/traceContext.d.ts +51 -0
- package/dist/observability/traceContext.d.ts.map +1 -0
- package/dist/observability/traceContext.js +151 -0
- package/dist/observability/traceContext.js.map +1 -0
- package/dist/observability/transportMetrics.d.ts +58 -0
- package/dist/observability/transportMetrics.d.ts.map +1 -0
- package/dist/observability/transportMetrics.js +55 -0
- package/dist/observability/transportMetrics.js.map +1 -0
- package/dist/qar/agentSpec.d.ts +93 -0
- package/dist/qar/agentSpec.d.ts.map +1 -0
- package/dist/qar/agentSpec.js +184 -0
- package/dist/qar/agentSpec.js.map +1 -0
- package/dist/qar/clientEvents.d.ts +86 -0
- package/dist/qar/clientEvents.d.ts.map +1 -0
- package/dist/qar/clientEvents.js +36 -0
- package/dist/qar/clientEvents.js.map +1 -0
- package/dist/qar/envelopes.d.ts +227 -0
- package/dist/qar/envelopes.d.ts.map +1 -0
- package/dist/qar/envelopes.js +67 -0
- package/dist/qar/envelopes.js.map +1 -0
- package/dist/qar/generated/envelope.d.ts +332 -0
- package/dist/qar/generated/envelope.d.ts.map +1 -0
- package/dist/qar/generated/envelope.js +15 -0
- package/dist/qar/generated/envelope.js.map +1 -0
- package/dist/qar/generated/qar-info.d.ts +76 -0
- package/dist/qar/generated/qar-info.d.ts.map +1 -0
- package/dist/qar/generated/qar-info.js +15 -0
- package/dist/qar/generated/qar-info.js.map +1 -0
- package/dist/qar/generated/qodo-task-start-payload.d.ts +54 -0
- package/dist/qar/generated/qodo-task-start-payload.d.ts.map +1 -0
- package/dist/qar/generated/qodo-task-start-payload.js +15 -0
- package/dist/qar/generated/qodo-task-start-payload.js.map +1 -0
- package/dist/qar/ids.d.ts +19 -0
- package/dist/qar/ids.d.ts.map +1 -0
- package/dist/qar/ids.js +11 -0
- package/dist/qar/ids.js.map +1 -0
- package/dist/qar/index.d.ts +24 -0
- package/dist/qar/index.d.ts.map +1 -0
- package/dist/qar/index.js +16 -0
- package/dist/qar/index.js.map +1 -0
- package/dist/qar/info.d.ts +37 -0
- package/dist/qar/info.d.ts.map +1 -0
- package/dist/qar/info.js +17 -0
- package/dist/qar/info.js.map +1 -0
- package/dist/qar/json.d.ts +14 -0
- package/dist/qar/json.d.ts.map +1 -0
- package/dist/qar/json.js +9 -0
- package/dist/qar/json.js.map +1 -0
- package/dist/qar/payloads.d.ts +480 -0
- package/dist/qar/payloads.d.ts.map +1 -0
- package/dist/qar/payloads.js +37 -0
- package/dist/qar/payloads.js.map +1 -0
- package/dist/qar/specs.d.ts +604 -0
- package/dist/qar/specs.d.ts.map +1 -0
- package/dist/qar/specs.js +29 -0
- package/dist/qar/specs.js.map +1 -0
- package/dist/qar/taskEvents.d.ts +25 -0
- package/dist/qar/taskEvents.d.ts.map +1 -0
- package/dist/qar/taskEvents.js +22 -0
- package/dist/qar/taskEvents.js.map +1 -0
- package/dist/qar/trace.d.ts +12 -0
- package/dist/qar/trace.d.ts.map +1 -0
- package/dist/qar/trace.js +12 -0
- package/dist/qar/trace.js.map +1 -0
- package/dist/skills/activation.d.ts +177 -0
- package/dist/skills/activation.d.ts.map +1 -0
- package/dist/skills/activation.js +428 -0
- package/dist/skills/activation.js.map +1 -0
- package/dist/skills/cli/index.browser.d.ts +18 -0
- package/dist/skills/cli/index.browser.d.ts.map +1 -0
- package/dist/skills/cli/index.browser.js +27 -0
- package/dist/skills/cli/index.browser.js.map +1 -0
- package/dist/skills/cli/index.d.ts +37 -0
- package/dist/skills/cli/index.d.ts.map +1 -0
- package/dist/skills/cli/index.js +494 -0
- package/dist/skills/cli/index.js.map +1 -0
- package/dist/skills/events.d.ts +255 -0
- package/dist/skills/events.d.ts.map +1 -0
- package/dist/skills/events.js +224 -0
- package/dist/skills/events.js.map +1 -0
- package/dist/skills/index.d.ts +45 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +34 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/inject.d.ts +57 -0
- package/dist/skills/inject.d.ts.map +1 -0
- package/dist/skills/inject.js +162 -0
- package/dist/skills/inject.js.map +1 -0
- package/dist/skills/lockfile.browser.d.ts +56 -0
- package/dist/skills/lockfile.browser.d.ts.map +1 -0
- package/dist/skills/lockfile.browser.js +55 -0
- package/dist/skills/lockfile.browser.js.map +1 -0
- package/dist/skills/lockfile.d.ts +137 -0
- package/dist/skills/lockfile.d.ts.map +1 -0
- package/dist/skills/lockfile.js +423 -0
- package/dist/skills/lockfile.js.map +1 -0
- package/dist/skills/manager.browser.d.ts +94 -0
- package/dist/skills/manager.browser.d.ts.map +1 -0
- package/dist/skills/manager.browser.js +159 -0
- package/dist/skills/manager.browser.js.map +1 -0
- package/dist/skills/manager.d.ts +362 -0
- package/dist/skills/manager.d.ts.map +1 -0
- package/dist/skills/manager.js +1386 -0
- package/dist/skills/manager.js.map +1 -0
- package/dist/skills/mcp/index.d.ts +15 -0
- package/dist/skills/mcp/index.d.ts.map +1 -0
- package/dist/skills/mcp/index.js +12 -0
- package/dist/skills/mcp/index.js.map +1 -0
- package/dist/skills/mcp/path.browser.d.ts +27 -0
- package/dist/skills/mcp/path.browser.d.ts.map +1 -0
- package/dist/skills/mcp/path.browser.js +33 -0
- package/dist/skills/mcp/path.browser.js.map +1 -0
- package/dist/skills/mcp/path.d.ts +57 -0
- package/dist/skills/mcp/path.d.ts.map +1 -0
- package/dist/skills/mcp/path.js +150 -0
- package/dist/skills/mcp/path.js.map +1 -0
- package/dist/skills/mcp/server.browser.d.ts +32 -0
- package/dist/skills/mcp/server.browser.d.ts.map +1 -0
- package/dist/skills/mcp/server.browser.js +53 -0
- package/dist/skills/mcp/server.browser.js.map +1 -0
- package/dist/skills/mcp/server.d.ts +144 -0
- package/dist/skills/mcp/server.d.ts.map +1 -0
- package/dist/skills/mcp/server.js +841 -0
- package/dist/skills/mcp/server.js.map +1 -0
- package/dist/skills/mcp/types.d.ts +72 -0
- package/dist/skills/mcp/types.d.ts.map +1 -0
- package/dist/skills/mcp/types.js +20 -0
- package/dist/skills/mcp/types.js.map +1 -0
- package/dist/skills/mcp/wireDefs.d.ts +58 -0
- package/dist/skills/mcp/wireDefs.d.ts.map +1 -0
- package/dist/skills/mcp/wireDefs.js +141 -0
- package/dist/skills/mcp/wireDefs.js.map +1 -0
- package/dist/skills/parser.d.ts +63 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +755 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/prefilter.d.ts +104 -0
- package/dist/skills/prefilter.d.ts.map +1 -0
- package/dist/skills/prefilter.js +398 -0
- package/dist/skills/prefilter.js.map +1 -0
- package/dist/skills/preprocess.d.ts +169 -0
- package/dist/skills/preprocess.d.ts.map +1 -0
- package/dist/skills/preprocess.js +535 -0
- package/dist/skills/preprocess.js.map +1 -0
- package/dist/skills/render.d.ts +83 -0
- package/dist/skills/render.d.ts.map +1 -0
- package/dist/skills/render.js +397 -0
- package/dist/skills/render.js.map +1 -0
- package/dist/skills/sources/index.browser.d.ts +29 -0
- package/dist/skills/sources/index.browser.d.ts.map +1 -0
- package/dist/skills/sources/index.browser.js +16 -0
- package/dist/skills/sources/index.browser.js.map +1 -0
- package/dist/skills/sources/index.d.ts +59 -0
- package/dist/skills/sources/index.d.ts.map +1 -0
- package/dist/skills/sources/index.js +471 -0
- package/dist/skills/sources/index.js.map +1 -0
- package/dist/skills/sources/walk.browser.d.ts +17 -0
- package/dist/skills/sources/walk.browser.d.ts.map +1 -0
- package/dist/skills/sources/walk.browser.js +19 -0
- package/dist/skills/sources/walk.browser.js.map +1 -0
- package/dist/skills/sources/walk.d.ts +68 -0
- package/dist/skills/sources/walk.d.ts.map +1 -0
- package/dist/skills/sources/walk.js +264 -0
- package/dist/skills/sources/walk.js.map +1 -0
- package/dist/skills/substitute.d.ts +87 -0
- package/dist/skills/substitute.d.ts.map +1 -0
- package/dist/skills/substitute.js +322 -0
- package/dist/skills/substitute.js.map +1 -0
- package/dist/skills/testing/SkillKit.browser.d.ts +62 -0
- package/dist/skills/testing/SkillKit.browser.d.ts.map +1 -0
- package/dist/skills/testing/SkillKit.browser.js +41 -0
- package/dist/skills/testing/SkillKit.browser.js.map +1 -0
- package/dist/skills/testing/SkillKit.d.ts +130 -0
- package/dist/skills/testing/SkillKit.d.ts.map +1 -0
- package/dist/skills/testing/SkillKit.js +316 -0
- package/dist/skills/testing/SkillKit.js.map +1 -0
- package/dist/skills/testing/index.d.ts +9 -0
- package/dist/skills/testing/index.d.ts.map +1 -0
- package/dist/skills/testing/index.js +8 -0
- package/dist/skills/testing/index.js.map +1 -0
- package/dist/skills/trust.d.ts +72 -0
- package/dist/skills/trust.d.ts.map +1 -0
- package/dist/skills/trust.js +183 -0
- package/dist/skills/trust.js.map +1 -0
- package/dist/skills/types.d.ts +627 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +85 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validator.d.ts +95 -0
- package/dist/skills/validator.d.ts.map +1 -0
- package/dist/skills/validator.js +486 -0
- package/dist/skills/validator.js.map +1 -0
- package/dist/tracing/PipelineTracer.d.ts +35 -22
- package/dist/tracing/PipelineTracer.d.ts.map +1 -1
- package/dist/tracing/PipelineTracer.js +106 -61
- package/dist/tracing/PipelineTracer.js.map +1 -1
- package/dist/tracing/SdkTracer.d.ts +63 -61
- package/dist/tracing/SdkTracer.d.ts.map +1 -1
- package/dist/tracing/SdkTracer.js +185 -177
- package/dist/tracing/SdkTracer.js.map +1 -1
- package/dist/tracing/index.d.ts +10 -1
- package/dist/tracing/index.d.ts.map +1 -1
- package/dist/tracing/index.js +9 -0
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/types.d.ts +89 -16
- package/dist/tracing/types.d.ts.map +1 -1
- package/dist/tracing/types.js +17 -4
- package/dist/tracing/types.js.map +1 -1
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +10 -20
- package/dist/version.js.map +1 -1
- package/package.json +53 -39
- package/.claude/skills/qodo-agent/SKILL.md +0 -974
- package/.claude/skills/qodo-agent/assets/programmatic-agent.ts +0 -407
- package/.claude/skills/qodo-agent/references/builtin-tools.md +0 -342
- package/.claude/skills/qodo-agent/references/common-issues.md +0 -537
- package/bin/rg +0 -0
- package/dist/api/agent.d.ts +0 -105
- package/dist/api/agent.d.ts.map +0 -1
- package/dist/api/agent.js +0 -963
- package/dist/api/agent.js.map +0 -1
- package/dist/api/analytics.d.ts +0 -43
- package/dist/api/analytics.d.ts.map +0 -1
- package/dist/api/analytics.js +0 -163
- package/dist/api/analytics.js.map +0 -1
- package/dist/api/http.d.ts +0 -5
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -62
- package/dist/api/http.js.map +0 -1
- package/dist/api/index.d.ts +0 -12
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -17
- package/dist/api/index.js.map +0 -1
- package/dist/api/taskTracking.d.ts +0 -54
- package/dist/api/taskTracking.d.ts.map +0 -1
- package/dist/api/taskTracking.js +0 -208
- package/dist/api/taskTracking.js.map +0 -1
- package/dist/api/types.d.ts +0 -93
- package/dist/api/types.d.ts.map +0 -1
- package/dist/api/types.js +0 -2
- package/dist/api/types.js.map +0 -1
- package/dist/api/utils.d.ts +0 -8
- package/dist/api/utils.d.ts.map +0 -1
- package/dist/api/utils.js +0 -63
- package/dist/api/utils.js.map +0 -1
- package/dist/api/websocket.d.ts +0 -203
- package/dist/api/websocket.d.ts.map +0 -1
- package/dist/api/websocket.js +0 -1166
- package/dist/api/websocket.js.map +0 -1
- package/dist/bin/install-skill.d.ts +0 -14
- package/dist/bin/install-skill.d.ts.map +0 -1
- package/dist/bin/install-skill.js +0 -125
- package/dist/bin/install-skill.js.map +0 -1
- package/dist/bin/run-helpers.d.ts +0 -34
- package/dist/bin/run-helpers.d.ts.map +0 -1
- package/dist/bin/run-helpers.js +0 -186
- package/dist/bin/run-helpers.js.map +0 -1
- package/dist/bin/run.d.ts +0 -13
- package/dist/bin/run.d.ts.map +0 -1
- package/dist/bin/run.js +0 -57
- package/dist/bin/run.js.map +0 -1
- package/dist/clients/index.d.ts +0 -10
- package/dist/clients/index.d.ts.map +0 -1
- package/dist/clients/index.js +0 -8
- package/dist/clients/index.js.map +0 -1
- package/dist/clients/info/InfoClient.d.ts +0 -37
- package/dist/clients/info/InfoClient.d.ts.map +0 -1
- package/dist/clients/info/InfoClient.js +0 -69
- package/dist/clients/info/InfoClient.js.map +0 -1
- package/dist/clients/info/index.d.ts +0 -4
- package/dist/clients/info/index.d.ts.map +0 -1
- package/dist/clients/info/index.js +0 -2
- package/dist/clients/info/index.js.map +0 -1
- package/dist/clients/info/types.d.ts +0 -21
- package/dist/clients/info/types.d.ts.map +0 -1
- package/dist/clients/info/types.js +0 -2
- package/dist/clients/info/types.js.map +0 -1
- package/dist/clients/sessions/SessionsClient.d.ts +0 -34
- package/dist/clients/sessions/SessionsClient.d.ts.map +0 -1
- package/dist/clients/sessions/SessionsClient.js +0 -71
- package/dist/clients/sessions/SessionsClient.js.map +0 -1
- package/dist/clients/sessions/index.d.ts +0 -4
- package/dist/clients/sessions/index.d.ts.map +0 -1
- package/dist/clients/sessions/index.js +0 -2
- package/dist/clients/sessions/index.js.map +0 -1
- package/dist/clients/sessions/types.d.ts +0 -20
- package/dist/clients/sessions/types.d.ts.map +0 -1
- package/dist/clients/sessions/types.js +0 -2
- package/dist/clients/sessions/types.js.map +0 -1
- package/dist/clients/tools/ToolsClient.d.ts +0 -39
- package/dist/clients/tools/ToolsClient.d.ts.map +0 -1
- package/dist/clients/tools/ToolsClient.js +0 -95
- package/dist/clients/tools/ToolsClient.js.map +0 -1
- package/dist/clients/tools/index.d.ts +0 -4
- package/dist/clients/tools/index.d.ts.map +0 -1
- package/dist/clients/tools/index.js +0 -2
- package/dist/clients/tools/index.js.map +0 -1
- package/dist/clients/tools/types.d.ts +0 -14
- package/dist/clients/tools/types.d.ts.map +0 -1
- package/dist/clients/tools/types.js +0 -2
- package/dist/clients/tools/types.js.map +0 -1
- package/dist/config/ConfigManager.d.ts +0 -43
- package/dist/config/ConfigManager.d.ts.map +0 -1
- package/dist/config/ConfigManager.js +0 -472
- package/dist/config/ConfigManager.js.map +0 -1
- package/dist/config/index.d.ts +0 -6
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -7
- package/dist/config/index.js.map +0 -1
- package/dist/config/urlConfig.d.ts +0 -15
- package/dist/config/urlConfig.d.ts.map +0 -1
- package/dist/config/urlConfig.js +0 -75
- package/dist/config/urlConfig.js.map +0 -1
- package/dist/constants/errors.d.ts +0 -2
- package/dist/constants/errors.d.ts.map +0 -1
- package/dist/constants/errors.js +0 -2
- package/dist/constants/errors.js.map +0 -1
- package/dist/constants/index.d.ts +0 -7
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js +0 -11
- package/dist/constants/index.js.map +0 -1
- package/dist/constants/tools.d.ts +0 -4
- package/dist/constants/tools.d.ts.map +0 -1
- package/dist/constants/tools.js +0 -4
- package/dist/constants/tools.js.map +0 -1
- package/dist/constants/versions.d.ts +0 -2
- package/dist/constants/versions.d.ts.map +0 -1
- package/dist/constants/versions.js +0 -2
- package/dist/constants/versions.js.map +0 -1
- package/dist/context/buildUserContext.d.ts +0 -18
- package/dist/context/buildUserContext.d.ts.map +0 -1
- package/dist/context/buildUserContext.js +0 -34
- package/dist/context/buildUserContext.js.map +0 -1
- package/dist/context/index.d.ts +0 -9
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -9
- package/dist/context/index.js.map +0 -1
- package/dist/context/messageManager.d.ts +0 -42
- package/dist/context/messageManager.d.ts.map +0 -1
- package/dist/context/messageManager.js +0 -322
- package/dist/context/messageManager.js.map +0 -1
- package/dist/context/taskFocus.d.ts +0 -2
- package/dist/context/taskFocus.d.ts.map +0 -1
- package/dist/context/taskFocus.js +0 -26
- package/dist/context/taskFocus.js.map +0 -1
- package/dist/context/userInput.d.ts +0 -3
- package/dist/context/userInput.d.ts.map +0 -1
- package/dist/context/userInput.js +0 -20
- package/dist/context/userInput.js.map +0 -1
- package/dist/mcp/MCPManager.d.ts +0 -109
- package/dist/mcp/MCPManager.d.ts.map +0 -1
- package/dist/mcp/MCPManager.js +0 -592
- package/dist/mcp/MCPManager.js.map +0 -1
- package/dist/mcp/approvedTools.d.ts +0 -4
- package/dist/mcp/approvedTools.d.ts.map +0 -1
- package/dist/mcp/approvedTools.js +0 -19
- package/dist/mcp/approvedTools.js.map +0 -1
- package/dist/mcp/baseServer.d.ts +0 -75
- package/dist/mcp/baseServer.d.ts.map +0 -1
- package/dist/mcp/baseServer.js +0 -107
- package/dist/mcp/baseServer.js.map +0 -1
- package/dist/mcp/builtinServers.d.ts +0 -15
- package/dist/mcp/builtinServers.d.ts.map +0 -1
- package/dist/mcp/builtinServers.js +0 -141
- package/dist/mcp/builtinServers.js.map +0 -1
- package/dist/mcp/dynamicBEServer.d.ts +0 -20
- package/dist/mcp/dynamicBEServer.d.ts.map +0 -1
- package/dist/mcp/dynamicBEServer.js +0 -52
- package/dist/mcp/dynamicBEServer.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -18
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -23
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/mcpInitialization.d.ts +0 -2
- package/dist/mcp/mcpInitialization.d.ts.map +0 -1
- package/dist/mcp/mcpInitialization.js +0 -56
- package/dist/mcp/mcpInitialization.js.map +0 -1
- package/dist/mcp/servers/filesystem.d.ts +0 -44
- package/dist/mcp/servers/filesystem.d.ts.map +0 -1
- package/dist/mcp/servers/filesystem.js +0 -776
- package/dist/mcp/servers/filesystem.js.map +0 -1
- package/dist/mcp/servers/git.d.ts +0 -18
- package/dist/mcp/servers/git.d.ts.map +0 -1
- package/dist/mcp/servers/git.js +0 -441
- package/dist/mcp/servers/git.js.map +0 -1
- package/dist/mcp/servers/ripgrep.d.ts +0 -39
- package/dist/mcp/servers/ripgrep.d.ts.map +0 -1
- package/dist/mcp/servers/ripgrep.js +0 -550
- package/dist/mcp/servers/ripgrep.js.map +0 -1
- package/dist/mcp/servers/shell.d.ts +0 -20
- package/dist/mcp/servers/shell.d.ts.map +0 -1
- package/dist/mcp/servers/shell.js +0 -519
- package/dist/mcp/servers/shell.js.map +0 -1
- package/dist/mcp/serversRegistry.d.ts +0 -55
- package/dist/mcp/serversRegistry.d.ts.map +0 -1
- package/dist/mcp/serversRegistry.js +0 -416
- package/dist/mcp/serversRegistry.js.map +0 -1
- package/dist/mcp/toolProcessor.d.ts +0 -82
- package/dist/mcp/toolProcessor.d.ts.map +0 -1
- package/dist/mcp/toolProcessor.js +0 -392
- package/dist/mcp/toolProcessor.js.map +0 -1
- package/dist/mcp/types.d.ts +0 -29
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/mcp/types.js +0 -2
- package/dist/mcp/types.js.map +0 -1
- package/dist/messages/index.d.ts +0 -8
- package/dist/messages/index.d.ts.map +0 -1
- package/dist/messages/index.js +0 -7
- package/dist/messages/index.js.map +0 -1
- package/dist/messages/openai.d.ts +0 -26
- package/dist/messages/openai.d.ts.map +0 -1
- package/dist/messages/openai.js +0 -55
- package/dist/messages/openai.js.map +0 -1
- package/dist/messages/types.d.ts +0 -73
- package/dist/messages/types.d.ts.map +0 -1
- package/dist/messages/types.js +0 -78
- package/dist/messages/types.js.map +0 -1
- package/dist/parser/index.d.ts +0 -72
- package/dist/parser/index.d.ts.map +0 -1
- package/dist/parser/index.js +0 -967
- package/dist/parser/index.js.map +0 -1
- package/dist/parser/types.d.ts +0 -153
- package/dist/parser/types.d.ts.map +0 -1
- package/dist/parser/types.js +0 -6
- package/dist/parser/types.js.map +0 -1
- package/dist/parser/utils.d.ts +0 -18
- package/dist/parser/utils.d.ts.map +0 -1
- package/dist/parser/utils.js +0 -64
- package/dist/parser/utils.js.map +0 -1
- package/dist/sdk/QodoSDK.d.ts +0 -218
- package/dist/sdk/QodoSDK.d.ts.map +0 -1
- package/dist/sdk/QodoSDK.js +0 -1115
- package/dist/sdk/QodoSDK.js.map +0 -1
- package/dist/sdk/artifacts.d.ts +0 -156
- package/dist/sdk/artifacts.d.ts.map +0 -1
- package/dist/sdk/artifacts.js +0 -166
- package/dist/sdk/artifacts.js.map +0 -1
- package/dist/sdk/bootstrap.d.ts +0 -16
- package/dist/sdk/bootstrap.d.ts.map +0 -1
- package/dist/sdk/bootstrap.js +0 -28
- package/dist/sdk/bootstrap.js.map +0 -1
- package/dist/sdk/builders.d.ts +0 -54
- package/dist/sdk/builders.d.ts.map +0 -1
- package/dist/sdk/builders.js +0 -117
- package/dist/sdk/builders.js.map +0 -1
- package/dist/sdk/defaults.d.ts +0 -11
- package/dist/sdk/defaults.d.ts.map +0 -1
- package/dist/sdk/defaults.js +0 -39
- package/dist/sdk/defaults.js.map +0 -1
- package/dist/sdk/discovery.d.ts +0 -2
- package/dist/sdk/discovery.d.ts.map +0 -1
- package/dist/sdk/discovery.js +0 -25
- package/dist/sdk/discovery.js.map +0 -1
- package/dist/sdk/events.d.ts +0 -269
- package/dist/sdk/events.d.ts.map +0 -1
- package/dist/sdk/events.js +0 -69
- package/dist/sdk/events.js.map +0 -1
- package/dist/sdk/exit-expression.d.ts +0 -13
- package/dist/sdk/exit-expression.d.ts.map +0 -1
- package/dist/sdk/exit-expression.js +0 -35
- package/dist/sdk/exit-expression.js.map +0 -1
- package/dist/sdk/index.d.ts +0 -17
- package/dist/sdk/index.d.ts.map +0 -1
- package/dist/sdk/index.js +0 -17
- package/dist/sdk/index.js.map +0 -1
- package/dist/sdk/middleware.d.ts +0 -59
- package/dist/sdk/middleware.d.ts.map +0 -1
- package/dist/sdk/middleware.js +0 -69
- package/dist/sdk/middleware.js.map +0 -1
- package/dist/sdk/pipeline/PipelineBuilder.d.ts +0 -79
- package/dist/sdk/pipeline/PipelineBuilder.d.ts.map +0 -1
- package/dist/sdk/pipeline/PipelineBuilder.js +0 -129
- package/dist/sdk/pipeline/PipelineBuilder.js.map +0 -1
- package/dist/sdk/pipeline/PipelineRunner.d.ts +0 -28
- package/dist/sdk/pipeline/PipelineRunner.d.ts.map +0 -1
- package/dist/sdk/pipeline/PipelineRunner.js +0 -326
- package/dist/sdk/pipeline/PipelineRunner.js.map +0 -1
- package/dist/sdk/pipeline/compiler.d.ts +0 -24
- package/dist/sdk/pipeline/compiler.d.ts.map +0 -1
- package/dist/sdk/pipeline/compiler.js +0 -199
- package/dist/sdk/pipeline/compiler.js.map +0 -1
- package/dist/sdk/pipeline/declarative.d.ts +0 -34
- package/dist/sdk/pipeline/declarative.d.ts.map +0 -1
- package/dist/sdk/pipeline/declarative.js +0 -9
- package/dist/sdk/pipeline/declarative.js.map +0 -1
- package/dist/sdk/pipeline/index.d.ts +0 -20
- package/dist/sdk/pipeline/index.d.ts.map +0 -1
- package/dist/sdk/pipeline/index.js +0 -19
- package/dist/sdk/pipeline/index.js.map +0 -1
- package/dist/sdk/pipeline/types.d.ts +0 -93
- package/dist/sdk/pipeline/types.d.ts.map +0 -1
- package/dist/sdk/pipeline/types.js +0 -10
- package/dist/sdk/pipeline/types.js.map +0 -1
- package/dist/sdk/policies.d.ts +0 -163
- package/dist/sdk/policies.d.ts.map +0 -1
- package/dist/sdk/policies.js +0 -243
- package/dist/sdk/policies.js.map +0 -1
- package/dist/sdk/runner/AgentRunner.d.ts +0 -22
- package/dist/sdk/runner/AgentRunner.d.ts.map +0 -1
- package/dist/sdk/runner/AgentRunner.js +0 -222
- package/dist/sdk/runner/AgentRunner.js.map +0 -1
- package/dist/sdk/runner/finalize.d.ts +0 -56
- package/dist/sdk/runner/finalize.d.ts.map +0 -1
- package/dist/sdk/runner/finalize.js +0 -155
- package/dist/sdk/runner/finalize.js.map +0 -1
- package/dist/sdk/runner/formats.d.ts +0 -7
- package/dist/sdk/runner/formats.d.ts.map +0 -1
- package/dist/sdk/runner/formats.js +0 -76
- package/dist/sdk/runner/formats.js.map +0 -1
- package/dist/sdk/runner/index.d.ts +0 -9
- package/dist/sdk/runner/index.d.ts.map +0 -1
- package/dist/sdk/runner/index.js +0 -9
- package/dist/sdk/runner/index.js.map +0 -1
- package/dist/sdk/runner/progress.d.ts +0 -3
- package/dist/sdk/runner/progress.d.ts.map +0 -1
- package/dist/sdk/runner/progress.js +0 -16
- package/dist/sdk/runner/progress.js.map +0 -1
- package/dist/sdk/schemas.d.ts +0 -72
- package/dist/sdk/schemas.d.ts.map +0 -1
- package/dist/sdk/schemas.js +0 -282
- package/dist/sdk/schemas.js.map +0 -1
- package/dist/sdk/trigger-context.d.ts +0 -24
- package/dist/sdk/trigger-context.d.ts.map +0 -1
- package/dist/sdk/trigger-context.js +0 -136
- package/dist/sdk/trigger-context.js.map +0 -1
- package/dist/session/SessionContext.d.ts +0 -89
- package/dist/session/SessionContext.d.ts.map +0 -1
- package/dist/session/SessionContext.js +0 -410
- package/dist/session/SessionContext.js.map +0 -1
- package/dist/session/environment.d.ts +0 -52
- package/dist/session/environment.d.ts.map +0 -1
- package/dist/session/environment.js +0 -27
- package/dist/session/environment.js.map +0 -1
- package/dist/session/history.d.ts +0 -18
- package/dist/session/history.d.ts.map +0 -1
- package/dist/session/history.js +0 -68
- package/dist/session/history.js.map +0 -1
- package/dist/session/index.d.ts +0 -10
- package/dist/session/index.d.ts.map +0 -1
- package/dist/session/index.js +0 -9
- package/dist/session/index.js.map +0 -1
- package/dist/session/serverData.d.ts +0 -38
- package/dist/session/serverData.d.ts.map +0 -1
- package/dist/session/serverData.js +0 -261
- package/dist/session/serverData.js.map +0 -1
- package/dist/tracing/pipelineHelpers.d.ts +0 -29
- package/dist/tracing/pipelineHelpers.d.ts.map +0 -1
- package/dist/tracing/pipelineHelpers.js +0 -224
- package/dist/tracing/pipelineHelpers.js.map +0 -1
- package/dist/tracking/Tracker.d.ts +0 -55
- package/dist/tracking/Tracker.d.ts.map +0 -1
- package/dist/tracking/Tracker.js +0 -217
- package/dist/tracking/Tracker.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -8
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -8
- package/dist/tracking/index.js.map +0 -1
- package/dist/tracking/schemas.d.ts +0 -292
- package/dist/tracking/schemas.d.ts.map +0 -1
- package/dist/tracking/schemas.js +0 -91
- package/dist/tracking/schemas.js.map +0 -1
- package/dist/utils/extractSetFlags.d.ts +0 -6
- package/dist/utils/extractSetFlags.d.ts.map +0 -1
- package/dist/utils/extractSetFlags.js +0 -16
- package/dist/utils/extractSetFlags.js.map +0 -1
- package/dist/utils/formatTimeAgo.d.ts +0 -2
- package/dist/utils/formatTimeAgo.d.ts.map +0 -1
- package/dist/utils/formatTimeAgo.js +0 -20
- package/dist/utils/formatTimeAgo.js.map +0 -1
- package/dist/utils/index.d.ts +0 -12
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -12
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/machineId.d.ts +0 -14
- package/dist/utils/machineId.d.ts.map +0 -1
- package/dist/utils/machineId.js +0 -66
- package/dist/utils/machineId.js.map +0 -1
- package/dist/utils/pathUtils.d.ts +0 -22
- package/dist/utils/pathUtils.d.ts.map +0 -1
- package/dist/utils/pathUtils.js +0 -54
- package/dist/utils/pathUtils.js.map +0 -1
- package/scripts/download-ripgrep.js +0 -269
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills foundation types.
|
|
3
|
+
*
|
|
4
|
+
* SDK 2.0 is a thin typed wire binding to QAR (Qodo Agent Runtime); it does
|
|
5
|
+
* not execute agents. Skills here are a *consumer-side* concept: the SDK
|
|
6
|
+
* reads `SKILL.md` files from the configured sources, builds an in-memory
|
|
7
|
+
* catalog, and injects a slim `<available_skills>` index into
|
|
8
|
+
* `InlineAgentSpec.instructions` so the QAR-side model loop sees what
|
|
9
|
+
* skills exist. Runtime body loading lives in the `qodo-skills` MCP
|
|
10
|
+
* server.
|
|
11
|
+
*
|
|
12
|
+
* The frontmatter shape mirrors the Agent Skills open standard
|
|
13
|
+
* (`name` / `description` / `when_to_use` / `allowed-tools` / ...) plus
|
|
14
|
+
* Qodo extensions (`vendor`, `version`, `min_sdk_version`, `requires`).
|
|
15
|
+
* Unknown fields are preserved on `unknown_fields` so forward-compat is
|
|
16
|
+
* by silence, not error.
|
|
17
|
+
*/
|
|
18
|
+
/** Preprocessing config defaults — exported so tests stay in sync with the runtime. */
|
|
19
|
+
export const PREPROCESS_DEFAULT_TIMEOUT_MS = 5000;
|
|
20
|
+
export const PREPROCESS_DEFAULT_MAX_OUTPUT_BYTES = 64 * 1024;
|
|
21
|
+
/** Default top-K when `SkillsConfig.activation.topK` is unset. */
|
|
22
|
+
export const ACTIVATION_DEFAULT_TOP_K = 8;
|
|
23
|
+
/** Default minimum cosine score when `SkillsConfig.activation.minScore` is unset. */
|
|
24
|
+
export const ACTIVATION_DEFAULT_MIN_SCORE = 0.35;
|
|
25
|
+
/** Resolved cap defaults used when `SkillsConfig.requires` fields are absent. */
|
|
26
|
+
export const REQUIRES_DEFAULT_MAX_DEPTH = 3;
|
|
27
|
+
export const REQUIRES_DEFAULT_MAX_TRANSITIVE = 8;
|
|
28
|
+
export const REQUIRES_DEFAULT_MAX_TRANSITIVE_TOKENS = 50 * 1024;
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Constants — wire defaults the renderer + parser refer to
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
/**
|
|
33
|
+
* Per-entry `description + when_to_use` cap in the slim index. Mirrors
|
|
34
|
+
* Claude Code's `SLASH_COMMAND_TOOL_CHAR_BUDGET` so OSS skills land
|
|
35
|
+
* identically.
|
|
36
|
+
*/
|
|
37
|
+
export const SLIM_INDEX_ENTRY_BUDGET = 1536;
|
|
38
|
+
/** Default total cap on the `<available_skills>` block. */
|
|
39
|
+
export const DEFAULT_INDEX_CHAR_BUDGET = 8000;
|
|
40
|
+
/** Hard cap on `SKILL.md` body size — exclusion threshold. */
|
|
41
|
+
export const SKILL_BODY_HARD_BYTES = 50 * 1024;
|
|
42
|
+
/**
|
|
43
|
+
* Hard cap on total `SKILL.md` file size (frontmatter + body + structure)
|
|
44
|
+
* enforced *before* `fs.readFile` — files larger than this are rejected
|
|
45
|
+
* with `sdk.skill.error` severity `'error'` and never read into memory.
|
|
46
|
+
* Comfortably above `SKILL_BODY_HARD_BYTES` so a generous frontmatter
|
|
47
|
+
* fits, but tight enough to defend against a third-party `package` /
|
|
48
|
+
* `cli-fetched` source shipping multi-megabyte SKILL.md files —
|
|
49
|
+
* defense-in-depth against DoS via unbounded `fs.readFile`.
|
|
50
|
+
*/
|
|
51
|
+
export const SKILL_FILE_HARD_BYTES = 256 * 1024;
|
|
52
|
+
/** Soft cap on `SKILL.md` body lines — emits warning, does not exclude. */
|
|
53
|
+
export const SKILL_BODY_SOFT_LINES = 500;
|
|
54
|
+
/** Max chars in a skill `name`. Reserved-word + character-class checks live in the validator. */
|
|
55
|
+
export const SKILL_NAME_MAX_CHARS = 64;
|
|
56
|
+
/** Reserved words a skill `name` cannot include (case-insensitive substring). */
|
|
57
|
+
export const SKILL_NAME_RESERVED_WORDS = ['anthropic', 'claude'];
|
|
58
|
+
/** Default `vendor` per source type. Frontmatter `vendor:` overrides. */
|
|
59
|
+
export const SOURCE_DEFAULT_VENDORS = {
|
|
60
|
+
project: 'local',
|
|
61
|
+
config: 'local',
|
|
62
|
+
user: 'user',
|
|
63
|
+
package: '__from_package_name__', // sentinel — manager resolves to packageName
|
|
64
|
+
'cli-fetched': '__from_ref__', // sentinel — manager resolves to <vendor> portion of ref
|
|
65
|
+
bundled: 'qodo',
|
|
66
|
+
};
|
|
67
|
+
/** Trust tier per source type. Mirror of `SkillTrustTier` documentation. */
|
|
68
|
+
export const SOURCE_TRUST_TIERS = {
|
|
69
|
+
project: 'trusted',
|
|
70
|
+
config: 'trusted',
|
|
71
|
+
bundled: 'trusted',
|
|
72
|
+
user: 'operator',
|
|
73
|
+
package: 'third-party',
|
|
74
|
+
'cli-fetched': 'third-party',
|
|
75
|
+
};
|
|
76
|
+
/** Default precedence (highest first). */
|
|
77
|
+
export const DEFAULT_SOURCE_ORDER = [
|
|
78
|
+
'project',
|
|
79
|
+
'config',
|
|
80
|
+
'user',
|
|
81
|
+
'package',
|
|
82
|
+
'cli-fetched',
|
|
83
|
+
'bundled',
|
|
84
|
+
];
|
|
85
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA8MH,uFAAuF;AACvF,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAClD,MAAM,CAAC,MAAM,mCAAmC,GAAG,EAAE,GAAG,IAAI,CAAC;AAe7D,kEAAkE;AAClE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,qFAAqF;AACrF,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAwGjD,iFAAiF;AACjF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,GAAG,IAAI,CAAC;AAkXhE,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C,2DAA2D;AAC3D,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,iGAAiG;AACjG,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,iFAAiF;AACjF,MAAM,CAAC,MAAM,yBAAyB,GAAsB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAEpF,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAA8C;IAC/E,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,uBAAuB,EAAE,6CAA6C;IAC/E,aAAa,EAAE,cAAc,EAAE,yDAAyD;IACxF,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,kBAAkB,GAAsD;IACnF,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,aAAa;IACtB,aAAa,EAAE,aAAa;CAC7B,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAA+B;IAC9D,SAAS;IACT,QAAQ;IACR,MAAM;IACN,SAAS;IACT,aAAa;IACb,SAAS;CACV,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frontmatter + body validator for skill documents.
|
|
3
|
+
*
|
|
4
|
+
* Operates on the output of `parseSkillDocument()` plus the skill's
|
|
5
|
+
* directory name (used as the default `name`) and source. Returns a typed
|
|
6
|
+
* `SkillFrontmatter` plus a list of warnings/errors so the manager can
|
|
7
|
+
* emit `sdk.skill.error` events with the appropriate severity.
|
|
8
|
+
*
|
|
9
|
+
* Rules enforced here (everything else is the manager's job — shadowing,
|
|
10
|
+
* versioning, FQN construction):
|
|
11
|
+
*
|
|
12
|
+
* - `name` regex + reserved-word ban + length cap.
|
|
13
|
+
* - `description` length cap (1024 chars).
|
|
14
|
+
* - `when_to_use` length cap (1024 chars).
|
|
15
|
+
* - `allowed-tools` normalization (string-or-array → `AllowedToolEntry[]`
|
|
16
|
+
* with `Tool(args)` parsed).
|
|
17
|
+
* - `arguments` normalization (string-or-object form → `SkillArgument[]`).
|
|
18
|
+
* - `paths` shape (array of strings).
|
|
19
|
+
* - Booleans for `disable-model-invocation`, `user-invocable`.
|
|
20
|
+
* - `version` semver shape; defaults to `0.0.0` if absent.
|
|
21
|
+
* - `min_sdk_version` semver shape.
|
|
22
|
+
* - `requires` shape (array of strings).
|
|
23
|
+
* - `effort`, `context`, `shell` enum membership.
|
|
24
|
+
* - Body size — 50 KB hard error, 500-line warning.
|
|
25
|
+
*
|
|
26
|
+
* Unknown frontmatter fields are NOT rejected; they're preserved on
|
|
27
|
+
* `frontmatter.unknown_fields` for forward compatibility and emitted as
|
|
28
|
+
* `sdk.skill.unknown_field` debug events.
|
|
29
|
+
*/
|
|
30
|
+
import type { JsonValue } from '../qar/json.js';
|
|
31
|
+
import type { SkillEventSeverity, SkillFrontmatter } from './types.js';
|
|
32
|
+
/**
|
|
33
|
+
* One validation diagnostic emitted by `validateFrontmatter` /
|
|
34
|
+
* `validateBody`. The manager translates these into `sdk.skill.error`
|
|
35
|
+
* events with the skill's path attached.
|
|
36
|
+
*/
|
|
37
|
+
export interface ValidationIssue {
|
|
38
|
+
readonly severity: SkillEventSeverity;
|
|
39
|
+
readonly message: string;
|
|
40
|
+
/** When emitted from `validateFrontmatter`, the offending field. */
|
|
41
|
+
readonly field?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ValidatedFrontmatter {
|
|
44
|
+
readonly frontmatter: SkillFrontmatter;
|
|
45
|
+
readonly issues: readonly ValidationIssue[];
|
|
46
|
+
/** Unknown fields preserved verbatim; emit `sdk.skill.unknown_field` per entry. */
|
|
47
|
+
readonly unknownFields: readonly string[];
|
|
48
|
+
}
|
|
49
|
+
export interface ValidatedBody {
|
|
50
|
+
readonly issues: readonly ValidationIssue[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validate parsed frontmatter against the skill contract. Returns a typed
|
|
54
|
+
* `SkillFrontmatter` (always present — even on failure, the validator
|
|
55
|
+
* preserves whatever it could parse) plus a list of issues. Fatal issues
|
|
56
|
+
* carry `severity: 'error'`; the manager treats those as catalog
|
|
57
|
+
* exclusions.
|
|
58
|
+
*/
|
|
59
|
+
export declare function validateFrontmatter(raw: Readonly<Record<string, JsonValue>>, defaultName: string): ValidatedFrontmatter;
|
|
60
|
+
/**
|
|
61
|
+
* Validate the body — 50 KB hard cap (error, exclude skill), 500-line soft
|
|
62
|
+
* cap (warning, include anyway).
|
|
63
|
+
*/
|
|
64
|
+
export declare function validateBody(body: string): ValidatedBody;
|
|
65
|
+
/**
|
|
66
|
+
* Result of {@link extractBodyReferences} — one entry per `[label](path)`
|
|
67
|
+
* markdown link OR `get_skill_file(path)` reference observed in the body.
|
|
68
|
+
*
|
|
69
|
+
* Only relative paths land in the result; absolute URLs (`https://...`,
|
|
70
|
+
* `mailto:`, anchors `#section`) are filtered out — they don't reference
|
|
71
|
+
* supporting files.
|
|
72
|
+
*/
|
|
73
|
+
export interface BodyReference {
|
|
74
|
+
/** The link target — normalized to POSIX separators, stripped of `./`. */
|
|
75
|
+
readonly path: string;
|
|
76
|
+
/** Path-segment depth (number of `/` separators + 1). */
|
|
77
|
+
readonly depth: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract supporting-file references from a SKILL.md body. Two forms are
|
|
81
|
+
* recognized per `skills-progressive-disclosure.md`:
|
|
82
|
+
*
|
|
83
|
+
* - Markdown links: `[label](path/to/file.ext)`.
|
|
84
|
+
* - Explicit tool calls: `get_skill_file("path/to/file")` (string arg).
|
|
85
|
+
*
|
|
86
|
+
* Both must be relative; external URLs and anchors are skipped.
|
|
87
|
+
*/
|
|
88
|
+
export declare function extractBodyReferences(body: string): readonly BodyReference[];
|
|
89
|
+
/** Compare two semver strings (`a < b`). Both must match `SEMVER_RE`. */
|
|
90
|
+
export declare function semverLessThan(a: string, b: string): boolean;
|
|
91
|
+
/** Return `true` iff the version strings refer to the same version. */
|
|
92
|
+
export declare function semverEqual(a: string, b: string): boolean;
|
|
93
|
+
/** Test helper exposed for the validator's own unit suite. */
|
|
94
|
+
export declare function isValidSemver(s: string): boolean;
|
|
95
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/skills/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAGV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AA4CpB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,mFAAmF;IACnF,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EACxC,WAAW,EAAE,MAAM,GAClB,oBAAoB,CAsKtB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAiBxD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAiC5E;AA6BD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAa5D;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhD"}
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frontmatter + body validator for skill documents.
|
|
3
|
+
*
|
|
4
|
+
* Operates on the output of `parseSkillDocument()` plus the skill's
|
|
5
|
+
* directory name (used as the default `name`) and source. Returns a typed
|
|
6
|
+
* `SkillFrontmatter` plus a list of warnings/errors so the manager can
|
|
7
|
+
* emit `sdk.skill.error` events with the appropriate severity.
|
|
8
|
+
*
|
|
9
|
+
* Rules enforced here (everything else is the manager's job — shadowing,
|
|
10
|
+
* versioning, FQN construction):
|
|
11
|
+
*
|
|
12
|
+
* - `name` regex + reserved-word ban + length cap.
|
|
13
|
+
* - `description` length cap (1024 chars).
|
|
14
|
+
* - `when_to_use` length cap (1024 chars).
|
|
15
|
+
* - `allowed-tools` normalization (string-or-array → `AllowedToolEntry[]`
|
|
16
|
+
* with `Tool(args)` parsed).
|
|
17
|
+
* - `arguments` normalization (string-or-object form → `SkillArgument[]`).
|
|
18
|
+
* - `paths` shape (array of strings).
|
|
19
|
+
* - Booleans for `disable-model-invocation`, `user-invocable`.
|
|
20
|
+
* - `version` semver shape; defaults to `0.0.0` if absent.
|
|
21
|
+
* - `min_sdk_version` semver shape.
|
|
22
|
+
* - `requires` shape (array of strings).
|
|
23
|
+
* - `effort`, `context`, `shell` enum membership.
|
|
24
|
+
* - Body size — 50 KB hard error, 500-line warning.
|
|
25
|
+
*
|
|
26
|
+
* Unknown frontmatter fields are NOT rejected; they're preserved on
|
|
27
|
+
* `frontmatter.unknown_fields` for forward compatibility and emitted as
|
|
28
|
+
* `sdk.skill.unknown_field` debug events.
|
|
29
|
+
*/
|
|
30
|
+
import { SKILL_BODY_HARD_BYTES, SKILL_BODY_SOFT_LINES, SKILL_NAME_MAX_CHARS, SKILL_NAME_RESERVED_WORDS, } from './types.js';
|
|
31
|
+
/** Description / when_to_use per-field cap. Mirrors the standard's 1024-char limit. */
|
|
32
|
+
const FIELD_CHAR_CAP = 1024;
|
|
33
|
+
/** Recognized top-level frontmatter keys. Anything else lands in `unknown_fields`. */
|
|
34
|
+
const KNOWN_FIELDS = new Set([
|
|
35
|
+
'name',
|
|
36
|
+
'description',
|
|
37
|
+
'when_to_use',
|
|
38
|
+
'allowed-tools',
|
|
39
|
+
'disable-model-invocation',
|
|
40
|
+
'user-invocable',
|
|
41
|
+
'model',
|
|
42
|
+
'effort',
|
|
43
|
+
'context',
|
|
44
|
+
'agent',
|
|
45
|
+
'paths',
|
|
46
|
+
'arguments',
|
|
47
|
+
'argument-hint',
|
|
48
|
+
'shell',
|
|
49
|
+
'hooks',
|
|
50
|
+
'vendor',
|
|
51
|
+
'version',
|
|
52
|
+
'min_sdk_version',
|
|
53
|
+
'requires',
|
|
54
|
+
]);
|
|
55
|
+
const VALID_EFFORT = new Set(['low', 'medium', 'high', 'max']);
|
|
56
|
+
const VALID_CONTEXT = new Set(['fork', 'inherit']);
|
|
57
|
+
const VALID_SHELL = new Set(['bash', 'powershell']);
|
|
58
|
+
/** Strict semver — major.minor.patch (no pre-release / build for simplicity). */
|
|
59
|
+
const SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
|
|
60
|
+
/** `name` shape — lowercase letters, digits, hyphens. Max length checked separately. */
|
|
61
|
+
const NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
62
|
+
/**
|
|
63
|
+
* Validate parsed frontmatter against the skill contract. Returns a typed
|
|
64
|
+
* `SkillFrontmatter` (always present — even on failure, the validator
|
|
65
|
+
* preserves whatever it could parse) plus a list of issues. Fatal issues
|
|
66
|
+
* carry `severity: 'error'`; the manager treats those as catalog
|
|
67
|
+
* exclusions.
|
|
68
|
+
*/
|
|
69
|
+
export function validateFrontmatter(raw, defaultName) {
|
|
70
|
+
const issues = [];
|
|
71
|
+
const unknown = {};
|
|
72
|
+
const unknownFields = [];
|
|
73
|
+
// -- name --
|
|
74
|
+
let name = defaultName;
|
|
75
|
+
const rawName = raw.name;
|
|
76
|
+
if (typeof rawName === 'string' && rawName.length > 0) {
|
|
77
|
+
name = rawName;
|
|
78
|
+
}
|
|
79
|
+
else if (rawName !== undefined && rawName !== null) {
|
|
80
|
+
issues.push({ severity: 'error', message: 'name must be a string', field: 'name' });
|
|
81
|
+
}
|
|
82
|
+
if (!NAME_RE.test(name)) {
|
|
83
|
+
issues.push({
|
|
84
|
+
severity: 'error',
|
|
85
|
+
message: `name ${JSON.stringify(name)} must match /^[a-z0-9][a-z0-9-]*$/`,
|
|
86
|
+
field: 'name',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (name.length > SKILL_NAME_MAX_CHARS) {
|
|
90
|
+
issues.push({
|
|
91
|
+
severity: 'error',
|
|
92
|
+
message: `name exceeds ${SKILL_NAME_MAX_CHARS} chars`,
|
|
93
|
+
field: 'name',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const lowerName = name.toLowerCase();
|
|
97
|
+
for (const reserved of SKILL_NAME_RESERVED_WORDS) {
|
|
98
|
+
if (lowerName.includes(reserved)) {
|
|
99
|
+
issues.push({
|
|
100
|
+
severity: 'error',
|
|
101
|
+
message: `name uses reserved word: ${reserved}`,
|
|
102
|
+
field: 'name',
|
|
103
|
+
});
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// -- description / when_to_use --
|
|
108
|
+
const description = expectStringField(raw.description, 'description', issues);
|
|
109
|
+
if (description !== undefined && description.length > FIELD_CHAR_CAP) {
|
|
110
|
+
issues.push({
|
|
111
|
+
severity: 'warning',
|
|
112
|
+
message: `description exceeds ${FIELD_CHAR_CAP} chars`,
|
|
113
|
+
field: 'description',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const whenToUse = expectStringField(raw.when_to_use, 'when_to_use', issues);
|
|
117
|
+
if (whenToUse !== undefined && whenToUse.length > FIELD_CHAR_CAP) {
|
|
118
|
+
issues.push({
|
|
119
|
+
severity: 'warning',
|
|
120
|
+
message: `when_to_use exceeds ${FIELD_CHAR_CAP} chars`,
|
|
121
|
+
field: 'when_to_use',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// -- allowed-tools --
|
|
125
|
+
const allowedTools = normalizeAllowedTools(raw['allowed-tools'], issues);
|
|
126
|
+
// -- disable-model-invocation / user-invocable --
|
|
127
|
+
const disableModel = expectBooleanField(raw['disable-model-invocation'], 'disable-model-invocation', issues);
|
|
128
|
+
const userInvocable = expectBooleanField(raw['user-invocable'], 'user-invocable', issues);
|
|
129
|
+
// -- model --
|
|
130
|
+
const model = expectStringField(raw.model, 'model', issues);
|
|
131
|
+
// -- effort --
|
|
132
|
+
const effort = expectEnumField(raw.effort, 'effort', VALID_EFFORT, issues);
|
|
133
|
+
// -- context / agent --
|
|
134
|
+
const context = expectEnumField(raw.context, 'context', VALID_CONTEXT, issues);
|
|
135
|
+
const agent = expectStringField(raw.agent, 'agent', issues);
|
|
136
|
+
// -- paths --
|
|
137
|
+
const paths = normalizeStringArray(raw.paths, 'paths', issues);
|
|
138
|
+
// -- arguments --
|
|
139
|
+
const argumentsList = normalizeArguments(raw.arguments, issues);
|
|
140
|
+
const argumentHint = expectStringField(raw['argument-hint'], 'argument-hint', issues);
|
|
141
|
+
// -- shell --
|
|
142
|
+
const shell = expectEnumField(raw.shell, 'shell', VALID_SHELL, issues);
|
|
143
|
+
// -- hooks (opaque JSON, no validation beyond presence) --
|
|
144
|
+
const hooks = raw.hooks;
|
|
145
|
+
// -- vendor --
|
|
146
|
+
const vendor = expectStringField(raw.vendor, 'vendor', issues);
|
|
147
|
+
// -- version --
|
|
148
|
+
let version;
|
|
149
|
+
const rawVersion = raw.version;
|
|
150
|
+
if (rawVersion === undefined || rawVersion === null) {
|
|
151
|
+
version = undefined; // manager defaults to '0.0.0'
|
|
152
|
+
}
|
|
153
|
+
else if (typeof rawVersion === 'string' && SEMVER_RE.test(rawVersion)) {
|
|
154
|
+
version = rawVersion;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
issues.push({
|
|
158
|
+
severity: 'error',
|
|
159
|
+
message: `version must be semver "major.minor.patch"; got ${JSON.stringify(rawVersion)}`,
|
|
160
|
+
field: 'version',
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// -- min_sdk_version --
|
|
164
|
+
let minSdk;
|
|
165
|
+
const rawMin = raw.min_sdk_version;
|
|
166
|
+
if (rawMin === undefined || rawMin === null) {
|
|
167
|
+
minSdk = undefined;
|
|
168
|
+
}
|
|
169
|
+
else if (typeof rawMin === 'string' && SEMVER_RE.test(rawMin)) {
|
|
170
|
+
minSdk = rawMin;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
issues.push({
|
|
174
|
+
severity: 'error',
|
|
175
|
+
message: `min_sdk_version must be semver; got ${JSON.stringify(rawMin)}`,
|
|
176
|
+
field: 'min_sdk_version',
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// -- requires --
|
|
180
|
+
const requires = normalizeStringArray(raw.requires, 'requires', issues);
|
|
181
|
+
// -- unknown fields --
|
|
182
|
+
for (const key of Object.keys(raw)) {
|
|
183
|
+
if (!KNOWN_FIELDS.has(key)) {
|
|
184
|
+
unknown[key] = raw[key];
|
|
185
|
+
unknownFields.push(key);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Build the typed frontmatter object.
|
|
189
|
+
const frontmatter = {
|
|
190
|
+
name,
|
|
191
|
+
...(description !== undefined ? { description } : {}),
|
|
192
|
+
...(whenToUse !== undefined ? { when_to_use: whenToUse } : {}),
|
|
193
|
+
...(allowedTools !== undefined ? { 'allowed-tools': allowedTools } : {}),
|
|
194
|
+
...(disableModel !== undefined ? { 'disable-model-invocation': disableModel } : {}),
|
|
195
|
+
...(userInvocable !== undefined ? { 'user-invocable': userInvocable } : {}),
|
|
196
|
+
...(model !== undefined ? { model } : {}),
|
|
197
|
+
...(effort !== undefined ? { effort } : {}),
|
|
198
|
+
...(context !== undefined ? { context } : {}),
|
|
199
|
+
...(agent !== undefined ? { agent } : {}),
|
|
200
|
+
...(paths !== undefined ? { paths } : {}),
|
|
201
|
+
...(argumentsList !== undefined ? { arguments: argumentsList } : {}),
|
|
202
|
+
...(argumentHint !== undefined ? { 'argument-hint': argumentHint } : {}),
|
|
203
|
+
...(shell !== undefined ? { shell } : {}),
|
|
204
|
+
...(hooks !== undefined ? { hooks } : {}),
|
|
205
|
+
...(vendor !== undefined ? { vendor } : {}),
|
|
206
|
+
...(version !== undefined ? { version } : {}),
|
|
207
|
+
...(minSdk !== undefined ? { min_sdk_version: minSdk } : {}),
|
|
208
|
+
...(requires !== undefined ? { requires } : {}),
|
|
209
|
+
...(unknownFields.length > 0 ? { unknown_fields: unknown } : {}),
|
|
210
|
+
};
|
|
211
|
+
return { frontmatter, issues, unknownFields };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Validate the body — 50 KB hard cap (error, exclude skill), 500-line soft
|
|
215
|
+
* cap (warning, include anyway).
|
|
216
|
+
*/
|
|
217
|
+
export function validateBody(body) {
|
|
218
|
+
const issues = [];
|
|
219
|
+
const byteLen = Buffer.byteLength(body, 'utf-8');
|
|
220
|
+
if (byteLen > SKILL_BODY_HARD_BYTES) {
|
|
221
|
+
issues.push({
|
|
222
|
+
severity: 'error',
|
|
223
|
+
message: `body exceeds ${SKILL_BODY_HARD_BYTES} bytes hard cap`,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
const lineCount = body.split('\n').length;
|
|
227
|
+
if (lineCount > SKILL_BODY_SOFT_LINES) {
|
|
228
|
+
issues.push({
|
|
229
|
+
severity: 'warning',
|
|
230
|
+
message: `body exceeds ${SKILL_BODY_SOFT_LINES} lines (got ${lineCount})`,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
return { issues };
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Extract supporting-file references from a SKILL.md body. Two forms are
|
|
237
|
+
* recognized per `skills-progressive-disclosure.md`:
|
|
238
|
+
*
|
|
239
|
+
* - Markdown links: `[label](path/to/file.ext)`.
|
|
240
|
+
* - Explicit tool calls: `get_skill_file("path/to/file")` (string arg).
|
|
241
|
+
*
|
|
242
|
+
* Both must be relative; external URLs and anchors are skipped.
|
|
243
|
+
*/
|
|
244
|
+
export function extractBodyReferences(body) {
|
|
245
|
+
const seen = new Map();
|
|
246
|
+
// Markdown link form. Match `[label](target)` with no nested brackets
|
|
247
|
+
// in the target; embedded `)` inside the target is rare in real skills
|
|
248
|
+
// and disambiguating without a full parser would be over-engineering.
|
|
249
|
+
const mdLinkRe = /\[([^\]\n]*)\]\(([^)\n]+)\)/g;
|
|
250
|
+
let m;
|
|
251
|
+
while ((m = mdLinkRe.exec(body)) !== null) {
|
|
252
|
+
const target = m[2].trim();
|
|
253
|
+
if (!isRelativePath(target))
|
|
254
|
+
continue;
|
|
255
|
+
const stripped = stripFragment(target);
|
|
256
|
+
if (stripped.length === 0)
|
|
257
|
+
continue;
|
|
258
|
+
const path = normalizeRelative(stripped);
|
|
259
|
+
if (!seen.has(path)) {
|
|
260
|
+
seen.set(path, { path, depth: path.split('/').length });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// `get_skill_file("path")` form. Both single- and double-quoted strings.
|
|
264
|
+
const toolCallRe = /get_skill_file\s*\(\s*["']([^"'\n]+)["']/g;
|
|
265
|
+
while ((m = toolCallRe.exec(body)) !== null) {
|
|
266
|
+
const target = m[1].trim();
|
|
267
|
+
if (!isRelativePath(target))
|
|
268
|
+
continue;
|
|
269
|
+
const stripped = stripFragment(target);
|
|
270
|
+
if (stripped.length === 0)
|
|
271
|
+
continue;
|
|
272
|
+
const path = normalizeRelative(stripped);
|
|
273
|
+
if (!seen.has(path)) {
|
|
274
|
+
seen.set(path, { path, depth: path.split('/').length });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return [...seen.values()];
|
|
278
|
+
}
|
|
279
|
+
function isRelativePath(target) {
|
|
280
|
+
if (target.length === 0)
|
|
281
|
+
return false;
|
|
282
|
+
// Absolute URLs / protocol-relative / scheme-prefixed.
|
|
283
|
+
if (/^[a-z]+:\/\//i.test(target))
|
|
284
|
+
return false;
|
|
285
|
+
if (target.startsWith('//'))
|
|
286
|
+
return false;
|
|
287
|
+
if (target.startsWith('mailto:'))
|
|
288
|
+
return false;
|
|
289
|
+
if (target.startsWith('tel:'))
|
|
290
|
+
return false;
|
|
291
|
+
// Anchor-only.
|
|
292
|
+
if (target.startsWith('#'))
|
|
293
|
+
return false;
|
|
294
|
+
// POSIX-absolute or Windows-absolute.
|
|
295
|
+
if (target.startsWith('/'))
|
|
296
|
+
return false;
|
|
297
|
+
if (/^[A-Za-z]:[\\/]/.test(target))
|
|
298
|
+
return false;
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
function stripFragment(target) {
|
|
302
|
+
const hashIdx = target.indexOf('#');
|
|
303
|
+
const trimmed = hashIdx === -1 ? target : target.slice(0, hashIdx);
|
|
304
|
+
return trimmed.split('?')[0];
|
|
305
|
+
}
|
|
306
|
+
function normalizeRelative(target) {
|
|
307
|
+
let out = target.replace(/\\/g, '/');
|
|
308
|
+
while (out.startsWith('./'))
|
|
309
|
+
out = out.slice(2);
|
|
310
|
+
return out;
|
|
311
|
+
}
|
|
312
|
+
/** Compare two semver strings (`a < b`). Both must match `SEMVER_RE`. */
|
|
313
|
+
export function semverLessThan(a, b) {
|
|
314
|
+
const am = a.match(SEMVER_RE);
|
|
315
|
+
const bm = b.match(SEMVER_RE);
|
|
316
|
+
if (am === null || bm === null) {
|
|
317
|
+
throw new Error(`invalid semver: ${JSON.stringify(am === null ? a : b)}`);
|
|
318
|
+
}
|
|
319
|
+
for (let i = 1; i <= 3; i += 1) {
|
|
320
|
+
const an = Number(am[i]);
|
|
321
|
+
const bn = Number(bm[i]);
|
|
322
|
+
if (an < bn)
|
|
323
|
+
return true;
|
|
324
|
+
if (an > bn)
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
/** Return `true` iff the version strings refer to the same version. */
|
|
330
|
+
export function semverEqual(a, b) {
|
|
331
|
+
return a === b;
|
|
332
|
+
}
|
|
333
|
+
/** Test helper exposed for the validator's own unit suite. */
|
|
334
|
+
export function isValidSemver(s) {
|
|
335
|
+
return SEMVER_RE.test(s);
|
|
336
|
+
}
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
338
|
+
// Field helpers
|
|
339
|
+
// ---------------------------------------------------------------------------
|
|
340
|
+
function expectStringField(value, field, issues) {
|
|
341
|
+
if (value === undefined || value === null)
|
|
342
|
+
return undefined;
|
|
343
|
+
if (typeof value !== 'string') {
|
|
344
|
+
issues.push({ severity: 'error', message: `${field} must be a string`, field });
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
347
|
+
return value;
|
|
348
|
+
}
|
|
349
|
+
function expectBooleanField(value, field, issues) {
|
|
350
|
+
if (value === undefined || value === null)
|
|
351
|
+
return undefined;
|
|
352
|
+
if (typeof value !== 'boolean') {
|
|
353
|
+
issues.push({ severity: 'error', message: `${field} must be a boolean`, field });
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
return value;
|
|
357
|
+
}
|
|
358
|
+
function expectEnumField(value, field, allowed, issues) {
|
|
359
|
+
if (value === undefined || value === null)
|
|
360
|
+
return undefined;
|
|
361
|
+
if (typeof value !== 'string' || !allowed.has(value)) {
|
|
362
|
+
issues.push({
|
|
363
|
+
severity: 'error',
|
|
364
|
+
message: `${field} must be one of ${[...allowed].join(', ')}; got ${JSON.stringify(value)}`,
|
|
365
|
+
field,
|
|
366
|
+
});
|
|
367
|
+
return undefined;
|
|
368
|
+
}
|
|
369
|
+
return value;
|
|
370
|
+
}
|
|
371
|
+
function normalizeStringArray(value, field, issues) {
|
|
372
|
+
if (value === undefined || value === null)
|
|
373
|
+
return undefined;
|
|
374
|
+
if (!Array.isArray(value)) {
|
|
375
|
+
issues.push({ severity: 'error', message: `${field} must be an array`, field });
|
|
376
|
+
return undefined;
|
|
377
|
+
}
|
|
378
|
+
const out = [];
|
|
379
|
+
for (const entry of value) {
|
|
380
|
+
if (typeof entry !== 'string') {
|
|
381
|
+
issues.push({
|
|
382
|
+
severity: 'error',
|
|
383
|
+
message: `${field} entries must be strings`,
|
|
384
|
+
field,
|
|
385
|
+
});
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
out.push(entry);
|
|
389
|
+
}
|
|
390
|
+
return out;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Normalize `allowed-tools` to `AllowedToolEntry[]`. Accepts the
|
|
394
|
+
* space-separated string form (`'Read Write Bash(git:*)'`) AND the YAML
|
|
395
|
+
* list form. Tool-with-args entries parse `Bash(git:*)` into
|
|
396
|
+
* `{ tool: 'Bash', args: 'git:*' }`.
|
|
397
|
+
*/
|
|
398
|
+
function normalizeAllowedTools(value, issues) {
|
|
399
|
+
if (value === undefined || value === null)
|
|
400
|
+
return undefined;
|
|
401
|
+
let parts;
|
|
402
|
+
if (typeof value === 'string') {
|
|
403
|
+
parts = value.split(/\s+/).filter((p) => p.length > 0);
|
|
404
|
+
}
|
|
405
|
+
else if (Array.isArray(value)) {
|
|
406
|
+
parts = [];
|
|
407
|
+
for (const entry of value) {
|
|
408
|
+
if (typeof entry !== 'string') {
|
|
409
|
+
issues.push({
|
|
410
|
+
severity: 'error',
|
|
411
|
+
message: 'allowed-tools entries must be strings',
|
|
412
|
+
field: 'allowed-tools',
|
|
413
|
+
});
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
parts.push(entry);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
issues.push({
|
|
421
|
+
severity: 'error',
|
|
422
|
+
message: 'allowed-tools must be a space-separated string or array of strings',
|
|
423
|
+
field: 'allowed-tools',
|
|
424
|
+
});
|
|
425
|
+
return undefined;
|
|
426
|
+
}
|
|
427
|
+
return parts.map((p) => parseToolEntry(p));
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Parse a single `allowed-tools` entry. `Bash(git:*)` → `{ tool: 'Bash', args: 'git:*' }`;
|
|
431
|
+
* `Read` → `{ tool: 'Read' }`.
|
|
432
|
+
*/
|
|
433
|
+
function parseToolEntry(entry) {
|
|
434
|
+
const openIdx = entry.indexOf('(');
|
|
435
|
+
if (openIdx === -1 || !entry.endsWith(')')) {
|
|
436
|
+
return { tool: entry };
|
|
437
|
+
}
|
|
438
|
+
const tool = entry.slice(0, openIdx);
|
|
439
|
+
const args = entry.slice(openIdx + 1, -1);
|
|
440
|
+
return { tool, args };
|
|
441
|
+
}
|
|
442
|
+
function normalizeArguments(value, issues) {
|
|
443
|
+
if (value === undefined || value === null)
|
|
444
|
+
return undefined;
|
|
445
|
+
if (!Array.isArray(value)) {
|
|
446
|
+
issues.push({
|
|
447
|
+
severity: 'error',
|
|
448
|
+
message: 'arguments must be an array',
|
|
449
|
+
field: 'arguments',
|
|
450
|
+
});
|
|
451
|
+
return undefined;
|
|
452
|
+
}
|
|
453
|
+
const out = [];
|
|
454
|
+
for (const entry of value) {
|
|
455
|
+
if (typeof entry === 'string') {
|
|
456
|
+
out.push({ name: entry });
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
if (entry !== null && typeof entry === 'object' && !Array.isArray(entry)) {
|
|
460
|
+
const obj = entry;
|
|
461
|
+
const nameValue = obj.name;
|
|
462
|
+
if (typeof nameValue !== 'string' || nameValue.length === 0) {
|
|
463
|
+
issues.push({
|
|
464
|
+
severity: 'error',
|
|
465
|
+
message: 'arguments entry must carry a non-empty name',
|
|
466
|
+
field: 'arguments',
|
|
467
|
+
});
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
const descriptionValue = obj.description;
|
|
471
|
+
const arg = {
|
|
472
|
+
name: nameValue,
|
|
473
|
+
...(typeof descriptionValue === 'string' ? { description: descriptionValue } : {}),
|
|
474
|
+
};
|
|
475
|
+
out.push(arg);
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
issues.push({
|
|
479
|
+
severity: 'error',
|
|
480
|
+
message: 'arguments entry must be a string or { name, description? } object',
|
|
481
|
+
field: 'arguments',
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
return out;
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=validator.js.map
|