@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,783 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { dirname, posix, resolve } from 'node:path';
3
+ import { HarnessError } from '../contracts/errors.js';
4
+ import { detectProjectFingerprint } from './fingerprint.js';
5
+ import { generateInitArtifactPlan } from './plan.js';
6
+ import { createCliInitPromptAdapter } from './prompt.js';
7
+ import { applyPackSelectionToMatchedContext, applyReviewTogglesToAnswers, deriveInitAnswersFromMatchedContext, filterCloudAssetsBySelection, resolveMatchedInitContext, } from './matched-init.js';
8
+ import { applyInitArtifactPlan } from './write.js';
9
+ import { createDefaultCursorCliAdapter } from './cursor-adapter.js';
10
+ import { createDefaultCloudInitAdapter } from './cloud-auto.js';
11
+ import { createDefaultCloudAssetClient } from './cloud-asset-client.js';
12
+ import { injectInstalledAssetIdHeader, isMarkdownLikeAssetPath } from '../assets/install-content.js';
13
+ import { createInitProjectManifest } from '../assets/project-manifest.js';
14
+ import { resolvePublishedAssetBody } from '../assets/published-content.js';
15
+ import { buildInstalledRegistryFromInitPlan, buildConfigPackManifestFromInit } from './manifest-records.js';
16
+ import { renderDebugBoundary, renderSection, renderSuccessBlock, renderWarningBlock } from '../cli-output/renderers.js';
17
+ function renderInitHelp(programName = 'harness') {
18
+ return [
19
+ '为当前工作区初始化 Harness 项目资产。',
20
+ '',
21
+ '用法:',
22
+ ` ${programName} init [--cwd <path>] [--mode <template-match|cloud-auto|local-manual>] [--dry-run]`,
23
+ '',
24
+ '模式:',
25
+ ' template-match 按工程指纹匹配云端配置包;无精确命中或服务不可用时直接失败。',
26
+ ' cloud-auto 上报工程指纹和用户角色,由云端 Mastra agent 选择资产。',
27
+ ' local-manual 调用 Cursor CLI 生成项目 Rule;缺少 Cursor CLI 时退出。',
28
+ '',
29
+ '选项:',
30
+ ' --cwd <path> 指定初始化目录,默认当前工作目录。',
31
+ ' --mode <mode> 选择初始化模式。',
32
+ ' --dry-run 只预览计划,不写入文件。',
33
+ ' -h, --help 查看帮助。',
34
+ ].join('\n');
35
+ }
36
+ const VALID_INIT_MODES = ['template-match', 'cloud-auto', 'local-manual'];
37
+ function parseInitMode(value) {
38
+ if (VALID_INIT_MODES.includes(value)) {
39
+ return value;
40
+ }
41
+ throw new HarnessError('INIT_INVALID_ARGS', `Unknown init mode: ${value}. Expected one of ${VALID_INIT_MODES.join(', ')}.`);
42
+ }
43
+ function parseInitArgs(args) {
44
+ let cwd = process.cwd();
45
+ let dryRun = false;
46
+ let help = false;
47
+ let mode;
48
+ for (let index = 0; index < args.length; index += 1) {
49
+ const arg = args[index];
50
+ if (arg === '--help' || arg === '-h') {
51
+ help = true;
52
+ continue;
53
+ }
54
+ if (arg === '--dry-run') {
55
+ dryRun = true;
56
+ continue;
57
+ }
58
+ if (arg === '--cwd') {
59
+ const value = args[index + 1];
60
+ if (!value || value.startsWith('--')) {
61
+ throw new HarnessError('INIT_INVALID_ARGS', 'Missing value for --cwd.');
62
+ }
63
+ cwd = resolve(value);
64
+ index += 1;
65
+ continue;
66
+ }
67
+ if (arg === '--mode') {
68
+ const value = args[index + 1];
69
+ if (!value || value.startsWith('--')) {
70
+ throw new HarnessError('INIT_INVALID_ARGS', 'Missing value for --mode.');
71
+ }
72
+ mode = parseInitMode(value);
73
+ index += 1;
74
+ continue;
75
+ }
76
+ throw new HarnessError('INIT_INVALID_ARGS', `Unknown init option: ${arg}`);
77
+ }
78
+ return {
79
+ cwd,
80
+ dryRun,
81
+ help,
82
+ mode,
83
+ };
84
+ }
85
+ async function assertValidCwd(cwd) {
86
+ try {
87
+ const details = await stat(cwd);
88
+ if (!details.isDirectory()) {
89
+ throw new HarnessError('INIT_INVALID_CWD', `Invalid cwd: ${cwd} is not a directory.`);
90
+ }
91
+ }
92
+ catch (error) {
93
+ if (error instanceof HarnessError) {
94
+ throw error;
95
+ }
96
+ throw new HarnessError('INIT_INVALID_CWD', `Invalid cwd: ${cwd}`, {
97
+ cause: error,
98
+ });
99
+ }
100
+ }
101
+ function selectInitMode(options, _fingerprint) {
102
+ if (options.mode) {
103
+ return {
104
+ mode: options.mode,
105
+ source: 'argument',
106
+ };
107
+ }
108
+ return {
109
+ mode: 'template-match',
110
+ source: 'default-selector',
111
+ };
112
+ }
113
+ function mapArtifactType(artifactId) {
114
+ if (artifactId.startsWith('cloud:')) {
115
+ const cloudTypePart = artifactId.slice('cloud:'.length).split(':')[0];
116
+ if (typeof cloudTypePart === 'string' && cloudTypePart.length > 0) {
117
+ return cloudTypePart;
118
+ }
119
+ }
120
+ switch (artifactId) {
121
+ case 'rules':
122
+ return 'rule';
123
+ case 'skill-suggestions':
124
+ return 'skill';
125
+ case 'mcp-config-draft':
126
+ return 'mcp-config';
127
+ case 'ai-coding-readme':
128
+ case 'local-manual-spec':
129
+ return 'spec';
130
+ case 'local-manual-command':
131
+ return 'command';
132
+ case 'cursorignore-secrets':
133
+ case 'gitignore-secrets':
134
+ return 'rule';
135
+ default:
136
+ return 'unknown';
137
+ }
138
+ }
139
+ function sanitizeArtifactIdPart(value) {
140
+ return value
141
+ .toLowerCase()
142
+ .replace(/[^a-z0-9]+/g, '-')
143
+ .replace(/^-+|-+$/g, '');
144
+ }
145
+ export function normalizeCursorAssetTargetPath(asset) {
146
+ const normalizedName = sanitizeArtifactIdPart(asset.name) || 'asset';
147
+ const rawTargetPath = (asset.targetPath ?? '').replace(/\\/g, '/').replace(/^\/+/, '');
148
+ if (!rawTargetPath.startsWith('.cursor/') && !rawTargetPath.startsWith('.harness/') && !rawTargetPath.startsWith('.agents/')) {
149
+ if (rawTargetPath === 'AI_CODING_README.md' || asset.name === 'ai-coding-readme') {
150
+ return rawTargetPath;
151
+ }
152
+ }
153
+ if (asset.assetType === 'rule') {
154
+ if (rawTargetPath.startsWith('.cursor/rules/')) {
155
+ return rawTargetPath;
156
+ }
157
+ return `.cursor/rules/${normalizedName}.mdc`;
158
+ }
159
+ if (rawTargetPath.startsWith('.harness/')) {
160
+ return `.cursor/harness/${rawTargetPath.slice('.harness/'.length)}`;
161
+ }
162
+ if (rawTargetPath.startsWith('.agents/')) {
163
+ return `.cursor/${rawTargetPath.slice('.agents/'.length)}`;
164
+ }
165
+ if (rawTargetPath.startsWith('.cursor/')) {
166
+ return rawTargetPath;
167
+ }
168
+ if (asset.assetType === 'mcp-config') {
169
+ return '.cursor/mcp.json';
170
+ }
171
+ if (asset.assetType === 'skill') {
172
+ return `.cursor/skills/${normalizedName}/SKILL.md`;
173
+ }
174
+ if (asset.assetType === 'spec') {
175
+ return `.cursor/specs/${normalizedName}.md`;
176
+ }
177
+ if (asset.assetType === 'command') {
178
+ return `.cursor/commands/${normalizedName}.md`;
179
+ }
180
+ return `.cursor/assets/${normalizedName}`;
181
+ }
182
+ function parseCloudAssetContent(asset) {
183
+ if (asset.content === undefined) {
184
+ return { content: undefined, metadata: {} };
185
+ }
186
+ if (asset.bundleFiles && asset.bundleFiles.length > 0) {
187
+ const metadata = asset.content !== undefined
188
+ ? resolvePublishedAssetBody(asset.content, { assetName: asset.name }).metadata
189
+ : {};
190
+ return {
191
+ content: asset.content,
192
+ metadata,
193
+ bundleFiles: asset.bundleFiles,
194
+ };
195
+ }
196
+ const parsed = resolvePublishedAssetBody(asset.content, { assetName: asset.name });
197
+ return {
198
+ content: parsed.content,
199
+ metadata: parsed.metadata,
200
+ bundleFiles: parsed.bundleFiles,
201
+ };
202
+ }
203
+ function joinPosixPath(...segments) {
204
+ return posix.join(...segments.map((segment) => segment.replace(/\\/g, '/')));
205
+ }
206
+ function renderCloudAssetContent(asset, targetPath, parsedInput) {
207
+ const parsed = parsedInput ?? parseCloudAssetContent(asset);
208
+ if (parsed.content !== undefined) {
209
+ if (targetPath && isMarkdownLikeAssetPath(targetPath) && asset.assetId) {
210
+ return injectInstalledAssetIdHeader(parsed.content, asset.assetId);
211
+ }
212
+ return parsed.content;
213
+ }
214
+ const metadata = {
215
+ source: asset.source,
216
+ version: asset.version,
217
+ reason: asset.reason ?? null,
218
+ };
219
+ if (asset.targetPath.endsWith('.json')) {
220
+ return JSON.stringify({
221
+ generatedBy: 'harness-cloud',
222
+ asset: {
223
+ assetType: asset.assetType,
224
+ name: asset.name,
225
+ },
226
+ metadata,
227
+ }, null, 2);
228
+ }
229
+ return [
230
+ `# Cloud Asset: ${asset.name}`,
231
+ '',
232
+ `- assetType: ${asset.assetType}`,
233
+ `- source: ${asset.source}`,
234
+ `- version: ${asset.version}`,
235
+ `- reason: ${asset.reason ?? 'n/a'}`,
236
+ ].join('\n');
237
+ }
238
+ async function resolveArtifactAction(cwd, targetPath) {
239
+ const absoluteTargetPath = resolve(cwd, targetPath);
240
+ try {
241
+ await stat(absoluteTargetPath);
242
+ return 'update';
243
+ }
244
+ catch {
245
+ return 'create';
246
+ }
247
+ }
248
+ async function convertCloudAssetsToWritePlan(args) {
249
+ const orderedCloudAssets = [...args.cloudAssets].sort((left, right) => left.targetPath.localeCompare(right.targetPath));
250
+ const seenTargetPaths = new Set();
251
+ const artifacts = [];
252
+ for (const asset of orderedCloudAssets) {
253
+ const targetPath = normalizeCursorAssetTargetPath(asset);
254
+ if (seenTargetPaths.has(targetPath)) {
255
+ artifacts.push({
256
+ id: `cloud:${asset.assetType}:${sanitizeArtifactIdPart(asset.name)}:duplicate`,
257
+ targetPath,
258
+ action: 'skip',
259
+ content: '',
260
+ reason: 'duplicate-cloud-asset-target',
261
+ });
262
+ continue;
263
+ }
264
+ seenTargetPaths.add(targetPath);
265
+ const parsed = parseCloudAssetContent(asset);
266
+ const action = await resolveArtifactAction(args.cwd, targetPath);
267
+ artifacts.push({
268
+ id: asset.assetId ?? `cloud:${asset.assetType}:${sanitizeArtifactIdPart(asset.name)}`,
269
+ targetPath,
270
+ action,
271
+ content: renderCloudAssetContent(asset, targetPath, parsed),
272
+ reason: asset.reason,
273
+ publishedVersion: asset.publishedVersionLabel,
274
+ contentRevision: asset.contentCommitSha ?? (asset.version !== 'unknown' ? asset.version : undefined),
275
+ });
276
+ const bundleFiles = parsed.bundleFiles ?? [];
277
+ if (bundleFiles.length > 0) {
278
+ const installDir = dirname(targetPath.replace(/\\/g, '/'));
279
+ const entrypointBasename = posix.basename(targetPath.replace(/\\/g, '/'));
280
+ for (const bundleFile of bundleFiles) {
281
+ if (bundleFile.path === entrypointBasename) {
282
+ continue;
283
+ }
284
+ const siblingTargetPath = joinPosixPath(installDir, bundleFile.path);
285
+ if (seenTargetPaths.has(siblingTargetPath)) {
286
+ continue;
287
+ }
288
+ seenTargetPaths.add(siblingTargetPath);
289
+ const siblingAction = await resolveArtifactAction(args.cwd, siblingTargetPath);
290
+ artifacts.push({
291
+ id: `${asset.assetId ?? `cloud:${asset.assetType}:${sanitizeArtifactIdPart(asset.name)}`}:file:${sanitizeArtifactIdPart(bundleFile.path)}`,
292
+ targetPath: siblingTargetPath,
293
+ action: siblingAction,
294
+ content: bundleFile.content,
295
+ reason: asset.reason,
296
+ publishedVersion: asset.publishedVersionLabel,
297
+ contentRevision: asset.contentCommitSha ?? (asset.version !== 'unknown' ? asset.version : undefined),
298
+ });
299
+ }
300
+ }
301
+ }
302
+ const mergedArtifacts = [...artifacts].sort((left, right) => left.targetPath.localeCompare(right.targetPath));
303
+ return {
304
+ ...args.initialPlan,
305
+ artifacts: mergedArtifacts,
306
+ summary: summarizeArtifacts({
307
+ ...args.initialPlan,
308
+ artifacts: mergedArtifacts,
309
+ }),
310
+ cloudPlanSource: args.cloudPlanSource,
311
+ localFallback: false,
312
+ };
313
+ }
314
+ function summarizeArtifacts(plan) {
315
+ return plan.artifacts.reduce((summary, artifact) => {
316
+ summary[artifact.action] += 1;
317
+ return summary;
318
+ }, {
319
+ create: 0,
320
+ update: 0,
321
+ skip: 0,
322
+ });
323
+ }
324
+ function appendCursorAssetManifest(plan, cloudAssets = [], matchedContext) {
325
+ const { configPacks, installFromByAssetId } = matchedContext !== undefined
326
+ ? buildConfigPackManifestFromInit({
327
+ context: matchedContext,
328
+ selectedCloudAssets: cloudAssets,
329
+ })
330
+ : { configPacks: [], installFromByAssetId: new Map() };
331
+ const installed = buildInstalledRegistryFromInitPlan({
332
+ plan,
333
+ cloudAssets,
334
+ installFromByAssetId,
335
+ });
336
+ const manifest = createInitProjectManifest({
337
+ generatedBy: 'harness init',
338
+ cloudPlanSource: plan.cloudPlanSource ?? null,
339
+ installed,
340
+ configPacks,
341
+ });
342
+ const shouldWriteManifest = installed.length > 0 || configPacks.length > 0;
343
+ const artifacts = [
344
+ ...plan.artifacts.filter((artifact) => artifact.id !== 'asset-manifest'),
345
+ {
346
+ id: 'asset-manifest',
347
+ targetPath: '.cursor/harness-assets.json',
348
+ action: shouldWriteManifest ? 'create' : 'skip',
349
+ content: JSON.stringify(manifest, null, 2),
350
+ reason: shouldWriteManifest ? undefined : 'No enabled init assets to track.',
351
+ },
352
+ ];
353
+ return {
354
+ ...plan,
355
+ artifacts,
356
+ summary: summarizeArtifacts({
357
+ ...plan,
358
+ artifacts,
359
+ }),
360
+ };
361
+ }
362
+ async function buildLocalManualPlan(args) {
363
+ const byId = new Map(args.plan.artifacts.map((artifact) => [artifact.id, artifact]));
364
+ const needsCursorDrafts = args.answers.includeRules;
365
+ let drafts = null;
366
+ if (needsCursorDrafts) {
367
+ const context = await args.cursorCliAdapter.collectRepositoryContext({
368
+ cwd: args.cwd,
369
+ fingerprint: args.fingerprint,
370
+ });
371
+ drafts = await args.cursorCliAdapter.generateRuleAndSpecDrafts({
372
+ context,
373
+ answers: args.answers,
374
+ });
375
+ }
376
+ const rulesArtifact = byId.get('rules');
377
+ const secretArtifacts = args.plan.artifacts.filter((artifact) => artifact.id === 'cursorignore-secrets' || artifact.id === 'gitignore-secrets');
378
+ const ordered = [];
379
+ if (rulesArtifact) {
380
+ ordered.push({
381
+ ...rulesArtifact,
382
+ content: rulesArtifact.action === 'create' && drafts !== null
383
+ ? drafts.ruleDraft
384
+ : rulesArtifact.content,
385
+ });
386
+ }
387
+ ordered.push(...secretArtifacts);
388
+ return {
389
+ ...args.plan,
390
+ artifacts: ordered,
391
+ summary: summarizeArtifacts({
392
+ ...args.plan,
393
+ artifacts: ordered,
394
+ }),
395
+ };
396
+ }
397
+ function summarizePlannedAssetTypes(plan) {
398
+ const types = new Set();
399
+ for (const artifact of plan.artifacts) {
400
+ if (artifact.action === 'create' || artifact.action === 'update') {
401
+ types.add(mapArtifactType(artifact.id));
402
+ }
403
+ }
404
+ if (types.size === 0) {
405
+ return 'none';
406
+ }
407
+ return Array.from(types).sort().join(', ');
408
+ }
409
+ function rollbackHintForMode(mode) {
410
+ switch (mode) {
411
+ case 'template-match':
412
+ return 'Use --dry-run first and revert generated files via version control if needed.';
413
+ case 'cloud-auto':
414
+ return 'If cloud output is not desired, rerun with --mode template-match or --mode local-manual.';
415
+ case 'local-manual':
416
+ return 'Keep manual edits in version control and rerun with template-match when standardizing.';
417
+ }
418
+ }
419
+ function formatGitIdentity(gitIdentity) {
420
+ const name = gitIdentity.name ?? 'missing';
421
+ const email = gitIdentity.email ?? 'missing';
422
+ return `name:${name},email:${email}`;
423
+ }
424
+ function deriveFingerprintFallback(fingerprint) {
425
+ const reasons = [];
426
+ if (fingerprint.languages.length === 1 && fingerprint.languages[0] === 'unknown') {
427
+ reasons.push('language-not-detected');
428
+ }
429
+ if (fingerprint.packageManager === 'unknown') {
430
+ reasons.push('package-manager-not-detected');
431
+ }
432
+ if (!fingerprint.markers.git) {
433
+ reasons.push('git-repository-not-detected');
434
+ }
435
+ else if (fingerprint.gitIdentity.name === null && fingerprint.gitIdentity.email === null) {
436
+ reasons.push('git-identity-not-configured');
437
+ }
438
+ return {
439
+ reasons,
440
+ nextSteps: fingerprint.recommendations,
441
+ };
442
+ }
443
+ function logFingerprintSummary(fingerprint) {
444
+ console.log(renderSection('初始化指纹摘要'));
445
+ console.log(` 语言=${fingerprint.languages.join(',')}`);
446
+ console.log(` 包管理器=${fingerprint.packageManager}`);
447
+ console.log(` Git 身份=${formatGitIdentity(fingerprint.gitIdentity)}`);
448
+ console.log(` 建议配置=${fingerprint.recommendations.length > 0 ? fingerprint.recommendations.join(' | ') : 'none'}`);
449
+ const fallback = deriveFingerprintFallback(fingerprint);
450
+ if (fallback.reasons.length > 0) {
451
+ console.log(renderSection('初始化回退提示'));
452
+ console.log(` 原因=${fallback.reasons.join(',')}`);
453
+ console.log(` 下一步=${fallback.nextSteps.join(' | ') || 'none'}`);
454
+ }
455
+ }
456
+ function logModePreflight(mode, plan) {
457
+ console.log([
458
+ `初始化预检 mode=${mode.mode}`,
459
+ `输入来源=${mode.source}`,
460
+ `资产类型=${summarizePlannedAssetTypes(plan)}`,
461
+ `回退提示=${rollbackHintForMode(mode.mode)}`,
462
+ ].join(' | '));
463
+ }
464
+ function logPlannedArtifactList(plan) {
465
+ console.log(renderSection('初始化文件计划'));
466
+ for (const artifact of plan.artifacts) {
467
+ console.log(` - ${artifact.action.toUpperCase()} ${artifact.targetPath}`);
468
+ }
469
+ }
470
+ function firstPreviewLine(content) {
471
+ const [firstLine = ''] = content.split(/\r?\n/, 1);
472
+ const compact = firstLine.trim();
473
+ if (compact.length === 0) {
474
+ return '[empty-line]';
475
+ }
476
+ return compact.length > 80 ? `${compact.slice(0, 77)}...` : compact;
477
+ }
478
+ async function readTargetFileOrNull(cwd, targetPath) {
479
+ const absoluteTargetPath = resolve(cwd, targetPath);
480
+ try {
481
+ return await readFile(absoluteTargetPath, 'utf8');
482
+ }
483
+ catch {
484
+ return null;
485
+ }
486
+ }
487
+ async function logLocalDiffPreview(cwd, plan) {
488
+ console.log(renderSection('初始化本地差异预览'));
489
+ for (const artifact of plan.artifacts) {
490
+ if (artifact.action === 'skip') {
491
+ const reason = artifact.reason ?? 'unchanged-or-disabled';
492
+ console.log(` - SKIP ${artifact.targetPath} | reason=${reason}`);
493
+ continue;
494
+ }
495
+ const existing = await readTargetFileOrNull(cwd, artifact.targetPath);
496
+ if (existing === null) {
497
+ console.log(` - CREATE ${artifact.targetPath}`);
498
+ console.log(` + ${firstPreviewLine(artifact.content)}`);
499
+ continue;
500
+ }
501
+ if (existing === artifact.content) {
502
+ console.log(` - SKIP ${artifact.targetPath} | reason=no-content-change`);
503
+ continue;
504
+ }
505
+ console.log(` - UPDATE ${artifact.targetPath}`);
506
+ console.log(` - ${firstPreviewLine(existing)}`);
507
+ console.log(` + ${firstPreviewLine(artifact.content)}`);
508
+ }
509
+ }
510
+ function logAppliedArtifactList(plan) {
511
+ console.log(renderSection('初始化写入结果'));
512
+ for (const artifact of plan.artifacts) {
513
+ console.log(` - ${artifact.action.toUpperCase()} ${artifact.targetPath}`);
514
+ }
515
+ }
516
+ function logCloudDiffPreview(preview) {
517
+ console.log(renderSection('云端差异预览', `来源=${preview.source} 版本=${preview.version}`));
518
+ for (const entry of preview.entries) {
519
+ const reasonSuffix = entry.reason ? ` | reason=${entry.reason}` : '';
520
+ console.log(` - ${entry.action.toUpperCase()} ${entry.targetPath}${reasonSuffix}`);
521
+ }
522
+ }
523
+ function buildCloudPlanPreviewFromWritePlan(plan) {
524
+ if (!plan.cloudPlanSource) {
525
+ return null;
526
+ }
527
+ const entries = plan.artifacts
528
+ .filter((artifact) => artifact.id.startsWith('cloud:'))
529
+ .map((artifact) => ({
530
+ id: artifact.id,
531
+ targetPath: artifact.targetPath,
532
+ action: artifact.action,
533
+ reason: artifact.reason,
534
+ }));
535
+ if (entries.length === 0) {
536
+ return null;
537
+ }
538
+ return {
539
+ source: `harness-cloud/${plan.cloudPlanSource}`,
540
+ version: 'dynamic',
541
+ entries,
542
+ };
543
+ }
544
+ function logCloudDynamicAssemblyResult(result) {
545
+ console.log(renderSection('云端动态组装日志'));
546
+ if (result.explainableLog.length === 0) {
547
+ console.log(' - [none]');
548
+ }
549
+ else {
550
+ for (const logEntry of result.explainableLog) {
551
+ console.log(` - ${logEntry}`);
552
+ }
553
+ }
554
+ console.log(renderSection('云端动态组装资产'));
555
+ if (result.assets.length === 0) {
556
+ console.log(' - [none]');
557
+ }
558
+ else {
559
+ for (const asset of result.assets) {
560
+ console.log(` - ${asset.assetType} ${asset.name} -> ${asset.targetPath} | source=${asset.source} | reason=${asset.reason ?? 'unknown'}`);
561
+ }
562
+ }
563
+ if (result.fallbackReason) {
564
+ console.log(`云端动态组装回退:${result.fallbackReason}`);
565
+ }
566
+ }
567
+ async function tryRenderCloudPreview(args) {
568
+ if (args.mode.mode !== 'cloud-auto') {
569
+ return;
570
+ }
571
+ const hydratedPreview = buildCloudPlanPreviewFromWritePlan(args.plan);
572
+ if (hydratedPreview) {
573
+ logCloudDiffPreview(hydratedPreview);
574
+ return;
575
+ }
576
+ if (!args.plan.cloudRequestPayload) {
577
+ return;
578
+ }
579
+ try {
580
+ const preview = await args.cloudInitAdapter.generatePlanPreview({
581
+ cwd: args.options.cwd,
582
+ payload: args.plan.cloudRequestPayload,
583
+ });
584
+ logCloudDiffPreview(preview);
585
+ }
586
+ catch (error) {
587
+ const message = error instanceof Error ? error.message : String(error);
588
+ console.log(renderWarningBlock('云端自动初始化暂不可用', [
589
+ ['原因', message],
590
+ ], ['本次 cloud-auto 预览未生成云端差异。']));
591
+ }
592
+ }
593
+ function logMatchedInitContext(context) {
594
+ if (context.cloudMiss) {
595
+ console.log(renderWarningBlock('云端配置包未命中', [['原因', context.cloudMiss.hitReason]]));
596
+ if (context.cloudMiss.rollbackHint) {
597
+ console.log(`云端配置包回退提示:${context.cloudMiss.rollbackHint}`);
598
+ }
599
+ }
600
+ console.log(renderSection('初始化配置包匹配'));
601
+ const packs = context.matchedPacks ?? [];
602
+ if (packs.length > 1) {
603
+ console.log(` 命中数量=${packs.length}`);
604
+ for (const pack of packs) {
605
+ console.log(` 配置包=${pack.packName} (${pack.packId} @ ${pack.version})`);
606
+ console.log(` 原因=${pack.hitReason}`);
607
+ }
608
+ }
609
+ else {
610
+ console.log(` 配置包=${context.packName} (${context.packId} @ ${context.version})`);
611
+ console.log(` 原因=${context.hitReason}`);
612
+ }
613
+ console.log(` 来源=${context.source}`);
614
+ if (context.includeCloudDynamicAssembly) {
615
+ console.log(' 说明=cloud-auto 将追加云端动态组装资产');
616
+ }
617
+ }
618
+ async function maybeHydratePlanFromCloudAssets(args) {
619
+ if (args.mode.mode !== 'template-match' && args.mode.mode !== 'cloud-auto') {
620
+ return args.initialPlan;
621
+ }
622
+ const cloudAssets = args.matchedContext.cloudAssets ?? [];
623
+ if (args.mode.mode === 'template-match' && cloudAssets.length === 0) {
624
+ throw new HarnessError('INIT_CLOUD_ASSET_UNAVAILABLE', 'Template-match requires cloud config-pack assets; none were returned.');
625
+ }
626
+ try {
627
+ let hydratedAssets = [...cloudAssets];
628
+ let cloudPlanSource = cloudAssets.length > 0 ? 'config-pack' : 'mastra';
629
+ if (args.mode.mode === 'cloud-auto' && args.matchedContext.includeCloudDynamicAssembly) {
630
+ const assembledResult = await args.cloudAssetClient.assembleAssets({
631
+ fingerprint: args.fingerprint,
632
+ answers: args.answers,
633
+ });
634
+ logCloudDynamicAssemblyResult(assembledResult);
635
+ const byPath = new Map();
636
+ for (const asset of hydratedAssets) {
637
+ byPath.set(asset.targetPath, asset);
638
+ }
639
+ for (const asset of assembledResult.assets) {
640
+ byPath.set(asset.targetPath, asset);
641
+ }
642
+ hydratedAssets = [...byPath.values()];
643
+ cloudPlanSource = cloudAssets.length > 0 ? 'config-pack+mastra' : 'mastra';
644
+ }
645
+ const filteredAssets = filterCloudAssetsBySelection({
646
+ assets: hydratedAssets,
647
+ answers: args.answers,
648
+ disabledAssetKeys: args.disabledAssetKeys,
649
+ });
650
+ if (filteredAssets.length === 0) {
651
+ throw new HarnessError('INIT_CLOUD_ASSET_UNAVAILABLE', 'No cloud assets remain after applying init selections.');
652
+ }
653
+ return convertCloudAssetsToWritePlan({
654
+ cwd: args.options.cwd,
655
+ initialPlan: args.initialPlan,
656
+ cloudAssets: filteredAssets,
657
+ cloudPlanSource,
658
+ });
659
+ }
660
+ catch (error) {
661
+ if (error instanceof HarnessError) {
662
+ throw error;
663
+ }
664
+ const message = error instanceof Error ? error.message : String(error);
665
+ throw new HarnessError('INIT_CLOUD_ASSET_UNAVAILABLE', message, { cause: error });
666
+ }
667
+ }
668
+ export async function runInitCommand(args, dependencies = {}) {
669
+ const startedAt = Date.now();
670
+ const options = parseInitArgs(args);
671
+ try {
672
+ if (options.help) {
673
+ console.log(renderInitHelp());
674
+ return 0;
675
+ }
676
+ await assertValidCwd(options.cwd);
677
+ const fingerprint = await detectProjectFingerprint({ cwd: options.cwd });
678
+ logFingerprintSummary(fingerprint);
679
+ const promptAdapter = dependencies.promptAdapter ?? createCliInitPromptAdapter();
680
+ const selectedMode = selectInitMode(options, fingerprint);
681
+ const cloudAssetClient = dependencies.cloudAssetClient ?? createDefaultCloudAssetClient();
682
+ const matchedContext = await resolveMatchedInitContext({
683
+ mode: selectedMode.mode,
684
+ fingerprint,
685
+ cloudAssetClient,
686
+ });
687
+ logMatchedInitContext(matchedContext);
688
+ const reviewResult = await promptAdapter.reviewMatchedInitConfig({
689
+ cwd: options.cwd,
690
+ mode: selectedMode.mode,
691
+ matched: matchedContext,
692
+ });
693
+ if (!reviewResult.confirmed) {
694
+ console.log(renderWarningBlock('初始化写入已取消', [], ['用户确认阶段选择取消,本次未写入文件。']));
695
+ return 0;
696
+ }
697
+ const effectiveMatchedContext = applyPackSelectionToMatchedContext(matchedContext, reviewResult.disabledPackIds);
698
+ if ((effectiveMatchedContext.cloudAssets ?? []).length === 0 && selectedMode.mode === 'template-match') {
699
+ throw new HarnessError('INIT_TEMPLATE_MATCH_MISS', 'No config packs remain selected after review.');
700
+ }
701
+ const baseAnswers = deriveInitAnswersFromMatchedContext(effectiveMatchedContext, fingerprint);
702
+ baseAnswers.mode = selectedMode.mode;
703
+ const answers = applyReviewTogglesToAnswers(baseAnswers, effectiveMatchedContext, {
704
+ useSkills: reviewResult.answers.useSkills,
705
+ includeRules: reviewResult.answers.includeRules,
706
+ bootstrapMcp: reviewResult.answers.bootstrapMcp,
707
+ syncSpec: reviewResult.answers.syncSpec,
708
+ generateReadme: reviewResult.answers.generateReadme,
709
+ enableRedaction: reviewResult.answers.enableRedaction,
710
+ });
711
+ const generatedPlan = generateInitArtifactPlan(fingerprint, answers);
712
+ const cloudHydratedPlan = await maybeHydratePlanFromCloudAssets({
713
+ mode: selectedMode,
714
+ options,
715
+ answers,
716
+ fingerprint,
717
+ initialPlan: generatedPlan,
718
+ matchedContext: effectiveMatchedContext,
719
+ disabledAssetKeys: reviewResult.disabledAssetKeys,
720
+ cloudAssetClient,
721
+ });
722
+ const assembledPlan = selectedMode.mode === 'local-manual'
723
+ ? await buildLocalManualPlan({
724
+ plan: cloudHydratedPlan,
725
+ answers,
726
+ fingerprint,
727
+ cwd: options.cwd,
728
+ cursorCliAdapter: dependencies.cursorCliAdapter ?? createDefaultCursorCliAdapter(),
729
+ })
730
+ : cloudHydratedPlan;
731
+ const registryCloudAssets = selectedMode.mode === 'template-match' || selectedMode.mode === 'cloud-auto'
732
+ ? filterCloudAssetsBySelection({
733
+ assets: effectiveMatchedContext.cloudAssets ?? [],
734
+ answers,
735
+ disabledAssetKeys: reviewResult.disabledAssetKeys,
736
+ })
737
+ : [];
738
+ const plan = appendCursorAssetManifest(assembledPlan, registryCloudAssets, effectiveMatchedContext);
739
+ await tryRenderCloudPreview({
740
+ mode: selectedMode,
741
+ options,
742
+ plan,
743
+ cloudInitAdapter: dependencies.cloudInitAdapter ?? createDefaultCloudInitAdapter(),
744
+ });
745
+ logModePreflight(selectedMode, plan);
746
+ logPlannedArtifactList(plan);
747
+ await logLocalDiffPreview(options.cwd, plan);
748
+ if (options.dryRun) {
749
+ console.log(renderSuccessBlock('初始化 Dry Run 完成', [
750
+ ['目录', options.cwd],
751
+ ['创建', plan.summary.create],
752
+ ['更新', plan.summary.update],
753
+ ['跳过', plan.summary.skip],
754
+ ]));
755
+ return 0;
756
+ }
757
+ const writeResult = await applyInitArtifactPlan(plan, {
758
+ cwd: options.cwd,
759
+ allowUpdates: false,
760
+ });
761
+ logAppliedArtifactList(writeResult);
762
+ console.log(renderSuccessBlock('初始化完成', [
763
+ ['目录', options.cwd],
764
+ ['创建', writeResult.summary.create],
765
+ ['更新', writeResult.summary.update],
766
+ ['跳过', writeResult.summary.skip],
767
+ ]));
768
+ return 0;
769
+ }
770
+ finally {
771
+ const durationMs = Date.now() - startedAt;
772
+ const budgetMs = 5_000;
773
+ const debugLine = renderDebugBoundary('init', durationMs, budgetMs);
774
+ if (debugLine) {
775
+ console.log(debugLine);
776
+ }
777
+ }
778
+ }
779
+ export function registerInitCommand(router, dependencies = {}) {
780
+ router.register('init', (args) => runInitCommand(args, dependencies));
781
+ }
782
+ export { renderInitHelp };
783
+ //# sourceMappingURL=command.js.map