@t2000/cli 0.12.3 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -186,23 +186,35 @@ function registerInit(program2) {
186
186
  // src/commands/send.ts
187
187
  import { T2000 as T20002 } from "@t2000/sdk";
188
188
  import { truncateAddress, formatUsd } from "@t2000/sdk";
189
+ var KNOWN_ASSETS = /* @__PURE__ */ new Set(["USDC", "USDT", "USDE", "USDSUI", "SUI"]);
190
+ function parseSendArgs(args) {
191
+ const filtered = args.filter((a) => a.toLowerCase() !== "to");
192
+ if (filtered.length >= 3 && KNOWN_ASSETS.has(filtered[1].toUpperCase())) {
193
+ return { amount: parseFloat(filtered[0]), asset: filtered[1].toUpperCase(), recipient: filtered[2] };
194
+ }
195
+ if (filtered.length >= 2) {
196
+ return { amount: parseFloat(filtered[0]), asset: "USDC", recipient: filtered[filtered.length - 1] };
197
+ }
198
+ throw new Error("Usage: t2000 send <amount> [asset] [to] <address_or_contact>");
199
+ }
189
200
  function registerSend(program2) {
190
- program2.command("send <amount> <asset> [to_keyword] <address>").description("Send USDC (or other asset) to an address").option("--key <path>", "Key file path").action(async (amount, asset, toOrAddress, address, opts) => {
201
+ program2.command("send").argument("<amount>", "Amount to send").argument("[args...]", 'Asset, "to" keyword, and recipient address or contact name').description("Send USDC (or other asset) to an address or contact name").option("--key <path>", "Key file path").action(async (amount, args, opts) => {
191
202
  try {
192
- const recipient = address ?? toOrAddress;
203
+ const { amount: parsedAmount, asset, recipient } = parseSendArgs([amount, ...args]);
193
204
  const pin = await resolvePin();
194
205
  const agent = await T20002.create({ pin, keyPath: opts.key });
195
206
  const result = await agent.send({
196
207
  to: recipient,
197
- amount: parseFloat(amount),
198
- asset: asset.toUpperCase()
208
+ amount: parsedAmount,
209
+ asset
199
210
  });
200
211
  if (isJsonMode()) {
201
212
  printJson(result);
202
213
  return;
203
214
  }
204
215
  printBlank();
205
- printSuccess(`Sent ${formatUsd(result.amount)} ${asset.toUpperCase()} \u2192 ${truncateAddress(result.to)}`);
216
+ const displayTo = result.contactName ? `${result.contactName} (${truncateAddress(result.to)})` : truncateAddress(result.to);
217
+ printSuccess(`Sent ${formatUsd(result.amount)} ${asset.toUpperCase()} \u2192 ${displayTo}`);
206
218
  printKeyValue("Gas", `${result.gasCost.toFixed(4)} ${result.gasCostUnit} (${result.gasMethod})`);
207
219
  printKeyValue("Balance", formatUsd(result.balance.available) + " USDC");
208
220
  printKeyValue("Tx", explorerUrl(result.tx));
@@ -1759,7 +1771,7 @@ function registerMcp(program2) {
1759
1771
  mcp.command("start", { isDefault: true }).description("Start MCP server (stdio transport)").option("--key <path>", "Key file path").action(async (opts) => {
1760
1772
  let mod;
1761
1773
  try {
1762
- mod = await import("./dist-KTIGPZKW.js");
1774
+ mod = await import("./dist-QGTOSQO3.js");
1763
1775
  } catch {
1764
1776
  console.error(
1765
1777
  "MCP server not installed. Run:\n npm install -g @t2000/mcp"
@@ -1842,6 +1854,74 @@ function registerMcp(program2) {
1842
1854
  });
1843
1855
  }
1844
1856
 
1857
+ // src/commands/contacts.ts
1858
+ import { ContactManager, truncateAddress as truncateAddress3 } from "@t2000/sdk";
1859
+ function registerContacts(program2) {
1860
+ const contacts = program2.command("contacts").description("Manage contacts (send by name instead of address)");
1861
+ contacts.command("add <name> <address>").description("Add or update a contact").action((name, address) => {
1862
+ try {
1863
+ const manager = new ContactManager();
1864
+ const result = manager.add(name, address);
1865
+ if (isJsonMode()) {
1866
+ const contact2 = manager.get(name);
1867
+ printJson({ action: result.action, name: contact2.name, address: contact2.address });
1868
+ return;
1869
+ }
1870
+ const contact = manager.get(name);
1871
+ printBlank();
1872
+ printSuccess(`${result.action === "added" ? "Added" : "Updated"} ${contact.name} (${truncateAddress3(contact.address)})`);
1873
+ printBlank();
1874
+ } catch (error) {
1875
+ handleError(error);
1876
+ }
1877
+ });
1878
+ contacts.command("remove <name>").description("Remove a contact").action((name) => {
1879
+ try {
1880
+ const manager = new ContactManager();
1881
+ const removed = manager.remove(name);
1882
+ if (isJsonMode()) {
1883
+ printJson({ removed, name });
1884
+ return;
1885
+ }
1886
+ printBlank();
1887
+ if (removed) {
1888
+ printSuccess(`Removed ${name}`);
1889
+ } else {
1890
+ printError(`Contact "${name}" not found`);
1891
+ }
1892
+ printBlank();
1893
+ } catch (error) {
1894
+ handleError(error);
1895
+ }
1896
+ });
1897
+ contacts.command("list", { isDefault: true }).description("List all contacts").action(() => {
1898
+ try {
1899
+ const manager = new ContactManager();
1900
+ const list = manager.list();
1901
+ if (isJsonMode()) {
1902
+ printJson(list);
1903
+ return;
1904
+ }
1905
+ if (list.length === 0) {
1906
+ printBlank();
1907
+ printLine("No contacts yet.");
1908
+ printLine("Add one: t2000 contacts add Tom 0x...");
1909
+ printBlank();
1910
+ return;
1911
+ }
1912
+ printHeader("Contacts");
1913
+ const maxNameLen = Math.max(...list.map((c) => c.name.length));
1914
+ for (const contact of list) {
1915
+ const padded = contact.name.padEnd(maxNameLen + 4);
1916
+ printLine(`${padded}${truncateAddress3(contact.address)}`);
1917
+ }
1918
+ printBlank();
1919
+ } catch (error) {
1920
+ handleError(error);
1921
+ }
1922
+ });
1923
+ }
1924
+
1845
1925
  // src/program.ts
1846
1926
  var require2 = createRequire(import.meta.url);
1847
1927
  var { version: CLI_VERSION } = require2("../package.json");
@@ -1877,6 +1957,7 @@ function createProgram() {
1877
1957
  registerRebalance(program2);
1878
1958
  registerExchange(program2);
1879
1959
  registerMcp(program2);
1960
+ registerContacts(program2);
1880
1961
  return program2;
1881
1962
  }
1882
1963