@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,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared filesystem walker for skill sources.
|
|
3
|
+
*
|
|
4
|
+
* Sits below the per-source-type walkers in `./project.ts`, `./user.ts`,
|
|
5
|
+
* etc. Each `SKILL.md` discovered yields a `WalkedSkill` carrying:
|
|
6
|
+
*
|
|
7
|
+
* - `dirPath` — absolute path to the skill's directory.
|
|
8
|
+
* - `skillFilePath` — absolute path to the `SKILL.md`.
|
|
9
|
+
* - `mtimeMs` — modification time of `SKILL.md` for slim-index ordering.
|
|
10
|
+
*
|
|
11
|
+
* Per `skills-edge-cases.md` §1.9 / §1.10 symlinks are bounded:
|
|
12
|
+
*
|
|
13
|
+
* - Symlink resolution count per skill is capped at `SYMLINK_HOP_CAP`.
|
|
14
|
+
* - A symlink resolving outside the skill directory's tree is rejected
|
|
15
|
+
* before any read.
|
|
16
|
+
*
|
|
17
|
+
* The walker never reads `SKILL.md` body content — it surfaces existence
|
|
18
|
+
* + mtime only. The parser (`../parser.ts`) handles the actual read.
|
|
19
|
+
*/
|
|
20
|
+
import { promises as fs } from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
/** Per-skill symlink-resolution cap. Mirrors POSIX `O_NOFOLLOW`-style behavior. */
|
|
23
|
+
export const SYMLINK_HOP_CAP = 8;
|
|
24
|
+
/**
|
|
25
|
+
* Files inside a skill's directory should be one level deep from
|
|
26
|
+
* `SKILL.md` (per `skills.md` §1.1). The walker enforces nothing about
|
|
27
|
+
* the body — it just locates `SKILL.md`. Filenames the walker recognizes:
|
|
28
|
+
*
|
|
29
|
+
* - `SKILL.md` (canonical, per the open standard).
|
|
30
|
+
* - `skill.md` (lower-case fallback, observed in OSS skills).
|
|
31
|
+
*
|
|
32
|
+
* Listed in priority order — the first match wins per directory.
|
|
33
|
+
*/
|
|
34
|
+
const SKILL_FILE_NAMES = ['SKILL.md', 'skill.md'];
|
|
35
|
+
/**
|
|
36
|
+
* Walk a single directory non-recursively and return every immediate
|
|
37
|
+
* sub-directory that contains a `SKILL.md` (or `skill.md`) file. The
|
|
38
|
+
* walker treats each subdirectory as one skill — supporting files
|
|
39
|
+
* (`reference.md`, `scripts/`, `assets/`) ride along but aren't surfaced
|
|
40
|
+
* by this walker.
|
|
41
|
+
*
|
|
42
|
+
* Errors thrown by the underlying `readdir` are propagated to the caller
|
|
43
|
+
* so the source-type walker can attach `sdk.skill.error` events with the
|
|
44
|
+
* source identity.
|
|
45
|
+
*/
|
|
46
|
+
export async function findSkillDirectories(root) {
|
|
47
|
+
const real = await safeRealPath(root);
|
|
48
|
+
if (real === null)
|
|
49
|
+
return [];
|
|
50
|
+
let entries;
|
|
51
|
+
try {
|
|
52
|
+
entries = await fs.readdir(real, { withFileTypes: true });
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
throw wrapFsError(`readdir failed for ${real}`, err);
|
|
56
|
+
}
|
|
57
|
+
const found = [];
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
60
|
+
continue;
|
|
61
|
+
if (entry.name.startsWith('.'))
|
|
62
|
+
continue; // skip dotfiles
|
|
63
|
+
const candidateDir = path.join(real, entry.name);
|
|
64
|
+
const resolved = await resolveSkillDir(real, candidateDir);
|
|
65
|
+
if (resolved === null)
|
|
66
|
+
continue;
|
|
67
|
+
const skillFile = await findSkillFile(resolved);
|
|
68
|
+
if (skillFile === null)
|
|
69
|
+
continue;
|
|
70
|
+
let stat;
|
|
71
|
+
try {
|
|
72
|
+
stat = await fs.stat(skillFile);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
found.push({
|
|
78
|
+
dirPath: resolved,
|
|
79
|
+
skillFilePath: skillFile,
|
|
80
|
+
mtimeMs: stat.mtimeMs,
|
|
81
|
+
size: stat.size,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return found;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Variant for sources whose root layout is "directory contains many
|
|
88
|
+
* subdirectories AND each subdirectory may itself contain skill
|
|
89
|
+
* subdirectories" — e.g. a glob expansion like `plugins/*\/skills`. The
|
|
90
|
+
* walker does NOT recurse arbitrarily deep; it probes exactly one level
|
|
91
|
+
* down from each immediate child.
|
|
92
|
+
*
|
|
93
|
+
* Pragmatically: if `root/foo/SKILL.md` exists, `foo` is a skill;
|
|
94
|
+
* otherwise the walker checks `root/foo/skills/` (legacy plugin layout).
|
|
95
|
+
*/
|
|
96
|
+
export async function findSkillDirectoriesWithLegacyPluginLayout(root) {
|
|
97
|
+
const direct = await findSkillDirectories(root);
|
|
98
|
+
if (direct.length > 0)
|
|
99
|
+
return direct;
|
|
100
|
+
// Fallback: check `<root>/<plugin>/skills/`.
|
|
101
|
+
const real = await safeRealPath(root);
|
|
102
|
+
if (real === null)
|
|
103
|
+
return [];
|
|
104
|
+
let entries;
|
|
105
|
+
try {
|
|
106
|
+
entries = await fs.readdir(real, { withFileTypes: true });
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const out = [];
|
|
112
|
+
for (const entry of entries) {
|
|
113
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
114
|
+
continue;
|
|
115
|
+
if (entry.name.startsWith('.'))
|
|
116
|
+
continue;
|
|
117
|
+
const pluginRoot = path.join(real, entry.name, 'skills');
|
|
118
|
+
try {
|
|
119
|
+
const child = await findSkillDirectories(pluginRoot);
|
|
120
|
+
out.push(...child);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// ignore — plugin sub-directory may not have skills
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Resolve a candidate skill directory through symlinks while:
|
|
130
|
+
* - keeping the resolved path inside `parentRoot` (rejection on escape),
|
|
131
|
+
* - bounding the hop count at `SYMLINK_HOP_CAP` (rejection on loop).
|
|
132
|
+
*
|
|
133
|
+
* Returns the resolved absolute path on success, `null` on rejection.
|
|
134
|
+
* The walker uses `null` rather than throwing because a single
|
|
135
|
+
* malformed skill subdirectory should not poison the entire source —
|
|
136
|
+
* the manager emits an `sdk.skill.error` event with the offending path
|
|
137
|
+
* captured elsewhere.
|
|
138
|
+
*/
|
|
139
|
+
async function resolveSkillDir(parentRoot, candidate) {
|
|
140
|
+
let current = candidate;
|
|
141
|
+
for (let hop = 0; hop < SYMLINK_HOP_CAP; hop += 1) {
|
|
142
|
+
let stat;
|
|
143
|
+
try {
|
|
144
|
+
stat = await fs.lstat(current);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
if (stat.isDirectory() && !stat.isSymbolicLink()) {
|
|
150
|
+
// Final canonical path; verify it stays within parentRoot.
|
|
151
|
+
const canonical = await safeRealPath(current);
|
|
152
|
+
if (canonical === null)
|
|
153
|
+
return null;
|
|
154
|
+
const parentCanonical = await safeRealPath(parentRoot);
|
|
155
|
+
if (parentCanonical === null)
|
|
156
|
+
return null;
|
|
157
|
+
const rel = path.relative(parentCanonical, canonical);
|
|
158
|
+
if (rel.startsWith('..') || path.isAbsolute(rel)) {
|
|
159
|
+
// resolves outside the parent root — reject per §1.10
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
return canonical;
|
|
163
|
+
}
|
|
164
|
+
if (stat.isSymbolicLink()) {
|
|
165
|
+
let target;
|
|
166
|
+
try {
|
|
167
|
+
target = await fs.readlink(current);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const resolvedTarget = path.isAbsolute(target)
|
|
173
|
+
? target
|
|
174
|
+
: path.resolve(path.dirname(current), target);
|
|
175
|
+
current = resolvedTarget;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
// Exceeded hop cap — loop or pathological depth.
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
async function findSkillFile(dir) {
|
|
184
|
+
for (const name of SKILL_FILE_NAMES) {
|
|
185
|
+
const candidate = path.join(dir, name);
|
|
186
|
+
try {
|
|
187
|
+
const stat = await fs.lstat(candidate);
|
|
188
|
+
if (stat.isFile())
|
|
189
|
+
return candidate;
|
|
190
|
+
if (stat.isSymbolicLink()) {
|
|
191
|
+
const resolved = await safeRealPath(candidate);
|
|
192
|
+
if (resolved === null)
|
|
193
|
+
continue;
|
|
194
|
+
const relativeToDir = path.relative(dir, resolved);
|
|
195
|
+
// SKILL.md must live inside the skill directory — symlink escape rejected.
|
|
196
|
+
if (relativeToDir.startsWith('..') || path.isAbsolute(relativeToDir)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const realStat = await fs.stat(resolved).catch(() => null);
|
|
200
|
+
if (realStat !== null && realStat.isFile())
|
|
201
|
+
return resolved;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// not found — try next variant
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Walk a path with symlink-resolution and return its canonical absolute
|
|
212
|
+
* form, or `null` if the path doesn't exist or cannot be canonicalised.
|
|
213
|
+
*/
|
|
214
|
+
export async function safeRealPath(p) {
|
|
215
|
+
try {
|
|
216
|
+
return await fs.realpath(p);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Walk upward from `cwd` looking for ancestor directories that contain a
|
|
224
|
+
* `<segment>` directory (typically `.qodo/skills` for the project source).
|
|
225
|
+
* Returns the matching ancestor paths in nearest-first order. Caller
|
|
226
|
+
* applies the precedence rule for ties.
|
|
227
|
+
*/
|
|
228
|
+
export async function walkAncestors(cwd, segment) {
|
|
229
|
+
const out = [];
|
|
230
|
+
const root = path.parse(cwd).root;
|
|
231
|
+
let current = path.resolve(cwd);
|
|
232
|
+
// Guard against pathological loops in case `path.dirname` doesn't
|
|
233
|
+
// converge on the root for some reason (e.g. test fixtures).
|
|
234
|
+
for (let i = 0; i < 64 && current.length > 0; i += 1) {
|
|
235
|
+
const candidate = path.join(current, segment);
|
|
236
|
+
const real = await safeRealPath(candidate);
|
|
237
|
+
if (real !== null) {
|
|
238
|
+
try {
|
|
239
|
+
const stat = await fs.stat(real);
|
|
240
|
+
if (stat.isDirectory())
|
|
241
|
+
out.push(real);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// ignore
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (current === root)
|
|
248
|
+
break;
|
|
249
|
+
const next = path.dirname(current);
|
|
250
|
+
if (next === current)
|
|
251
|
+
break;
|
|
252
|
+
current = next;
|
|
253
|
+
}
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
function wrapFsError(message, err) {
|
|
257
|
+
if (err instanceof Error) {
|
|
258
|
+
const e = new Error(`${message}: ${err.message}`);
|
|
259
|
+
e.code = err.code;
|
|
260
|
+
return e;
|
|
261
|
+
}
|
|
262
|
+
return new Error(`${message}: ${String(err)}`);
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../../src/skills/sources/walk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Argument substitutions for skill bodies.
|
|
3
|
+
*
|
|
4
|
+
* Per `knowledge/doc/skills.md` §2.1, a skill body can reference:
|
|
5
|
+
*
|
|
6
|
+
* - `$ARGUMENTS` — the full argument string as typed.
|
|
7
|
+
* - `$ARGUMENTS[N]` — the Nth shell-parsed argument (0-indexed).
|
|
8
|
+
* - `$N` — shorthand for `$ARGUMENTS[N]`.
|
|
9
|
+
* - `$<name>` — named argument matched against `arguments:` frontmatter
|
|
10
|
+
* (positional mapping — the first name maps to argv[0], etc.).
|
|
11
|
+
* - `${CLAUDE_SESSION_ID}` / `${QODO_SESSION_ID}` — current session ID.
|
|
12
|
+
* - `${CLAUDE_SKILL_DIR}` / `${QODO_SKILL_DIR}` — canonical absolute path
|
|
13
|
+
* of the skill directory.
|
|
14
|
+
* - `${CLAUDE_EFFORT}` / `${QODO_EFFORT}` — active effort level.
|
|
15
|
+
*
|
|
16
|
+
* Out-of-bounds indexed references stay literal; the engine emits a
|
|
17
|
+
* `sdk.skill.substitution_warn` event the caller can wire to telemetry.
|
|
18
|
+
*
|
|
19
|
+
* The substitution is intentionally **shape-preserving** for unknown
|
|
20
|
+
* references — a body with `${LITERAL_DOLLAR_AMOUNT}` (no resolver match)
|
|
21
|
+
* is passed through verbatim. Authors who want a literal `$ARGUMENTS`
|
|
22
|
+
* unsubstituted can escape with a non-matching prefix.
|
|
23
|
+
*
|
|
24
|
+
* Compatibility: both `CLAUDE_*` and `QODO_*` prefixes resolve to the same
|
|
25
|
+
* value so OSS skills authored for Anthropic Claude Code render correctly.
|
|
26
|
+
*/
|
|
27
|
+
import type { SkillArgument } from './types.js';
|
|
28
|
+
/**
|
|
29
|
+
* Context passed to {@link substitute}. Every field is optional; missing
|
|
30
|
+
* fields cause the matching reference to remain literal (and emit a
|
|
31
|
+
* warning).
|
|
32
|
+
*/
|
|
33
|
+
export interface SubstitutionContext {
|
|
34
|
+
/** Skill FQN used for telemetry attribution. */
|
|
35
|
+
readonly skill: string;
|
|
36
|
+
/** The full argument string as typed by the caller. */
|
|
37
|
+
readonly argumentsText?: string;
|
|
38
|
+
/** Shell-parsed argv. Index `0` corresponds to the first argument. */
|
|
39
|
+
readonly argv?: readonly string[];
|
|
40
|
+
/** Named-argument descriptors from frontmatter. Position-mapped onto argv. */
|
|
41
|
+
readonly named?: readonly SkillArgument[];
|
|
42
|
+
/** Session identifier resolved by the consumer; powers ${CLAUDE_SESSION_ID}. */
|
|
43
|
+
readonly sessionId?: string;
|
|
44
|
+
/** Canonical absolute path of the skill directory; powers ${CLAUDE_SKILL_DIR}. */
|
|
45
|
+
readonly skillDir?: string;
|
|
46
|
+
/** Effort string (`low|medium|high|max`); powers ${CLAUDE_EFFORT}. */
|
|
47
|
+
readonly effort?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Warning produced during substitution — caller forwards to telemetry. */
|
|
50
|
+
export interface SubstitutionWarning {
|
|
51
|
+
readonly reference: string;
|
|
52
|
+
readonly reason: 'out_of_bounds' | 'unknown_named' | 'malformed';
|
|
53
|
+
}
|
|
54
|
+
export interface SubstitutionResult {
|
|
55
|
+
readonly text: string;
|
|
56
|
+
readonly warnings: readonly SubstitutionWarning[];
|
|
57
|
+
/**
|
|
58
|
+
* `true` iff `$ARGUMENTS` (or any of its forms) appeared in the body and
|
|
59
|
+
* was consumed. Callers use this to decide whether to append
|
|
60
|
+
* `\nARGUMENTS: <args>\n` when an argument string was supplied but no
|
|
61
|
+
* reference consumed it — matches Claude Code's append-on-absence behavior.
|
|
62
|
+
*/
|
|
63
|
+
readonly referencedArguments: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Apply substitutions to a skill body. Pure function — IO-free, returns
|
|
67
|
+
* the rendered text plus any warnings. The caller appends the
|
|
68
|
+
* `ARGUMENTS:` trailer when:
|
|
69
|
+
*
|
|
70
|
+
* - the caller supplied a non-empty `argumentsText` AND
|
|
71
|
+
* - the body did not consume `$ARGUMENTS` / `$N` / `$<name>` in any form.
|
|
72
|
+
*/
|
|
73
|
+
export declare function substitute(body: string, ctx: SubstitutionContext): SubstitutionResult;
|
|
74
|
+
/**
|
|
75
|
+
* Helper composing `substitute` + the Claude-Code-compatible
|
|
76
|
+
* append-on-absence behavior. If the caller passed an argument string but
|
|
77
|
+
* the body never referenced it, append `\nARGUMENTS: <args>\n` to the body.
|
|
78
|
+
*/
|
|
79
|
+
export declare function substituteWithArgumentsTrailer(body: string, ctx: SubstitutionContext): SubstitutionResult;
|
|
80
|
+
/**
|
|
81
|
+
* Parse a shell-quoted argument string into `argv`. Supports double-quoted
|
|
82
|
+
* substrings, single-quoted substrings, and backslash escaping inside
|
|
83
|
+
* double quotes. Intentionally minimal — skill arguments are typed by the
|
|
84
|
+
* model and not a shell.
|
|
85
|
+
*/
|
|
86
|
+
export declare function parseArgv(s: string): string[];
|
|
87
|
+
//# sourceMappingURL=substitute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"substitute.d.ts","sourceRoot":"","sources":["../../src/skills/substitute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,sEAAsE;IACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,GAAG,WAAW,CAAC;CAClE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD;;;;;OAKG;IACH,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,GAAG,kBAAkB,CAqJrF;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,mBAAmB,GACvB,kBAAkB,CAgBpB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAqE7C"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Argument substitutions for skill bodies.
|
|
3
|
+
*
|
|
4
|
+
* Per `knowledge/doc/skills.md` §2.1, a skill body can reference:
|
|
5
|
+
*
|
|
6
|
+
* - `$ARGUMENTS` — the full argument string as typed.
|
|
7
|
+
* - `$ARGUMENTS[N]` — the Nth shell-parsed argument (0-indexed).
|
|
8
|
+
* - `$N` — shorthand for `$ARGUMENTS[N]`.
|
|
9
|
+
* - `$<name>` — named argument matched against `arguments:` frontmatter
|
|
10
|
+
* (positional mapping — the first name maps to argv[0], etc.).
|
|
11
|
+
* - `${CLAUDE_SESSION_ID}` / `${QODO_SESSION_ID}` — current session ID.
|
|
12
|
+
* - `${CLAUDE_SKILL_DIR}` / `${QODO_SKILL_DIR}` — canonical absolute path
|
|
13
|
+
* of the skill directory.
|
|
14
|
+
* - `${CLAUDE_EFFORT}` / `${QODO_EFFORT}` — active effort level.
|
|
15
|
+
*
|
|
16
|
+
* Out-of-bounds indexed references stay literal; the engine emits a
|
|
17
|
+
* `sdk.skill.substitution_warn` event the caller can wire to telemetry.
|
|
18
|
+
*
|
|
19
|
+
* The substitution is intentionally **shape-preserving** for unknown
|
|
20
|
+
* references — a body with `${LITERAL_DOLLAR_AMOUNT}` (no resolver match)
|
|
21
|
+
* is passed through verbatim. Authors who want a literal `$ARGUMENTS`
|
|
22
|
+
* unsubstituted can escape with a non-matching prefix.
|
|
23
|
+
*
|
|
24
|
+
* Compatibility: both `CLAUDE_*` and `QODO_*` prefixes resolve to the same
|
|
25
|
+
* value so OSS skills authored for Anthropic Claude Code render correctly.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Apply substitutions to a skill body. Pure function — IO-free, returns
|
|
29
|
+
* the rendered text plus any warnings. The caller appends the
|
|
30
|
+
* `ARGUMENTS:` trailer when:
|
|
31
|
+
*
|
|
32
|
+
* - the caller supplied a non-empty `argumentsText` AND
|
|
33
|
+
* - the body did not consume `$ARGUMENTS` / `$N` / `$<name>` in any form.
|
|
34
|
+
*/
|
|
35
|
+
export function substitute(body, ctx) {
|
|
36
|
+
const warnings = [];
|
|
37
|
+
let referencedArguments = false;
|
|
38
|
+
// Pre-parse argv from `argumentsText` if not explicitly supplied.
|
|
39
|
+
const argv = ctx.argv ?? (ctx.argumentsText !== undefined ? parseArgv(ctx.argumentsText) : []);
|
|
40
|
+
const namedMap = buildNamedIndex(ctx.named);
|
|
41
|
+
// Single-pass scanner. The body length is bounded (skills' soft cap is
|
|
42
|
+
// 500 lines), so a manual scan is no slower than chained `String.replace`
|
|
43
|
+
// calls and avoids the "leftover bracket suffix" bug where a literal
|
|
44
|
+
// `$ARGUMENTS[-1]` from the first pass gets its prefix consumed by the
|
|
45
|
+
// second pass.
|
|
46
|
+
let out = '';
|
|
47
|
+
let i = 0;
|
|
48
|
+
while (i < body.length) {
|
|
49
|
+
const ch = body[i];
|
|
50
|
+
if (ch !== '$') {
|
|
51
|
+
out += ch;
|
|
52
|
+
i += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// `${VAR}` envvar reference.
|
|
56
|
+
if (body[i + 1] === '{') {
|
|
57
|
+
const close = body.indexOf('}', i + 2);
|
|
58
|
+
if (close !== -1) {
|
|
59
|
+
const name = body.slice(i + 2, close);
|
|
60
|
+
if (/^[A-Z_][A-Z0-9_]*$/.test(name)) {
|
|
61
|
+
const resolved = resolveEnvAlias(name, ctx);
|
|
62
|
+
if (resolved !== null) {
|
|
63
|
+
out += resolved;
|
|
64
|
+
i = close + 1;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
// Known shape but no resolver match — pass through literally.
|
|
68
|
+
out += body.slice(i, close + 1);
|
|
69
|
+
i = close + 1;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
out += ch;
|
|
74
|
+
i += 1;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// `$ARGUMENTS` and `$ARGUMENTS[N]`.
|
|
78
|
+
if (body.slice(i, i + '$ARGUMENTS'.length) === '$ARGUMENTS') {
|
|
79
|
+
const tail = i + '$ARGUMENTS'.length;
|
|
80
|
+
// `$ARGUMENTS[...]` — the bracket form. Match `[<digits-or-leading-minus>]`
|
|
81
|
+
// for a valid index; anything else inside the brackets is "malformed"
|
|
82
|
+
// and the entire `$ARGUMENTS[...]` token stays literal with a
|
|
83
|
+
// `malformed` warning.
|
|
84
|
+
if (body[tail] === '[') {
|
|
85
|
+
const close = body.indexOf(']', tail + 1);
|
|
86
|
+
if (close !== -1) {
|
|
87
|
+
const idxStr = body.slice(tail + 1, close);
|
|
88
|
+
if (/^-?\d+$/.test(idxStr)) {
|
|
89
|
+
const idx = Number.parseInt(idxStr, 10);
|
|
90
|
+
if (idx < 0 || idx >= argv.length) {
|
|
91
|
+
// Reference is shape-valid but the index doesn't resolve.
|
|
92
|
+
// `referencedArguments` stays false — the value never lands
|
|
93
|
+
// in the output, so the append-on-absence trailer should
|
|
94
|
+
// still fire (Qodo #2).
|
|
95
|
+
warnings.push({ reference: `$ARGUMENTS[${idxStr}]`, reason: 'out_of_bounds' });
|
|
96
|
+
out += `$ARGUMENTS[${idxStr}]`;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
referencedArguments = true;
|
|
100
|
+
out += argv[idx];
|
|
101
|
+
}
|
|
102
|
+
i = close + 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// Malformed bracket (non-numeric, empty, leading whitespace).
|
|
106
|
+
// Keep the entire `$ARGUMENTS[...]` literal and emit a
|
|
107
|
+
// `malformed` warning. Crucially, advance past the closing `]`
|
|
108
|
+
// so the bare-`$ARGUMENTS` branch below doesn't then consume
|
|
109
|
+
// the `$ARGUMENTS` prefix and leave a dangling `[...]` suffix.
|
|
110
|
+
warnings.push({
|
|
111
|
+
reference: `$ARGUMENTS[${idxStr}]`,
|
|
112
|
+
reason: 'malformed',
|
|
113
|
+
});
|
|
114
|
+
out += `$ARGUMENTS[${idxStr}]`;
|
|
115
|
+
i = close + 1;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// Unclosed bracket — `$ARGUMENTS[` with no `]`. Treat as
|
|
119
|
+
// malformed and keep just the `$ARGUMENTS` prefix literal so
|
|
120
|
+
// the trailing `[` falls through to ordinary character output.
|
|
121
|
+
warnings.push({ reference: '$ARGUMENTS[', reason: 'malformed' });
|
|
122
|
+
out += '$ARGUMENTS';
|
|
123
|
+
i = tail;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// Bare `$ARGUMENTS`. Require a non-word boundary after.
|
|
127
|
+
const after = body[tail];
|
|
128
|
+
if (after === undefined || !/[A-Za-z0-9_]/.test(after)) {
|
|
129
|
+
referencedArguments = true;
|
|
130
|
+
out += ctx.argumentsText ?? '';
|
|
131
|
+
i = tail;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// `$N` shorthand. `[N]` is whole-token, so `$10` parses as argv[10].
|
|
136
|
+
if (/^\d/.test(body[i + 1] ?? '')) {
|
|
137
|
+
let j = i + 1;
|
|
138
|
+
while (j < body.length && /\d/.test(body[j]))
|
|
139
|
+
j += 1;
|
|
140
|
+
const idxStr = body.slice(i + 1, j);
|
|
141
|
+
// No word-char trailing the number (so `$1abc` is not consumed
|
|
142
|
+
// as `argv[1] + 'abc'`).
|
|
143
|
+
const after = body[j];
|
|
144
|
+
if (after === undefined || !/[A-Za-z_]/.test(after)) {
|
|
145
|
+
const idx = Number.parseInt(idxStr, 10);
|
|
146
|
+
if (idx < 0 || idx >= argv.length) {
|
|
147
|
+
// Index doesn't resolve — keep the reference literal; do NOT
|
|
148
|
+
// mark consumed so the trailer still appends (Qodo #2).
|
|
149
|
+
warnings.push({ reference: `$${idxStr}`, reason: 'out_of_bounds' });
|
|
150
|
+
out += `$${idxStr}`;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
referencedArguments = true;
|
|
154
|
+
out += argv[idx];
|
|
155
|
+
}
|
|
156
|
+
i = j;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// `$<name>` named argument.
|
|
161
|
+
if (namedMap.size > 0 && /[A-Za-z_]/.test(body[i + 1] ?? '')) {
|
|
162
|
+
let j = i + 1;
|
|
163
|
+
while (j < body.length && /[A-Za-z0-9_]/.test(body[j]))
|
|
164
|
+
j += 1;
|
|
165
|
+
const name = body.slice(i + 1, j);
|
|
166
|
+
const index = namedMap.get(name);
|
|
167
|
+
if (index !== undefined) {
|
|
168
|
+
if (index < 0 || index >= argv.length) {
|
|
169
|
+
// Declared name but out of argv bounds — keep literal and do
|
|
170
|
+
// NOT mark consumed (Qodo #2).
|
|
171
|
+
warnings.push({ reference: `$${name}`, reason: 'out_of_bounds' });
|
|
172
|
+
out += `$${name}`;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
referencedArguments = true;
|
|
176
|
+
out += argv[index];
|
|
177
|
+
}
|
|
178
|
+
i = j;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// No substitution matched — keep the literal `$`.
|
|
183
|
+
out += ch;
|
|
184
|
+
i += 1;
|
|
185
|
+
}
|
|
186
|
+
return { text: out, warnings, referencedArguments };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Helper composing `substitute` + the Claude-Code-compatible
|
|
190
|
+
* append-on-absence behavior. If the caller passed an argument string but
|
|
191
|
+
* the body never referenced it, append `\nARGUMENTS: <args>\n` to the body.
|
|
192
|
+
*/
|
|
193
|
+
export function substituteWithArgumentsTrailer(body, ctx) {
|
|
194
|
+
const result = substitute(body, ctx);
|
|
195
|
+
const args = ctx.argumentsText;
|
|
196
|
+
if (args !== undefined &&
|
|
197
|
+
args.length > 0 &&
|
|
198
|
+
!result.referencedArguments) {
|
|
199
|
+
const sep = result.text.endsWith('\n') ? '' : '\n';
|
|
200
|
+
return {
|
|
201
|
+
text: `${result.text}${sep}\nARGUMENTS: ${args}\n`,
|
|
202
|
+
warnings: result.warnings,
|
|
203
|
+
referencedArguments: false,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Parse a shell-quoted argument string into `argv`. Supports double-quoted
|
|
210
|
+
* substrings, single-quoted substrings, and backslash escaping inside
|
|
211
|
+
* double quotes. Intentionally minimal — skill arguments are typed by the
|
|
212
|
+
* model and not a shell.
|
|
213
|
+
*/
|
|
214
|
+
export function parseArgv(s) {
|
|
215
|
+
const out = [];
|
|
216
|
+
let i = 0;
|
|
217
|
+
let current = '';
|
|
218
|
+
let inSingle = false;
|
|
219
|
+
let inDouble = false;
|
|
220
|
+
let hasCurrent = false;
|
|
221
|
+
while (i < s.length) {
|
|
222
|
+
const ch = s[i];
|
|
223
|
+
if (inSingle) {
|
|
224
|
+
if (ch === "'") {
|
|
225
|
+
inSingle = false;
|
|
226
|
+
i += 1;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
current += ch;
|
|
230
|
+
hasCurrent = true;
|
|
231
|
+
i += 1;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (inDouble) {
|
|
235
|
+
if (ch === '\\' && i + 1 < s.length) {
|
|
236
|
+
const next = s[i + 1];
|
|
237
|
+
if (next === '"' || next === '\\' || next === '$' || next === '`') {
|
|
238
|
+
current += next;
|
|
239
|
+
hasCurrent = true;
|
|
240
|
+
i += 2;
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (ch === '"') {
|
|
245
|
+
inDouble = false;
|
|
246
|
+
i += 1;
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
current += ch;
|
|
250
|
+
hasCurrent = true;
|
|
251
|
+
i += 1;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (ch === "'") {
|
|
255
|
+
inSingle = true;
|
|
256
|
+
hasCurrent = true;
|
|
257
|
+
i += 1;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (ch === '"') {
|
|
261
|
+
inDouble = true;
|
|
262
|
+
hasCurrent = true;
|
|
263
|
+
i += 1;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (ch === ' ' || ch === '\t' || ch === '\n') {
|
|
267
|
+
if (hasCurrent) {
|
|
268
|
+
out.push(current);
|
|
269
|
+
current = '';
|
|
270
|
+
hasCurrent = false;
|
|
271
|
+
}
|
|
272
|
+
i += 1;
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
current += ch;
|
|
276
|
+
hasCurrent = true;
|
|
277
|
+
i += 1;
|
|
278
|
+
}
|
|
279
|
+
if (hasCurrent) {
|
|
280
|
+
out.push(current);
|
|
281
|
+
}
|
|
282
|
+
return out;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Build a name → argv-index map from the `arguments:` frontmatter list.
|
|
286
|
+
* The mapping is **positional** — the first declared name maps to
|
|
287
|
+
* `argv[0]`, the second to `argv[1]`, and so on.
|
|
288
|
+
*/
|
|
289
|
+
function buildNamedIndex(named) {
|
|
290
|
+
const map = new Map();
|
|
291
|
+
if (named === undefined)
|
|
292
|
+
return map;
|
|
293
|
+
for (let i = 0; i < named.length; i += 1) {
|
|
294
|
+
const entry = named[i];
|
|
295
|
+
if (entry.name.length === 0)
|
|
296
|
+
continue;
|
|
297
|
+
if (map.has(entry.name))
|
|
298
|
+
continue; // first declaration wins
|
|
299
|
+
map.set(entry.name, i);
|
|
300
|
+
}
|
|
301
|
+
return map;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Resolve a `${VAR}` reference. Returns the substituted value or `null`
|
|
305
|
+
* when the name is not one of the known envvar aliases.
|
|
306
|
+
*/
|
|
307
|
+
function resolveEnvAlias(name, ctx) {
|
|
308
|
+
switch (name) {
|
|
309
|
+
case 'CLAUDE_SESSION_ID':
|
|
310
|
+
case 'QODO_SESSION_ID':
|
|
311
|
+
return ctx.sessionId ?? null;
|
|
312
|
+
case 'CLAUDE_SKILL_DIR':
|
|
313
|
+
case 'QODO_SKILL_DIR':
|
|
314
|
+
return ctx.skillDir ?? null;
|
|
315
|
+
case 'CLAUDE_EFFORT':
|
|
316
|
+
case 'QODO_EFFORT':
|
|
317
|
+
return ctx.effort ?? null;
|
|
318
|
+
default:
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=substitute.js.map
|