@qodo/sdk 0.13.3 → 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.
Files changed (764) hide show
  1. package/LICENSE +31 -118
  2. package/README.md +133 -121
  3. package/bin/qodo-skills.mjs +13 -0
  4. package/bundled-skills/code-review/SKILL.md +41 -0
  5. package/bundled-skills/pr-summary/SKILL.md +59 -0
  6. package/bundled-skills/test-gen/SKILL.md +47 -0
  7. package/dist/auth/index.browser.d.ts +38 -0
  8. package/dist/auth/index.browser.d.ts.map +1 -0
  9. package/dist/auth/index.browser.js +62 -0
  10. package/dist/auth/index.browser.js.map +1 -0
  11. package/dist/auth/index.d.ts +44 -30
  12. package/dist/auth/index.d.ts.map +1 -1
  13. package/dist/auth/index.js +57 -110
  14. package/dist/auth/index.js.map +1 -1
  15. package/dist/client/AgentsClient.d.ts +33 -0
  16. package/dist/client/AgentsClient.d.ts.map +1 -0
  17. package/dist/client/AgentsClient.js +40 -0
  18. package/dist/client/AgentsClient.js.map +1 -0
  19. package/dist/client/ArtifactsClient.d.ts +43 -0
  20. package/dist/client/ArtifactsClient.d.ts.map +1 -0
  21. package/dist/client/ArtifactsClient.js +54 -0
  22. package/dist/client/ArtifactsClient.js.map +1 -0
  23. package/dist/client/BulletinClient.d.ts +45 -0
  24. package/dist/client/BulletinClient.d.ts.map +1 -0
  25. package/dist/client/BulletinClient.js +51 -0
  26. package/dist/client/BulletinClient.js.map +1 -0
  27. package/dist/client/InfoClient.d.ts +58 -0
  28. package/dist/client/InfoClient.d.ts.map +1 -0
  29. package/dist/client/InfoClient.js +135 -0
  30. package/dist/client/InfoClient.js.map +1 -0
  31. package/dist/client/PipelineClient.d.ts +162 -0
  32. package/dist/client/PipelineClient.d.ts.map +1 -0
  33. package/dist/client/PipelineClient.js +340 -0
  34. package/dist/client/PipelineClient.js.map +1 -0
  35. package/dist/client/QarRegistryClient.d.ts +396 -0
  36. package/dist/client/QarRegistryClient.d.ts.map +1 -0
  37. package/dist/client/QarRegistryClient.js +536 -0
  38. package/dist/client/QarRegistryClient.js.map +1 -0
  39. package/dist/client/QodoClient.d.ts +296 -0
  40. package/dist/client/QodoClient.d.ts.map +1 -0
  41. package/dist/client/QodoClient.js +803 -0
  42. package/dist/client/QodoClient.js.map +1 -0
  43. package/dist/client/SpecsClient.d.ts +121 -0
  44. package/dist/client/SpecsClient.d.ts.map +1 -0
  45. package/dist/client/SpecsClient.js +252 -0
  46. package/dist/client/SpecsClient.js.map +1 -0
  47. package/dist/client/StateClient.d.ts +35 -0
  48. package/dist/client/StateClient.d.ts.map +1 -0
  49. package/dist/client/StateClient.js +36 -0
  50. package/dist/client/StateClient.js.map +1 -0
  51. package/dist/client/TaskClient.d.ts +706 -0
  52. package/dist/client/TaskClient.d.ts.map +1 -0
  53. package/dist/client/TaskClient.js +2522 -0
  54. package/dist/client/TaskClient.js.map +1 -0
  55. package/dist/client/ToolClient.d.ts +278 -0
  56. package/dist/client/ToolClient.d.ts.map +1 -0
  57. package/dist/client/ToolClient.js +1115 -0
  58. package/dist/client/ToolClient.js.map +1 -0
  59. package/dist/client/a2a/index.d.ts +10 -0
  60. package/dist/client/a2a/index.d.ts.map +1 -0
  61. package/dist/client/a2a/index.js +9 -0
  62. package/dist/client/a2a/index.js.map +1 -0
  63. package/dist/client/a2a/registerA2A.d.ts +170 -0
  64. package/dist/client/a2a/registerA2A.d.ts.map +1 -0
  65. package/dist/client/a2a/registerA2A.js +85 -0
  66. package/dist/client/a2a/registerA2A.js.map +1 -0
  67. package/dist/client/connection.d.ts +800 -0
  68. package/dist/client/connection.d.ts.map +1 -0
  69. package/dist/client/connection.js +2020 -0
  70. package/dist/client/connection.js.map +1 -0
  71. package/dist/client/errors.d.ts +735 -0
  72. package/dist/client/errors.d.ts.map +1 -0
  73. package/dist/client/errors.js +921 -0
  74. package/dist/client/errors.js.map +1 -0
  75. package/dist/client/index.d.ts +26 -0
  76. package/dist/client/index.d.ts.map +1 -0
  77. package/dist/client/index.js +20 -0
  78. package/dist/client/index.js.map +1 -0
  79. package/dist/client/inlineGraph.d.ts +66 -0
  80. package/dist/client/inlineGraph.d.ts.map +1 -0
  81. package/dist/client/inlineGraph.js +500 -0
  82. package/dist/client/inlineGraph.js.map +1 -0
  83. package/dist/client/internal/thenable.d.ts +27 -0
  84. package/dist/client/internal/thenable.d.ts.map +1 -0
  85. package/dist/client/internal/thenable.js +31 -0
  86. package/dist/client/internal/thenable.js.map +1 -0
  87. package/dist/client/iterator.d.ts +32 -0
  88. package/dist/client/iterator.d.ts.map +1 -0
  89. package/dist/client/iterator.js +73 -0
  90. package/dist/client/iterator.js.map +1 -0
  91. package/dist/client/mcp/McpClientPool.browser.d.ts +76 -0
  92. package/dist/client/mcp/McpClientPool.browser.d.ts.map +1 -0
  93. package/dist/client/mcp/McpClientPool.browser.js +78 -0
  94. package/dist/client/mcp/McpClientPool.browser.js.map +1 -0
  95. package/dist/client/mcp/McpClientPool.d.ts +236 -0
  96. package/dist/client/mcp/McpClientPool.d.ts.map +1 -0
  97. package/dist/client/mcp/McpClientPool.js +585 -0
  98. package/dist/client/mcp/McpClientPool.js.map +1 -0
  99. package/dist/client/mcp/projection.d.ts +109 -0
  100. package/dist/client/mcp/projection.d.ts.map +1 -0
  101. package/dist/client/mcp/projection.js +446 -0
  102. package/dist/client/mcp/projection.js.map +1 -0
  103. package/dist/client/mcp/substituteEnv.browser.d.ts +18 -0
  104. package/dist/client/mcp/substituteEnv.browser.d.ts.map +1 -0
  105. package/dist/client/mcp/substituteEnv.browser.js +20 -0
  106. package/dist/client/mcp/substituteEnv.browser.js.map +1 -0
  107. package/dist/client/mcp/substituteEnv.d.ts +45 -0
  108. package/dist/client/mcp/substituteEnv.d.ts.map +1 -0
  109. package/dist/client/mcp/substituteEnv.js +63 -0
  110. package/dist/client/mcp/substituteEnv.js.map +1 -0
  111. package/dist/client/observers.d.ts +57 -0
  112. package/dist/client/observers.d.ts.map +1 -0
  113. package/dist/client/observers.js +203 -0
  114. package/dist/client/observers.js.map +1 -0
  115. package/dist/client/options.d.ts +269 -0
  116. package/dist/client/options.d.ts.map +1 -0
  117. package/dist/client/options.js +9 -0
  118. package/dist/client/options.js.map +1 -0
  119. package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts +17 -0
  120. package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts.map +1 -0
  121. package/dist/client/tools/_readlineApprovalPrompt.browser.js +24 -0
  122. package/dist/client/tools/_readlineApprovalPrompt.browser.js.map +1 -0
  123. package/dist/client/tools/_readlineApprovalPrompt.d.ts +33 -0
  124. package/dist/client/tools/_readlineApprovalPrompt.d.ts.map +1 -0
  125. package/dist/client/tools/_readlineApprovalPrompt.js +90 -0
  126. package/dist/client/tools/_readlineApprovalPrompt.js.map +1 -0
  127. package/dist/client/tools/approval.d.ts +280 -0
  128. package/dist/client/tools/approval.d.ts.map +1 -0
  129. package/dist/client/tools/approval.js +229 -0
  130. package/dist/client/tools/approval.js.map +1 -0
  131. package/dist/client/tools/bindFunctionToolDefs.d.ts +156 -0
  132. package/dist/client/tools/bindFunctionToolDefs.d.ts.map +1 -0
  133. package/dist/client/tools/bindFunctionToolDefs.js +360 -0
  134. package/dist/client/tools/bindFunctionToolDefs.js.map +1 -0
  135. package/dist/client/tools/defineFunctionTool.d.ts +277 -0
  136. package/dist/client/tools/defineFunctionTool.d.ts.map +1 -0
  137. package/dist/client/tools/defineFunctionTool.js +190 -0
  138. package/dist/client/tools/defineFunctionTool.js.map +1 -0
  139. package/dist/client/transport.browser.d.ts +20 -0
  140. package/dist/client/transport.browser.d.ts.map +1 -0
  141. package/dist/client/transport.browser.js +29 -0
  142. package/dist/client/transport.browser.js.map +1 -0
  143. package/dist/client/transport.d.ts +47 -0
  144. package/dist/client/transport.d.ts.map +1 -0
  145. package/dist/client/transport.js +102 -0
  146. package/dist/client/transport.js.map +1 -0
  147. package/dist/client/transport.shared.d.ts +30 -0
  148. package/dist/client/transport.shared.d.ts.map +1 -0
  149. package/dist/client/transport.shared.js +40 -0
  150. package/dist/client/transport.shared.js.map +1 -0
  151. package/dist/client/uuid.d.ts +32 -0
  152. package/dist/client/uuid.d.ts.map +1 -0
  153. package/dist/client/uuid.js +65 -0
  154. package/dist/client/uuid.js.map +1 -0
  155. package/dist/index.d.ts +88 -39
  156. package/dist/index.d.ts.map +1 -1
  157. package/dist/index.js +166 -43
  158. package/dist/index.js.map +1 -1
  159. package/dist/observability/attributes.d.ts +136 -0
  160. package/dist/observability/attributes.d.ts.map +1 -0
  161. package/dist/observability/attributes.js +184 -0
  162. package/dist/observability/attributes.js.map +1 -0
  163. package/dist/observability/index.d.ts +14 -0
  164. package/dist/observability/index.d.ts.map +1 -0
  165. package/dist/observability/index.js +11 -0
  166. package/dist/observability/index.js.map +1 -0
  167. package/dist/observability/resolveOTel.browser.d.ts +13 -0
  168. package/dist/observability/resolveOTel.browser.d.ts.map +1 -0
  169. package/dist/observability/resolveOTel.browser.js +14 -0
  170. package/dist/observability/resolveOTel.browser.js.map +1 -0
  171. package/dist/observability/resolveOTel.d.ts +28 -0
  172. package/dist/observability/resolveOTel.d.ts.map +1 -0
  173. package/dist/observability/resolveOTel.js +74 -0
  174. package/dist/observability/resolveOTel.js.map +1 -0
  175. package/dist/observability/spans.d.ts +198 -0
  176. package/dist/observability/spans.d.ts.map +1 -0
  177. package/dist/observability/spans.js +300 -0
  178. package/dist/observability/spans.js.map +1 -0
  179. package/dist/observability/traceContext.d.ts +51 -0
  180. package/dist/observability/traceContext.d.ts.map +1 -0
  181. package/dist/observability/traceContext.js +151 -0
  182. package/dist/observability/traceContext.js.map +1 -0
  183. package/dist/observability/transportMetrics.d.ts +58 -0
  184. package/dist/observability/transportMetrics.d.ts.map +1 -0
  185. package/dist/observability/transportMetrics.js +55 -0
  186. package/dist/observability/transportMetrics.js.map +1 -0
  187. package/dist/qar/agentSpec.d.ts +93 -0
  188. package/dist/qar/agentSpec.d.ts.map +1 -0
  189. package/dist/qar/agentSpec.js +184 -0
  190. package/dist/qar/agentSpec.js.map +1 -0
  191. package/dist/qar/clientEvents.d.ts +86 -0
  192. package/dist/qar/clientEvents.d.ts.map +1 -0
  193. package/dist/qar/clientEvents.js +36 -0
  194. package/dist/qar/clientEvents.js.map +1 -0
  195. package/dist/qar/envelopes.d.ts +227 -0
  196. package/dist/qar/envelopes.d.ts.map +1 -0
  197. package/dist/qar/envelopes.js +67 -0
  198. package/dist/qar/envelopes.js.map +1 -0
  199. package/dist/qar/generated/envelope.d.ts +332 -0
  200. package/dist/qar/generated/envelope.d.ts.map +1 -0
  201. package/dist/qar/generated/envelope.js +15 -0
  202. package/dist/qar/generated/envelope.js.map +1 -0
  203. package/dist/qar/generated/qar-info.d.ts +76 -0
  204. package/dist/qar/generated/qar-info.d.ts.map +1 -0
  205. package/dist/qar/generated/qar-info.js +15 -0
  206. package/dist/qar/generated/qar-info.js.map +1 -0
  207. package/dist/qar/generated/qodo-task-start-payload.d.ts +54 -0
  208. package/dist/qar/generated/qodo-task-start-payload.d.ts.map +1 -0
  209. package/dist/qar/generated/qodo-task-start-payload.js +15 -0
  210. package/dist/qar/generated/qodo-task-start-payload.js.map +1 -0
  211. package/dist/qar/ids.d.ts +19 -0
  212. package/dist/qar/ids.d.ts.map +1 -0
  213. package/dist/qar/ids.js +11 -0
  214. package/dist/qar/ids.js.map +1 -0
  215. package/dist/qar/index.d.ts +24 -0
  216. package/dist/qar/index.d.ts.map +1 -0
  217. package/dist/qar/index.js +16 -0
  218. package/dist/qar/index.js.map +1 -0
  219. package/dist/qar/info.d.ts +37 -0
  220. package/dist/qar/info.d.ts.map +1 -0
  221. package/dist/qar/info.js +17 -0
  222. package/dist/qar/info.js.map +1 -0
  223. package/dist/qar/json.d.ts +14 -0
  224. package/dist/qar/json.d.ts.map +1 -0
  225. package/dist/qar/json.js +9 -0
  226. package/dist/qar/json.js.map +1 -0
  227. package/dist/qar/payloads.d.ts +480 -0
  228. package/dist/qar/payloads.d.ts.map +1 -0
  229. package/dist/qar/payloads.js +37 -0
  230. package/dist/qar/payloads.js.map +1 -0
  231. package/dist/qar/specs.d.ts +604 -0
  232. package/dist/qar/specs.d.ts.map +1 -0
  233. package/dist/qar/specs.js +29 -0
  234. package/dist/qar/specs.js.map +1 -0
  235. package/dist/qar/taskEvents.d.ts +25 -0
  236. package/dist/qar/taskEvents.d.ts.map +1 -0
  237. package/dist/qar/taskEvents.js +22 -0
  238. package/dist/qar/taskEvents.js.map +1 -0
  239. package/dist/qar/trace.d.ts +12 -0
  240. package/dist/qar/trace.d.ts.map +1 -0
  241. package/dist/qar/trace.js +12 -0
  242. package/dist/qar/trace.js.map +1 -0
  243. package/dist/skills/activation.d.ts +177 -0
  244. package/dist/skills/activation.d.ts.map +1 -0
  245. package/dist/skills/activation.js +428 -0
  246. package/dist/skills/activation.js.map +1 -0
  247. package/dist/skills/cli/index.browser.d.ts +18 -0
  248. package/dist/skills/cli/index.browser.d.ts.map +1 -0
  249. package/dist/skills/cli/index.browser.js +27 -0
  250. package/dist/skills/cli/index.browser.js.map +1 -0
  251. package/dist/skills/cli/index.d.ts +37 -0
  252. package/dist/skills/cli/index.d.ts.map +1 -0
  253. package/dist/skills/cli/index.js +494 -0
  254. package/dist/skills/cli/index.js.map +1 -0
  255. package/dist/skills/events.d.ts +255 -0
  256. package/dist/skills/events.d.ts.map +1 -0
  257. package/dist/skills/events.js +224 -0
  258. package/dist/skills/events.js.map +1 -0
  259. package/dist/skills/index.d.ts +45 -0
  260. package/dist/skills/index.d.ts.map +1 -0
  261. package/dist/skills/index.js +34 -0
  262. package/dist/skills/index.js.map +1 -0
  263. package/dist/skills/inject.d.ts +57 -0
  264. package/dist/skills/inject.d.ts.map +1 -0
  265. package/dist/skills/inject.js +162 -0
  266. package/dist/skills/inject.js.map +1 -0
  267. package/dist/skills/lockfile.browser.d.ts +56 -0
  268. package/dist/skills/lockfile.browser.d.ts.map +1 -0
  269. package/dist/skills/lockfile.browser.js +55 -0
  270. package/dist/skills/lockfile.browser.js.map +1 -0
  271. package/dist/skills/lockfile.d.ts +137 -0
  272. package/dist/skills/lockfile.d.ts.map +1 -0
  273. package/dist/skills/lockfile.js +423 -0
  274. package/dist/skills/lockfile.js.map +1 -0
  275. package/dist/skills/manager.browser.d.ts +94 -0
  276. package/dist/skills/manager.browser.d.ts.map +1 -0
  277. package/dist/skills/manager.browser.js +159 -0
  278. package/dist/skills/manager.browser.js.map +1 -0
  279. package/dist/skills/manager.d.ts +362 -0
  280. package/dist/skills/manager.d.ts.map +1 -0
  281. package/dist/skills/manager.js +1386 -0
  282. package/dist/skills/manager.js.map +1 -0
  283. package/dist/skills/mcp/index.d.ts +15 -0
  284. package/dist/skills/mcp/index.d.ts.map +1 -0
  285. package/dist/skills/mcp/index.js +12 -0
  286. package/dist/skills/mcp/index.js.map +1 -0
  287. package/dist/skills/mcp/path.browser.d.ts +27 -0
  288. package/dist/skills/mcp/path.browser.d.ts.map +1 -0
  289. package/dist/skills/mcp/path.browser.js +33 -0
  290. package/dist/skills/mcp/path.browser.js.map +1 -0
  291. package/dist/skills/mcp/path.d.ts +57 -0
  292. package/dist/skills/mcp/path.d.ts.map +1 -0
  293. package/dist/skills/mcp/path.js +150 -0
  294. package/dist/skills/mcp/path.js.map +1 -0
  295. package/dist/skills/mcp/server.browser.d.ts +32 -0
  296. package/dist/skills/mcp/server.browser.d.ts.map +1 -0
  297. package/dist/skills/mcp/server.browser.js +53 -0
  298. package/dist/skills/mcp/server.browser.js.map +1 -0
  299. package/dist/skills/mcp/server.d.ts +144 -0
  300. package/dist/skills/mcp/server.d.ts.map +1 -0
  301. package/dist/skills/mcp/server.js +841 -0
  302. package/dist/skills/mcp/server.js.map +1 -0
  303. package/dist/skills/mcp/types.d.ts +72 -0
  304. package/dist/skills/mcp/types.d.ts.map +1 -0
  305. package/dist/skills/mcp/types.js +20 -0
  306. package/dist/skills/mcp/types.js.map +1 -0
  307. package/dist/skills/mcp/wireDefs.d.ts +58 -0
  308. package/dist/skills/mcp/wireDefs.d.ts.map +1 -0
  309. package/dist/skills/mcp/wireDefs.js +141 -0
  310. package/dist/skills/mcp/wireDefs.js.map +1 -0
  311. package/dist/skills/parser.d.ts +63 -0
  312. package/dist/skills/parser.d.ts.map +1 -0
  313. package/dist/skills/parser.js +755 -0
  314. package/dist/skills/parser.js.map +1 -0
  315. package/dist/skills/prefilter.d.ts +104 -0
  316. package/dist/skills/prefilter.d.ts.map +1 -0
  317. package/dist/skills/prefilter.js +398 -0
  318. package/dist/skills/prefilter.js.map +1 -0
  319. package/dist/skills/preprocess.d.ts +169 -0
  320. package/dist/skills/preprocess.d.ts.map +1 -0
  321. package/dist/skills/preprocess.js +535 -0
  322. package/dist/skills/preprocess.js.map +1 -0
  323. package/dist/skills/render.d.ts +83 -0
  324. package/dist/skills/render.d.ts.map +1 -0
  325. package/dist/skills/render.js +397 -0
  326. package/dist/skills/render.js.map +1 -0
  327. package/dist/skills/sources/index.browser.d.ts +29 -0
  328. package/dist/skills/sources/index.browser.d.ts.map +1 -0
  329. package/dist/skills/sources/index.browser.js +16 -0
  330. package/dist/skills/sources/index.browser.js.map +1 -0
  331. package/dist/skills/sources/index.d.ts +59 -0
  332. package/dist/skills/sources/index.d.ts.map +1 -0
  333. package/dist/skills/sources/index.js +471 -0
  334. package/dist/skills/sources/index.js.map +1 -0
  335. package/dist/skills/sources/walk.browser.d.ts +17 -0
  336. package/dist/skills/sources/walk.browser.d.ts.map +1 -0
  337. package/dist/skills/sources/walk.browser.js +19 -0
  338. package/dist/skills/sources/walk.browser.js.map +1 -0
  339. package/dist/skills/sources/walk.d.ts +68 -0
  340. package/dist/skills/sources/walk.d.ts.map +1 -0
  341. package/dist/skills/sources/walk.js +264 -0
  342. package/dist/skills/sources/walk.js.map +1 -0
  343. package/dist/skills/substitute.d.ts +87 -0
  344. package/dist/skills/substitute.d.ts.map +1 -0
  345. package/dist/skills/substitute.js +322 -0
  346. package/dist/skills/substitute.js.map +1 -0
  347. package/dist/skills/testing/SkillKit.browser.d.ts +62 -0
  348. package/dist/skills/testing/SkillKit.browser.d.ts.map +1 -0
  349. package/dist/skills/testing/SkillKit.browser.js +41 -0
  350. package/dist/skills/testing/SkillKit.browser.js.map +1 -0
  351. package/dist/skills/testing/SkillKit.d.ts +130 -0
  352. package/dist/skills/testing/SkillKit.d.ts.map +1 -0
  353. package/dist/skills/testing/SkillKit.js +316 -0
  354. package/dist/skills/testing/SkillKit.js.map +1 -0
  355. package/dist/skills/testing/index.d.ts +9 -0
  356. package/dist/skills/testing/index.d.ts.map +1 -0
  357. package/dist/skills/testing/index.js +8 -0
  358. package/dist/skills/testing/index.js.map +1 -0
  359. package/dist/skills/trust.d.ts +72 -0
  360. package/dist/skills/trust.d.ts.map +1 -0
  361. package/dist/skills/trust.js +183 -0
  362. package/dist/skills/trust.js.map +1 -0
  363. package/dist/skills/types.d.ts +627 -0
  364. package/dist/skills/types.d.ts.map +1 -0
  365. package/dist/skills/types.js +85 -0
  366. package/dist/skills/types.js.map +1 -0
  367. package/dist/skills/validator.d.ts +95 -0
  368. package/dist/skills/validator.d.ts.map +1 -0
  369. package/dist/skills/validator.js +486 -0
  370. package/dist/skills/validator.js.map +1 -0
  371. package/dist/tracing/PipelineTracer.d.ts +35 -22
  372. package/dist/tracing/PipelineTracer.d.ts.map +1 -1
  373. package/dist/tracing/PipelineTracer.js +106 -61
  374. package/dist/tracing/PipelineTracer.js.map +1 -1
  375. package/dist/tracing/SdkTracer.d.ts +63 -61
  376. package/dist/tracing/SdkTracer.d.ts.map +1 -1
  377. package/dist/tracing/SdkTracer.js +185 -177
  378. package/dist/tracing/SdkTracer.js.map +1 -1
  379. package/dist/tracing/index.d.ts +10 -1
  380. package/dist/tracing/index.d.ts.map +1 -1
  381. package/dist/tracing/index.js +9 -0
  382. package/dist/tracing/index.js.map +1 -1
  383. package/dist/tracing/types.d.ts +89 -16
  384. package/dist/tracing/types.d.ts.map +1 -1
  385. package/dist/tracing/types.js +17 -4
  386. package/dist/tracing/types.js.map +1 -1
  387. package/dist/types.d.ts +6 -1
  388. package/dist/types.d.ts.map +1 -1
  389. package/dist/types.js +4 -0
  390. package/dist/types.js.map +1 -1
  391. package/dist/version.d.ts.map +1 -1
  392. package/dist/version.js +10 -20
  393. package/dist/version.js.map +1 -1
  394. package/package.json +53 -39
  395. package/.claude/skills/qodo-agent/SKILL.md +0 -974
  396. package/.claude/skills/qodo-agent/assets/programmatic-agent.ts +0 -407
  397. package/.claude/skills/qodo-agent/references/builtin-tools.md +0 -342
  398. package/.claude/skills/qodo-agent/references/common-issues.md +0 -537
  399. package/bin/rg +0 -0
  400. package/dist/api/agent.d.ts +0 -104
  401. package/dist/api/agent.d.ts.map +0 -1
  402. package/dist/api/agent.js +0 -939
  403. package/dist/api/agent.js.map +0 -1
  404. package/dist/api/analytics.d.ts +0 -43
  405. package/dist/api/analytics.d.ts.map +0 -1
  406. package/dist/api/analytics.js +0 -163
  407. package/dist/api/analytics.js.map +0 -1
  408. package/dist/api/http.d.ts +0 -5
  409. package/dist/api/http.d.ts.map +0 -1
  410. package/dist/api/http.js +0 -62
  411. package/dist/api/http.js.map +0 -1
  412. package/dist/api/index.d.ts +0 -12
  413. package/dist/api/index.d.ts.map +0 -1
  414. package/dist/api/index.js +0 -17
  415. package/dist/api/index.js.map +0 -1
  416. package/dist/api/taskTracking.d.ts +0 -54
  417. package/dist/api/taskTracking.d.ts.map +0 -1
  418. package/dist/api/taskTracking.js +0 -208
  419. package/dist/api/taskTracking.js.map +0 -1
  420. package/dist/api/types.d.ts +0 -93
  421. package/dist/api/types.d.ts.map +0 -1
  422. package/dist/api/types.js +0 -2
  423. package/dist/api/types.js.map +0 -1
  424. package/dist/api/utils.d.ts +0 -8
  425. package/dist/api/utils.d.ts.map +0 -1
  426. package/dist/api/utils.js +0 -63
  427. package/dist/api/utils.js.map +0 -1
  428. package/dist/api/websocket.d.ts +0 -203
  429. package/dist/api/websocket.d.ts.map +0 -1
  430. package/dist/api/websocket.js +0 -1166
  431. package/dist/api/websocket.js.map +0 -1
  432. package/dist/bin/install-skill.d.ts +0 -14
  433. package/dist/bin/install-skill.d.ts.map +0 -1
  434. package/dist/bin/install-skill.js +0 -125
  435. package/dist/bin/install-skill.js.map +0 -1
  436. package/dist/bin/run-helpers.d.ts +0 -34
  437. package/dist/bin/run-helpers.d.ts.map +0 -1
  438. package/dist/bin/run-helpers.js +0 -186
  439. package/dist/bin/run-helpers.js.map +0 -1
  440. package/dist/bin/run.d.ts +0 -13
  441. package/dist/bin/run.d.ts.map +0 -1
  442. package/dist/bin/run.js +0 -57
  443. package/dist/bin/run.js.map +0 -1
  444. package/dist/clients/index.d.ts +0 -10
  445. package/dist/clients/index.d.ts.map +0 -1
  446. package/dist/clients/index.js +0 -8
  447. package/dist/clients/index.js.map +0 -1
  448. package/dist/clients/info/InfoClient.d.ts +0 -37
  449. package/dist/clients/info/InfoClient.d.ts.map +0 -1
  450. package/dist/clients/info/InfoClient.js +0 -69
  451. package/dist/clients/info/InfoClient.js.map +0 -1
  452. package/dist/clients/info/index.d.ts +0 -4
  453. package/dist/clients/info/index.d.ts.map +0 -1
  454. package/dist/clients/info/index.js +0 -2
  455. package/dist/clients/info/index.js.map +0 -1
  456. package/dist/clients/info/types.d.ts +0 -21
  457. package/dist/clients/info/types.d.ts.map +0 -1
  458. package/dist/clients/info/types.js +0 -2
  459. package/dist/clients/info/types.js.map +0 -1
  460. package/dist/clients/sessions/SessionsClient.d.ts +0 -34
  461. package/dist/clients/sessions/SessionsClient.d.ts.map +0 -1
  462. package/dist/clients/sessions/SessionsClient.js +0 -71
  463. package/dist/clients/sessions/SessionsClient.js.map +0 -1
  464. package/dist/clients/sessions/index.d.ts +0 -4
  465. package/dist/clients/sessions/index.d.ts.map +0 -1
  466. package/dist/clients/sessions/index.js +0 -2
  467. package/dist/clients/sessions/index.js.map +0 -1
  468. package/dist/clients/sessions/types.d.ts +0 -20
  469. package/dist/clients/sessions/types.d.ts.map +0 -1
  470. package/dist/clients/sessions/types.js +0 -2
  471. package/dist/clients/sessions/types.js.map +0 -1
  472. package/dist/clients/tools/ToolsClient.d.ts +0 -39
  473. package/dist/clients/tools/ToolsClient.d.ts.map +0 -1
  474. package/dist/clients/tools/ToolsClient.js +0 -95
  475. package/dist/clients/tools/ToolsClient.js.map +0 -1
  476. package/dist/clients/tools/index.d.ts +0 -4
  477. package/dist/clients/tools/index.d.ts.map +0 -1
  478. package/dist/clients/tools/index.js +0 -2
  479. package/dist/clients/tools/index.js.map +0 -1
  480. package/dist/clients/tools/types.d.ts +0 -14
  481. package/dist/clients/tools/types.d.ts.map +0 -1
  482. package/dist/clients/tools/types.js +0 -2
  483. package/dist/clients/tools/types.js.map +0 -1
  484. package/dist/config/ConfigManager.d.ts +0 -43
  485. package/dist/config/ConfigManager.d.ts.map +0 -1
  486. package/dist/config/ConfigManager.js +0 -472
  487. package/dist/config/ConfigManager.js.map +0 -1
  488. package/dist/config/index.d.ts +0 -6
  489. package/dist/config/index.d.ts.map +0 -1
  490. package/dist/config/index.js +0 -7
  491. package/dist/config/index.js.map +0 -1
  492. package/dist/config/urlConfig.d.ts +0 -15
  493. package/dist/config/urlConfig.d.ts.map +0 -1
  494. package/dist/config/urlConfig.js +0 -75
  495. package/dist/config/urlConfig.js.map +0 -1
  496. package/dist/constants/errors.d.ts +0 -2
  497. package/dist/constants/errors.d.ts.map +0 -1
  498. package/dist/constants/errors.js +0 -2
  499. package/dist/constants/errors.js.map +0 -1
  500. package/dist/constants/index.d.ts +0 -7
  501. package/dist/constants/index.d.ts.map +0 -1
  502. package/dist/constants/index.js +0 -11
  503. package/dist/constants/index.js.map +0 -1
  504. package/dist/constants/tools.d.ts +0 -4
  505. package/dist/constants/tools.d.ts.map +0 -1
  506. package/dist/constants/tools.js +0 -4
  507. package/dist/constants/tools.js.map +0 -1
  508. package/dist/constants/versions.d.ts +0 -2
  509. package/dist/constants/versions.d.ts.map +0 -1
  510. package/dist/constants/versions.js +0 -2
  511. package/dist/constants/versions.js.map +0 -1
  512. package/dist/context/buildUserContext.d.ts +0 -18
  513. package/dist/context/buildUserContext.d.ts.map +0 -1
  514. package/dist/context/buildUserContext.js +0 -34
  515. package/dist/context/buildUserContext.js.map +0 -1
  516. package/dist/context/index.d.ts +0 -9
  517. package/dist/context/index.d.ts.map +0 -1
  518. package/dist/context/index.js +0 -9
  519. package/dist/context/index.js.map +0 -1
  520. package/dist/context/messageManager.d.ts +0 -42
  521. package/dist/context/messageManager.d.ts.map +0 -1
  522. package/dist/context/messageManager.js +0 -322
  523. package/dist/context/messageManager.js.map +0 -1
  524. package/dist/context/taskFocus.d.ts +0 -2
  525. package/dist/context/taskFocus.d.ts.map +0 -1
  526. package/dist/context/taskFocus.js +0 -26
  527. package/dist/context/taskFocus.js.map +0 -1
  528. package/dist/context/userInput.d.ts +0 -3
  529. package/dist/context/userInput.d.ts.map +0 -1
  530. package/dist/context/userInput.js +0 -20
  531. package/dist/context/userInput.js.map +0 -1
  532. package/dist/mcp/MCPManager.d.ts +0 -109
  533. package/dist/mcp/MCPManager.d.ts.map +0 -1
  534. package/dist/mcp/MCPManager.js +0 -592
  535. package/dist/mcp/MCPManager.js.map +0 -1
  536. package/dist/mcp/approvedTools.d.ts +0 -4
  537. package/dist/mcp/approvedTools.d.ts.map +0 -1
  538. package/dist/mcp/approvedTools.js +0 -19
  539. package/dist/mcp/approvedTools.js.map +0 -1
  540. package/dist/mcp/baseServer.d.ts +0 -75
  541. package/dist/mcp/baseServer.d.ts.map +0 -1
  542. package/dist/mcp/baseServer.js +0 -107
  543. package/dist/mcp/baseServer.js.map +0 -1
  544. package/dist/mcp/builtinServers.d.ts +0 -15
  545. package/dist/mcp/builtinServers.d.ts.map +0 -1
  546. package/dist/mcp/builtinServers.js +0 -141
  547. package/dist/mcp/builtinServers.js.map +0 -1
  548. package/dist/mcp/dynamicBEServer.d.ts +0 -20
  549. package/dist/mcp/dynamicBEServer.d.ts.map +0 -1
  550. package/dist/mcp/dynamicBEServer.js +0 -52
  551. package/dist/mcp/dynamicBEServer.js.map +0 -1
  552. package/dist/mcp/index.d.ts +0 -18
  553. package/dist/mcp/index.d.ts.map +0 -1
  554. package/dist/mcp/index.js +0 -23
  555. package/dist/mcp/index.js.map +0 -1
  556. package/dist/mcp/mcpInitialization.d.ts +0 -2
  557. package/dist/mcp/mcpInitialization.d.ts.map +0 -1
  558. package/dist/mcp/mcpInitialization.js +0 -56
  559. package/dist/mcp/mcpInitialization.js.map +0 -1
  560. package/dist/mcp/servers/filesystem.d.ts +0 -44
  561. package/dist/mcp/servers/filesystem.d.ts.map +0 -1
  562. package/dist/mcp/servers/filesystem.js +0 -776
  563. package/dist/mcp/servers/filesystem.js.map +0 -1
  564. package/dist/mcp/servers/git.d.ts +0 -18
  565. package/dist/mcp/servers/git.d.ts.map +0 -1
  566. package/dist/mcp/servers/git.js +0 -441
  567. package/dist/mcp/servers/git.js.map +0 -1
  568. package/dist/mcp/servers/ripgrep.d.ts +0 -39
  569. package/dist/mcp/servers/ripgrep.d.ts.map +0 -1
  570. package/dist/mcp/servers/ripgrep.js +0 -550
  571. package/dist/mcp/servers/ripgrep.js.map +0 -1
  572. package/dist/mcp/servers/shell.d.ts +0 -20
  573. package/dist/mcp/servers/shell.d.ts.map +0 -1
  574. package/dist/mcp/servers/shell.js +0 -519
  575. package/dist/mcp/servers/shell.js.map +0 -1
  576. package/dist/mcp/serversRegistry.d.ts +0 -55
  577. package/dist/mcp/serversRegistry.d.ts.map +0 -1
  578. package/dist/mcp/serversRegistry.js +0 -416
  579. package/dist/mcp/serversRegistry.js.map +0 -1
  580. package/dist/mcp/toolProcessor.d.ts +0 -82
  581. package/dist/mcp/toolProcessor.d.ts.map +0 -1
  582. package/dist/mcp/toolProcessor.js +0 -392
  583. package/dist/mcp/toolProcessor.js.map +0 -1
  584. package/dist/mcp/types.d.ts +0 -29
  585. package/dist/mcp/types.d.ts.map +0 -1
  586. package/dist/mcp/types.js +0 -2
  587. package/dist/mcp/types.js.map +0 -1
  588. package/dist/messages/index.d.ts +0 -8
  589. package/dist/messages/index.d.ts.map +0 -1
  590. package/dist/messages/index.js +0 -7
  591. package/dist/messages/index.js.map +0 -1
  592. package/dist/messages/openai.d.ts +0 -26
  593. package/dist/messages/openai.d.ts.map +0 -1
  594. package/dist/messages/openai.js +0 -55
  595. package/dist/messages/openai.js.map +0 -1
  596. package/dist/messages/types.d.ts +0 -73
  597. package/dist/messages/types.d.ts.map +0 -1
  598. package/dist/messages/types.js +0 -78
  599. package/dist/messages/types.js.map +0 -1
  600. package/dist/parser/index.d.ts +0 -72
  601. package/dist/parser/index.d.ts.map +0 -1
  602. package/dist/parser/index.js +0 -967
  603. package/dist/parser/index.js.map +0 -1
  604. package/dist/parser/types.d.ts +0 -153
  605. package/dist/parser/types.d.ts.map +0 -1
  606. package/dist/parser/types.js +0 -6
  607. package/dist/parser/types.js.map +0 -1
  608. package/dist/parser/utils.d.ts +0 -18
  609. package/dist/parser/utils.d.ts.map +0 -1
  610. package/dist/parser/utils.js +0 -64
  611. package/dist/parser/utils.js.map +0 -1
  612. package/dist/sdk/QodoSDK.d.ts +0 -218
  613. package/dist/sdk/QodoSDK.d.ts.map +0 -1
  614. package/dist/sdk/QodoSDK.js +0 -1115
  615. package/dist/sdk/QodoSDK.js.map +0 -1
  616. package/dist/sdk/artifacts.d.ts +0 -156
  617. package/dist/sdk/artifacts.d.ts.map +0 -1
  618. package/dist/sdk/artifacts.js +0 -166
  619. package/dist/sdk/artifacts.js.map +0 -1
  620. package/dist/sdk/bootstrap.d.ts +0 -16
  621. package/dist/sdk/bootstrap.d.ts.map +0 -1
  622. package/dist/sdk/bootstrap.js +0 -28
  623. package/dist/sdk/bootstrap.js.map +0 -1
  624. package/dist/sdk/builders.d.ts +0 -54
  625. package/dist/sdk/builders.d.ts.map +0 -1
  626. package/dist/sdk/builders.js +0 -117
  627. package/dist/sdk/builders.js.map +0 -1
  628. package/dist/sdk/defaults.d.ts +0 -11
  629. package/dist/sdk/defaults.d.ts.map +0 -1
  630. package/dist/sdk/defaults.js +0 -39
  631. package/dist/sdk/defaults.js.map +0 -1
  632. package/dist/sdk/discovery.d.ts +0 -2
  633. package/dist/sdk/discovery.d.ts.map +0 -1
  634. package/dist/sdk/discovery.js +0 -25
  635. package/dist/sdk/discovery.js.map +0 -1
  636. package/dist/sdk/events.d.ts +0 -269
  637. package/dist/sdk/events.d.ts.map +0 -1
  638. package/dist/sdk/events.js +0 -69
  639. package/dist/sdk/events.js.map +0 -1
  640. package/dist/sdk/exit-expression.d.ts +0 -13
  641. package/dist/sdk/exit-expression.d.ts.map +0 -1
  642. package/dist/sdk/exit-expression.js +0 -35
  643. package/dist/sdk/exit-expression.js.map +0 -1
  644. package/dist/sdk/index.d.ts +0 -17
  645. package/dist/sdk/index.d.ts.map +0 -1
  646. package/dist/sdk/index.js +0 -17
  647. package/dist/sdk/index.js.map +0 -1
  648. package/dist/sdk/middleware.d.ts +0 -59
  649. package/dist/sdk/middleware.d.ts.map +0 -1
  650. package/dist/sdk/middleware.js +0 -69
  651. package/dist/sdk/middleware.js.map +0 -1
  652. package/dist/sdk/pipeline/PipelineBuilder.d.ts +0 -79
  653. package/dist/sdk/pipeline/PipelineBuilder.d.ts.map +0 -1
  654. package/dist/sdk/pipeline/PipelineBuilder.js +0 -129
  655. package/dist/sdk/pipeline/PipelineBuilder.js.map +0 -1
  656. package/dist/sdk/pipeline/PipelineRunner.d.ts +0 -28
  657. package/dist/sdk/pipeline/PipelineRunner.d.ts.map +0 -1
  658. package/dist/sdk/pipeline/PipelineRunner.js +0 -326
  659. package/dist/sdk/pipeline/PipelineRunner.js.map +0 -1
  660. package/dist/sdk/pipeline/compiler.d.ts +0 -24
  661. package/dist/sdk/pipeline/compiler.d.ts.map +0 -1
  662. package/dist/sdk/pipeline/compiler.js +0 -199
  663. package/dist/sdk/pipeline/compiler.js.map +0 -1
  664. package/dist/sdk/pipeline/declarative.d.ts +0 -34
  665. package/dist/sdk/pipeline/declarative.d.ts.map +0 -1
  666. package/dist/sdk/pipeline/declarative.js +0 -9
  667. package/dist/sdk/pipeline/declarative.js.map +0 -1
  668. package/dist/sdk/pipeline/index.d.ts +0 -20
  669. package/dist/sdk/pipeline/index.d.ts.map +0 -1
  670. package/dist/sdk/pipeline/index.js +0 -19
  671. package/dist/sdk/pipeline/index.js.map +0 -1
  672. package/dist/sdk/pipeline/types.d.ts +0 -93
  673. package/dist/sdk/pipeline/types.d.ts.map +0 -1
  674. package/dist/sdk/pipeline/types.js +0 -10
  675. package/dist/sdk/pipeline/types.js.map +0 -1
  676. package/dist/sdk/policies.d.ts +0 -163
  677. package/dist/sdk/policies.d.ts.map +0 -1
  678. package/dist/sdk/policies.js +0 -243
  679. package/dist/sdk/policies.js.map +0 -1
  680. package/dist/sdk/runner/AgentRunner.d.ts +0 -22
  681. package/dist/sdk/runner/AgentRunner.d.ts.map +0 -1
  682. package/dist/sdk/runner/AgentRunner.js +0 -222
  683. package/dist/sdk/runner/AgentRunner.js.map +0 -1
  684. package/dist/sdk/runner/finalize.d.ts +0 -56
  685. package/dist/sdk/runner/finalize.d.ts.map +0 -1
  686. package/dist/sdk/runner/finalize.js +0 -155
  687. package/dist/sdk/runner/finalize.js.map +0 -1
  688. package/dist/sdk/runner/formats.d.ts +0 -7
  689. package/dist/sdk/runner/formats.d.ts.map +0 -1
  690. package/dist/sdk/runner/formats.js +0 -76
  691. package/dist/sdk/runner/formats.js.map +0 -1
  692. package/dist/sdk/runner/index.d.ts +0 -9
  693. package/dist/sdk/runner/index.d.ts.map +0 -1
  694. package/dist/sdk/runner/index.js +0 -9
  695. package/dist/sdk/runner/index.js.map +0 -1
  696. package/dist/sdk/runner/progress.d.ts +0 -3
  697. package/dist/sdk/runner/progress.d.ts.map +0 -1
  698. package/dist/sdk/runner/progress.js +0 -16
  699. package/dist/sdk/runner/progress.js.map +0 -1
  700. package/dist/sdk/schemas.d.ts +0 -72
  701. package/dist/sdk/schemas.d.ts.map +0 -1
  702. package/dist/sdk/schemas.js +0 -282
  703. package/dist/sdk/schemas.js.map +0 -1
  704. package/dist/sdk/trigger-context.d.ts +0 -24
  705. package/dist/sdk/trigger-context.d.ts.map +0 -1
  706. package/dist/sdk/trigger-context.js +0 -136
  707. package/dist/sdk/trigger-context.js.map +0 -1
  708. package/dist/session/SessionContext.d.ts +0 -89
  709. package/dist/session/SessionContext.d.ts.map +0 -1
  710. package/dist/session/SessionContext.js +0 -410
  711. package/dist/session/SessionContext.js.map +0 -1
  712. package/dist/session/environment.d.ts +0 -52
  713. package/dist/session/environment.d.ts.map +0 -1
  714. package/dist/session/environment.js +0 -27
  715. package/dist/session/environment.js.map +0 -1
  716. package/dist/session/history.d.ts +0 -18
  717. package/dist/session/history.d.ts.map +0 -1
  718. package/dist/session/history.js +0 -68
  719. package/dist/session/history.js.map +0 -1
  720. package/dist/session/index.d.ts +0 -10
  721. package/dist/session/index.d.ts.map +0 -1
  722. package/dist/session/index.js +0 -9
  723. package/dist/session/index.js.map +0 -1
  724. package/dist/session/serverData.d.ts +0 -38
  725. package/dist/session/serverData.d.ts.map +0 -1
  726. package/dist/session/serverData.js +0 -261
  727. package/dist/session/serverData.js.map +0 -1
  728. package/dist/tracing/pipelineHelpers.d.ts +0 -29
  729. package/dist/tracing/pipelineHelpers.d.ts.map +0 -1
  730. package/dist/tracing/pipelineHelpers.js +0 -224
  731. package/dist/tracing/pipelineHelpers.js.map +0 -1
  732. package/dist/tracking/Tracker.d.ts +0 -55
  733. package/dist/tracking/Tracker.d.ts.map +0 -1
  734. package/dist/tracking/Tracker.js +0 -217
  735. package/dist/tracking/Tracker.js.map +0 -1
  736. package/dist/tracking/index.d.ts +0 -8
  737. package/dist/tracking/index.d.ts.map +0 -1
  738. package/dist/tracking/index.js +0 -8
  739. package/dist/tracking/index.js.map +0 -1
  740. package/dist/tracking/schemas.d.ts +0 -292
  741. package/dist/tracking/schemas.d.ts.map +0 -1
  742. package/dist/tracking/schemas.js +0 -91
  743. package/dist/tracking/schemas.js.map +0 -1
  744. package/dist/utils/extractSetFlags.d.ts +0 -6
  745. package/dist/utils/extractSetFlags.d.ts.map +0 -1
  746. package/dist/utils/extractSetFlags.js +0 -16
  747. package/dist/utils/extractSetFlags.js.map +0 -1
  748. package/dist/utils/formatTimeAgo.d.ts +0 -2
  749. package/dist/utils/formatTimeAgo.d.ts.map +0 -1
  750. package/dist/utils/formatTimeAgo.js +0 -20
  751. package/dist/utils/formatTimeAgo.js.map +0 -1
  752. package/dist/utils/index.d.ts +0 -12
  753. package/dist/utils/index.d.ts.map +0 -1
  754. package/dist/utils/index.js +0 -12
  755. package/dist/utils/index.js.map +0 -1
  756. package/dist/utils/machineId.d.ts +0 -14
  757. package/dist/utils/machineId.d.ts.map +0 -1
  758. package/dist/utils/machineId.js +0 -66
  759. package/dist/utils/machineId.js.map +0 -1
  760. package/dist/utils/pathUtils.d.ts +0 -22
  761. package/dist/utils/pathUtils.d.ts.map +0 -1
  762. package/dist/utils/pathUtils.js +0 -54
  763. package/dist/utils/pathUtils.js.map +0 -1
  764. 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