@ytinnovation/harness-core 0.0.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 (397) hide show
  1. package/README.md +17 -0
  2. package/dist/assets/fetch-published-by-name.d.ts +16 -0
  3. package/dist/assets/fetch-published-by-name.d.ts.map +1 -0
  4. package/dist/assets/fetch-published-by-name.js +40 -0
  5. package/dist/assets/fetch-published-by-name.js.map +1 -0
  6. package/dist/assets/install-content.d.ts +7 -0
  7. package/dist/assets/install-content.d.ts.map +1 -0
  8. package/dist/assets/install-content.js +24 -0
  9. package/dist/assets/install-content.js.map +1 -0
  10. package/dist/assets/install-from.d.ts +6 -0
  11. package/dist/assets/install-from.d.ts.map +1 -0
  12. package/dist/assets/install-from.js +13 -0
  13. package/dist/assets/install-from.js.map +1 -0
  14. package/dist/assets/install.d.ts +36 -0
  15. package/dist/assets/install.d.ts.map +1 -0
  16. package/dist/assets/install.js +199 -0
  17. package/dist/assets/install.js.map +1 -0
  18. package/dist/assets/mcp-config-format.d.ts +11 -0
  19. package/dist/assets/mcp-config-format.d.ts.map +1 -0
  20. package/dist/assets/mcp-config-format.js +101 -0
  21. package/dist/assets/mcp-config-format.js.map +1 -0
  22. package/dist/assets/metadata.d.ts +65 -0
  23. package/dist/assets/metadata.d.ts.map +1 -0
  24. package/dist/assets/metadata.js +164 -0
  25. package/dist/assets/metadata.js.map +1 -0
  26. package/dist/assets/project-manifest.d.ts +80 -0
  27. package/dist/assets/project-manifest.d.ts.map +1 -0
  28. package/dist/assets/project-manifest.js +556 -0
  29. package/dist/assets/project-manifest.js.map +1 -0
  30. package/dist/assets/published-content.d.ts +28 -0
  31. package/dist/assets/published-content.d.ts.map +1 -0
  32. package/dist/assets/published-content.js +137 -0
  33. package/dist/assets/published-content.js.map +1 -0
  34. package/dist/assets/registry-entry.d.ts +9 -0
  35. package/dist/assets/registry-entry.d.ts.map +1 -0
  36. package/dist/assets/registry-entry.js +72 -0
  37. package/dist/assets/registry-entry.js.map +1 -0
  38. package/dist/assets/remote-list.d.ts +15 -0
  39. package/dist/assets/remote-list.d.ts.map +1 -0
  40. package/dist/assets/remote-list.js +36 -0
  41. package/dist/assets/remote-list.js.map +1 -0
  42. package/dist/cli-output/clipboard.d.ts +9 -0
  43. package/dist/cli-output/clipboard.d.ts.map +1 -0
  44. package/dist/cli-output/clipboard.js +56 -0
  45. package/dist/cli-output/clipboard.js.map +1 -0
  46. package/dist/cli-output/renderers.d.ts +99 -0
  47. package/dist/cli-output/renderers.d.ts.map +1 -0
  48. package/dist/cli-output/renderers.js +267 -0
  49. package/dist/cli-output/renderers.js.map +1 -0
  50. package/dist/cloud/enterprise-asset-client.d.ts +32 -0
  51. package/dist/cloud/enterprise-asset-client.d.ts.map +1 -0
  52. package/dist/cloud/enterprise-asset-client.js +179 -0
  53. package/dist/cloud/enterprise-asset-client.js.map +1 -0
  54. package/dist/cloud/enterprise-asset-types.d.ts +74 -0
  55. package/dist/cloud/enterprise-asset-types.d.ts.map +1 -0
  56. package/dist/cloud/enterprise-asset-types.js +2 -0
  57. package/dist/cloud/enterprise-asset-types.js.map +1 -0
  58. package/dist/cloud/harness-service-url.d.ts +3 -0
  59. package/dist/cloud/harness-service-url.d.ts.map +1 -0
  60. package/dist/cloud/harness-service-url.js +13 -0
  61. package/dist/cloud/harness-service-url.js.map +1 -0
  62. package/dist/cloud/rag-client.d.ts +18 -0
  63. package/dist/cloud/rag-client.d.ts.map +1 -0
  64. package/dist/cloud/rag-client.js +57 -0
  65. package/dist/cloud/rag-client.js.map +1 -0
  66. package/dist/cloud/redaction.d.ts +2 -0
  67. package/dist/cloud/redaction.d.ts.map +1 -0
  68. package/dist/cloud/redaction.js +53 -0
  69. package/dist/cloud/redaction.js.map +1 -0
  70. package/dist/cloud/telemetry-client.d.ts +21 -0
  71. package/dist/cloud/telemetry-client.d.ts.map +1 -0
  72. package/dist/cloud/telemetry-client.js +39 -0
  73. package/dist/cloud/telemetry-client.js.map +1 -0
  74. package/dist/contracts/config.d.ts +9 -0
  75. package/dist/contracts/config.d.ts.map +1 -0
  76. package/dist/contracts/config.defaults.d.ts +5 -0
  77. package/dist/contracts/config.defaults.d.ts.map +1 -0
  78. package/dist/contracts/config.defaults.js +5 -0
  79. package/dist/contracts/config.defaults.js.map +1 -0
  80. package/dist/contracts/config.js +5 -0
  81. package/dist/contracts/config.js.map +1 -0
  82. package/dist/contracts/config.loader.d.ts +3 -0
  83. package/dist/contracts/config.loader.d.ts.map +1 -0
  84. package/dist/contracts/config.loader.js +38 -0
  85. package/dist/contracts/config.loader.js.map +1 -0
  86. package/dist/contracts/errors.d.ts +8 -0
  87. package/dist/contracts/errors.d.ts.map +1 -0
  88. package/dist/contracts/errors.js +10 -0
  89. package/dist/contracts/errors.js.map +1 -0
  90. package/dist/cursor-acp-demo/index.d.ts +2 -0
  91. package/dist/cursor-acp-demo/index.d.ts.map +1 -0
  92. package/dist/cursor-acp-demo/index.js +63 -0
  93. package/dist/cursor-acp-demo/index.js.map +1 -0
  94. package/dist/dashboard/command.d.ts +15 -0
  95. package/dist/dashboard/command.d.ts.map +1 -0
  96. package/dist/dashboard/command.js +283 -0
  97. package/dist/dashboard/command.js.map +1 -0
  98. package/dist/dashboard/http-api.d.ts +3 -0
  99. package/dist/dashboard/http-api.d.ts.map +1 -0
  100. package/dist/dashboard/http-api.js +376 -0
  101. package/dist/dashboard/http-api.js.map +1 -0
  102. package/dist/dashboard/telemetry-snapshot.d.ts +11 -0
  103. package/dist/dashboard/telemetry-snapshot.d.ts.map +1 -0
  104. package/dist/dashboard/telemetry-snapshot.js +27 -0
  105. package/dist/dashboard/telemetry-snapshot.js.map +1 -0
  106. package/dist/dashboard-assets/assets/index-BNx5sFKx.css +1 -0
  107. package/dist/dashboard-assets/assets/index-ruRt5sDA.js +40 -0
  108. package/dist/dashboard-assets/index.html +13 -0
  109. package/dist/gateway/auth.d.ts +44 -0
  110. package/dist/gateway/auth.d.ts.map +1 -0
  111. package/dist/gateway/auth.js +2 -0
  112. package/dist/gateway/auth.js.map +1 -0
  113. package/dist/gateway/client.d.ts +65 -0
  114. package/dist/gateway/client.d.ts.map +1 -0
  115. package/dist/gateway/client.js +133 -0
  116. package/dist/gateway/client.js.map +1 -0
  117. package/dist/gateway/command.d.ts +4 -0
  118. package/dist/gateway/command.d.ts.map +1 -0
  119. package/dist/gateway/command.js +213 -0
  120. package/dist/gateway/command.js.map +1 -0
  121. package/dist/gateway/service-http-exchange.d.ts +17 -0
  122. package/dist/gateway/service-http-exchange.d.ts.map +1 -0
  123. package/dist/gateway/service-http-exchange.js +183 -0
  124. package/dist/gateway/service-http-exchange.js.map +1 -0
  125. package/dist/gateway/token-exchange.d.ts +10 -0
  126. package/dist/gateway/token-exchange.d.ts.map +1 -0
  127. package/dist/gateway/token-exchange.js +8 -0
  128. package/dist/gateway/token-exchange.js.map +1 -0
  129. package/dist/index.d.ts +111 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/dist/index.js +62 -0
  132. package/dist/index.js.map +1 -0
  133. package/dist/init/cloud-asset-client.d.ts +74 -0
  134. package/dist/init/cloud-asset-client.d.ts.map +1 -0
  135. package/dist/init/cloud-asset-client.js +399 -0
  136. package/dist/init/cloud-asset-client.js.map +1 -0
  137. package/dist/init/cloud-auto.d.ts +16 -0
  138. package/dist/init/cloud-auto.d.ts.map +1 -0
  139. package/dist/init/cloud-auto.js +61 -0
  140. package/dist/init/cloud-auto.js.map +1 -0
  141. package/dist/init/command.d.ts +17 -0
  142. package/dist/init/command.d.ts.map +1 -0
  143. package/dist/init/command.js +783 -0
  144. package/dist/init/command.js.map +1 -0
  145. package/dist/init/cursor-adapter.d.ts +24 -0
  146. package/dist/init/cursor-adapter.d.ts.map +1 -0
  147. package/dist/init/cursor-adapter.js +71 -0
  148. package/dist/init/cursor-adapter.js.map +1 -0
  149. package/dist/init/fingerprint.d.ts +6 -0
  150. package/dist/init/fingerprint.d.ts.map +1 -0
  151. package/dist/init/fingerprint.js +157 -0
  152. package/dist/init/fingerprint.js.map +1 -0
  153. package/dist/init/git-identity-catalog.d.ts +17 -0
  154. package/dist/init/git-identity-catalog.d.ts.map +1 -0
  155. package/dist/init/git-identity-catalog.js +48 -0
  156. package/dist/init/git-identity-catalog.js.map +1 -0
  157. package/dist/init/local-fallback-config-packs.d.ts +5 -0
  158. package/dist/init/local-fallback-config-packs.d.ts.map +1 -0
  159. package/dist/init/local-fallback-config-packs.js +6 -0
  160. package/dist/init/local-fallback-config-packs.js.map +1 -0
  161. package/dist/init/manifest-records.d.ts +34 -0
  162. package/dist/init/manifest-records.d.ts.map +1 -0
  163. package/dist/init/manifest-records.js +296 -0
  164. package/dist/init/manifest-records.js.map +1 -0
  165. package/dist/init/matched-init.d.ts +64 -0
  166. package/dist/init/matched-init.d.ts.map +1 -0
  167. package/dist/init/matched-init.js +263 -0
  168. package/dist/init/matched-init.js.map +1 -0
  169. package/dist/init/plan.d.ts +8 -0
  170. package/dist/init/plan.d.ts.map +1 -0
  171. package/dist/init/plan.js +165 -0
  172. package/dist/init/plan.js.map +1 -0
  173. package/dist/init/project-fingerprint-catalog.d.ts +17 -0
  174. package/dist/init/project-fingerprint-catalog.d.ts.map +1 -0
  175. package/dist/init/project-fingerprint-catalog.js +105 -0
  176. package/dist/init/project-fingerprint-catalog.js.map +1 -0
  177. package/dist/init/prompt.d.ts +38 -0
  178. package/dist/init/prompt.d.ts.map +1 -0
  179. package/dist/init/prompt.js +217 -0
  180. package/dist/init/prompt.js.map +1 -0
  181. package/dist/init/questions.d.ts +5 -0
  182. package/dist/init/questions.d.ts.map +1 -0
  183. package/dist/init/questions.js +71 -0
  184. package/dist/init/questions.js.map +1 -0
  185. package/dist/init/template-match.d.ts +10 -0
  186. package/dist/init/template-match.d.ts.map +1 -0
  187. package/dist/init/template-match.js +125 -0
  188. package/dist/init/template-match.js.map +1 -0
  189. package/dist/init/types.d.ts +162 -0
  190. package/dist/init/types.d.ts.map +1 -0
  191. package/dist/init/types.js +2 -0
  192. package/dist/init/types.js.map +1 -0
  193. package/dist/init/write.d.ts +7 -0
  194. package/dist/init/write.d.ts.map +1 -0
  195. package/dist/init/write.js +155 -0
  196. package/dist/init/write.js.map +1 -0
  197. package/dist/install/command.d.ts +25 -0
  198. package/dist/install/command.d.ts.map +1 -0
  199. package/dist/install/command.js +251 -0
  200. package/dist/install/command.js.map +1 -0
  201. package/dist/install/prompt.d.ts +21 -0
  202. package/dist/install/prompt.d.ts.map +1 -0
  203. package/dist/install/prompt.js +60 -0
  204. package/dist/install/prompt.js.map +1 -0
  205. package/dist/kernel/commands/init.d.ts +11 -0
  206. package/dist/kernel/commands/init.d.ts.map +1 -0
  207. package/dist/kernel/commands/init.js +144 -0
  208. package/dist/kernel/commands/init.js.map +1 -0
  209. package/dist/kernel/create.d.ts +3 -0
  210. package/dist/kernel/create.d.ts.map +1 -0
  211. package/dist/kernel/create.js +31 -0
  212. package/dist/kernel/create.js.map +1 -0
  213. package/dist/kernel/router.d.ts +14 -0
  214. package/dist/kernel/router.d.ts.map +1 -0
  215. package/dist/kernel/router.js +73 -0
  216. package/dist/kernel/router.js.map +1 -0
  217. package/dist/kernel/types.d.ts +6 -0
  218. package/dist/kernel/types.d.ts.map +1 -0
  219. package/dist/kernel/types.js +2 -0
  220. package/dist/kernel/types.js.map +1 -0
  221. package/dist/knowledge/command.d.ts +6 -0
  222. package/dist/knowledge/command.d.ts.map +1 -0
  223. package/dist/knowledge/command.js +151 -0
  224. package/dist/knowledge/command.js.map +1 -0
  225. package/dist/knowledge/query.d.ts +23 -0
  226. package/dist/knowledge/query.d.ts.map +1 -0
  227. package/dist/knowledge/query.js +133 -0
  228. package/dist/knowledge/query.js.map +1 -0
  229. package/dist/knowledge/rag.d.ts +74 -0
  230. package/dist/knowledge/rag.d.ts.map +1 -0
  231. package/dist/knowledge/rag.js +55 -0
  232. package/dist/knowledge/rag.js.map +1 -0
  233. package/dist/knowledge/types.d.ts +40 -0
  234. package/dist/knowledge/types.d.ts.map +1 -0
  235. package/dist/knowledge/types.js +13 -0
  236. package/dist/knowledge/types.js.map +1 -0
  237. package/dist/mcp/command.d.ts +19 -0
  238. package/dist/mcp/command.d.ts.map +1 -0
  239. package/dist/mcp/command.js +359 -0
  240. package/dist/mcp/command.js.map +1 -0
  241. package/dist/mcp/server.d.ts +14 -0
  242. package/dist/mcp/server.d.ts.map +1 -0
  243. package/dist/mcp/server.js +44 -0
  244. package/dist/mcp/server.js.map +1 -0
  245. package/dist/mcp/tool-registry.d.ts +38 -0
  246. package/dist/mcp/tool-registry.d.ts.map +1 -0
  247. package/dist/mcp/tool-registry.js +50 -0
  248. package/dist/mcp/tool-registry.js.map +1 -0
  249. package/dist/mcp/tools/add-skill.d.ts +29 -0
  250. package/dist/mcp/tools/add-skill.d.ts.map +1 -0
  251. package/dist/mcp/tools/add-skill.js +184 -0
  252. package/dist/mcp/tools/add-skill.js.map +1 -0
  253. package/dist/mcp/tools/assemble-init-assets.d.ts +26 -0
  254. package/dist/mcp/tools/assemble-init-assets.d.ts.map +1 -0
  255. package/dist/mcp/tools/assemble-init-assets.js +136 -0
  256. package/dist/mcp/tools/assemble-init-assets.js.map +1 -0
  257. package/dist/mcp/tools/query-knowledge.d.ts +28 -0
  258. package/dist/mcp/tools/query-knowledge.d.ts.map +1 -0
  259. package/dist/mcp/tools/query-knowledge.js +92 -0
  260. package/dist/mcp/tools/query-knowledge.js.map +1 -0
  261. package/dist/mcp/tools/read-instructions.d.ts +14 -0
  262. package/dist/mcp/tools/read-instructions.d.ts.map +1 -0
  263. package/dist/mcp/tools/read-instructions.js +81 -0
  264. package/dist/mcp/tools/read-instructions.js.map +1 -0
  265. package/dist/mcp/tools/sync-spec.d.ts +17 -0
  266. package/dist/mcp/tools/sync-spec.d.ts.map +1 -0
  267. package/dist/mcp/tools/sync-spec.js +80 -0
  268. package/dist/mcp/tools/sync-spec.js.map +1 -0
  269. package/dist/mcp/tools/update-rule.d.ts +49 -0
  270. package/dist/mcp/tools/update-rule.d.ts.map +1 -0
  271. package/dist/mcp/tools/update-rule.js +188 -0
  272. package/dist/mcp/tools/update-rule.js.map +1 -0
  273. package/dist/mcp/types.d.ts +21 -0
  274. package/dist/mcp/types.d.ts.map +1 -0
  275. package/dist/mcp/types.js +8 -0
  276. package/dist/mcp/types.js.map +1 -0
  277. package/dist/prompt/command.d.ts +10 -0
  278. package/dist/prompt/command.d.ts.map +1 -0
  279. package/dist/prompt/command.js +260 -0
  280. package/dist/prompt/command.js.map +1 -0
  281. package/dist/rule/command.d.ts +10 -0
  282. package/dist/rule/command.d.ts.map +1 -0
  283. package/dist/rule/command.js +120 -0
  284. package/dist/rule/command.js.map +1 -0
  285. package/dist/skills/command.d.ts +23 -0
  286. package/dist/skills/command.d.ts.map +1 -0
  287. package/dist/skills/command.js +713 -0
  288. package/dist/skills/command.js.map +1 -0
  289. package/dist/skills/default-internal-skill-provider.d.ts +4 -0
  290. package/dist/skills/default-internal-skill-provider.d.ts.map +1 -0
  291. package/dist/skills/default-internal-skill-provider.js +23 -0
  292. package/dist/skills/default-internal-skill-provider.js.map +1 -0
  293. package/dist/skills/gitlab-skill-publish-client.d.ts +13 -0
  294. package/dist/skills/gitlab-skill-publish-client.d.ts.map +1 -0
  295. package/dist/skills/gitlab-skill-publish-client.js +255 -0
  296. package/dist/skills/gitlab-skill-publish-client.js.map +1 -0
  297. package/dist/skills/install.d.ts +23 -0
  298. package/dist/skills/install.d.ts.map +1 -0
  299. package/dist/skills/install.js +143 -0
  300. package/dist/skills/install.js.map +1 -0
  301. package/dist/skills/list-scan.d.ts +29 -0
  302. package/dist/skills/list-scan.d.ts.map +1 -0
  303. package/dist/skills/list-scan.js +230 -0
  304. package/dist/skills/list-scan.js.map +1 -0
  305. package/dist/skills/metadata.d.ts +5 -0
  306. package/dist/skills/metadata.d.ts.map +1 -0
  307. package/dist/skills/metadata.js +44 -0
  308. package/dist/skills/metadata.js.map +1 -0
  309. package/dist/skills/providers/harness-service.d.ts +11 -0
  310. package/dist/skills/providers/harness-service.d.ts.map +1 -0
  311. package/dist/skills/providers/harness-service.js +111 -0
  312. package/dist/skills/providers/harness-service.js.map +1 -0
  313. package/dist/skills/providers/stub.d.ts +4 -0
  314. package/dist/skills/providers/stub.d.ts.map +1 -0
  315. package/dist/skills/providers/stub.js +18 -0
  316. package/dist/skills/providers/stub.js.map +1 -0
  317. package/dist/skills/publish.d.ts +35 -0
  318. package/dist/skills/publish.d.ts.map +1 -0
  319. package/dist/skills/publish.js +115 -0
  320. package/dist/skills/publish.js.map +1 -0
  321. package/dist/skills/registry.d.ts +24 -0
  322. package/dist/skills/registry.d.ts.map +1 -0
  323. package/dist/skills/registry.js +124 -0
  324. package/dist/skills/registry.js.map +1 -0
  325. package/dist/skills/remove.d.ts +14 -0
  326. package/dist/skills/remove.d.ts.map +1 -0
  327. package/dist/skills/remove.js +44 -0
  328. package/dist/skills/remove.js.map +1 -0
  329. package/dist/skills/search.d.ts +9 -0
  330. package/dist/skills/search.d.ts.map +1 -0
  331. package/dist/skills/search.js +65 -0
  332. package/dist/skills/search.js.map +1 -0
  333. package/dist/skills/skill-markdown-manifest.d.ts +6 -0
  334. package/dist/skills/skill-markdown-manifest.d.ts.map +1 -0
  335. package/dist/skills/skill-markdown-manifest.js +57 -0
  336. package/dist/skills/skill-markdown-manifest.js.map +1 -0
  337. package/dist/skills/types.d.ts +138 -0
  338. package/dist/skills/types.d.ts.map +1 -0
  339. package/dist/skills/types.js +2 -0
  340. package/dist/skills/types.js.map +1 -0
  341. package/dist/skills/update.d.ts +11 -0
  342. package/dist/skills/update.d.ts.map +1 -0
  343. package/dist/skills/update.js +55 -0
  344. package/dist/skills/update.js.map +1 -0
  345. package/dist/spec/command.d.ts +11 -0
  346. package/dist/spec/command.d.ts.map +1 -0
  347. package/dist/spec/command.js +201 -0
  348. package/dist/spec/command.js.map +1 -0
  349. package/dist/telemetry/reporter.d.ts +14 -0
  350. package/dist/telemetry/reporter.d.ts.map +1 -0
  351. package/dist/telemetry/reporter.js +31 -0
  352. package/dist/telemetry/reporter.js.map +1 -0
  353. package/dist/telemetry/sink.d.ts +7 -0
  354. package/dist/telemetry/sink.d.ts.map +1 -0
  355. package/dist/telemetry/sink.js +309 -0
  356. package/dist/telemetry/sink.js.map +1 -0
  357. package/dist/telemetry/types.d.ts +48 -0
  358. package/dist/telemetry/types.d.ts.map +1 -0
  359. package/dist/telemetry/types.js +2 -0
  360. package/dist/telemetry/types.js.map +1 -0
  361. package/dist/update/apply.d.ts +11 -0
  362. package/dist/update/apply.d.ts.map +1 -0
  363. package/dist/update/apply.js +94 -0
  364. package/dist/update/apply.js.map +1 -0
  365. package/dist/update/command.d.ts +43 -0
  366. package/dist/update/command.d.ts.map +1 -0
  367. package/dist/update/command.js +524 -0
  368. package/dist/update/command.js.map +1 -0
  369. package/dist/update/config-pack-sync.d.ts +11 -0
  370. package/dist/update/config-pack-sync.d.ts.map +1 -0
  371. package/dist/update/config-pack-sync.js +88 -0
  372. package/dist/update/config-pack-sync.js.map +1 -0
  373. package/dist/update/enterprise-update-provider.d.ts +8 -0
  374. package/dist/update/enterprise-update-provider.d.ts.map +1 -0
  375. package/dist/update/enterprise-update-provider.js +76 -0
  376. package/dist/update/enterprise-update-provider.js.map +1 -0
  377. package/dist/update/manifest-source.d.ts +33 -0
  378. package/dist/update/manifest-source.d.ts.map +1 -0
  379. package/dist/update/manifest-source.js +111 -0
  380. package/dist/update/manifest-source.js.map +1 -0
  381. package/dist/update/plan-utils.d.ts +5 -0
  382. package/dist/update/plan-utils.d.ts.map +1 -0
  383. package/dist/update/plan-utils.js +13 -0
  384. package/dist/update/plan-utils.js.map +1 -0
  385. package/dist/update/prompt.d.ts +19 -0
  386. package/dist/update/prompt.d.ts.map +1 -0
  387. package/dist/update/prompt.js +72 -0
  388. package/dist/update/prompt.js.map +1 -0
  389. package/dist/update/resolve-action.d.ts +7 -0
  390. package/dist/update/resolve-action.d.ts.map +1 -0
  391. package/dist/update/resolve-action.js +14 -0
  392. package/dist/update/resolve-action.js.map +1 -0
  393. package/dist/update/types.d.ts +33 -0
  394. package/dist/update/types.d.ts.map +1 -0
  395. package/dist/update/types.js +2 -0
  396. package/dist/update/types.js.map +1 -0
  397. package/package.json +42 -0
@@ -0,0 +1,80 @@
1
+ import { stat } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ export const SYNC_SPEC_TOOL = {
4
+ name: 'sync_spec',
5
+ description: 'Resolve and validate the configured spec mount path for workspace synchronization.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ mountPath: {
10
+ type: 'string',
11
+ description: 'Optional relative mount path override. Defaults to the configured Harness spec mount path.',
12
+ },
13
+ },
14
+ additionalProperties: false,
15
+ },
16
+ };
17
+ function isNodeError(error) {
18
+ return typeof error === 'object' && error !== null && 'code' in error;
19
+ }
20
+ function classifySyncSpecError(error) {
21
+ if (isNodeError(error)) {
22
+ if (error.code === 'EACCES' || error.code === 'EPERM') {
23
+ return 'permission-denied';
24
+ }
25
+ if (error.code === 'ECANCELED' || error.code === 'ABORT_ERR') {
26
+ return 'user-cancelled';
27
+ }
28
+ if (error.code === 'ECONNRESET'
29
+ || error.code === 'ENETUNREACH'
30
+ || error.code === 'ETIMEDOUT'
31
+ || error.code === 'EAI_AGAIN') {
32
+ return 'network-error';
33
+ }
34
+ }
35
+ return 'unavailable';
36
+ }
37
+ export async function syncSpecTool(input, context) {
38
+ const configuredPath = typeof input?.mountPath === 'string' && input.mountPath.trim().length > 0
39
+ ? input.mountPath.trim()
40
+ : context.harnessConfig?.specMountPath?.trim();
41
+ if (!configuredPath) {
42
+ return {
43
+ status: 'unavailable',
44
+ message: 'No spec mount path configured. Set harnessConfig.specMountPath before calling sync_spec.',
45
+ data: null,
46
+ errorCode: 'unavailable',
47
+ };
48
+ }
49
+ const resolvedPath = resolve(context.workspaceRoot, configuredPath);
50
+ try {
51
+ const details = await stat(resolvedPath);
52
+ const sourceType = details.isDirectory() ? 'directory' : 'file';
53
+ return {
54
+ status: 'success',
55
+ message: `Resolved spec source at ${configuredPath}.`,
56
+ data: {
57
+ configuredMountPath: configuredPath,
58
+ resolvedPath,
59
+ sourceType,
60
+ },
61
+ };
62
+ }
63
+ catch (error) {
64
+ if (isNodeError(error) && error.code === 'ENOENT') {
65
+ return {
66
+ status: 'unavailable',
67
+ message: `Configured spec mount path does not exist: ${configuredPath}.`,
68
+ data: null,
69
+ errorCode: 'not-found',
70
+ };
71
+ }
72
+ return {
73
+ status: 'error',
74
+ message: `Failed to inspect configured spec mount path: ${configuredPath}.`,
75
+ data: null,
76
+ errorCode: classifySyncSpecError(error),
77
+ };
78
+ }
79
+ }
80
+ //# sourceMappingURL=sync-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-spec.js","sourceRoot":"","sources":["../../../src/mcp/tools/sync-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { McpToolDefinition, McpToolResult } from '../types.js';
2
+ export interface UpdateRuleToolContext {
3
+ workspaceRoot: string;
4
+ }
5
+ export type RuleUpdateMode = 'auto-merge' | 'view-diff' | 'keep-local';
6
+ export interface UpdateRuleInput {
7
+ ruleName?: string;
8
+ targetPath?: string;
9
+ mode?: RuleUpdateMode;
10
+ dryRun?: boolean;
11
+ }
12
+ export interface ResolvedRuleUpdate {
13
+ baseContent: string;
14
+ targetContent: string;
15
+ targetVersion: string;
16
+ targetRevision: string | null;
17
+ source: string;
18
+ }
19
+ export interface ResolveRuleUpdateInput {
20
+ ruleName: string;
21
+ currentVersion: string;
22
+ currentRevision: string | null;
23
+ source: string;
24
+ }
25
+ export interface UpdateRuleData {
26
+ ruleName: string;
27
+ targetPath: string;
28
+ source: string;
29
+ currentVersion: string;
30
+ targetVersion: string;
31
+ currentRevision: string | null;
32
+ targetRevision: string | null;
33
+ action: RuleUpdateMode;
34
+ options: RuleUpdateMode[];
35
+ requestedMode: RuleUpdateMode | null;
36
+ hasLocalChanges: boolean;
37
+ hasRemoteChanges: boolean;
38
+ dryRun: boolean;
39
+ reason: string;
40
+ conflictSummary?: string;
41
+ }
42
+ export interface UpdateRuleToolDependencies {
43
+ resolveRuleUpdate: (input: ResolveRuleUpdateInput) => Promise<ResolvedRuleUpdate | null>;
44
+ }
45
+ export declare const UPDATE_RULE_TOOL: McpToolDefinition;
46
+ export declare function createUpdateRuleTool(dependencies?: Partial<UpdateRuleToolDependencies>): (input: UpdateRuleInput | undefined, context: UpdateRuleToolContext) => Promise<McpToolResult<UpdateRuleData>>;
47
+ export declare const updateRuleTool: (input: UpdateRuleInput | undefined, context: UpdateRuleToolContext) => Promise<McpToolResult<UpdateRuleData>>;
48
+ export type UpdateRuleTool = ReturnType<typeof createUpdateRuleTool>;
49
+ //# sourceMappingURL=update-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-rule.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/update-rule.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,aAAa,EAAE,cAAc,GAAG,IAAI,CAAC;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;CAC1F;AAID,eAAO,MAAM,gBAAgB,EAAE,iBA4B9B,CAAC;AAsDF,wBAAgB,oBAAoB,CAAC,YAAY,GAAE,OAAO,CAAC,0BAA0B,CAAM,WAOhF,eAAe,GAAG,SAAS,WACzB,qBAAqB,KAC7B,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAqH1C;AAED,eAAO,MAAM,cAAc,UAzHhB,eAAe,GAAG,SAAS,WACzB,qBAAqB,KAC7B,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAuHU,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -0,0 +1,188 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { isAbsolute, join } from 'node:path';
3
+ import { parseLocalRuleMetadataStore } from '../../assets/metadata.js';
4
+ import { HarnessError } from '../../contracts/errors.js';
5
+ import { planSkillUpdate } from '../../skills/update.js';
6
+ const DEFAULT_RULE_METADATA_RELATIVE_PATH = ['.harness', 'rules', 'metadata.json'];
7
+ export const UPDATE_RULE_TOOL = {
8
+ name: 'update_rule',
9
+ description: 'Build a safe update plan for a local rule using metadata, without overwriting local changes.',
10
+ inputSchema: {
11
+ type: 'object',
12
+ properties: {
13
+ ruleName: {
14
+ type: 'string',
15
+ description: 'Rule name from local metadata store.',
16
+ },
17
+ targetPath: {
18
+ type: 'string',
19
+ description: 'Optional override target path for local rule file.',
20
+ },
21
+ mode: {
22
+ type: 'string',
23
+ enum: ['auto-merge', 'view-diff', 'keep-local'],
24
+ description: 'Optional preferred mode for this update plan.',
25
+ },
26
+ dryRun: {
27
+ type: 'boolean',
28
+ description: 'When true, return plan only. This tool never overwrites local files.',
29
+ },
30
+ },
31
+ required: ['ruleName'],
32
+ additionalProperties: false,
33
+ },
34
+ };
35
+ function isNodeError(error) {
36
+ return typeof error === 'object' && error !== null && 'code' in error;
37
+ }
38
+ function classifyRuleUpdateError(error) {
39
+ if (error instanceof HarnessError) {
40
+ if (error.code === 'RULE_METADATA_INVALID_STORE'
41
+ || error.code === 'RULE_METADATA_INVALID_RECORD'
42
+ || error.code === 'ASSET_METADATA_INVALID') {
43
+ return 'unavailable';
44
+ }
45
+ }
46
+ if (isNodeError(error)) {
47
+ if (error.code === 'EACCES' || error.code === 'EPERM') {
48
+ return 'permission-denied';
49
+ }
50
+ if (error.code === 'ECONNRESET' || error.code === 'ENETUNREACH' || error.code === 'ETIMEDOUT') {
51
+ return 'network-error';
52
+ }
53
+ }
54
+ return 'unavailable';
55
+ }
56
+ function resolveRuleMetadataPath(workspaceRoot) {
57
+ return join(workspaceRoot, ...DEFAULT_RULE_METADATA_RELATIVE_PATH);
58
+ }
59
+ function resolveRuleTargetPath(workspaceRoot, metadataTargetPath, input) {
60
+ const configuredPath = input.targetPath?.trim();
61
+ if (configuredPath && configuredPath.length > 0) {
62
+ if (isAbsolute(configuredPath)) {
63
+ return configuredPath;
64
+ }
65
+ return join(workspaceRoot, configuredPath);
66
+ }
67
+ if (isAbsolute(metadataTargetPath)) {
68
+ return metadataTargetPath;
69
+ }
70
+ return join(workspaceRoot, metadataTargetPath);
71
+ }
72
+ function createDefaultDependencies() {
73
+ return {
74
+ resolveRuleUpdate: async () => null,
75
+ };
76
+ }
77
+ export function createUpdateRuleTool(dependencies = {}) {
78
+ const merged = {
79
+ ...createDefaultDependencies(),
80
+ ...dependencies,
81
+ };
82
+ return async function updateRuleTool(input, context) {
83
+ const ruleName = input?.ruleName?.trim() ?? '';
84
+ if (ruleName.length === 0) {
85
+ return {
86
+ status: 'error',
87
+ message: 'A non-empty `ruleName` is required when calling update_rule.',
88
+ data: null,
89
+ errorCode: 'user-cancelled',
90
+ };
91
+ }
92
+ try {
93
+ const metadataPath = resolveRuleMetadataPath(context.workspaceRoot);
94
+ const serializedStore = await readFile(metadataPath, 'utf8');
95
+ const store = parseLocalRuleMetadataStore(serializedStore);
96
+ const localRuleRecord = store.records.find((record) => record.ruleName === ruleName);
97
+ if (!localRuleRecord) {
98
+ return {
99
+ status: 'error',
100
+ message: `Local metadata for rule "${ruleName}" was not found.`,
101
+ data: null,
102
+ errorCode: 'not-found',
103
+ };
104
+ }
105
+ const resolvedUpdate = await merged.resolveRuleUpdate({
106
+ ruleName,
107
+ currentVersion: localRuleRecord.metadata.version,
108
+ currentRevision: localRuleRecord.metadata.revision,
109
+ source: localRuleRecord.metadata.source,
110
+ });
111
+ if (!resolvedUpdate) {
112
+ return {
113
+ status: 'error',
114
+ message: `Remote rule "${ruleName}" was not found for update planning.`,
115
+ data: null,
116
+ errorCode: 'not-found',
117
+ };
118
+ }
119
+ const targetPath = resolveRuleTargetPath(context.workspaceRoot, localRuleRecord.targetPath, input ?? {});
120
+ const localContent = await readFile(targetPath, 'utf8');
121
+ const plan = planSkillUpdate({
122
+ skillName: ruleName,
123
+ currentRevision: localRuleRecord.metadata.revision,
124
+ targetRevision: resolvedUpdate.targetRevision ?? '',
125
+ baseContent: resolvedUpdate.baseContent,
126
+ localContent,
127
+ targetContent: resolvedUpdate.targetContent,
128
+ });
129
+ const hasLocalChanges = localContent !== resolvedUpdate.baseContent;
130
+ const hasRemoteChanges = resolvedUpdate.targetContent !== resolvedUpdate.baseContent;
131
+ const options = hasLocalChanges
132
+ ? ['view-diff', 'keep-local', 'auto-merge']
133
+ : ['auto-merge', 'keep-local'];
134
+ const requestedMode = input?.mode ?? null;
135
+ if (requestedMode && !options.includes(requestedMode)) {
136
+ return {
137
+ status: 'error',
138
+ message: `Requested mode "${requestedMode}" is not available for rule "${ruleName}".`,
139
+ data: null,
140
+ errorCode: 'user-cancelled',
141
+ };
142
+ }
143
+ const action = requestedMode ?? plan.action;
144
+ const dryRun = input?.dryRun === true;
145
+ return {
146
+ status: 'success',
147
+ message: `Rule ${ruleName} update plan generated with action ${action}.`,
148
+ data: {
149
+ ruleName,
150
+ targetPath,
151
+ source: resolvedUpdate.source,
152
+ currentVersion: localRuleRecord.metadata.version,
153
+ targetVersion: resolvedUpdate.targetVersion,
154
+ currentRevision: localRuleRecord.metadata.revision,
155
+ targetRevision: resolvedUpdate.targetRevision,
156
+ action,
157
+ options,
158
+ requestedMode,
159
+ hasLocalChanges,
160
+ hasRemoteChanges,
161
+ dryRun,
162
+ reason: hasLocalChanges
163
+ ? 'Local modifications detected; choose a safe merge strategy before applying updates.'
164
+ : 'No local modifications detected; auto-merge is safe.',
165
+ conflictSummary: plan.conflictSummary,
166
+ },
167
+ };
168
+ }
169
+ catch (error) {
170
+ if (isNodeError(error) && error.code === 'ENOENT') {
171
+ return {
172
+ status: 'error',
173
+ message: `Rule metadata or target file is missing for "${ruleName}".`,
174
+ data: null,
175
+ errorCode: 'not-found',
176
+ };
177
+ }
178
+ return {
179
+ status: 'error',
180
+ message: error instanceof Error ? error.message : String(error),
181
+ data: null,
182
+ errorCode: classifyRuleUpdateError(error),
183
+ };
184
+ }
185
+ };
186
+ }
187
+ export const updateRuleTool = createUpdateRuleTool();
188
+ //# sourceMappingURL=update-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-rule.js","sourceRoot":"","sources":["../../../src/mcp/tools/update-rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type McpJsonSchema = Record<string, unknown>;
2
+ export declare const MCP_TOOL_ERROR_CODES: readonly ["permission-denied", "not-found", "network-error", "user-cancelled", "unavailable"];
3
+ export type McpToolErrorCode = (typeof MCP_TOOL_ERROR_CODES)[number];
4
+ export interface McpToolDefinition {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: McpJsonSchema;
8
+ }
9
+ export interface McpToolResult<TData = Record<string, unknown>> {
10
+ status: 'success' | 'error' | 'unavailable';
11
+ message: string;
12
+ data: TData | null;
13
+ errorCode?: McpToolErrorCode;
14
+ }
15
+ export interface McpServerOptions {
16
+ serverName: string;
17
+ serverVersion: string;
18
+ workspaceRoot: string;
19
+ tools: McpToolDefinition[];
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,eAAO,MAAM,oBAAoB,+FAMvB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,aAAa,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B"}
@@ -0,0 +1,8 @@
1
+ export const MCP_TOOL_ERROR_CODES = [
2
+ 'permission-denied',
3
+ 'not-found',
4
+ 'network-error',
5
+ 'user-cancelled',
6
+ 'unavailable',
7
+ ];
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,mBAAmB;IACnB,WAAW;IACX,eAAe;IACf,gBAAgB;IAChB,aAAa;CACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CommandRouter } from '../kernel/router.js';
2
+ export interface PromptCommandOptions {
3
+ baseUrl?: string;
4
+ fetchImpl?: typeof fetch;
5
+ }
6
+ declare function renderPromptHelp(programName?: string): string;
7
+ export declare function runPromptCommand(args: string[], options?: PromptCommandOptions): Promise<number>;
8
+ export declare function registerPromptCommand(router: CommandRouter): void;
9
+ export { renderPromptHelp };
10
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/prompt/command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAczD,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAKD,iBAAS,gBAAgB,CAAC,WAAW,SAAY,GAAG,MAAM,CAoBzD;AA4HD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+I1G;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEjE;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,260 @@
1
+ import { HarnessError } from '../contracts/errors.js';
2
+ import { fetchPublishedAssetByName } from '../assets/fetch-published-by-name.js';
3
+ import { createEnterpriseAssetClient } from '../cloud/enterprise-asset-client.js';
4
+ import { copyTextToClipboard } from '../cli-output/clipboard.js';
5
+ import { renderErrorBlock, renderJson, renderRemoteAssetList, renderSuccessBlock, renderWarningBlock, } from '../cli-output/renderers.js';
6
+ import { formatRemoteTopAsset } from '../assets/remote-list.js';
7
+ const DEFAULT_LIST_LIMIT = 50;
8
+ const MAX_LIST_LIMIT = 200;
9
+ function renderPromptHelp(programName = 'harness') {
10
+ return [
11
+ '查看与取用 Harness Prompt 提示词资产。',
12
+ '',
13
+ '用法:',
14
+ ` ${programName} prompt list [--remote] [--query <text>] [--limit <n>] [--json]`,
15
+ ` ${programName} prompt get <name> [--no-copy] [--json]`,
16
+ '',
17
+ '子命令:',
18
+ ' list 列出企业服务中的已发布 Prompt(默认远程列表)。',
19
+ ' get <name> 读取并输出 Prompt 正文;默认复制到系统剪贴板。',
20
+ '',
21
+ '选项:',
22
+ ' --remote 显式指定远程列表(与默认行为相同)。',
23
+ ' --query 按名称或描述模糊搜索。',
24
+ ' --limit 列表条数上限,默认 50,最大 200。',
25
+ ' --no-copy get 时不写入剪贴板。',
26
+ ' --json 输出机器可读 JSON。',
27
+ ' -h, --help 查看帮助。',
28
+ ].join('\n');
29
+ }
30
+ function parseListOptions(args) {
31
+ let json = false;
32
+ let query;
33
+ let limit = DEFAULT_LIST_LIMIT;
34
+ const unknown = [];
35
+ for (let index = 0; index < args.length; index += 1) {
36
+ const arg = args[index];
37
+ if (!arg) {
38
+ continue;
39
+ }
40
+ if (arg === '--json') {
41
+ json = true;
42
+ continue;
43
+ }
44
+ if (arg === '--remote') {
45
+ continue;
46
+ }
47
+ if (arg === '--query') {
48
+ const value = args[index + 1];
49
+ if (!value || value.startsWith('--')) {
50
+ throw new HarnessError('PROMPT_INVALID_ARGS', 'Missing value for --query.');
51
+ }
52
+ query = value.trim();
53
+ index += 1;
54
+ continue;
55
+ }
56
+ if (arg === '--limit') {
57
+ const value = args[index + 1];
58
+ if (!value || value.startsWith('--')) {
59
+ throw new HarnessError('PROMPT_INVALID_ARGS', 'Missing value for --limit.');
60
+ }
61
+ const parsed = Number.parseInt(value, 10);
62
+ if (!Number.isFinite(parsed) || parsed <= 0) {
63
+ throw new HarnessError('PROMPT_INVALID_ARGS', '`--limit` must be a positive integer.');
64
+ }
65
+ limit = Math.min(parsed, MAX_LIST_LIMIT);
66
+ index += 1;
67
+ continue;
68
+ }
69
+ unknown.push(arg);
70
+ }
71
+ return { json, query, limit, unknown };
72
+ }
73
+ function parseGetOptions(args) {
74
+ let json = false;
75
+ let noCopy = false;
76
+ const rest = [];
77
+ for (const arg of args) {
78
+ if (arg === '--json') {
79
+ json = true;
80
+ continue;
81
+ }
82
+ if (arg === '--no-copy') {
83
+ noCopy = true;
84
+ continue;
85
+ }
86
+ rest.push(arg);
87
+ }
88
+ const name = rest[0]?.trim();
89
+ if (!name || rest.length !== 1) {
90
+ throw new HarnessError('PROMPT_INVALID_ARGS', '用法:harness prompt get <name> [--no-copy] [--json]');
91
+ }
92
+ return { json, noCopy, name };
93
+ }
94
+ async function listRemotePrompts(args) {
95
+ const client = createEnterpriseAssetClient({
96
+ baseUrl: args.options.baseUrl,
97
+ fetchImpl: args.options.fetchImpl,
98
+ });
99
+ if (!client) {
100
+ throw new HarnessError('HARNESS_SERVICE_UNAVAILABLE', 'HARNESS_SERVICE_URL is not configured');
101
+ }
102
+ const items = await client.searchPublished({
103
+ type: 'prompt',
104
+ query: args.query,
105
+ sort: 'download_count',
106
+ limit: args.limit,
107
+ });
108
+ const assets = [];
109
+ for (const item of items) {
110
+ const remote = formatRemoteTopAsset({
111
+ type: item.type,
112
+ name: item.name,
113
+ assetId: item.id,
114
+ version: item.latestPublished?.version ?? null,
115
+ downloadCount: item.downloadCount,
116
+ rating: item.rating,
117
+ });
118
+ if (remote?.type === 'prompt') {
119
+ assets.push(remote);
120
+ }
121
+ }
122
+ return assets.sort((left, right) => {
123
+ if (right.downloadCount !== left.downloadCount) {
124
+ return right.downloadCount - left.downloadCount;
125
+ }
126
+ return left.name.localeCompare(right.name);
127
+ });
128
+ }
129
+ export async function runPromptCommand(args, options = {}) {
130
+ if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
131
+ console.log(renderPromptHelp());
132
+ return 0;
133
+ }
134
+ const subcommand = args[0];
135
+ if (subcommand === 'list') {
136
+ try {
137
+ const parsed = parseListOptions(args.slice(1));
138
+ if (parsed.unknown.length > 0) {
139
+ console.error(renderErrorBlock({
140
+ title: 'Prompt 列表参数无效',
141
+ message: `未知参数:${parsed.unknown.join(' ')}`,
142
+ code: 'PROMPT_INVALID_ARGS',
143
+ suggestions: ['运行 harness prompt list --help 查看支持的选项。'],
144
+ }));
145
+ return 1;
146
+ }
147
+ const assets = await listRemotePrompts({
148
+ query: parsed.query,
149
+ limit: parsed.limit,
150
+ options,
151
+ });
152
+ if (parsed.json) {
153
+ console.log(renderJson({ assets, pagination: { limit: parsed.limit, total: assets.length } }));
154
+ return 0;
155
+ }
156
+ const subtitle = parsed.query ? `搜索词:${parsed.query}` : undefined;
157
+ console.log(renderRemoteAssetList(subtitle ? `远程 Prompt(${subtitle})` : '远程 Prompt 提示词', assets));
158
+ return 0;
159
+ }
160
+ catch (error) {
161
+ const message = error instanceof Error ? error.message : String(error);
162
+ console.error(renderErrorBlock({ title: '远程 Prompt 列表读取失败', message }));
163
+ return 1;
164
+ }
165
+ }
166
+ if (subcommand === 'get') {
167
+ try {
168
+ const parsed = parseGetOptions(args.slice(1));
169
+ const client = createEnterpriseAssetClient({
170
+ baseUrl: options.baseUrl,
171
+ fetchImpl: options.fetchImpl,
172
+ });
173
+ if (!client) {
174
+ console.error(renderErrorBlock({
175
+ title: 'Prompt 读取失败',
176
+ message: 'HARNESS_SERVICE_URL is not configured.',
177
+ code: 'HARNESS_SERVICE_UNAVAILABLE',
178
+ }));
179
+ return 1;
180
+ }
181
+ const asset = await fetchPublishedAssetByName({
182
+ client,
183
+ type: 'prompt',
184
+ name: parsed.name,
185
+ });
186
+ let downloadCount;
187
+ try {
188
+ downloadCount = await client.recordDownload(asset.assetId);
189
+ }
190
+ catch (error) {
191
+ const message = error instanceof Error ? error.message : String(error);
192
+ console.error(renderWarningBlock('下载量未更新', [['原因', message]], ['Prompt 正文仍可使用。']));
193
+ }
194
+ let copied = false;
195
+ let copyReason;
196
+ if (!parsed.noCopy) {
197
+ const copyResult = await copyTextToClipboard(asset.content);
198
+ copied = copyResult.ok;
199
+ if (!copyResult.ok) {
200
+ copyReason = copyResult.reason;
201
+ }
202
+ }
203
+ if (parsed.json) {
204
+ console.log(renderJson({
205
+ name: asset.name,
206
+ assetId: asset.assetId,
207
+ version: asset.version,
208
+ description: asset.description,
209
+ content: asset.content,
210
+ downloadCount,
211
+ copied,
212
+ copyReason,
213
+ }));
214
+ return 0;
215
+ }
216
+ console.log(asset.content);
217
+ if (parsed.noCopy) {
218
+ console.log('');
219
+ console.log(renderSuccessBlock('Prompt 已输出', [
220
+ ['名称', asset.name],
221
+ ['版本', asset.version],
222
+ ...(downloadCount !== undefined ? [['下载量', downloadCount]] : []),
223
+ ]));
224
+ return 0;
225
+ }
226
+ if (copied) {
227
+ console.log('');
228
+ console.log(renderSuccessBlock('Prompt 已复制到剪贴板', [
229
+ ['名称', asset.name],
230
+ ['版本', asset.version],
231
+ ...(downloadCount !== undefined ? [['下载量', downloadCount]] : []),
232
+ ], ['可直接粘贴到 Cursor Chat 或其他 AI 工具中使用。']));
233
+ return 0;
234
+ }
235
+ console.log('');
236
+ console.log(renderWarningBlock('未能写入剪贴板', [
237
+ ['名称', asset.name],
238
+ ['原因', copyReason ?? '未知错误'],
239
+ ], ['正文已在上方输出,请手动复制。']));
240
+ return 0;
241
+ }
242
+ catch (error) {
243
+ const message = error instanceof Error ? error.message : String(error);
244
+ console.error(renderErrorBlock({ title: 'Prompt 读取失败', message }));
245
+ return 1;
246
+ }
247
+ }
248
+ console.error(renderErrorBlock({
249
+ title: 'Prompt 子命令无效',
250
+ message: `未知子命令:${subcommand}`,
251
+ code: 'PROMPT_INVALID_ARGS',
252
+ suggestions: ['运行 harness prompt --help 查看用法。'],
253
+ }));
254
+ return 1;
255
+ }
256
+ export function registerPromptCommand(router) {
257
+ router.register('prompt', (argv) => runPromptCommand(argv));
258
+ }
259
+ export { renderPromptHelp };
260
+ //# sourceMappingURL=command.js.map