@thecorporation/cli 26.3.3 → 26.3.4

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
@@ -819,19 +819,13 @@ var link_exports = {};
819
819
  __export(link_exports, {
820
820
  linkCommand: () => linkCommand
821
821
  });
822
- async function linkCommand() {
822
+ async function linkCommand(opts) {
823
823
  const cfg = requireConfig("api_url", "api_key", "workspace_id");
824
824
  const client = new CorpAPIClient(cfg.api_url, cfg.api_key, cfg.workspace_id);
825
825
  try {
826
- const data = await client.createLink();
827
- const code = data.code;
828
- const expires = data.expires_in_seconds ?? 900;
829
- console.log();
830
- console.log(` ${code}`);
831
- console.log();
832
- console.log(`Run this on the other device (expires in ${Math.floor(expires / 60)} minutes):`);
833
- console.log(` corp claim ${code}`);
834
- console.log();
826
+ const data = await client.createLink(opts.externalId, opts.provider);
827
+ printSuccess(`Workspace linked to ${opts.provider} (external ID: ${opts.externalId})`);
828
+ if (data.workspace_id) console.log(` Workspace: ${data.workspace_id}`);
835
829
  } catch (err) {
836
830
  printError(`${err}`);
837
831
  process.exit(1);
@@ -1297,7 +1291,12 @@ async function entitiesDissolveCommand(entityId, opts) {
1297
1291
  printSuccess(`Dissolution initiated: ${result.dissolution_id ?? "OK"}`);
1298
1292
  printJson(result);
1299
1293
  } catch (err) {
1300
- printError(`Failed to dissolve entity: ${err}`);
1294
+ const msg = String(err);
1295
+ if (msg.includes("InvalidTransition") || msg.includes("422")) {
1296
+ printError(`Cannot dissolve entity: only entities with 'active' status can be dissolved. Check the entity's current status with: corp entities show ${entityId}`);
1297
+ } else {
1298
+ printError(`Failed to dissolve entity: ${err}`);
1299
+ }
1301
1300
  process.exit(1);
1302
1301
  }
1303
1302
  }
@@ -1336,9 +1335,10 @@ async function contactsListCommand(opts) {
1336
1335
  }
1337
1336
  async function contactsShowCommand(contactId, opts) {
1338
1337
  const cfg = requireConfig("api_url", "api_key", "workspace_id");
1338
+ const eid = resolveEntityId(cfg, opts.entityId);
1339
1339
  const client = new CorpAPIClient(cfg.api_url, cfg.api_key, cfg.workspace_id);
1340
1340
  try {
1341
- const profile = await client.getContactProfile(contactId);
1341
+ const profile = await client.getContactProfile(contactId, eid);
1342
1342
  if (opts.json) {
1343
1343
  printJson(profile);
1344
1344
  } else {
@@ -1390,9 +1390,10 @@ async function contactsAddCommand(opts) {
1390
1390
  }
1391
1391
  async function contactsEditCommand(contactId, opts) {
1392
1392
  const cfg = requireConfig("api_url", "api_key", "workspace_id");
1393
+ const eid = resolveEntityId(cfg, opts.entityId);
1393
1394
  const client = new CorpAPIClient(cfg.api_url, cfg.api_key, cfg.workspace_id);
1394
1395
  try {
1395
- const data = {};
1396
+ const data = { entity_id: eid };
1396
1397
  if (opts.name != null) data.name = opts.name;
1397
1398
  if (opts.email != null) data.email = opts.email;
1398
1399
  if (opts.category != null) data.category = opts.category;
@@ -1515,7 +1516,12 @@ async function fourOhNineACommand(opts) {
1515
1516
  else if (!data || Object.keys(data).length === 0) console.log("No 409A valuation found.");
1516
1517
  else print409a(data);
1517
1518
  } catch (err) {
1518
- printError(`Failed to fetch 409A valuation: ${err}`);
1519
+ const msg = String(err);
1520
+ if (msg.includes("404")) {
1521
+ console.log("No 409A valuation found for this entity. Create one with:\n corp cap-table create-valuation --type four_oh_nine_a --date YYYY-MM-DD --methodology <method>");
1522
+ } else {
1523
+ printError(`Failed to fetch 409A valuation: ${err}`);
1524
+ }
1519
1525
  process.exit(1);
1520
1526
  }
1521
1527
  }
@@ -1618,13 +1624,20 @@ async function transferSharesCommand(opts) {
1618
1624
  const eid = resolveEntityId(cfg, opts.entityId);
1619
1625
  const client = new CorpAPIClient(cfg.api_url, cfg.api_key, cfg.workspace_id);
1620
1626
  try {
1621
- const result = await client.transferShares({
1627
+ const body = {
1622
1628
  entity_id: eid,
1623
- from_holder_id: opts.fromGrant,
1624
- to_holder_id: opts.to,
1625
- quantity: opts.shares,
1626
- transfer_type: opts.type
1627
- });
1629
+ share_class_id: opts.shareClassId,
1630
+ from_contact_id: opts.from,
1631
+ to_contact_id: opts.to,
1632
+ transfer_type: opts.type,
1633
+ share_count: opts.shares,
1634
+ governing_doc_type: opts.governingDocType,
1635
+ transferee_rights: opts.transfereeRights,
1636
+ prepare_intent_id: opts.prepareIntentId
1637
+ };
1638
+ if (opts.pricePerShareCents != null) body.price_per_share_cents = opts.pricePerShareCents;
1639
+ if (opts.relationship) body.relationship_to_holder = opts.relationship;
1640
+ const result = await client.transferShares(body);
1628
1641
  printSuccess(`Transfer workflow created: ${result.workflow_id ?? "OK"}`);
1629
1642
  printJson(result);
1630
1643
  } catch (err) {
@@ -1735,7 +1748,12 @@ async function submitValuationCommand(opts) {
1735
1748
  if (result.agenda_item_id) console.log(` Agenda Item: ${result.agenda_item_id}`);
1736
1749
  printJson(result);
1737
1750
  } catch (err) {
1738
- printError(`Failed to submit valuation: ${err}`);
1751
+ const msg = String(err);
1752
+ if (msg.includes("404")) {
1753
+ printError(`Valuation not found. List valuations with: corp cap-table valuations`);
1754
+ } else {
1755
+ printError(`Failed to submit valuation: ${err}`);
1756
+ }
1739
1757
  process.exit(1);
1740
1758
  }
1741
1759
  }
@@ -1748,7 +1766,12 @@ async function approveValuationCommand(opts) {
1748
1766
  printSuccess(`Valuation approved: ${result.valuation_id ?? "OK"}`);
1749
1767
  printJson(result);
1750
1768
  } catch (err) {
1751
- printError(`Failed to approve valuation: ${err}`);
1769
+ const msg = String(err);
1770
+ if (msg.includes("400")) {
1771
+ printError(`Bad request \u2014 a --resolution-id from a board vote may be required. Submit for approval first: corp cap-table submit-valuation <id>`);
1772
+ } else {
1773
+ printError(`Failed to approve valuation: ${err}`);
1774
+ }
1752
1775
  process.exit(1);
1753
1776
  }
1754
1777
  }
@@ -1963,9 +1986,10 @@ async function governanceListCommand(opts) {
1963
1986
  }
1964
1987
  async function governanceSeatsCommand(bodyId, opts) {
1965
1988
  const cfg = requireConfig("api_url", "api_key", "workspace_id");
1989
+ const eid = resolveEntityId(cfg, opts.entityId);
1966
1990
  const client = new CorpAPIClient(cfg.api_url, cfg.api_key, cfg.workspace_id);
1967
1991
  try {
1968
- const seats = await client.getGovernanceSeats(bodyId);
1992
+ const seats = await client.getGovernanceSeats(bodyId, eid);
1969
1993
  if (opts.json) printJson(seats);
1970
1994
  else if (seats.length === 0) console.log("No seats found.");
1971
1995
  else printSeatsTable(seats);
@@ -1976,9 +2000,10 @@ async function governanceSeatsCommand(bodyId, opts) {
1976
2000
  }
1977
2001
  async function governanceMeetingsCommand(bodyId, opts) {
1978
2002
  const cfg = requireConfig("api_url", "api_key", "workspace_id");
2003
+ const eid = resolveEntityId(cfg, opts.entityId);
1979
2004
  const client = new CorpAPIClient(cfg.api_url, cfg.api_key, cfg.workspace_id);
1980
2005
  try {
1981
- const meetings = await client.listMeetings(bodyId);
2006
+ const meetings = await client.listMeetings(bodyId, eid);
1982
2007
  if (opts.json) printJson(meetings);
1983
2008
  else if (meetings.length === 0) console.log("No meetings found.");
1984
2009
  else printMeetingsTable(meetings);
@@ -1989,9 +2014,10 @@ async function governanceMeetingsCommand(bodyId, opts) {
1989
2014
  }
1990
2015
  async function governanceResolutionsCommand(meetingId, opts) {
1991
2016
  const cfg = requireConfig("api_url", "api_key", "workspace_id");
2017
+ const eid = resolveEntityId(cfg, opts.entityId);
1992
2018
  const client = new CorpAPIClient(cfg.api_url, cfg.api_key, cfg.workspace_id);
1993
2019
  try {
1994
- const resolutions = await client.getMeetingResolutions(meetingId);
2020
+ const resolutions = await client.getMeetingResolutions(meetingId, eid);
1995
2021
  if (opts.json) printJson(resolutions);
1996
2022
  else if (resolutions.length === 0) console.log("No resolutions found.");
1997
2023
  else printResolutionsTable(resolutions);
@@ -2169,13 +2195,18 @@ async function documentsListCommand(opts) {
2169
2195
  process.exit(1);
2170
2196
  }
2171
2197
  }
2172
- async function documentsSigningLinkCommand(docId) {
2198
+ async function documentsSigningLinkCommand(docId, opts) {
2173
2199
  const cfg = requireConfig("api_url", "api_key", "workspace_id");
2200
+ const eid = resolveEntityId(cfg, opts.entityId);
2174
2201
  const client = new CorpAPIClient(cfg.api_url, cfg.api_key, cfg.workspace_id);
2175
2202
  try {
2176
- const result = client.getSigningLink(docId);
2203
+ const result = await client.getSigningLink(docId, eid);
2177
2204
  printSuccess(`Signing link: ${result.signing_url}`);
2178
- console.log("Open this link in your browser to sign the document.");
2205
+ if (result.token) {
2206
+ console.log(` Token: ${result.token}`);
2207
+ console.log(` Share this URL with the signer:`);
2208
+ console.log(` https://humans.thecorporation.ai/sign/${docId}?token=${result.token}`);
2209
+ }
2179
2210
  } catch (err) {
2180
2211
  printError(`Failed to get signing link: ${err}`);
2181
2212
  process.exit(1);
@@ -3112,9 +3143,9 @@ program.command("digest").description("View or trigger daily digests").option("-
3112
3143
  const { digestCommand: digestCommand2 } = await Promise.resolve().then(() => (init_digest(), digest_exports));
3113
3144
  await digestCommand2(opts);
3114
3145
  });
3115
- program.command("link").description("Generate a claim code to pair another device").action(async () => {
3146
+ program.command("link").description("Link workspace to an external provider").requiredOption("--external-id <id>", "External ID to link").requiredOption("--provider <provider>", "Provider name (e.g. stripe, github)").action(async (opts) => {
3116
3147
  const { linkCommand: linkCommand2 } = await Promise.resolve().then(() => (init_link(), link_exports));
3117
- await linkCommand2();
3148
+ await linkCommand2(opts);
3118
3149
  });
3119
3150
  program.command("claim <code>").description("Redeem a claim code to join a workspace").action(async (code) => {
3120
3151
  const { claimCommand: claimCommand2 } = await Promise.resolve().then(() => (init_claim(), claim_exports));
@@ -3144,18 +3175,20 @@ var contactsCmd = program.command("contacts").description("Contact management").
3144
3175
  const { contactsListCommand: contactsListCommand2 } = await Promise.resolve().then(() => (init_contacts(), contacts_exports));
3145
3176
  await contactsListCommand2(opts);
3146
3177
  });
3147
- contactsCmd.command("show <contact-id>").option("--json", "Output as JSON").description("Show contact detail/profile").action(async (contactId, opts) => {
3178
+ contactsCmd.command("show <contact-id>").option("--json", "Output as JSON").description("Show contact detail/profile").action(async (contactId, opts, cmd) => {
3179
+ const parent = cmd.parent.opts();
3148
3180
  const { contactsShowCommand: contactsShowCommand2 } = await Promise.resolve().then(() => (init_contacts(), contacts_exports));
3149
- await contactsShowCommand2(contactId, opts);
3181
+ await contactsShowCommand2(contactId, { ...opts, entityId: parent.entityId });
3150
3182
  });
3151
3183
  contactsCmd.command("add").requiredOption("--name <name>", "Contact name").requiredOption("--email <email>", "Contact email").option("--type <type>", "Contact type (individual, organization)", "individual").option("--category <category>", "Category (employee, contractor, board_member, investor, law_firm, valuation_firm, accounting_firm, officer, advisor)").option("--phone <phone>", "Phone number").option("--notes <notes>", "Notes").description("Add a new contact").action(async (opts, cmd) => {
3152
3184
  const parent = cmd.parent.opts();
3153
3185
  const { contactsAddCommand: contactsAddCommand2 } = await Promise.resolve().then(() => (init_contacts(), contacts_exports));
3154
3186
  await contactsAddCommand2({ ...opts, entityId: parent.entityId });
3155
3187
  });
3156
- contactsCmd.command("edit <contact-id>").option("--name <name>", "Contact name").option("--email <email>", "Contact email").option("--category <category>", "Contact category").option("--phone <phone>", "Phone number").option("--notes <notes>", "Notes").description("Edit an existing contact").action(async (contactId, opts) => {
3188
+ contactsCmd.command("edit <contact-id>").option("--name <name>", "Contact name").option("--email <email>", "Contact email").option("--category <category>", "Contact category").option("--phone <phone>", "Phone number").option("--notes <notes>", "Notes").description("Edit an existing contact").action(async (contactId, opts, cmd) => {
3189
+ const parent = cmd.parent.opts();
3157
3190
  const { contactsEditCommand: contactsEditCommand2 } = await Promise.resolve().then(() => (init_contacts(), contacts_exports));
3158
- await contactsEditCommand2(contactId, opts);
3191
+ await contactsEditCommand2(contactId, { ...opts, entityId: parent.entityId });
3159
3192
  });
3160
3193
  var capTableCmd = program.command("cap-table").description("Cap table, equity grants, SAFEs, transfers, and valuations").option("--entity-id <id>", "Entity ID (overrides active entity)").option("--json", "Output as JSON").action(async (opts) => {
3161
3194
  const { capTableCommand: capTableCommand2 } = await Promise.resolve().then(() => (init_cap_table(), cap_table_exports));
@@ -3191,7 +3224,7 @@ capTableCmd.command("issue-safe").requiredOption("--investor <name>", "Investor
3191
3224
  const { issueSafeCommand: issueSafeCommand2 } = await Promise.resolve().then(() => (init_cap_table(), cap_table_exports));
3192
3225
  await issueSafeCommand2({ ...opts, entityId: parent.entityId });
3193
3226
  });
3194
- capTableCmd.command("transfer").requiredOption("--from-grant <id>", "Source grant ID").requiredOption("--to <name>", "Recipient name").requiredOption("--shares <n>", "Number of shares", parseInt).option("--type <type>", "Transfer type", "sale").description("Transfer shares").action(async (opts, cmd) => {
3227
+ capTableCmd.command("transfer").requiredOption("--from <id>", "Source contact ID (from_contact_id)").requiredOption("--to <id>", "Destination contact ID (to_contact_id)").requiredOption("--shares <n>", "Number of shares to transfer", parseInt).requiredOption("--share-class-id <id>", "Share class ID").requiredOption("--governing-doc-type <type>", "Governing document type").requiredOption("--transferee-rights <rights>", "Transferee rights").requiredOption("--prepare-intent-id <id>", "Prepare intent ID").option("--type <type>", "Transfer type", "sale").option("--price-per-share-cents <n>", "Price per share in cents", parseInt).option("--relationship <rel>", "Relationship to holder").description("Create a share transfer workflow").action(async (opts, cmd) => {
3195
3228
  const parent = cmd.parent.opts();
3196
3229
  const { transferSharesCommand: transferSharesCommand2 } = await Promise.resolve().then(() => (init_cap_table(), cap_table_exports));
3197
3230
  await transferSharesCommand2({ ...opts, entityId: parent.entityId });
@@ -3295,7 +3328,7 @@ governanceCmd.command("convene").requiredOption("--body <id>", "Governance body
3295
3328
  const { governanceConveneCommand: governanceConveneCommand2 } = await Promise.resolve().then(() => (init_governance(), governance_exports));
3296
3329
  await governanceConveneCommand2({ ...opts, meetingType: opts.type, entityId: parent.entityId });
3297
3330
  });
3298
- governanceCmd.command("vote <meeting-id> <item-id>").requiredOption("--voter <name>", "Voter name/ID").requiredOption("--vote <value>", "Vote (yea, nay, abstain)").description("Cast a vote on an agenda item").action(async (meetingId, itemId, opts) => {
3331
+ governanceCmd.command("vote <meeting-id> <item-id>").requiredOption("--voter <id>", "Voter contact UUID").requiredOption("--vote <value>", "Vote (for, against, abstain, recusal)").description("Cast a vote on an agenda item").action(async (meetingId, itemId, opts) => {
3299
3332
  const { governanceVoteCommand: governanceVoteCommand2 } = await Promise.resolve().then(() => (init_governance(), governance_exports));
3300
3333
  await governanceVoteCommand2(meetingId, itemId, opts);
3301
3334
  });
@@ -3319,7 +3352,7 @@ governanceCmd.command("agenda-items <meeting-id>").description("List agenda item
3319
3352
  const { listAgendaItemsCommand: listAgendaItemsCommand2 } = await Promise.resolve().then(() => (init_governance(), governance_exports));
3320
3353
  await listAgendaItemsCommand2(meetingId, { entityId: parent.entityId, json: parent.json });
3321
3354
  });
3322
- governanceCmd.command("finalize-item <meeting-id> <item-id>").requiredOption("--status <status>", "Status: Voted, Discussed, Tabled, or Withdrawn").description("Finalize an agenda item").action(async (meetingId, itemId, opts, cmd) => {
3355
+ governanceCmd.command("finalize-item <meeting-id> <item-id>").requiredOption("--status <status>", "Status: voted, discussed, tabled, or withdrawn").description("Finalize an agenda item").action(async (meetingId, itemId, opts, cmd) => {
3323
3356
  const parent = cmd.parent.opts();
3324
3357
  const { finalizeAgendaItemCommand: finalizeAgendaItemCommand2 } = await Promise.resolve().then(() => (init_governance(), governance_exports));
3325
3358
  await finalizeAgendaItemCommand2(meetingId, itemId, { ...opts, entityId: parent.entityId });
@@ -3338,9 +3371,10 @@ var documentsCmd = program.command("documents").description("Documents and signi
3338
3371
  const { documentsListCommand: documentsListCommand2 } = await Promise.resolve().then(() => (init_documents(), documents_exports));
3339
3372
  await documentsListCommand2(opts);
3340
3373
  });
3341
- documentsCmd.command("signing-link <doc-id>").description("Get a signing link for a document").action(async (docId) => {
3374
+ documentsCmd.command("signing-link <doc-id>").description("Get a signing link for a document").action(async (docId, _opts, cmd) => {
3375
+ const parent = cmd.parent.opts();
3342
3376
  const { documentsSigningLinkCommand: documentsSigningLinkCommand2 } = await Promise.resolve().then(() => (init_documents(), documents_exports));
3343
- await documentsSigningLinkCommand2(docId);
3377
+ await documentsSigningLinkCommand2(docId, { entityId: parent.entityId });
3344
3378
  });
3345
3379
  documentsCmd.command("generate").requiredOption("--template <type>", "Template type (consulting_agreement, employment_offer, contractor_agreement, nda, custom)").requiredOption("--counterparty <name>", "Counterparty name").option("--effective-date <date>", "Effective date (ISO 8601, defaults to today)").description("Generate a contract from a template").action(async (opts, cmd) => {
3346
3380
  const parent = cmd.parent.opts();
@@ -3417,8 +3451,9 @@ program.command("approvals").description("Approvals are managed through governan
3417
3451
  "Approvals are managed through governance meetings.\n Use: corp governance convene ... to schedule a board meeting\n Use: corp governance vote <meeting-id> <item-id> ... to cast votes"
3418
3452
  );
3419
3453
  });
3420
- var formCmd = program.command("form").description("Form a new entity with founders and cap table (Cooley-style)").option("--entity-type <type>", "Entity type (llc, c_corp)").option("--name <name>", "Legal name").option("--jurisdiction <jurisdiction>", "Jurisdiction (e.g. US-DE, US-WY)").option("--member <member>", "Member as 'name,email,role[,pct]' \u2014 role: director|officer|manager|member|chair (repeatable)", (v, a) => [...a, v], []).option("--address <address>", "Company address as 'street,city,state,zip'").option("--fiscal-year-end <date>", "Fiscal year end (MM-DD)", "12-31").option("--s-corp", "Elect S-Corp status").option("--transfer-restrictions", "Enable transfer restrictions").option("--rofr", "Enable right of first refusal").action(async (opts) => {
3454
+ var formCmd = program.command("form").description("Form a new entity with founders and cap table (Cooley-style)").option("--entity-type <type>", "Entity type (llc, c_corp)").option("--legal-name <name>", "Legal name").option("--jurisdiction <jurisdiction>", "Jurisdiction (e.g. US-DE, US-WY)").option("--member <member>", "Member as 'name,email,role[,pct]' \u2014 role: director|officer|manager|member|chair (repeatable)", (v, a) => [...a, v], []).option("--address <address>", "Company address as 'street,city,state,zip'").option("--fiscal-year-end <date>", "Fiscal year end (MM-DD)", "12-31").option("--s-corp", "Elect S-Corp status").option("--transfer-restrictions", "Enable transfer restrictions").option("--rofr", "Enable right of first refusal").action(async (opts) => {
3421
3455
  if (opts.entityType && !opts.type) opts.type = opts.entityType;
3456
+ if (opts.legalName && !opts.name) opts.name = opts.legalName;
3422
3457
  const { formCommand: formCommand2 } = await Promise.resolve().then(() => (init_form(), form_exports));
3423
3458
  await formCommand2(opts);
3424
3459
  });