@aligndottech/cli 0.50.0 → 0.52.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 (323) hide show
  1. package/README.md +1 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +6 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/config.d.ts +8 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +33 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/connect-agents.d.ts.map +1 -1
  10. package/dist/commands/connect-agents.js +3 -1
  11. package/dist/commands/connect-agents.js.map +1 -1
  12. package/dist/commands/env.d.ts.map +1 -1
  13. package/dist/commands/env.js +11 -0
  14. package/dist/commands/env.js.map +1 -1
  15. package/dist/commands/invite.d.ts +8 -18
  16. package/dist/commands/invite.d.ts.map +1 -1
  17. package/dist/commands/invite.js +23 -46
  18. package/dist/commands/invite.js.map +1 -1
  19. package/dist/commands/join.d.ts +5 -0
  20. package/dist/commands/join.d.ts.map +1 -0
  21. package/dist/commands/join.js +49 -0
  22. package/dist/commands/join.js.map +1 -0
  23. package/dist/commands/local-relink.d.ts +35 -0
  24. package/dist/commands/local-relink.d.ts.map +1 -0
  25. package/dist/commands/local-relink.js +72 -0
  26. package/dist/commands/local-relink.js.map +1 -0
  27. package/dist/commands/local.d.ts.map +1 -1
  28. package/dist/commands/local.js +37 -0
  29. package/dist/commands/local.js.map +1 -1
  30. package/dist/commands/login.d.ts.map +1 -1
  31. package/dist/commands/login.js +21 -2
  32. package/dist/commands/login.js.map +1 -1
  33. package/dist/commands/mcp.d.ts +8 -0
  34. package/dist/commands/mcp.d.ts.map +1 -1
  35. package/dist/commands/mcp.js +12 -5
  36. package/dist/commands/mcp.js.map +1 -1
  37. package/dist/commands/registry.d.ts.map +1 -1
  38. package/dist/commands/registry.js +4 -0
  39. package/dist/commands/registry.js.map +1 -1
  40. package/dist/commands/share.d.ts.map +1 -1
  41. package/dist/commands/share.js +81 -12
  42. package/dist/commands/share.js.map +1 -1
  43. package/dist/commands/status.d.ts.map +1 -1
  44. package/dist/commands/status.js +10 -0
  45. package/dist/commands/status.js.map +1 -1
  46. package/dist/detector/detector-version.d.ts +16 -0
  47. package/dist/detector/detector-version.d.ts.map +1 -0
  48. package/dist/detector/detector-version.js +36 -0
  49. package/dist/detector/detector-version.js.map +1 -0
  50. package/dist/detector/relationship-contract.d.ts +30 -0
  51. package/dist/detector/relationship-contract.d.ts.map +1 -0
  52. package/dist/detector/relationship-contract.js +120 -0
  53. package/dist/detector/relationship-contract.js.map +1 -0
  54. package/dist/detector/relationship-contract.v1.json +53 -0
  55. package/dist/detector/relationship-prompt.d.ts +20 -0
  56. package/dist/detector/relationship-prompt.d.ts.map +1 -0
  57. package/dist/detector/relationship-prompt.js +55 -0
  58. package/dist/detector/relationship-prompt.js.map +1 -0
  59. package/dist/detector/relationship-prompt.v1.json +13 -0
  60. package/dist/detector/resolve-pair.d.ts +39 -0
  61. package/dist/detector/resolve-pair.d.ts.map +1 -0
  62. package/dist/detector/resolve-pair.js +345 -0
  63. package/dist/detector/resolve-pair.js.map +1 -0
  64. package/dist/detector/similar-item.d.ts +20 -0
  65. package/dist/detector/similar-item.d.ts.map +1 -0
  66. package/dist/detector/similar-item.js +16 -0
  67. package/dist/detector/similar-item.js.map +1 -0
  68. package/dist/index.js +37 -13
  69. package/dist/index.js.map +1 -1
  70. package/dist/lib/advisory-dedup.d.ts.map +1 -1
  71. package/dist/lib/advisory-dedup.js +16 -8
  72. package/dist/lib/advisory-dedup.js.map +1 -1
  73. package/dist/lib/advisory-verdict.d.ts +19 -0
  74. package/dist/lib/advisory-verdict.d.ts.map +1 -1
  75. package/dist/lib/advisory-verdict.js +6 -3
  76. package/dist/lib/advisory-verdict.js.map +1 -1
  77. package/dist/lib/backup-exclusion.d.ts +10 -0
  78. package/dist/lib/backup-exclusion.d.ts.map +1 -0
  79. package/dist/lib/backup-exclusion.js +58 -0
  80. package/dist/lib/backup-exclusion.js.map +1 -0
  81. package/dist/lib/cli-oauth.d.ts +2 -0
  82. package/dist/lib/cli-oauth.d.ts.map +1 -1
  83. package/dist/lib/cli-oauth.js +61 -10
  84. package/dist/lib/cli-oauth.js.map +1 -1
  85. package/dist/lib/config.d.ts +41 -1
  86. package/dist/lib/config.d.ts.map +1 -1
  87. package/dist/lib/config.js +109 -1
  88. package/dist/lib/config.js.map +1 -1
  89. package/dist/lib/curation/guardrail.d.ts.map +1 -1
  90. package/dist/lib/curation/guardrail.js +2 -0
  91. package/dist/lib/curation/guardrail.js.map +1 -1
  92. package/dist/lib/curation/judgements-db.d.ts +1 -0
  93. package/dist/lib/curation/judgements-db.d.ts.map +1 -1
  94. package/dist/lib/curation/judgements-db.js +9 -3
  95. package/dist/lib/curation/judgements-db.js.map +1 -1
  96. package/dist/lib/curation/mark.js +4 -2
  97. package/dist/lib/curation/mark.js.map +1 -1
  98. package/dist/lib/destination-name.d.ts +24 -0
  99. package/dist/lib/destination-name.d.ts.map +1 -0
  100. package/dist/lib/destination-name.js +39 -0
  101. package/dist/lib/destination-name.js.map +1 -0
  102. package/dist/lib/destination-summary.d.ts +6 -0
  103. package/dist/lib/destination-summary.d.ts.map +1 -0
  104. package/dist/lib/destination-summary.js +27 -0
  105. package/dist/lib/destination-summary.js.map +1 -0
  106. package/dist/lib/destination-trust.d.ts +54 -0
  107. package/dist/lib/destination-trust.d.ts.map +1 -0
  108. package/dist/lib/destination-trust.js +107 -0
  109. package/dist/lib/destination-trust.js.map +1 -0
  110. package/dist/lib/env-resolver.d.ts.map +1 -1
  111. package/dist/lib/env-resolver.js +3 -0
  112. package/dist/lib/env-resolver.js.map +1 -1
  113. package/dist/lib/fatal.d.ts +11 -0
  114. package/dist/lib/fatal.d.ts.map +1 -0
  115. package/dist/lib/fatal.js +22 -0
  116. package/dist/lib/fatal.js.map +1 -0
  117. package/dist/lib/gateway-client.d.ts +8 -16
  118. package/dist/lib/gateway-client.d.ts.map +1 -1
  119. package/dist/lib/gateway-client.js +30 -20
  120. package/dist/lib/gateway-client.js.map +1 -1
  121. package/dist/lib/invite-prompt.d.ts +4 -4
  122. package/dist/lib/invite-prompt.d.ts.map +1 -1
  123. package/dist/lib/invite-prompt.js +4 -4
  124. package/dist/lib/invite-prompt.js.map +1 -1
  125. package/dist/lib/invite-settings.d.ts +18 -0
  126. package/dist/lib/invite-settings.d.ts.map +1 -0
  127. package/dist/lib/invite-settings.js +29 -0
  128. package/dist/lib/invite-settings.js.map +1 -0
  129. package/dist/lib/join-flow.d.ts +60 -0
  130. package/dist/lib/join-flow.d.ts.map +1 -0
  131. package/dist/lib/join-flow.js +282 -0
  132. package/dist/lib/join-flow.js.map +1 -0
  133. package/dist/lib/launch/mcp-child-env.d.ts.map +1 -1
  134. package/dist/lib/launch/mcp-child-env.js +5 -2
  135. package/dist/lib/launch/mcp-child-env.js.map +1 -1
  136. package/dist/lib/lead-prompt.d.ts +106 -0
  137. package/dist/lib/lead-prompt.d.ts.map +1 -0
  138. package/dist/lib/lead-prompt.js +175 -0
  139. package/dist/lib/lead-prompt.js.map +1 -0
  140. package/dist/lib/local-candidate-classify.d.ts +26 -0
  141. package/dist/lib/local-candidate-classify.d.ts.map +1 -0
  142. package/dist/lib/local-candidate-classify.js +53 -0
  143. package/dist/lib/local-candidate-classify.js.map +1 -0
  144. package/dist/lib/local-db-migrate.d.ts +1 -1
  145. package/dist/lib/local-db-migrate.d.ts.map +1 -1
  146. package/dist/lib/local-db-migrate.js +45 -1
  147. package/dist/lib/local-db-migrate.js.map +1 -1
  148. package/dist/lib/local-db-v12.d.ts +17 -0
  149. package/dist/lib/local-db-v12.d.ts.map +1 -0
  150. package/dist/lib/local-db-v12.js +8 -0
  151. package/dist/lib/local-db-v12.js.map +1 -0
  152. package/dist/lib/local-db.d.ts +13 -13
  153. package/dist/lib/local-db.d.ts.map +1 -1
  154. package/dist/lib/local-db.js +41 -6
  155. package/dist/lib/local-db.js.map +1 -1
  156. package/dist/lib/local-gateway-client.d.ts +1 -0
  157. package/dist/lib/local-gateway-client.d.ts.map +1 -1
  158. package/dist/lib/local-gateway-client.js +31 -20
  159. package/dist/lib/local-gateway-client.js.map +1 -1
  160. package/dist/lib/local-ingest.d.ts +2 -0
  161. package/dist/lib/local-ingest.d.ts.map +1 -1
  162. package/dist/lib/local-ingest.js.map +1 -1
  163. package/dist/lib/local-link-pass.d.ts.map +1 -1
  164. package/dist/lib/local-link-pass.js +25 -29
  165. package/dist/lib/local-link-pass.js.map +1 -1
  166. package/dist/lib/local-llm.d.ts +1 -1
  167. package/dist/lib/local-llm.d.ts.map +1 -1
  168. package/dist/lib/local-llm.js +3 -2
  169. package/dist/lib/local-llm.js.map +1 -1
  170. package/dist/lib/local-mode.d.ts +5 -1
  171. package/dist/lib/local-mode.d.ts.map +1 -1
  172. package/dist/lib/local-mode.js +11 -6
  173. package/dist/lib/local-mode.js.map +1 -1
  174. package/dist/lib/local-relationship-classifier.d.ts +4 -0
  175. package/dist/lib/local-relationship-classifier.d.ts.map +1 -1
  176. package/dist/lib/local-relationship-classifier.js +9 -4
  177. package/dist/lib/local-relationship-classifier.js.map +1 -1
  178. package/dist/lib/local-relink.d.ts +59 -0
  179. package/dist/lib/local-relink.d.ts.map +1 -0
  180. package/dist/lib/local-relink.js +171 -0
  181. package/dist/lib/local-relink.js.map +1 -0
  182. package/dist/lib/local-set-classifier.d.ts +36 -0
  183. package/dist/lib/local-set-classifier.d.ts.map +1 -0
  184. package/dist/lib/local-set-classifier.js +81 -0
  185. package/dist/lib/local-set-classifier.js.map +1 -0
  186. package/dist/lib/local-snapshot-loader.d.ts +29 -0
  187. package/dist/lib/local-snapshot-loader.d.ts.map +1 -0
  188. package/dist/lib/local-snapshot-loader.js +108 -0
  189. package/dist/lib/local-snapshot-loader.js.map +1 -0
  190. package/dist/lib/login-flow.d.ts +15 -0
  191. package/dist/lib/login-flow.d.ts.map +1 -1
  192. package/dist/lib/login-flow.js +80 -4
  193. package/dist/lib/login-flow.js.map +1 -1
  194. package/dist/lib/mcp/share-status-tool.d.ts +13 -0
  195. package/dist/lib/mcp/share-status-tool.d.ts.map +1 -0
  196. package/dist/lib/mcp/share-status-tool.js +116 -0
  197. package/dist/lib/mcp/share-status-tool.js.map +1 -0
  198. package/dist/lib/mcp/share-tool.d.ts +18 -14
  199. package/dist/lib/mcp/share-tool.d.ts.map +1 -1
  200. package/dist/lib/mcp/share-tool.js +127 -21
  201. package/dist/lib/mcp/share-tool.js.map +1 -1
  202. package/dist/lib/model-cache.d.ts +10 -0
  203. package/dist/lib/model-cache.d.ts.map +1 -0
  204. package/dist/lib/model-cache.js +35 -0
  205. package/dist/lib/model-cache.js.map +1 -0
  206. package/dist/lib/next-step.d.ts.map +1 -1
  207. package/dist/lib/next-step.js +2 -1
  208. package/dist/lib/next-step.js.map +1 -1
  209. package/dist/lib/private-files.d.ts +38 -0
  210. package/dist/lib/private-files.d.ts.map +1 -0
  211. package/dist/lib/private-files.js +102 -0
  212. package/dist/lib/private-files.js.map +1 -0
  213. package/dist/lib/redaction-notice.d.ts +7 -0
  214. package/dist/lib/redaction-notice.d.ts.map +1 -0
  215. package/dist/lib/redaction-notice.js +32 -0
  216. package/dist/lib/redaction-notice.js.map +1 -0
  217. package/dist/lib/relink-estimate.d.ts +16 -0
  218. package/dist/lib/relink-estimate.d.ts.map +1 -0
  219. package/dist/lib/relink-estimate.js +30 -0
  220. package/dist/lib/relink-estimate.js.map +1 -0
  221. package/dist/lib/resolve-env.d.ts +15 -1
  222. package/dist/lib/resolve-env.d.ts.map +1 -1
  223. package/dist/lib/resolve-env.js +27 -7
  224. package/dist/lib/resolve-env.js.map +1 -1
  225. package/dist/lib/scope-defaults.d.ts.map +1 -1
  226. package/dist/lib/scope-defaults.js +2 -0
  227. package/dist/lib/scope-defaults.js.map +1 -1
  228. package/dist/lib/scope-real.d.ts +57 -0
  229. package/dist/lib/scope-real.d.ts.map +1 -1
  230. package/dist/lib/setup-route.d.ts +4 -2
  231. package/dist/lib/setup-route.d.ts.map +1 -1
  232. package/dist/lib/setup-route.js +12 -6
  233. package/dist/lib/setup-route.js.map +1 -1
  234. package/dist/lib/share/approval.d.ts +71 -0
  235. package/dist/lib/share/approval.d.ts.map +1 -0
  236. package/dist/lib/share/approval.js +139 -0
  237. package/dist/lib/share/approval.js.map +1 -0
  238. package/dist/lib/share/approve-link.d.ts +31 -0
  239. package/dist/lib/share/approve-link.d.ts.map +1 -0
  240. package/dist/lib/share/approve-link.js +46 -0
  241. package/dist/lib/share/approve-link.js.map +1 -0
  242. package/dist/lib/share/browser-flow.d.ts +85 -0
  243. package/dist/lib/share/browser-flow.d.ts.map +1 -0
  244. package/dist/lib/share/browser-flow.js +168 -0
  245. package/dist/lib/share/browser-flow.js.map +1 -0
  246. package/dist/lib/share/command.d.ts +34 -1
  247. package/dist/lib/share/command.d.ts.map +1 -1
  248. package/dist/lib/share/command.js +153 -11
  249. package/dist/lib/share/command.js.map +1 -1
  250. package/dist/lib/share/delivery-options.d.ts +15 -0
  251. package/dist/lib/share/delivery-options.d.ts.map +1 -0
  252. package/dist/lib/share/delivery-options.js +16 -0
  253. package/dist/lib/share/delivery-options.js.map +1 -0
  254. package/dist/lib/share/delivery.d.ts +83 -0
  255. package/dist/lib/share/delivery.d.ts.map +1 -0
  256. package/dist/lib/share/delivery.js +134 -0
  257. package/dist/lib/share/delivery.js.map +1 -0
  258. package/dist/lib/share/envelope.d.ts +61 -0
  259. package/dist/lib/share/envelope.d.ts.map +1 -0
  260. package/dist/lib/share/envelope.js +99 -0
  261. package/dist/lib/share/envelope.js.map +1 -0
  262. package/dist/lib/share/ledger.d.ts.map +1 -1
  263. package/dist/lib/share/ledger.js +3 -1
  264. package/dist/lib/share/ledger.js.map +1 -1
  265. package/dist/lib/share/payload.d.ts +9 -0
  266. package/dist/lib/share/payload.d.ts.map +1 -1
  267. package/dist/lib/share/payload.js +9 -0
  268. package/dist/lib/share/payload.js.map +1 -1
  269. package/dist/lib/share/pending.d.ts +47 -1
  270. package/dist/lib/share/pending.d.ts.map +1 -1
  271. package/dist/lib/share/pending.js +139 -13
  272. package/dist/lib/share/pending.js.map +1 -1
  273. package/dist/lib/share/preview.d.ts +5 -1
  274. package/dist/lib/share/preview.d.ts.map +1 -1
  275. package/dist/lib/share/preview.js +3 -1
  276. package/dist/lib/share/preview.js.map +1 -1
  277. package/dist/lib/share/qr.d.ts +13 -0
  278. package/dist/lib/share/qr.d.ts.map +1 -0
  279. package/dist/lib/share/qr.js +77 -0
  280. package/dist/lib/share/qr.js.map +1 -0
  281. package/dist/lib/share/requests-client.d.ts +63 -0
  282. package/dist/lib/share/requests-client.d.ts.map +1 -0
  283. package/dist/lib/share/requests-client.js +69 -0
  284. package/dist/lib/share/requests-client.js.map +1 -0
  285. package/dist/lib/share/run.d.ts +20 -1
  286. package/dist/lib/share/run.d.ts.map +1 -1
  287. package/dist/lib/share/run.js +27 -10
  288. package/dist/lib/share/run.js.map +1 -1
  289. package/dist/lib/share/secret-scan.d.ts +5 -0
  290. package/dist/lib/share/secret-scan.d.ts.map +1 -1
  291. package/dist/lib/share/secret-scan.js +43 -2
  292. package/dist/lib/share/secret-scan.js.map +1 -1
  293. package/dist/lib/share/target.d.ts +38 -0
  294. package/dist/lib/share/target.d.ts.map +1 -0
  295. package/dist/lib/share/target.js +80 -0
  296. package/dist/lib/share/target.js.map +1 -0
  297. package/dist/lib/share/tty.d.ts +8 -0
  298. package/dist/lib/share/tty.d.ts.map +1 -1
  299. package/dist/lib/share/tty.js +45 -0
  300. package/dist/lib/share/tty.js.map +1 -1
  301. package/dist/lib/source-sync-state.d.ts.map +1 -1
  302. package/dist/lib/source-sync-state.js +2 -0
  303. package/dist/lib/source-sync-state.js.map +1 -1
  304. package/dist/lib/sync/blocked.d.ts.map +1 -1
  305. package/dist/lib/sync/blocked.js +2 -1
  306. package/dist/lib/sync/blocked.js.map +1 -1
  307. package/dist/lib/sync/classify.d.ts.map +1 -1
  308. package/dist/lib/sync/classify.js +2 -0
  309. package/dist/lib/sync/classify.js.map +1 -1
  310. package/dist/lib/sync/real-env.d.ts +57 -0
  311. package/dist/lib/sync/real-env.d.ts.map +1 -1
  312. package/dist/lib/sync/sync-state.d.ts.map +1 -1
  313. package/dist/lib/sync/sync-state.js +3 -1
  314. package/dist/lib/sync/sync-state.js.map +1 -1
  315. package/dist/lib/usage-telemetry.d.ts +2 -2
  316. package/dist/lib/usage-telemetry.d.ts.map +1 -1
  317. package/dist/lib/usage-telemetry.js +21 -3
  318. package/dist/lib/usage-telemetry.js.map +1 -1
  319. package/package.json +4 -2
  320. package/dist/lib/personal-email-domains.d.ts +0 -8
  321. package/dist/lib/personal-email-domains.d.ts.map +0 -1
  322. package/dist/lib/personal-email-domains.js +0 -39
  323. package/dist/lib/personal-email-domains.js.map +0 -1
package/README.md CHANGED
@@ -120,6 +120,7 @@ picks which one is used when you have several. [Setting one up](docs/configurati
120
120
  | | |
121
121
  |---|---|
122
122
  | [Installing](docs/installation.md) | npm, the binary, Windows and PowerShell |
123
+ | [Join your team's graph](docs/join-your-team.md) | `align join`, hosted and self-hosted |
123
124
  | [Importing](docs/importing.md) | Every source, tokens, flags |
124
125
  | [Alignment check](docs/check.md) | Modes, exit codes, CI, the GitHub Action |
125
126
  | [Cloud or local-only](docs/local-mode.md) | What runs where, what touches the network |
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAU1C,oGAAoG;AACpG,eAAO,MAAM,gBAAgB,yEAAyE,CAAC;AAEvG;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqBvD;AAED,MAAM,WAAW,mBAAmB;IAClC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;uEACmE;IACnE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC7E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAoGvE"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAW1C,oGAAoG;AACpG,eAAO,MAAM,gBAAgB,yEAAyE,CAAC;AAEvG;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqBvD;AAED,MAAM,WAAW,mBAAmB;IAClC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;uEACmE;IACnE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC7E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CA0GvE"}
package/dist/cli.js CHANGED
@@ -5,6 +5,7 @@ import { runDefaultAction } from './commands/default-action.js';
5
5
  import { createConfigStore, savedLlmConfig } from './lib/config.js';
6
6
  import { setSavedLlmSource } from './lib/local-llm.js';
7
7
  import { setWriteRecorder } from './lib/safe-config-write.js';
8
+ import { printRedactionNotice } from './lib/redaction-notice.js';
8
9
  const { version } = pkg;
9
10
  /** Where every hidden command is documented; `align --help` points here instead of listing them. */
10
11
  export const COMMANDS_DOC_URL = 'https://github.com/aligndottech/align-cli/blob/main/docs/commands.md';
@@ -119,6 +120,11 @@ export function buildProgram(options = {}) {
119
120
  ...(invocationCommandPath(actionCommand) === 'sync' ? { capMs: 500 } : {}),
120
121
  });
121
122
  });
123
+ // Secrets replaced with placeholders before a local write (local-gateway-client.ts ingestOne):
124
+ // told once, after the command's own output, however many items it imported.
125
+ program.hook('postAction', () => {
126
+ printRedactionNotice();
127
+ });
122
128
  const internal = options.internal ?? process.env.ALIGN_INTERNAL === '1';
123
129
  for (const entry of COMMAND_REGISTRY) {
124
130
  if (entry.internal && !internal)
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * `align config detector [v0|v1]`: the saved choice of relationship detector. With no argument it
4
+ * prints the detector in use and where that comes from; with one it saves the choice. ALIGN_DETECTOR
5
+ * still overrides a saved choice, and the output says so rather than letting it look ignored.
6
+ */
7
+ export declare function registerConfigCommand(program: Command): void;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB5D"}
@@ -0,0 +1,33 @@
1
+ import { createConfigStore } from '../lib/config.js';
2
+ import { DETECTOR_VERSIONS, detectorSource, resolveDetectorVersion } from '../detector/detector-version.js';
3
+ /**
4
+ * `align config detector [v0|v1]`: the saved choice of relationship detector. With no argument it
5
+ * prints the detector in use and where that comes from; with one it saves the choice. ALIGN_DETECTOR
6
+ * still overrides a saved choice, and the output says so rather than letting it look ignored.
7
+ */
8
+ export function registerConfigCommand(program) {
9
+ const config = program.command('config').description('Change align settings');
10
+ config
11
+ .command('detector [version]')
12
+ .description(`Which relationship detector runs: ${DETECTOR_VERSIONS.join(' or ')} (default v0)`)
13
+ .action((version) => {
14
+ const store = createConfigStore();
15
+ if (version === undefined) {
16
+ const active = resolveDetectorVersion(process.env, store.getDetector());
17
+ console.log(`Detector: ${active} (${detectorSource(process.env, store.getDetector())})`);
18
+ console.log(`Change it with: align config detector ${active === 'v0' ? 'v1' : 'v0'}`);
19
+ return;
20
+ }
21
+ if (!DETECTOR_VERSIONS.includes(version)) {
22
+ console.error(`"${version}" is not a detector. Allowed: ${DETECTOR_VERSIONS.join(', ')}.`);
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ store.setDetector(version);
27
+ console.log(`Saved: detector ${version}.`);
28
+ if (process.env['ALIGN_DETECTOR']?.trim()) {
29
+ console.log(`ALIGN_DETECTOR is set in this shell and overrides the saved choice (${process.env['ALIGN_DETECTOR']}).`);
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE5G;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAC9E,MAAM;SACH,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,qCAAqC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;SAC/F,MAAM,CAAC,CAAC,OAA2B,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,KAAK,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,yCAAyC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QACD,IAAI,CAAE,iBAAuC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,iCAAiC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,GAAG,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,uEAAuE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACxH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"connect-agents.d.ts","sourceRoot":"","sources":["../../src/commands/connect-agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGhD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkGnE"}
1
+ {"version":3,"file":"connect-agents.d.ts","sourceRoot":"","sources":["../../src/commands/connect-agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAmGnE"}
@@ -1,6 +1,7 @@
1
1
  import chalk from 'chalk';
2
2
  import * as p from '@clack/prompts';
3
3
  import { alignServerEntry, detectEditors, writeMcpConfig } from '../lib/mcp-setup.js';
4
+ import { envFlag } from '../lib/destination-name.js';
4
5
  import { foreignNotice, keptConnectionNotice } from '../lib/foreign-env.js';
5
6
  /**
6
7
  * Connect the agents installed on this machine to Align (ALI-776).
@@ -30,7 +31,8 @@ export async function connectDetectedAgents(envName, opts = {}) {
30
31
  const envArg = envName === 'prod' ? undefined : envName;
31
32
  // Runnable AS PRINTED. Bare `align mcp --setup` resolves to the cloud default, so telling a
32
33
  // local user to run it would wire their agent to prod - the graph they did not just build.
33
- const envSuffix = envArg ? ` --env ${envArg}` : '';
34
+ // envFlag also refuses a name that is not shell-safe, before anything is written.
35
+ const envSuffix = envFlag(envName);
34
36
  if (editors.length === 0) {
35
37
  // Named GLOBAL deliberately: detectEditors() only checks each agent's global config
36
38
  // (~/.claude.json etc). .mcp.json was already written by writeAgentAlignment, earlier
@@ -1 +1 @@
1
- {"version":3,"file":"connect-agents.js","sourceRoot":"","sources":["../../src/commands/connect-agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect-agents.js","sourceRoot":"","sources":["../../src/commands/connect-agents.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyBzD"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkCzD"}
@@ -1,5 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import { createConfigStore } from '../lib/config.js';
3
+ import { destinationLines } from '../lib/destination-summary.js';
3
4
  const VALID_ENVS = ['local', 'preview', 'prod'];
4
5
  export function registerEnvCommand(program) {
5
6
  const env = program
@@ -17,6 +18,16 @@ export function registerEnvCommand(program) {
17
18
  console.log(chalk.green(`Default env set to ${chalk.bold(name)}`));
18
19
  console.log(chalk.dim('All commands will now target this environment unless --env is passed.'));
19
20
  });
21
+ env
22
+ .command('list')
23
+ .description('List the environments and every team destination joined with align join, with both hosts')
24
+ .action(() => {
25
+ const config = createConfigStore();
26
+ for (const e of VALID_ENVS)
27
+ console.log(` ${e}`);
28
+ for (const line of destinationLines(config))
29
+ console.log(line);
30
+ });
20
31
  env
21
32
  .command('get')
22
33
  .description('Show the current default environment')
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AAEnE,MAAM,UAAU,GAAc,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,2DAA2D,CAAC,CAAC;IAE5E,GAAG;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;QACvB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAe,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,sBAAsB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,iBAAiB,EAAE,CAAC,aAAa,CAAC,IAAe,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC,aAAa,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,UAAU,GAAc,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,2DAA2D,CAAC,CAAC;IAE5E,GAAG;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;QACvB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAe,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,sBAAsB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,iBAAiB,EAAE,CAAC,aAAa,CAAC,IAAe,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0FAA0F,CAAC;SACvG,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC,aAAa,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,24 +1,14 @@
1
1
  /**
2
- * ALI-938: `align invite <email>` - the teammate-request action the bottom-up thesis
3
- * depends on. A solo dev adopts the free CLI, the agent gets smarter, "this would be
4
- * amazing if my whole team's decisions were in here" - and this is the command that
5
- * turns that thought into a real invite instead of a dead end.
2
+ * `align invite [email]` points an org admin at Settings > Team invites in the web app.
6
3
  *
7
- * Three outcomes, decided from `whoami()` alone (no new gateway endpoint needed to
8
- * classify the caller):
9
- * - a personal-email tenant (gmail.com, icloud.com, ...) has nobody to invite - its
10
- * tenant is a single-person workspace by construction (provisioning.ts). Explain
11
- * that a work email lands them in their company's shared graph instead.
12
- * - a work-domain tenant member who is not org_admin cannot create an invite (the
13
- * gateway 403s it) - tell them to ask their admin, rather than spending a round
14
- * trip proving what the role already says.
15
- * - a work-domain org_admin: the real path. POST /admin/invites via
16
- * gateway-client.ts's createInvite, print the link.
4
+ * It used to POST /admin/invites with the CLI's api_token (ALI-938). The gateway now refuses that
5
+ * on purpose (requireAdminSurface): an agent's token must not add team members, so invites are
6
+ * created in the browser by a signed-in admin. This command creates nothing and calls no invite
7
+ * route. It prints the page and, for a person at a terminal, opens it with the allowlisted opener
8
+ * (no shell). Inside an agent align launched (ALIGN_WRAPPED), or with no TTY, it only prints.
17
9
  *
18
- * Deliberately NOT behind `preferLocalEmbedded`: inviting a teammate only means
19
- * anything against a real cloud tenant, so this resolves the same way `login` and
20
- * `whoami` do - the configured default cloud env, never redirected to a no-account
21
- * local graph.
10
+ * Deliberately NOT behind `preferLocalEmbedded`: a team only exists on a cloud destination, so this
11
+ * resolves the same way `login` and `whoami` do.
22
12
  */
23
13
  import type { Command } from 'commander';
24
14
  export declare function registerInviteCommand(program: Command): void;
@@ -1 +1 @@
1
- {"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../src/commands/invite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoE5D"}
1
+ {"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../src/commands/invite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoC5D"}
@@ -1,68 +1,45 @@
1
1
  import chalk from 'chalk';
2
- import ora from 'ora';
3
2
  import { createConfigStore } from '../lib/config.js';
4
3
  import { createGatewayClient } from '../lib/gateway-client.js';
4
+ import { inviteSettingsUrl, resolveInviteAppUrl } from '../lib/invite-settings.js';
5
5
  import { resolveEnv } from '../lib/resolve-env.js';
6
+ import { currentDeliveryEnv, decideDelivery, openSettingsLink } from '../lib/share/delivery.js';
7
+ import { visible } from '../lib/share/visible.js';
6
8
  import { recordFunnelStage } from '../lib/usage-telemetry.js';
7
- import { isPersonalEmailDomain } from '../lib/personal-email-domains.js';
8
9
  const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
9
10
  export function registerInviteCommand(program) {
10
11
  program
11
- .command('invite <email>')
12
- .description('Invite a teammate to your shared Align decision graph')
12
+ .command('invite [email]')
13
+ .description('Open Team invites in the web app, where an org admin creates invite links')
13
14
  .option('--env <env>', 'Environment')
14
15
  .action(async (email, opts) => {
15
- if (!EMAIL_RE.test(email)) {
16
- console.log(chalk.red(`\n "${email}" doesn't look like an email address.\n`));
16
+ if (email !== undefined && !EMAIL_RE.test(email)) {
17
+ console.log(chalk.red(`\n "${visible(email)}" doesn't look like an email address.\n`));
17
18
  process.exit(1);
18
19
  return;
19
20
  }
20
- const config = createConfigStore();
21
21
  const envName = resolveEnv(opts.env);
22
- const env = config.getEnvironment(envName);
22
+ const env = createConfigStore().getEnvironment(envName);
23
23
  if (env.mode === 'local-embedded') {
24
- console.log(chalk.yellow(`\n align invite needs a cloud account - a local graph has nobody to invite ${email} into.`));
25
- console.log(chalk.dim(` Run: align login --env preview (or --env prod)\n`));
24
+ console.log(chalk.yellow('\n align invite needs a cloud account - a local graph has no team to invite anyone into.'));
25
+ console.log(chalk.dim(' Run: align login --env preview (or --env prod)\n'));
26
26
  process.exit(1);
27
27
  return;
28
28
  }
29
- if (!env.authToken && env.mode !== 'demo') {
30
- console.log(chalk.yellow(`\n Not logged in to ${envName}. Run: align login --env ${envName}\n`));
31
- process.exit(1);
32
- return;
33
- }
34
- // ALI-938: fired for every genuine attempt that gets past the login gate, whether or
35
- // not the invite is actually sent - a member blocked by the org_admin check is still
36
- // demand for shared context. Fired without await (same discipline as why.ts's
37
- // first_useful_decision): telemetry must never delay or fail the command it rides on.
29
+ // ALI-938: the demand signal survives the move to the browser. Fired without await:
30
+ // telemetry must never delay or fail the command it rides on.
38
31
  void recordFunnelStage(env, 'teammate_requested', 'invite');
39
- const client = createGatewayClient(env);
40
- const spinner = ora('Checking your account...').start();
41
- try {
42
- const me = await client.whoami();
43
- spinner.stop();
44
- if (isPersonalEmailDomain(me.user.email)) {
45
- console.log(chalk.yellow(`\n You're on a personal graph tied to ${me.user.email}, not a company one - there's no team here yet to invite ${email} into.`));
46
- console.log(chalk.dim(' A work email lands you in your company\'s shared graph automatically.'));
47
- console.log(chalk.dim(` If a teammate already has Align set up there, ask them to run: align invite ${me.user.email}\n`));
48
- return;
49
- }
50
- if (me.user.role !== 'org_admin') {
51
- console.log(chalk.yellow(`\n You're a member of ${me.tenant.name}, not an admin, so you can't send invites directly.`));
52
- console.log(chalk.dim(` Ask your org's admin to run: align invite ${email}\n`));
53
- return;
54
- }
55
- const inviteSpinner = ora(`Inviting ${email}...`).start();
56
- const result = await client.createInvite(email);
57
- inviteSpinner.stop();
58
- console.log(chalk.green(`\n Invite sent. Share this link with ${email}:`));
59
- console.log(chalk.dim(` ${result.inviteUrl}\n`));
60
- }
61
- catch (err) {
62
- spinner.stop();
63
- console.log(chalk.red(`\n ${err.message}\n`));
64
- process.exit(1);
65
- }
32
+ const appUrl = await resolveInviteAppUrl(env, async (signal) => (await createGatewayClient(env).shareRequestsConfig(signal))?.appUrl ?? null);
33
+ const url = inviteSettingsUrl(appUrl);
34
+ const who = email ? `a link for ${visible(email)}, and send it to them` : 'a link, and send it to the person joining';
35
+ console.log('\n Invites are created in the web app, by an org admin.');
36
+ console.log(` Open Team invites, create ${who}.`);
37
+ console.log(`\n ${chalk.bold(visible(url))}\n`);
38
+ const de = currentDeliveryEnv();
39
+ if (de.env['ALIGN_WRAPPED'] || !decideDelivery(de, {}).open)
40
+ return;
41
+ if (!(await openSettingsLink(url, appUrl)))
42
+ console.log(chalk.dim(' Could not open a browser here. Open the link above yourself.\n'));
66
43
  });
67
44
  }
68
45
  //# sourceMappingURL=invite.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"invite.js","sourceRoot":"","sources":["../../src/commands/invite.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAE9C,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAuB,EAAE,EAAE;QACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,yCAAyC,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CACtB,+EAA+E,KAAK,QAAQ,CAC7F,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,OAAO,4BAA4B,OAAO,IAAI,CAAC,CAAC,CAAC;YAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,qFAAqF;QACrF,qFAAqF;QACrF,8EAA8E;QAC9E,sFAAsF;QACtF,KAAK,iBAAiB,CAAC,GAAG,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CACtB,0CAA0C,EAAE,CAAC,IAAI,CAAC,KAAK,4DAA4D,KAAK,QAAQ,CACjI,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;gBAClG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iFAAiF,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBAC3H,OAAO;YACT,CAAC;YAED,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC,MAAM,CAAC,IAAI,qDAAqD,CAAC,CAAC,CAAC;gBACzH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,KAAK,IAAI,CAAC,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YAED,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAChD,aAAa,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yCAAyC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAQ,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"invite.js","sourceRoot":"","sources":["../../src/commands/invite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ import { type JoinDeps } from '../lib/join-flow.js';
3
+ export declare function realJoinDeps(): JoinDeps;
4
+ export declare function registerJoinCommand(program: Command): void;
5
+ //# sourceMappingURL=join.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,EAAE,KAAK,QAAQ,EAAW,MAAM,qBAAqB,CAAC;AAe7D,wBAAgB,YAAY,IAAI,QAAQ,CAcvC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB1D"}
@@ -0,0 +1,49 @@
1
+ import readline from 'node:readline';
2
+ import { CLI_CALLBACK_PORTS, waitForCallback } from '../lib/cli-oauth.js';
3
+ import { createConfigStore } from '../lib/config.js';
4
+ import { runJoin } from '../lib/join-flow.js';
5
+ import { tryOpenUrl } from '../lib/open-url.js';
6
+ const ASK_TIMEOUT_MS = 5 * 60_000;
7
+ function ask(question) {
8
+ return new Promise((resolve) => {
9
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
10
+ // Resolve FIRST: close() emits 'close' synchronously, and that handler resolves null. Closing first made every answer null.
11
+ const done = (v) => { resolve(v); rl.close(); };
12
+ rl.once('close', () => resolve(null));
13
+ rl.question(question, (a) => done(a));
14
+ });
15
+ }
16
+ export function realJoinDeps() {
17
+ return {
18
+ config: createConfigStore(),
19
+ isTTY: Boolean(process.stdin.isTTY && process.stdout.isTTY),
20
+ wrapped: (process.env['ALIGN_WRAPPED'] ?? '') !== '',
21
+ out: (l) => console.log(l),
22
+ openUrl: (u) => tryOpenUrl(u),
23
+ promptLine: ask,
24
+ confirm: async (q) => /^y(es)?$/i.test((await ask(`${q} [y/N] `))?.trim() ?? ''),
25
+ waitForCallback,
26
+ now: () => new Date(),
27
+ callbackPorts: CLI_CALLBACK_PORTS,
28
+ timeoutMs: ASK_TIMEOUT_MS,
29
+ };
30
+ }
31
+ export function registerJoinCommand(program) {
32
+ program
33
+ .command('join <link>')
34
+ .description("Join your team's graph from an invite link, as a named destination (a terminal only; additive: nothing you already have is moved)")
35
+ .option('--name <name>', 'What to call this destination (default: made from the org name)')
36
+ .option('--gateway <url>', 'The server address, for a link that does not carry one')
37
+ .option('--replace', 'Replace an existing destination of the same name (asks you to type the new host)')
38
+ .action(async (link, opts) => {
39
+ const result = await runJoin(realJoinDeps(), {
40
+ link,
41
+ ...(opts.name === undefined ? {} : { name: opts.name }),
42
+ ...(opts.gateway === undefined ? {} : { gateway: opts.gateway }),
43
+ ...(opts.replace === undefined ? {} : { replace: opts.replace }),
44
+ });
45
+ if (!result.ok)
46
+ process.exitCode = 1;
47
+ });
48
+ }
49
+ //# sourceMappingURL=join.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join.js","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `align local relink --detector v1` (shared detector P3, review F3).
3
+ *
4
+ * The estimate (calls, tokens, cost) prints before anything else. A dry run calls no model unless
5
+ * `--classify` is passed with it. A spending run stops after DEFAULT_RELINK_MAX_CALLS calls unless
6
+ * `--max-calls` raises it, asks at a terminal, and refuses with no terminal or inside an agent
7
+ * (ALIGN_WRAPPED) unless BOTH `--yes` and `--max-calls` are given, so an unattended run always
8
+ * names its own ceiling. The rules for which links are touched live in src/lib/local-relink.ts.
9
+ */
10
+ import type { LlmProviderId } from '../lib/llm-providers.js';
11
+ import type { RelinkPlan, RelinkReport, relinkWithV1 } from '../lib/local-relink.js';
12
+ export declare const DEFAULT_RELINK_MAX_CALLS = 50;
13
+ export interface RelinkCommandOptions {
14
+ detector: string;
15
+ dryRun?: boolean;
16
+ classify?: boolean;
17
+ apply?: boolean;
18
+ replace?: boolean;
19
+ yes?: boolean;
20
+ maxCalls?: number;
21
+ }
22
+ export interface RelinkCommandDeps {
23
+ dbPath(): string;
24
+ plan(dbPath: string): RelinkPlan;
25
+ relink(dbPath: string, opts: Parameters<typeof relinkWithV1>[1]): Promise<RelinkReport>;
26
+ hasProvider(): boolean;
27
+ provider(): LlmProviderId | undefined;
28
+ isTty(): boolean;
29
+ wrapped(): boolean;
30
+ confirm(message: string): Promise<boolean>;
31
+ out(line: string): void;
32
+ err(line: string): void;
33
+ }
34
+ export declare function runRelinkCommand(opts: RelinkCommandOptions, d: RelinkCommandDeps): Promise<number>;
35
+ //# sourceMappingURL=local-relink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-relink.d.ts","sourceRoot":"","sources":["../../src/commands/local-relink.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGrF,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,IAAI,MAAM,CAAC;IACjB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IACjC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxF,WAAW,IAAI,OAAO,CAAC;IACvB,QAAQ,IAAI,aAAa,GAAG,SAAS,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC;IACjB,OAAO,IAAI,OAAO,CAAC;IACnB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAID,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDxG"}
@@ -0,0 +1,72 @@
1
+ import { costEstimate } from '../lib/relink-estimate.js';
2
+ export const DEFAULT_RELINK_MAX_CALLS = 50;
3
+ const fmt = (c) => `${c.sourceId} -> ${c.targetId}: ${c.from.join('+')} -> ${c.to}`;
4
+ export async function runRelinkCommand(opts, d) {
5
+ const refuse = (message) => { d.err(`align local relink: ${message}`); return 2; };
6
+ if (opts.detector !== 'v1')
7
+ return refuse(`only --detector v1 can re-type links (got "${opts.detector}").`);
8
+ if (opts.dryRun && opts.apply)
9
+ return refuse('--dry-run and --apply contradict each other. Pick one.');
10
+ if (opts.replace && !opts.apply)
11
+ return refuse('--replace only makes sense with --apply.');
12
+ if (opts.classify && opts.apply)
13
+ return refuse('--classify belongs to --dry-run; --apply always classifies.');
14
+ if (opts.classify && !opts.dryRun)
15
+ return refuse('--classify needs --dry-run (it shows the v1 verdicts without writing them).');
16
+ if (opts.maxCalls !== undefined && (!Number.isInteger(opts.maxCalls) || opts.maxCalls < 1))
17
+ return refuse('--max-calls needs a whole number of at least 1.');
18
+ const dbPath = d.dbPath();
19
+ const plan = d.plan(dbPath);
20
+ const cost = costEstimate(plan.inputTokens, plan.maxOutputTokens, d.provider());
21
+ const price = cost.usd === null ? cost.note : `about $${cost.usd.toFixed(4)} at most, at ${cost.model} list prices`;
22
+ d.out(`Relink with the v1 detector: ${plan.calls} model call(s) for ${plan.pairs} pair(s), about ${plan.inputTokens} input tokens and up to ${plan.maxOutputTokens} output tokens, ${price}.`);
23
+ if (plan.skippedJudged > 0)
24
+ d.out(`${plan.skippedJudged} pair(s) skipped: a person judged them (a mark or a verdict), and relink never touches those.`);
25
+ if (plan.calls === 0) {
26
+ d.out('Nothing to relink.');
27
+ return 0;
28
+ }
29
+ const spends = opts.apply === true || opts.classify === true;
30
+ if (!spends) {
31
+ d.out('Dry run: no model was called and nothing was written. Add --dry-run --classify to see the v1 verdicts (this spends the calls above), or --apply to write them.');
32
+ return 0;
33
+ }
34
+ if (!d.hasProvider()) {
35
+ d.err('align local relink: no AI provider is configured, so nothing can be re-typed. Run: align ai');
36
+ return 1;
37
+ }
38
+ const maxCalls = opts.maxCalls ?? DEFAULT_RELINK_MAX_CALLS;
39
+ if (plan.calls > maxCalls)
40
+ d.out(`This run stops after ${maxCalls} of ${plan.calls} calls; raise it with --max-calls.`);
41
+ if (d.wrapped() || !d.isTty()) {
42
+ if (!opts.yes || opts.maxCalls === undefined) {
43
+ d.err('align local relink: this spends your AI provider key and there is no person at a terminal to ask. Nothing was sent. Pass --yes and --max-calls <n> to go ahead.');
44
+ return 1;
45
+ }
46
+ }
47
+ else if (!opts.yes && !(await d.confirm(`Make up to ${Math.min(maxCalls, plan.calls)} model call(s) now? This costs money.`))) {
48
+ d.out('Cancelled. Nothing was sent.');
49
+ return 0;
50
+ }
51
+ const apply = opts.apply === true;
52
+ const r = await d.relink(dbPath, { apply, replace: opts.replace === true, maxCalls });
53
+ if (apply)
54
+ for (const c of r.written)
55
+ d.out(` wrote: ${fmt(c)}`);
56
+ else
57
+ for (const c of r.proposed)
58
+ d.out(` would change: ${fmt(c)}`);
59
+ d.out(`${r.calls} call(s): ${apply ? `${r.written.length} link(s) written` : `${r.proposed.length} link(s) would change type`}, ${r.unchanged} unchanged, ${r.omitted} given no relationship (left as they are), ${r.keptSupersedes} supersedes kept (only a conflict answer changes one), ${r.failed} failed.`);
60
+ if (!apply)
61
+ d.out('Dry run: nothing was written.');
62
+ else if (!opts.replace && r.written.length > 0)
63
+ d.out('The v0 links stay beside the new v1 ones; add --replace to swap them.');
64
+ if (r.remainingCalls > 0)
65
+ d.out(`${r.remainingCalls} more call(s) not made (--max-calls).`);
66
+ if (r.stopped) {
67
+ d.err(`align local relink: stopped early: ${r.stopped}`);
68
+ return 1;
69
+ }
70
+ return 0;
71
+ }
72
+ //# sourceMappingURL=local-relink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-relink.js","sourceRoot":"","sources":["../../src/commands/local-relink.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+J3D"}
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoM3D"}
@@ -10,6 +10,7 @@ import { forgetSourceData } from '../lib/sync/forget.js';
10
10
  import { isPurgeable, PURGEABLE_SOURCES, purgePreview } from '../lib/sync/purge.js';
11
11
  import { BACKFILL_SOURCES } from '../lib/mcp-backfill.js';
12
12
  import { refreshSummary } from '../lib/sync/summary.js';
13
+ import { DEFAULT_RELINK_MAX_CALLS, runRelinkCommand } from './local-relink.js';
13
14
  export function registerLocalCommand(program) {
14
15
  const local = program
15
16
  .command('local')
@@ -128,6 +129,42 @@ export function registerLocalCommand(program) {
128
129
  console.log(`${r.staying} ${connector} items stay in your graph. To delete the ones nobody has vouched for: align local forget ${connector} --purge`);
129
130
  }
130
131
  });
132
+ // Shared detector P3: the one path that re-types an existing link. See local-relink.ts for the
133
+ // estimate, cap and confirmation, and src/lib/local-relink.ts for which links it may touch.
134
+ local
135
+ .command('relink')
136
+ .description('Re-type existing local links with the v1 relationship detector (estimate first; writes only with --apply)')
137
+ .requiredOption('--detector <version>', 'Detector to re-type with (only v1)')
138
+ .option('--dry-run', 'Show the estimate and write nothing (the default); calls no model unless --classify is added')
139
+ .option('--classify', 'With --dry-run: classify and show the v1 verdicts without writing (spends the estimated calls)')
140
+ .option('--apply', 'Classify and write the re-typed links as v1 rows beside the v0 ones')
141
+ .option('--replace', 'With --apply: replace each re-typed v0 link instead of keeping it')
142
+ .option('--max-calls <n>', `Stop after this many model calls (default ${DEFAULT_RELINK_MAX_CALLS})`, (v) => Number(v))
143
+ .option('--yes', 'Skip the question; with no terminal, also needs --max-calls')
144
+ .action(async (opts) => {
145
+ const env = createConfigStore().getEnvironment('local');
146
+ if (env.mode !== 'local-embedded') {
147
+ console.log('Local mode is not active. Run `align local start` first.');
148
+ return;
149
+ }
150
+ const [{ planRelink, relinkWithV1 }, llm] = await Promise.all([import('../lib/local-relink.js'), import('../lib/local-llm.js')]);
151
+ process.exitCode = await runRelinkCommand(opts, {
152
+ dbPath: () => env.localDbPath ?? getLocalDbPath(),
153
+ plan: planRelink,
154
+ relink: (dbPath, o) => relinkWithV1(dbPath, o),
155
+ hasProvider: llm.hasConfiguredProvider,
156
+ provider: () => (llm.hasConfiguredProvider() ? llm.preferredProvider() : undefined),
157
+ isTty: () => Boolean(process.stdin.isTTY && process.stdout.isTTY),
158
+ wrapped: () => Boolean(process.env['ALIGN_WRAPPED']),
159
+ confirm: async (message) => {
160
+ const { confirm, isCancel } = await import('@clack/prompts');
161
+ const answer = await confirm({ message, initialValue: false });
162
+ return !isCancel(answer) && answer === true;
163
+ },
164
+ out: (line) => console.log(line),
165
+ err: (line) => console.error(line),
166
+ });
167
+ });
131
168
  local
132
169
  .command('reset')
133
170
  .description('Wipe local graph and reset config')