@wirecat/cli-memo 0.131.62 → 0.131.64

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 (163) hide show
  1. package/dist/bin/memo.js +2 -2
  2. package/dist/bundle/{app-server-QBJG7OGQ.js → app-server-7KM4MSDA.js} +9 -9
  3. package/dist/bundle/{auto-Z4MEU5OY.js → auto-V3FUD6RW.js} +16 -16
  4. package/dist/bundle/{chunk-LK6D26RK.js → chunk-3SCHFNUH.js} +5 -5
  5. package/dist/bundle/{chunk-HGNWJJDT.js → chunk-3YNJBKGV.js} +13 -1
  6. package/dist/bundle/{chunk-Q3VEUHC7.js → chunk-6OS7PTOC.js} +3 -3
  7. package/dist/bundle/{chunk-2UCLF4AO.js → chunk-DXTNBVLV.js} +394 -115
  8. package/dist/bundle/{chunk-2VDRVJCR.js → chunk-EDBZEHAU.js} +5 -4
  9. package/dist/bundle/{chunk-H3COKFXP.js → chunk-FHZKHKBJ.js} +1651 -11
  10. package/dist/bundle/{chunk-TBSWOVM3.js → chunk-FKUA3BTM.js} +14 -14
  11. package/dist/bundle/{chunk-TSKGEK2S.js → chunk-LVLFLWGY.js} +3 -3
  12. package/dist/bundle/{chunk-O2NQCWRM.js → chunk-ML46T7UC.js} +8 -8
  13. package/dist/bundle/{chunk-XX37LSNV.js → chunk-MYXB2T77.js} +25 -1
  14. package/dist/bundle/{chunk-WDZOEBTE.js → chunk-NH3A5QTW.js} +2 -2
  15. package/dist/bundle/{chunk-6OZ2WI7Y.js → chunk-NIJZXGJN.js} +1 -1
  16. package/dist/bundle/{chunk-EGI6JHIA.js → chunk-NRHF7TQ4.js} +2 -2
  17. package/dist/bundle/{chunk-WDWKG7FJ.js → chunk-PVGK67AJ.js} +17 -0
  18. package/dist/bundle/{chunk-E5JQFEIQ.js → chunk-QHNAPLVB.js} +4 -4
  19. package/dist/bundle/{chunk-SJ55SMBE.js → chunk-QTF4ZXOL.js} +2 -1
  20. package/dist/bundle/chunk-T3LVSUNZ.js +301 -0
  21. package/dist/bundle/{chunk-OXBETHGN.js → chunk-UXAP7MNL.js} +4 -4
  22. package/dist/bundle/{chunk-3ZXWLFUG.js → chunk-VLUDHCCX.js} +3 -3
  23. package/dist/bundle/{chunk-KREN56SX.js → chunk-WINH45XG.js} +4 -4
  24. package/dist/bundle/{chunk-FD3OQYFL.js → chunk-XPT5PX7H.js} +4 -4
  25. package/dist/bundle/{chunk-SJ36WSEI.js → chunk-ZX6SWNSR.js} +3 -3
  26. package/dist/bundle/{command-contract-SIXWLKAS.js → command-contract-PLB2JGFJ.js} +2 -2
  27. package/dist/bundle/{entry-SFLEGFSN.js → entry-MUE6HWX3.js} +1 -1
  28. package/dist/bundle/{failure-B33C3BFU.js → failure-6SP64Q66.js} +14 -14
  29. package/dist/bundle/{first-run-ZKDGFY6P.js → first-run-3JYWLJCH.js} +1 -1
  30. package/dist/bundle/{first-screen-IQEU7XF2.js → first-screen-QH34AIFV.js} +3 -3
  31. package/dist/bundle/{mcp-Y4XMDC5Q.js → mcp-QX2D6EXA.js} +6 -6
  32. package/dist/bundle/memo.js +6 -6
  33. package/dist/bundle/{program-DSQWICNB.js → program-LXQLWUAG.js} +1789 -422
  34. package/dist/bundle/{server-IQILK5YP.js → server-L622PMVC.js} +9 -9
  35. package/dist/bundle/{server-ZHFC3PIP.js → server-MVJU7QG4.js} +19 -19
  36. package/dist/bundle/{server-NKI7SVK5.js → server-SJVP2XXD.js} +6 -6
  37. package/dist/bundle/{store-6H4FPFTX.js → store-M5QSIRWJ.js} +1 -1
  38. package/dist/bundle/{store-maintenance-command-IFVWSQMJ.js → store-maintenance-command-PQCO5ICC.js} +5 -5
  39. package/dist/bundle/{update-LR5BVLBD.js → update-MQUCCIBB.js} +15 -15
  40. package/dist/contract-overrides/search.js +2 -2
  41. package/dist/contract-overrides/search.js.map +1 -1
  42. package/dist/discovery/command.d.ts.map +1 -1
  43. package/dist/discovery/command.js +6 -0
  44. package/dist/discovery/command.js.map +1 -1
  45. package/dist/events/command.d.ts +4 -0
  46. package/dist/events/command.d.ts.map +1 -0
  47. package/dist/events/command.js +35 -0
  48. package/dist/events/command.js.map +1 -0
  49. package/dist/events/events.d.ts +52 -0
  50. package/dist/events/events.d.ts.map +1 -0
  51. package/dist/events/events.js +199 -0
  52. package/dist/events/events.js.map +1 -0
  53. package/dist/examples.d.ts.map +1 -1
  54. package/dist/examples.js +90 -3
  55. package/dist/examples.js.map +1 -1
  56. package/dist/finance/command.d.ts +1 -1
  57. package/dist/finance/command.d.ts.map +1 -1
  58. package/dist/finance/command.js +13 -30
  59. package/dist/finance/command.js.map +1 -1
  60. package/dist/finance/contracts-command.d.ts +12 -0
  61. package/dist/finance/contracts-command.d.ts.map +1 -0
  62. package/dist/finance/contracts-command.js +110 -0
  63. package/dist/finance/contracts-command.js.map +1 -0
  64. package/dist/finance/deals-command.d.ts.map +1 -1
  65. package/dist/finance/deals-command.js +5 -4
  66. package/dist/finance/deals-command.js.map +1 -1
  67. package/dist/finance/lines-command.d.ts +37 -0
  68. package/dist/finance/lines-command.d.ts.map +1 -0
  69. package/dist/finance/lines-command.js +70 -0
  70. package/dist/finance/lines-command.js.map +1 -0
  71. package/dist/finance/orders-command.d.ts.map +1 -1
  72. package/dist/finance/orders-command.js +5 -2
  73. package/dist/finance/orders-command.js.map +1 -1
  74. package/dist/finance/products-command.d.ts +12 -0
  75. package/dist/finance/products-command.d.ts.map +1 -0
  76. package/dist/finance/products-command.js +99 -0
  77. package/dist/finance/products-command.js.map +1 -0
  78. package/dist/finance/subscriptions-command.d.ts +12 -0
  79. package/dist/finance/subscriptions-command.d.ts.map +1 -0
  80. package/dist/finance/subscriptions-command.js +153 -0
  81. package/dist/finance/subscriptions-command.js.map +1 -0
  82. package/dist/finance/transactions-command.d.ts +12 -0
  83. package/dist/finance/transactions-command.d.ts.map +1 -0
  84. package/dist/finance/transactions-command.js +137 -0
  85. package/dist/finance/transactions-command.js.map +1 -0
  86. package/dist/finance/wallets-command.d.ts +12 -0
  87. package/dist/finance/wallets-command.d.ts.map +1 -0
  88. package/dist/finance/wallets-command.js +106 -0
  89. package/dist/finance/wallets-command.js.map +1 -0
  90. package/dist/finance/written.d.ts +37 -0
  91. package/dist/finance/written.d.ts.map +1 -0
  92. package/dist/finance/written.js +36 -0
  93. package/dist/finance/written.js.map +1 -0
  94. package/dist/knowledge/command.d.ts.map +1 -1
  95. package/dist/knowledge/command.js +3 -2
  96. package/dist/knowledge/command.js.map +1 -1
  97. package/dist/mcp/permissions.d.ts +1 -1
  98. package/dist/mcp/permissions.d.ts.map +1 -1
  99. package/dist/mcp/permissions.js +1 -0
  100. package/dist/mcp/permissions.js.map +1 -1
  101. package/dist/options.d.ts +2 -0
  102. package/dist/options.d.ts.map +1 -1
  103. package/dist/options.js +2 -0
  104. package/dist/options.js.map +1 -1
  105. package/dist/program.d.ts.map +1 -1
  106. package/dist/program.js +174 -0
  107. package/dist/program.js.map +1 -1
  108. package/dist/reasons.d.ts.map +1 -1
  109. package/dist/reasons.js +24 -0
  110. package/dist/reasons.js.map +1 -1
  111. package/dist/records/import.d.ts +2 -4
  112. package/dist/records/import.d.ts.map +1 -1
  113. package/dist/records/import.js +41 -41
  114. package/dist/records/import.js.map +1 -1
  115. package/dist/records/input.d.ts +20 -0
  116. package/dist/records/input.d.ts.map +1 -0
  117. package/dist/records/input.js +115 -0
  118. package/dist/records/input.js.map +1 -0
  119. package/dist/records/mapping.d.ts +16 -1
  120. package/dist/records/mapping.d.ts.map +1 -1
  121. package/dist/records/mapping.js +24 -11
  122. package/dist/records/mapping.js.map +1 -1
  123. package/dist/records/record-commands.d.ts +8 -0
  124. package/dist/records/record-commands.d.ts.map +1 -0
  125. package/dist/records/record-commands.js +89 -0
  126. package/dist/records/record-commands.js.map +1 -0
  127. package/dist/records/sources.d.ts +48 -0
  128. package/dist/records/sources.d.ts.map +1 -0
  129. package/dist/records/sources.js +72 -0
  130. package/dist/records/sources.js.map +1 -0
  131. package/dist/review/kinds.d.ts +1 -1
  132. package/dist/review/kinds.d.ts.map +1 -1
  133. package/dist/review/kinds.js +4 -0
  134. package/dist/review/kinds.js.map +1 -1
  135. package/dist/review/review.d.ts.map +1 -1
  136. package/dist/review/review.js +4 -0
  137. package/dist/review/review.js.map +1 -1
  138. package/dist/rows.d.ts.map +1 -1
  139. package/dist/rows.js +34 -0
  140. package/dist/rows.js.map +1 -1
  141. package/dist/search/command.d.ts.map +1 -1
  142. package/dist/search/command.js +9 -4
  143. package/dist/search/command.js.map +1 -1
  144. package/dist/search/lane-gates.d.ts +3 -0
  145. package/dist/search/lane-gates.d.ts.map +1 -1
  146. package/dist/search/lane-gates.js +9 -3
  147. package/dist/search/lane-gates.js.map +1 -1
  148. package/dist/search/search.d.ts +3 -1
  149. package/dist/search/search.d.ts.map +1 -1
  150. package/dist/search/search.js +2 -1
  151. package/dist/search/search.js.map +1 -1
  152. package/dist/show/command.d.ts +6 -1
  153. package/dist/show/command.d.ts.map +1 -1
  154. package/dist/show/command.js +49 -4
  155. package/dist/show/command.js.map +1 -1
  156. package/dist/version.d.ts +1 -1
  157. package/dist/version.js +1 -1
  158. package/package.json +1 -1
  159. package/skills/cli-memo/SKILL.md +8 -5
  160. package/skills/cli-memo/topics/money.md +20 -1
  161. package/skills/cli-memo/topics/proposals.md +8 -5
  162. package/skills/cli-memo/topics/search.md +7 -0
  163. package/dist/bundle/chunk-HMJ3D7XE.js +0 -1901
@@ -0,0 +1,153 @@
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
+ import { FINANCE_REVIEWS, INVOICE_DIRECTIONS, SUBSCRIPTION_STATUSES } from "@wirecat/cli-core";
3
+ import { LOCAL_READ, LOCAL_WRITE, queryTerms, termField, withQuery } from "@wirecat/cli-core/cli";
4
+ import { answers, itemAnswer } from "../answer.js";
5
+ import { byOption, whoRuns } from "../author.js";
6
+ import { positive } from "../options.js";
7
+ import { pageOf } from "../page.js";
8
+ import { withSources } from "../records/sources.js";
9
+ import { canonicalProject } from "../vocabulary/project.js";
10
+ import { dayOf, today } from "./finance.js";
11
+ import { choice, given, json, needed, optionalChoice, PROPOSES, writeMeta, writtenBy } from "./written.js";
12
+ export const SUBSCRIPTION_QUERY = {
13
+ entity: "subscription",
14
+ backend: "native",
15
+ fields: [
16
+ termField("status", "enum", "status:active", { values: SUBSCRIPTION_STATUSES }),
17
+ termField("direction", "enum", "direction:payable", { values: INVOICE_DIRECTIONS }),
18
+ termField("supplier", "ref", 'supplier:"organization:3"'),
19
+ termField("customer", "ref", 'customer:"organization:3"'),
20
+ termField("project", "kw", "project:PMED"),
21
+ termField("review", "enum", "review:proposed", { values: FINANCE_REVIEWS }),
22
+ termField("renews", "time", "renews:2026-12-01"),
23
+ ],
24
+ };
25
+ export const listSubscriptions = async (store, words, limit) => {
26
+ const terms = queryTerms(words, SUBSCRIPTION_QUERY, "subscriptions list");
27
+ const project = terms.get("project");
28
+ const filter = given({
29
+ status: terms.get("status"),
30
+ direction: terms.get("direction"),
31
+ supplier: terms.get("supplier"),
32
+ customer: terms.get("customer"),
33
+ review: terms.get("review"),
34
+ renewsBy: dayOf(terms.get("renews")),
35
+ project: project === undefined ? undefined : await canonicalProject(store, project),
36
+ });
37
+ return pageOf("subscriptions list", limit, (most) => store.subscriptions.list({ ...filter, limit: most }));
38
+ };
39
+ const parts = (command) => command
40
+ .option("--status <state>", `${SUBSCRIPTION_STATUSES.join(", ")}; trial needs --trial-end-date`)
41
+ .option("--supplier <party>", "who supplies it: person:<uid> or organization:<id>; you, when you bill it")
42
+ .option("--customer <party>", "who receives it and pays for it: person:<uid> or organization:<id>; you, when you pay")
43
+ .option("--product <product>", "the product or service it is for: product:<id>")
44
+ .option("--contract <contract>", "the contract it runs under: contract:<id>")
45
+ .option("--every <count-unit>", "how often it is charged: a count and a unit, such as 1-month or 1-year")
46
+ .option("--start-date <date>", "the first day it runs, YYYY-MM-DD")
47
+ .option("--trial-end-date <date>", "the day its free trial ends, YYYY-MM-DD");
48
+ const fieldsOf = (options) => given({
49
+ status: optionalChoice(options.status, SUBSCRIPTION_STATUSES, "--status"),
50
+ supplier: options.supplier,
51
+ customer: options.customer,
52
+ product: options.product,
53
+ contract: options.contract,
54
+ every: options.every,
55
+ startDate: dayOf(options.startDate),
56
+ trialEndDate: dayOf(options.trialEndDate),
57
+ endDate: dayOf(options.endDate),
58
+ });
59
+ /** `memo subscriptions`: what the owner bills or pays on a schedule, and its price history. */
60
+ export const subscriptionCommands = (program, streams, env) => {
61
+ const { run } = answers(program, streams, env);
62
+ const subscriptions = program
63
+ .command("subscriptions")
64
+ .description("subscriptions you bill or pay: who supplies it, who pays, how often, and every price it had; a price is " +
65
+ "never changed, a new one is added")
66
+ .summary("subscriptions you bill or pay, and their prices");
67
+ withQuery(json(annotate(subscriptions.command("list"), { effects: LOCAL_READ })).description("subscriptions, newest first; renews:2026-12-01 lists those that renew by then"), SUBSCRIPTION_QUERY)
68
+ .option("--limit <n>", "most subscriptions, up to 500", positive, 100)
69
+ .action((words, { json, limit }) => run(json, (store) => listSubscriptions(store, words, limit)));
70
+ json(annotate(subscriptions.command("show"), { effects: LOCAL_READ, output: { entity: "subscription" } }))
71
+ .description("one subscription with its parties, dates, current price and every price it had")
72
+ .argument("<subscription>", "subscription:<id>")
73
+ .action((ref, options, command) => run(options.json, async (store) => itemAnswer(await withSources(command, store, await store.subscriptions.get(ref)))));
74
+ json(writeMeta(parts(annotate(subscriptions.command("add"), {
75
+ effects: LOCAL_WRITE,
76
+ output: { entity: "subscription" },
77
+ literal_after_dashes: true,
78
+ })).option("--kind <kind>", "receivable (you bill it) or payable (you pay it)")))
79
+ .description(`record a subscription and its first price; ${PROPOSES}`)
80
+ .summary("record a subscription; an agent's waits for your review")
81
+ .argument("<name>", "what it is, such as Hosting")
82
+ .argument("<amount>", "its price for one period, a decimal such as 990.00")
83
+ .argument("<currency>", "ISO 4217, such as RUB")
84
+ .action(async (name, amount, currency, options, command) => {
85
+ const by = await whoRuns(command, env, {
86
+ asOwner: options.asOwner,
87
+ question: "record this subscription as yours?",
88
+ });
89
+ await run(options.json, async (store) => {
90
+ const startDate = dayOf(options.startDate) ?? today();
91
+ return itemAnswer(await store.subscriptions.add({
92
+ ...(await writtenBy(store, by, options)),
93
+ ...fieldsOf(options),
94
+ name,
95
+ direction: choice(options.kind, INVOICE_DIRECTIONS, "--kind"),
96
+ every: needed(options.every, "--every", "how often it is charged, such as 1-month"),
97
+ startDate,
98
+ prices: [{ amount, currency, effectiveFrom: startDate }],
99
+ }));
100
+ });
101
+ });
102
+ json(byOption(parts(annotate(subscriptions.command("update"), { effects: LOCAL_WRITE, output: { entity: "subscription" } }))
103
+ .option("--title <title>", "its new name")
104
+ .option("--end-date <date>", "the last day it runs, YYYY-MM-DD")))
105
+ .description("change a subscription's status, schedule, dates or parties; pause it with --status paused. You change any, an " +
106
+ "agent only one it proposed that is still proposed. A new price is subscriptions prices add")
107
+ .summary("change a subscription")
108
+ .argument("<subscription>", "subscription:<id>")
109
+ .action(async (ref, options, command) => {
110
+ const by = await whoRuns(command, env, { asOwner: options.asOwner, question: `change ${ref} as yours?` });
111
+ await run(options.json, async (store) => itemAnswer(await store.subscriptions.update(ref, { by, ...fieldsOf(options), ...given({ name: options.title }) })));
112
+ });
113
+ json(byOption(annotate(subscriptions.command("cancel"), { effects: LOCAL_WRITE, output: { entity: "subscription" } }).option("--occurred-time <time>", "the day it was cancelled, such as 2026-11-01; today when left out")))
114
+ .description("mark a subscription cancelled on a day; it stays, with its prices")
115
+ .summary("cancel a subscription")
116
+ .argument("<subscription>", "subscription:<id>")
117
+ .action(async (ref, options, command) => {
118
+ const by = await whoRuns(command, env, { asOwner: options.asOwner, question: `cancel ${ref} as yours?` });
119
+ await run(options.json, async (store) => itemAnswer(await store.subscriptions.update(ref, {
120
+ by,
121
+ status: "cancelled",
122
+ cancelledDate: dayOf(options.occurredTime) ?? today(),
123
+ })));
124
+ });
125
+ const prices = subscriptions
126
+ .command("prices")
127
+ .description("the prices a subscription had, each from a day on; one is never changed, a new one is added")
128
+ .summary("a subscription's prices");
129
+ json(byOption(annotate(prices.command("add"), { effects: LOCAL_WRITE, output: { entity: "subscription_price" } })
130
+ .option("--start-date <date>", "the first day the price holds, YYYY-MM-DD; the subscription's start when left out")
131
+ .option("--reason <text>", "why an agent proposes it, for the owner who decides")))
132
+ .description(`add a price from a day on; the earlier ones stay as they were. ${PROPOSES}, and the subscription stays as it is`)
133
+ .summary("add a subscription's new price")
134
+ .argument("<subscription>", "subscription:<id>")
135
+ .argument("<amount>", "the price for one period, a decimal such as 1190.00")
136
+ .argument("<currency>", "ISO 4217, such as RUB")
137
+ .action(async (ref, amount, currency, options, command) => {
138
+ const by = await whoRuns(command, env, {
139
+ asOwner: options.asOwner,
140
+ question: `add a price to ${ref} as yours?`,
141
+ });
142
+ await run(options.json, async (store) => itemAnswer(await store.subscriptions.addPrice(ref, {
143
+ by,
144
+ amount,
145
+ currency,
146
+ ...given({
147
+ effectiveFrom: dayOf(options.startDate),
148
+ reason: by === "owner" ? undefined : options.reason,
149
+ }),
150
+ })));
151
+ });
152
+ };
153
+ //# sourceMappingURL=subscriptions-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions-command.js","sourceRoot":"","sources":["../../src/finance/subscriptions-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Streams } from "@wirecat/cli-base";
2
+ import type { MessageStore } from "@wirecat/cli-core/store";
3
+ import type { Command } from "commander";
4
+ export declare const TRANSACTION_QUERY: {
5
+ readonly entity: "transaction";
6
+ readonly backend: "native";
7
+ readonly fields: readonly [import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec];
8
+ };
9
+ export declare const listTransactions: (store: MessageStore, words: readonly string[] | string | undefined, limit?: number) => Promise<import("@wirecat/cli-core/cli").ListBody<unknown>>;
10
+ /** `memo transactions`: what a bank statement says moved, and the categories it is split into. */
11
+ export declare const transactionCommands: (program: Command, streams: Streams, env: NodeJS.ProcessEnv) => void;
12
+ //# sourceMappingURL=transactions-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions-command.d.ts","sourceRoot":"","sources":["../../src/finance/transactions-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAKhD,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUxC,eAAO,MAAM,iBAAiB;qBACpB,aAAa;sBACZ,QAAQ;;CAUe,CAAA;AAElC,eAAO,MAAM,gBAAgB,UACpB,YAAY,SACZ,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,UACrC,MAAM,+DAcf,CAAA;AAUD,kGAAkG;AAClG,eAAO,MAAM,mBAAmB,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,KAAG,IA2JhG,CAAA"}
@@ -0,0 +1,137 @@
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
+ import { FINANCE_REVIEWS, MONEY_DIRECTIONS, TRANSACTION_STATUSES } from "@wirecat/cli-core";
3
+ import { LOCAL_READ, LOCAL_WRITE, queryTerms, termField, withQuery } from "@wirecat/cli-core/cli";
4
+ import { answers, itemAnswer } from "../answer.js";
5
+ import { byOption, whoRuns } from "../author.js";
6
+ import { positive } from "../options.js";
7
+ import { pageOf } from "../page.js";
8
+ import { withSources } from "../records/sources.js";
9
+ import { canonicalProject } from "../vocabulary/project.js";
10
+ import { dayOf, today } from "./finance.js";
11
+ import { choice, given, json, optionalChoice, PROPOSES, writeMeta, writtenBy } from "./written.js";
12
+ export const TRANSACTION_QUERY = {
13
+ entity: "transaction",
14
+ backend: "native",
15
+ fields: [
16
+ termField("wallet", "ref", 'wallet:"wallet:2"'),
17
+ termField("direction", "enum", "direction:out", { values: MONEY_DIRECTIONS }),
18
+ termField("status", "enum", "status:pending", { values: TRANSACTION_STATUSES }),
19
+ termField("category", "kw", "category:Rent"),
20
+ termField("project", "kw", "project:PMED"),
21
+ termField("review", "enum", "review:proposed", { values: FINANCE_REVIEWS }),
22
+ termField("uncategorized", "bool", "uncategorized:true"),
23
+ ],
24
+ };
25
+ export const listTransactions = async (store, words, limit) => {
26
+ const terms = queryTerms(words, TRANSACTION_QUERY, "transactions list");
27
+ const project = terms.get("project");
28
+ const filter = given({
29
+ wallet: terms.get("wallet"),
30
+ direction: terms.get("direction"),
31
+ status: terms.get("status"),
32
+ category: terms.get("category"),
33
+ review: terms.get("review"),
34
+ uncategorized: terms.has("uncategorized") ? terms.get("uncategorized") === "true" : undefined,
35
+ project: project === undefined ? undefined : await canonicalProject(store, project),
36
+ });
37
+ return pageOf("transactions list", limit, (most) => store.transactions.list({ ...filter, limit: most }));
38
+ };
39
+ const STATUS_HELP = `${TRANSACTION_STATUSES.join(" or ")}; only a booked one counts in a balance`;
40
+ /** `memo transactions`: what a bank statement says moved, and the categories it is split into. */
41
+ export const transactionCommands = (program, streams, env) => {
42
+ const { run } = answers(program, streams, env);
43
+ const transactions = program
44
+ .command("transactions")
45
+ .description("money a wallet's statement shows moving in or out, the payment it settles, and the categories it is split into")
46
+ .summary("money moving in or out of your wallets");
47
+ withQuery(json(annotate(transactions.command("list"), { effects: LOCAL_READ })).description("transactions, newest first; uncategorized:true lists those not fully split into categories"), TRANSACTION_QUERY)
48
+ .summary("transactions, newest first")
49
+ .option("--limit <n>", "most transactions, up to 500", positive, 100)
50
+ .action((words, { json, limit }) => run(json, (store) => listTransactions(store, words, limit)));
51
+ json(annotate(transactions.command("show"), { effects: LOCAL_READ, output: { entity: "transaction" } }))
52
+ .description("one transaction with its wallet, payment, splits and what is not categorized")
53
+ .argument("<transaction>", "transaction:<id>")
54
+ .action((ref, options, command) => run(options.json, async (store) => itemAnswer(await withSources(command, store, await store.transactions.get(ref)))));
55
+ json(writeMeta(annotate(transactions.command("add"), {
56
+ effects: LOCAL_WRITE,
57
+ output: { entity: "transaction" },
58
+ literal_after_dashes: true,
59
+ })
60
+ .option("--kind <kind>", "in (money came in) or out (money went out)")
61
+ .option("--occurred-time <time>", "the day the statement shows, such as 2026-11-01; today when left out")
62
+ .option("--description <text>", "what the statement says, as it says it")
63
+ .option("--status <state>", `${STATUS_HELP}; booked when left out`)
64
+ .option("--payment <payment>", "the payment it settles, same amount, currency and direction: payment:<id>")))
65
+ .description(`record what a wallet's statement shows moved, in the wallet's currency; ${PROPOSES}`)
66
+ .summary("record a transaction; an agent's waits for your review")
67
+ .argument("<wallet>", "wallet:<id>")
68
+ .argument("<amount>", "a decimal above 0, such as 500.00")
69
+ .action(async (wallet, amount, options, command) => {
70
+ const by = await whoRuns(command, env, {
71
+ asOwner: options.asOwner,
72
+ question: "record this transaction as yours?",
73
+ });
74
+ await run(options.json, async (store) => itemAnswer(await store.transactions.add({
75
+ ...(await writtenBy(store, by, options)),
76
+ wallet,
77
+ amount,
78
+ direction: choice(options.kind, MONEY_DIRECTIONS, "--kind"),
79
+ statementDate: dayOf(options.occurredTime) ?? today(),
80
+ ...given({
81
+ status: optionalChoice(options.status, TRANSACTION_STATUSES, "--status"),
82
+ description: options.description,
83
+ payment: options.payment,
84
+ }),
85
+ })));
86
+ });
87
+ json(byOption(annotate(transactions.command("update"), { effects: LOCAL_WRITE, output: { entity: "transaction" } })
88
+ .option("--status <state>", STATUS_HELP)
89
+ .option("--payment <payment>", "the payment it settles, same amount, currency and direction: payment:<id>")
90
+ .option("--description <text>", "what the statement says, as it says it")))
91
+ .description("book a pending transaction, link it to the payment it settles, or fix its text; you change any, an agent only " +
92
+ "one it proposed that is still proposed")
93
+ .summary("book a transaction or link it to its payment")
94
+ .argument("<transaction>", "transaction:<id>")
95
+ .action(async (ref, options, command) => {
96
+ const by = await whoRuns(command, env, { asOwner: options.asOwner, question: `change ${ref} as yours?` });
97
+ await run(options.json, async (store) => itemAnswer(await store.transactions.update(ref, {
98
+ by,
99
+ ...given({
100
+ status: optionalChoice(options.status, TRANSACTION_STATUSES, "--status"),
101
+ payment: options.payment,
102
+ description: options.description,
103
+ }),
104
+ })));
105
+ });
106
+ const splits = transactions
107
+ .command("splits")
108
+ .description("the categories a transaction's amount is split into; together never more than the amount, the rest is " +
109
+ "uncategorized")
110
+ .summary("a transaction's categories");
111
+ const WHO = "you split any transaction; an agent only one it proposed that is still proposed";
112
+ json(byOption(annotate(splits.command("add"), { effects: LOCAL_WRITE, output: { entity: "transaction" } }).option("--project <project>", "the project this part belongs to: its key or project:<id>")))
113
+ .description(`put part of a transaction's amount under a category; ${WHO}`)
114
+ .summary("put part of a transaction under a category")
115
+ .argument("<transaction>", "transaction:<id>")
116
+ .argument("<amount>", "a decimal above 0, such as 120.00")
117
+ .argument("<category...>", "the category, in a word or a few, such as Rent")
118
+ .action(async (ref, amount, words, options, command) => {
119
+ const by = await whoRuns(command, env, { asOwner: options.asOwner, question: `split ${ref} as yours?` });
120
+ await run(options.json, async (store) => itemAnswer(await store.transactions.addSplit(ref, {
121
+ by,
122
+ amount,
123
+ category: words.join(" "),
124
+ ...(options.project === undefined ? {} : { project: await canonicalProject(store, options.project) }),
125
+ })));
126
+ });
127
+ json(byOption(annotate(splits.command("remove"), { effects: LOCAL_WRITE, output: { entity: "transaction" } })))
128
+ .description(`take a split off a transaction; its amount is uncategorized again. ${WHO}`)
129
+ .summary("take a split off a transaction")
130
+ .argument("<transaction>", "transaction:<id>")
131
+ .argument("<position>", "the split's position, from 1, as transactions show lists it", positive)
132
+ .action(async (ref, position, options, command) => {
133
+ const by = await whoRuns(command, env, { asOwner: options.asOwner, question: `change ${ref}'s splits as yours?` });
134
+ await run(options.json, async (store) => itemAnswer(await store.transactions.removeSplit(ref, { position, by })));
135
+ });
136
+ };
137
+ //# sourceMappingURL=transactions-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions-command.js","sourceRoot":"","sources":["../../src/finance/transactions-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Streams } from "@wirecat/cli-base";
2
+ import type { MessageStore } from "@wirecat/cli-core/store";
3
+ import type { Command } from "commander";
4
+ export declare const WALLET_QUERY: {
5
+ readonly entity: "wallet";
6
+ readonly backend: "native";
7
+ readonly fields: readonly [import("@wirecat/cli-base/query").FieldSpec, import("@wirecat/cli-base/query").FieldSpec];
8
+ };
9
+ export declare const listWallets: (store: MessageStore, words: readonly string[] | string | undefined, limit?: number) => Promise<import("@wirecat/cli-core/cli").ListBody<unknown>>;
10
+ /** `memo wallets`: where the owner's money is, with a balance computed from its confirmed, booked transactions. */
11
+ export declare const walletCommands: (program: Command, streams: Streams, env: NodeJS.ProcessEnv) => void;
12
+ //# sourceMappingURL=wallets-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallets-command.d.ts","sourceRoot":"","sources":["../../src/finance/wallets-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAKhD,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,yBAAyB,CAAA;AACjF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASxC,eAAO,MAAM,YAAY;qBACf,QAAQ;sBACP,QAAQ;;CAKe,CAAA;AAElC,eAAO,MAAM,WAAW,UACf,YAAY,SACZ,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,UACrC,MAAM,+DAQf,CAAA;AAsBD,mHAAmH;AACnH,eAAO,MAAM,cAAc,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,KAAG,IAgH3F,CAAA"}
@@ -0,0 +1,106 @@
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
+ import { WALLET_KINDS } from "@wirecat/cli-core";
3
+ import { LOCAL_READ, LOCAL_WRITE, queryTerms, termField, withQuery } from "@wirecat/cli-core/cli";
4
+ import { answers, itemAnswer } from "../answer.js";
5
+ import { authorOf, byOption, whoRuns } from "../author.js";
6
+ import { positive } from "../options.js";
7
+ import { pageOf } from "../page.js";
8
+ import { sourceAccounts, withSources } from "../records/sources.js";
9
+ import { dayOf } from "./finance.js";
10
+ import { given, json, optionalChoice } from "./written.js";
11
+ export const WALLET_QUERY = {
12
+ entity: "wallet",
13
+ backend: "native",
14
+ fields: [
15
+ termField("kind", "enum", "kind:card", { values: WALLET_KINDS }),
16
+ termField("currency", "kw", "currency:RUB"),
17
+ ],
18
+ };
19
+ export const listWallets = async (store, words, limit) => {
20
+ const terms = queryTerms(words, WALLET_QUERY, "wallets list");
21
+ const filter = given({
22
+ kind: terms.get("kind"),
23
+ currency: terms.get("currency"),
24
+ });
25
+ return pageOf("wallets list", limit, (most) => store.wallets.list({ ...filter, limit: most }));
26
+ };
27
+ /**
28
+ * An imported wallet's opening balance as its source record gives it: only the owner sets the wallet's own, so until
29
+ * then `wallets show` prints the source's beside it.
30
+ */
31
+ const sourceSays = async (store, wallet) => {
32
+ if (wallet.openingBalance !== null)
33
+ return null;
34
+ for (const { provider, account } of await sourceAccounts(store, wallet)) {
35
+ const [record] = await store.records.list({ provider, account, entity: wallet.ref, limit: 1 });
36
+ const { opening_balance: balance, opening_date: date } = record?.fields ?? {};
37
+ if (record && typeof balance === "string")
38
+ return {
39
+ openingBalance: balance,
40
+ openingDate: typeof date === "string" ? date : null,
41
+ record: `${record.type}:${record.externalId}`,
42
+ account: `${provider}:${account}`,
43
+ };
44
+ }
45
+ return null;
46
+ };
47
+ /** `memo wallets`: where the owner's money is, with a balance computed from its confirmed, booked transactions. */
48
+ export const walletCommands = (program, streams, env) => {
49
+ const { run } = answers(program, streams, env);
50
+ const wallets = program
51
+ .command("wallets")
52
+ .description("bank accounts, cards and cash you keep money in, one currency each; a balance is the opening balance plus " +
53
+ "confirmed, booked transactions, computed each time")
54
+ .summary("bank accounts, cards and cash, with their balances");
55
+ withQuery(json(annotate(wallets.command("list"), { effects: LOCAL_READ })).description("wallets with their balances today; kind:card lists the cards"), WALLET_QUERY)
56
+ .option("--limit <n>", "most wallets, up to 500", positive, 100)
57
+ .action((words, { json, limit }) => run(json, (store) => listWallets(store, words, limit)));
58
+ json(annotate(wallets.command("show"), { effects: LOCAL_READ, output: { entity: "wallet" } }).option("--until-time <time>", "the balance up to and including this day, such as 2026-10-31; today when left out"))
59
+ .description("one wallet with its balance, and beside it what is pending or proposed and not counted yet; for an imported " +
60
+ "wallet whose opening balance you have not set, source_says gives the one its source sent")
61
+ .summary("one wallet with its balance and what is pending")
62
+ .argument("<wallet>", "wallet:<id>")
63
+ .action((ref, options, command) => run(options.json, async (store) => {
64
+ const until = dayOf(options.untilTime);
65
+ const wallet = await store.wallets.get(ref, until === undefined ? {} : { until });
66
+ return itemAnswer(await withSources(command, store, { ...wallet, sourceSays: await sourceSays(store, wallet) }));
67
+ }));
68
+ json(annotate(wallets.command("add"), { effects: LOCAL_WRITE, output: { entity: "wallet" }, literal_after_dashes: true })
69
+ .option("--kind <kind>", `${WALLET_KINDS.join(", ")}; bank when left out`)
70
+ .option("--institution <text>", "the bank or other company that holds it, by name"))
71
+ .description("add a wallet in one currency; anyone adds one directly, and only you set its opening balance, with wallets update")
72
+ .summary("add a bank account, card or cash wallet")
73
+ .argument("<name>", "what you call it, such as 'Main card'")
74
+ .argument("<currency>", "ISO 4217, such as RUB; a bank account in two currencies is two wallets")
75
+ .action((name, currency, options) => run(options.json, async (store) => itemAnswer(await store.wallets.add({
76
+ by: authorOf(env),
77
+ name,
78
+ currency,
79
+ ...given({
80
+ kind: optionalChoice(options.kind, WALLET_KINDS, "--kind"),
81
+ institution: options.institution,
82
+ }),
83
+ }))));
84
+ json(byOption(annotate(wallets.command("update"), { effects: LOCAL_WRITE, output: { entity: "wallet" } })
85
+ .option("--title <title>", "its new name")
86
+ .option("--institution <text>", "the bank or other company that holds it, by name")
87
+ .option("--opening-balance <decimal>", "what it held on --opening-date, such as 1500.50; only you set it")
88
+ .option("--opening-date <date>", "the day of the opening balance, YYYY-MM-DD")))
89
+ .description("rename a wallet, or set the opening balance its balance counts from; the opening balance is yours alone, an " +
90
+ "agent is refused")
91
+ .summary("rename a wallet or set its opening balance")
92
+ .argument("<wallet>", "wallet:<id>")
93
+ .action(async (ref, options, command) => {
94
+ const by = await whoRuns(command, env, { asOwner: options.asOwner, question: `change ${ref} as yours?` });
95
+ await run(options.json, async (store) => itemAnswer(await store.wallets.update(ref, {
96
+ by,
97
+ ...given({
98
+ name: options.title,
99
+ institution: options.institution,
100
+ openingBalance: options.openingBalance,
101
+ openingDate: dayOf(options.openingDate),
102
+ }),
103
+ })));
104
+ });
105
+ };
106
+ //# sourceMappingURL=wallets-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallets-command.js","sourceRoot":"","sources":["../../src/finance/wallets-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { MessageStore } from "@wirecat/cli-core/store";
2
+ import type { Command } from "commander";
3
+ export interface Written {
4
+ kind?: string;
5
+ person?: string;
6
+ organization?: string;
7
+ title?: string;
8
+ occurredTime?: string;
9
+ project?: string;
10
+ reason?: string;
11
+ evidence?: string[];
12
+ asOwner?: boolean;
13
+ json?: boolean;
14
+ }
15
+ export declare const json: (command: Command) => Command;
16
+ export declare const PROPOSES = "yours is confirmed at once; an agent's waits as proposed for you in memo review";
17
+ export declare const choice: <T extends string>(value: string | undefined, allowed: readonly T[], flag: string) => T;
18
+ export declare const needed: (value: string | undefined, flag: string, what: string) => string;
19
+ export declare const optionalChoice: <T extends string>(value: string | undefined, allowed: readonly T[], flag: string) => T | undefined;
20
+ /** `--auto-renew on`, `--archived off`: the vocabulary's on|off values. */
21
+ export declare const onOff: (value: string | undefined, flag: string) => boolean | undefined;
22
+ /** The parts every finance write shares: who writes it, its project, and an agent's reason. */
23
+ export declare const writtenBy: (store: MessageStore, by: "owner" | {
24
+ bot: string;
25
+ }, options: Written) => Promise<{
26
+ by: "owner" | {
27
+ bot: string;
28
+ };
29
+ project?: string | undefined;
30
+ reason?: string | undefined;
31
+ evidence?: string[] | undefined;
32
+ }>;
33
+ export declare const party: (command: Command, what: string) => Command;
34
+ export declare const writeMeta: (command: Command) => Command;
35
+ /** Leaves out what the caller did not give, so an update changes only the named fields. */
36
+ export declare const given: <T extends Record<string, unknown>>(fields: T) => { [K in keyof T]?: Exclude<T[K], undefined>; };
37
+ //# sourceMappingURL=written.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"written.d.ts","sourceRoot":"","sources":["../../src/finance/written.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,eAAO,MAAM,IAAI,YAAa,OAAO,YAAwB,CAAA;AAE7D,eAAO,MAAM,QAAQ,oFAAoF,CAAA;AAEzG,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,SAAS,MAAM,GAAG,SAAS,WAAW,SAAS,CAAC,EAAE,QAAQ,MAAM,KAAG,CAIzG,CAAA;AAED,eAAO,MAAM,MAAM,UAAW,MAAM,GAAG,SAAS,QAAQ,MAAM,QAAQ,MAAM,KAAG,MAI9E,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,MAAM,SACtC,MAAM,GAAG,SAAS,WAChB,SAAS,CAAC,EAAE,QACf,MAAM,KACX,CAAC,GAAG,SAA6E,CAAA;AAEpF,2EAA2E;AAC3E,eAAO,MAAM,KAAK,UAAW,MAAM,GAAG,SAAS,QAAQ,MAAM,KAAG,OAAO,GAAG,SACc,CAAA;AAExF,+FAA+F;AAC/F,eAAO,MAAM,SAAS,UAAiB,YAAY,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,WAAW,OAAO;;aAA1B,MAAM;;;;;EAK9E,CAAA;AAEF,eAAO,MAAM,KAAK,YAAa,OAAO,QAAQ,MAAM,YAGuC,CAAA;AAE3F,eAAO,MAAM,SAAS,YAAa,OAAO,YAMvC,CAAA;AAEH,2FAA2F;AAC3F,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,KACyB,GACtF,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAC1C,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { CliError } from "@wirecat/cli-base";
2
+ import { byOption } from "../author.js";
3
+ import { jsonOption } from "../options.js";
4
+ import { canonicalProject } from "../vocabulary/project.js";
5
+ export const json = (command) => jsonOption(command);
6
+ export const PROPOSES = "yours is confirmed at once; an agent's waits as proposed for you in memo review";
7
+ export const choice = (value, allowed, flag) => {
8
+ if (value === undefined || !allowed.includes(value))
9
+ throw new CliError("validation_error", `${flag} is one of ${allowed.join(", ")}`, { param: flag });
10
+ return value;
11
+ };
12
+ export const needed = (value, flag, what) => {
13
+ if (value === undefined || value.trim() === "")
14
+ throw new CliError("validation_error", `name ${what}: ${flag}`, { param: flag });
15
+ return value;
16
+ };
17
+ export const optionalChoice = (value, allowed, flag) => (value === undefined ? undefined : choice(value, allowed, flag));
18
+ /** `--auto-renew on`, `--archived off`: the vocabulary's on|off values. */
19
+ export const onOff = (value, flag) => value === undefined ? undefined : choice(value, ["on", "off"], flag) === "on";
20
+ /** The parts every finance write shares: who writes it, its project, and an agent's reason. */
21
+ export const writtenBy = async (store, by, options) => ({
22
+ by,
23
+ ...(options.project === undefined ? {} : { project: await canonicalProject(store, options.project) }),
24
+ ...(by !== "owner" && options.reason !== undefined ? { reason: options.reason } : {}),
25
+ ...(options.evidence === undefined ? {} : { evidence: options.evidence }),
26
+ });
27
+ export const party = (command, what) => command
28
+ .option("--person <uid>", `the person ${what}: person:<id>`)
29
+ .option("--organization <organization>", `the organization ${what}: organization:<id>`);
30
+ export const writeMeta = (command) => byOption(command
31
+ .option("--project <project>", "the project it belongs to: its key or project:<id>")
32
+ .option("--reason <text>", "why an agent proposes it, for the owner who decides")
33
+ .option("--evidence <ref...>", "what shows it, up to 8: msg:, note:, document: or another reference"));
34
+ /** Leaves out what the caller did not give, so an update changes only the named fields. */
35
+ export const given = (fields) => Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined));
36
+ //# sourceMappingURL=written.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"written.js","sourceRoot":"","sources":["../../src/finance/written.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/knowledge/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AA2B1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoCxC,eAAO,MAAM,iBAAiB,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,SA8b3F,CAAA"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/knowledge/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AA2B1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoCxC,eAAO,MAAM,iBAAiB,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,SAqc3F,CAAA"}
@@ -186,7 +186,8 @@ export const knowledgeCommands = (program, streams, env) => {
186
186
  .argument("<to>", "the person:, organization: or project: it belongs or relates to")
187
187
  .option("--json", "print JSON; --json=id,title keeps only those fields")
188
188
  .option("--kind <kind>", "member-of or related-to", "member-of")
189
- .option("--role <role>", "the role it has there, in a few words, such as cto")
189
+ .option("--role <role>", "the role it has there; a person's role in an organization or a project is one from its list, " +
190
+ "such as employee or contributor")
190
191
  .option("--reason <text>", "why you think so, in a sentence")
191
192
  .action(async (from, to, options, command) => {
192
193
  const by = await whoRuns(command, env, { asOwner: options.asOwner, question: "state it as yours?" });
@@ -217,7 +218,7 @@ export const knowledgeCommands = (program, streams, env) => {
217
218
  "an agent's change waits for you in memo review")
218
219
  .summary("set a relationship's role or a chat's purpose in a project")
219
220
  .argument("<id>", "the relationship's id, as relationships list gives it")
220
- .option("--role <role>", "the role it has there, in a few words; an empty value clears it")
221
+ .option("--role <role>", "the role it has there, from the same list as relationships add; an empty value clears it")
221
222
  .option("--purpose <purpose>", "what the chat is for in the project: work, sales, support or other")
222
223
  .option("--reason <text>", "why, in a sentence")
223
224
  .option("--json", "print JSON; --json=id,title keeps only those fields")).action(async (id, options, command) => {