@agent-crm/cli 0.0.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/README.md +108 -0
- package/dist/bin/acrm.js +49 -0
- package/dist/bin/acrm.js.map +1 -0
- package/dist/commands/execute.js +75 -0
- package/dist/commands/execute.js.map +1 -0
- package/dist/commands/import.js +451 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.js +97 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/ui.js +513 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/db/execute.js +30 -0
- package/dist/db/execute.js.map +1 -0
- package/dist/domain/values.js +104 -0
- package/dist/domain/values.js.map +1 -0
- package/dist/lib/errors.js +25 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/ids.js +8 -0
- package/dist/lib/ids.js.map +1 -0
- package/dist/lib/time.js +4 -0
- package/dist/lib/time.js.map +1 -0
- package/dist/output/json.js +44 -0
- package/dist/output/json.js.map +1 -0
- package/dist/workspace/open.js +60 -0
- package/dist/workspace/open.js.map +1 -0
- package/dist/workspace/schemas/index.js +124 -0
- package/dist/workspace/schemas/index.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { findWorkspace, openWorkspace } from "../workspace/open.js";
|
|
4
|
+
import { exec } from "../db/execute.js";
|
|
5
|
+
import { fail, isJson, ok, setJsonMode } from "../output/json.js";
|
|
6
|
+
import { startUiServer } from "./ui.js";
|
|
7
|
+
import { generateUuid } from "../lib/ids.js";
|
|
8
|
+
import { nowIso } from "../lib/time.js";
|
|
9
|
+
import { AcrmError, ERR } from "../lib/errors.js";
|
|
10
|
+
import { encode, normalizeUniqueKey, normalizeDomain, domainFromEmail, } from "../domain/values.js";
|
|
11
|
+
function parseCsv(text) {
|
|
12
|
+
const rows = [];
|
|
13
|
+
let cur = [];
|
|
14
|
+
let field = "";
|
|
15
|
+
let inQuotes = false;
|
|
16
|
+
let i = 0;
|
|
17
|
+
while (i < text.length) {
|
|
18
|
+
const c = text[i];
|
|
19
|
+
if (inQuotes) {
|
|
20
|
+
if (c === '"') {
|
|
21
|
+
if (text[i + 1] === '"') {
|
|
22
|
+
field += '"';
|
|
23
|
+
i += 2;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
inQuotes = false;
|
|
27
|
+
i++;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
field += c;
|
|
31
|
+
i++;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (c === '"') {
|
|
35
|
+
inQuotes = true;
|
|
36
|
+
i++;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (c === ",") {
|
|
40
|
+
cur.push(field);
|
|
41
|
+
field = "";
|
|
42
|
+
i++;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (c === "\r") {
|
|
46
|
+
i++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (c === "\n") {
|
|
50
|
+
cur.push(field);
|
|
51
|
+
rows.push(cur);
|
|
52
|
+
cur = [];
|
|
53
|
+
field = "";
|
|
54
|
+
i++;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
field += c;
|
|
58
|
+
i++;
|
|
59
|
+
}
|
|
60
|
+
if (field.length || cur.length) {
|
|
61
|
+
cur.push(field);
|
|
62
|
+
rows.push(cur);
|
|
63
|
+
}
|
|
64
|
+
if (!rows.length)
|
|
65
|
+
return [];
|
|
66
|
+
const header = rows[0].map((h) => h.trim().toLowerCase());
|
|
67
|
+
const out = [];
|
|
68
|
+
for (let r = 1; r < rows.length; r++) {
|
|
69
|
+
const row = rows[r];
|
|
70
|
+
if (row.length === 1 && row[0] === "")
|
|
71
|
+
continue;
|
|
72
|
+
const obj = {};
|
|
73
|
+
for (let c = 0; c < header.length; c++) {
|
|
74
|
+
obj[header[c]] = (row[c] ?? "").trim();
|
|
75
|
+
}
|
|
76
|
+
out.push(obj);
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
function pick(row, ...keys) {
|
|
81
|
+
for (const k of keys) {
|
|
82
|
+
const v = row[k];
|
|
83
|
+
if (v && v.length)
|
|
84
|
+
return v;
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
async function findRecordByUnique(lix, object_slug, attribute_slug, normalized_key) {
|
|
89
|
+
const r = await exec(lix, `SELECT record_id FROM acrm_value
|
|
90
|
+
WHERE object_slug = $1 AND attribute_slug = $2
|
|
91
|
+
AND normalized_key = $3 AND active_until IS NULL
|
|
92
|
+
LIMIT 1`, [object_slug, attribute_slug, normalized_key]);
|
|
93
|
+
return r.rows[0]?.record_id ?? null;
|
|
94
|
+
}
|
|
95
|
+
async function insertRecord(lix, object_slug, record_id) {
|
|
96
|
+
await exec(lix, "INSERT INTO acrm_record (object_slug, record_id) VALUES ($1, $2)", [object_slug, record_id]);
|
|
97
|
+
}
|
|
98
|
+
async function insertValue(lix, args) {
|
|
99
|
+
const normalized = normalizeUniqueKey(args.attribute_type, args.value_json);
|
|
100
|
+
const ref = args.attribute_type === "record-reference"
|
|
101
|
+
? {
|
|
102
|
+
ref_object: args.value_json.target_object ?? null,
|
|
103
|
+
ref_record_id: args.value_json.target_record_id ?? null,
|
|
104
|
+
}
|
|
105
|
+
: { ref_object: null, ref_record_id: null };
|
|
106
|
+
const params = [
|
|
107
|
+
await generateUuid(lix),
|
|
108
|
+
args.object_slug,
|
|
109
|
+
args.record_id,
|
|
110
|
+
args.attribute_slug,
|
|
111
|
+
JSON.stringify(args.value_json),
|
|
112
|
+
args.attribute_type,
|
|
113
|
+
nowIso(),
|
|
114
|
+
normalized,
|
|
115
|
+
ref.ref_object,
|
|
116
|
+
ref.ref_record_id,
|
|
117
|
+
args.source,
|
|
118
|
+
JSON.stringify(args.provenance),
|
|
119
|
+
];
|
|
120
|
+
await exec(lix, `INSERT INTO acrm_value
|
|
121
|
+
(id, object_slug, record_id, attribute_slug, value_json, attribute_type,
|
|
122
|
+
active_from, normalized_key, ref_object, ref_record_id, source, provenance_json)
|
|
123
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, params);
|
|
124
|
+
}
|
|
125
|
+
async function getAttribute(lix, object_slug, attribute_slug) {
|
|
126
|
+
const r = await exec(lix, "SELECT attribute_type FROM acrm_attribute WHERE object_slug = $1 AND attribute_slug = $2", [object_slug, attribute_slug]);
|
|
127
|
+
const row = r.rows[0];
|
|
128
|
+
if (!row)
|
|
129
|
+
return null;
|
|
130
|
+
return { attribute_type: row.attribute_type };
|
|
131
|
+
}
|
|
132
|
+
async function setSingleValue(lix, args) {
|
|
133
|
+
const value_json = encode(args.attribute_type, args.value);
|
|
134
|
+
// close any active values
|
|
135
|
+
await exec(lix, `UPDATE acrm_value SET active_until = $1
|
|
136
|
+
WHERE object_slug = $2 AND record_id = $3 AND attribute_slug = $4 AND active_until IS NULL`, [nowIso(), args.object_slug, args.record_id, args.attribute_slug]);
|
|
137
|
+
await insertValue(lix, { ...args, value_json });
|
|
138
|
+
}
|
|
139
|
+
async function addMultiValue(lix, args) {
|
|
140
|
+
const value_json = encode(args.attribute_type, args.value);
|
|
141
|
+
const normalized = normalizeUniqueKey(args.attribute_type, value_json);
|
|
142
|
+
if (normalized) {
|
|
143
|
+
const exists = await exec(lix, `SELECT 1 FROM acrm_value
|
|
144
|
+
WHERE object_slug = $1 AND record_id = $2 AND attribute_slug = $3
|
|
145
|
+
AND normalized_key = $4 AND active_until IS NULL LIMIT 1`, [args.object_slug, args.record_id, args.attribute_slug, normalized]);
|
|
146
|
+
if (exists.rows.length)
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
await insertValue(lix, { ...args, value_json });
|
|
150
|
+
}
|
|
151
|
+
async function importRow(lix, row, source, rowIndex, stats) {
|
|
152
|
+
const provenance = { row: rowIndex };
|
|
153
|
+
const email = pick(row, "email", "email_address", "email_addresses");
|
|
154
|
+
const composed = [pick(row, "first_name"), pick(row, "last_name")]
|
|
155
|
+
.filter(Boolean)
|
|
156
|
+
.join(" ")
|
|
157
|
+
.trim();
|
|
158
|
+
const fullName = pick(row, "name", "full_name", "person_name") ?? (composed.length ? composed : null);
|
|
159
|
+
const companyName = pick(row, "company", "company_name", "organization");
|
|
160
|
+
const domainRaw = pick(row, "domain", "website", "company_domain");
|
|
161
|
+
const jobTitle = pick(row, "job_title", "title", "role");
|
|
162
|
+
const linkedin = pick(row, "linkedin_url", "linkedin");
|
|
163
|
+
// company
|
|
164
|
+
let companyId = null;
|
|
165
|
+
let companyDomain = null;
|
|
166
|
+
if (domainRaw)
|
|
167
|
+
companyDomain = normalizeDomain(domainRaw);
|
|
168
|
+
else if (email)
|
|
169
|
+
companyDomain = domainFromEmail(email);
|
|
170
|
+
if (companyDomain) {
|
|
171
|
+
const existing = await findRecordByUnique(lix, "companies", "domains", companyDomain);
|
|
172
|
+
if (existing) {
|
|
173
|
+
companyId = existing;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
companyId = await generateUuid(lix);
|
|
177
|
+
await insertRecord(lix, "companies", companyId);
|
|
178
|
+
await addMultiValue(lix, {
|
|
179
|
+
object_slug: "companies",
|
|
180
|
+
record_id: companyId,
|
|
181
|
+
attribute_slug: "domains",
|
|
182
|
+
attribute_type: "domain",
|
|
183
|
+
value: companyDomain,
|
|
184
|
+
source,
|
|
185
|
+
provenance,
|
|
186
|
+
});
|
|
187
|
+
if (companyName) {
|
|
188
|
+
await setSingleValue(lix, {
|
|
189
|
+
object_slug: "companies",
|
|
190
|
+
record_id: companyId,
|
|
191
|
+
attribute_slug: "name",
|
|
192
|
+
attribute_type: "text",
|
|
193
|
+
value: companyName,
|
|
194
|
+
source,
|
|
195
|
+
provenance,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
stats.companies_created++;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// person
|
|
202
|
+
let personId = null;
|
|
203
|
+
if (email) {
|
|
204
|
+
const normalized = email.trim().toLowerCase();
|
|
205
|
+
const existing = await findRecordByUnique(lix, "people", "email_addresses", normalized);
|
|
206
|
+
if (existing) {
|
|
207
|
+
personId = existing;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
personId = await generateUuid(lix);
|
|
211
|
+
await insertRecord(lix, "people", personId);
|
|
212
|
+
await addMultiValue(lix, {
|
|
213
|
+
object_slug: "people",
|
|
214
|
+
record_id: personId,
|
|
215
|
+
attribute_slug: "email_addresses",
|
|
216
|
+
attribute_type: "email-address",
|
|
217
|
+
value: email,
|
|
218
|
+
source,
|
|
219
|
+
provenance,
|
|
220
|
+
});
|
|
221
|
+
if (fullName) {
|
|
222
|
+
await setSingleValue(lix, {
|
|
223
|
+
object_slug: "people",
|
|
224
|
+
record_id: personId,
|
|
225
|
+
attribute_slug: "name",
|
|
226
|
+
attribute_type: "personal-name",
|
|
227
|
+
value: fullName,
|
|
228
|
+
source,
|
|
229
|
+
provenance,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (jobTitle) {
|
|
233
|
+
await setSingleValue(lix, {
|
|
234
|
+
object_slug: "people",
|
|
235
|
+
record_id: personId,
|
|
236
|
+
attribute_slug: "job_title",
|
|
237
|
+
attribute_type: "text",
|
|
238
|
+
value: jobTitle,
|
|
239
|
+
source,
|
|
240
|
+
provenance,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (linkedin) {
|
|
244
|
+
await setSingleValue(lix, {
|
|
245
|
+
object_slug: "people",
|
|
246
|
+
record_id: personId,
|
|
247
|
+
attribute_slug: "linkedin_url",
|
|
248
|
+
attribute_type: "url",
|
|
249
|
+
value: linkedin,
|
|
250
|
+
source,
|
|
251
|
+
provenance,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
stats.people_created++;
|
|
255
|
+
}
|
|
256
|
+
if (companyId) {
|
|
257
|
+
await setSingleValue(lix, {
|
|
258
|
+
object_slug: "people",
|
|
259
|
+
record_id: personId,
|
|
260
|
+
attribute_slug: "company",
|
|
261
|
+
attribute_type: "record-reference",
|
|
262
|
+
value: { target_object: "companies", target_record_id: companyId },
|
|
263
|
+
source,
|
|
264
|
+
provenance,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// deal (optional)
|
|
269
|
+
const dealName = pick(row, "deal_name", "deal");
|
|
270
|
+
if (dealName) {
|
|
271
|
+
const dealId = await generateUuid(lix);
|
|
272
|
+
await insertRecord(lix, "deals", dealId);
|
|
273
|
+
await setSingleValue(lix, {
|
|
274
|
+
object_slug: "deals",
|
|
275
|
+
record_id: dealId,
|
|
276
|
+
attribute_slug: "name",
|
|
277
|
+
attribute_type: "text",
|
|
278
|
+
value: dealName,
|
|
279
|
+
source,
|
|
280
|
+
provenance,
|
|
281
|
+
});
|
|
282
|
+
const stage = pick(row, "deal_stage", "stage");
|
|
283
|
+
if (stage) {
|
|
284
|
+
const attr = await getAttribute(lix, "deals", "stage");
|
|
285
|
+
if (attr) {
|
|
286
|
+
await setSingleValue(lix, {
|
|
287
|
+
object_slug: "deals",
|
|
288
|
+
record_id: dealId,
|
|
289
|
+
attribute_slug: "stage",
|
|
290
|
+
attribute_type: attr.attribute_type,
|
|
291
|
+
value: stage,
|
|
292
|
+
source,
|
|
293
|
+
provenance,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const dealValue = pick(row, "deal_value", "value");
|
|
298
|
+
if (dealValue) {
|
|
299
|
+
await setSingleValue(lix, {
|
|
300
|
+
object_slug: "deals",
|
|
301
|
+
record_id: dealId,
|
|
302
|
+
attribute_slug: "value",
|
|
303
|
+
attribute_type: "currency",
|
|
304
|
+
value: dealValue,
|
|
305
|
+
source,
|
|
306
|
+
provenance,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
const closeDate = pick(row, "close_date", "deal_close_date");
|
|
310
|
+
if (closeDate) {
|
|
311
|
+
await setSingleValue(lix, {
|
|
312
|
+
object_slug: "deals",
|
|
313
|
+
record_id: dealId,
|
|
314
|
+
attribute_slug: "close_date",
|
|
315
|
+
attribute_type: "date",
|
|
316
|
+
value: closeDate,
|
|
317
|
+
source,
|
|
318
|
+
provenance,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
const nextStep = pick(row, "next_step", "deal_next_step");
|
|
322
|
+
if (nextStep) {
|
|
323
|
+
await setSingleValue(lix, {
|
|
324
|
+
object_slug: "deals",
|
|
325
|
+
record_id: dealId,
|
|
326
|
+
attribute_slug: "next_step",
|
|
327
|
+
attribute_type: "text",
|
|
328
|
+
value: nextStep,
|
|
329
|
+
source,
|
|
330
|
+
provenance,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
if (companyId) {
|
|
334
|
+
await setSingleValue(lix, {
|
|
335
|
+
object_slug: "deals",
|
|
336
|
+
record_id: dealId,
|
|
337
|
+
attribute_slug: "associated_company",
|
|
338
|
+
attribute_type: "record-reference",
|
|
339
|
+
value: { target_object: "companies", target_record_id: companyId },
|
|
340
|
+
source,
|
|
341
|
+
provenance,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
if (personId) {
|
|
345
|
+
await addMultiValue(lix, {
|
|
346
|
+
object_slug: "deals",
|
|
347
|
+
record_id: dealId,
|
|
348
|
+
attribute_slug: "associated_people",
|
|
349
|
+
attribute_type: "record-reference",
|
|
350
|
+
value: { target_object: "people", target_record_id: personId },
|
|
351
|
+
source,
|
|
352
|
+
provenance,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
stats.deals_created++;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
export function registerImport(program) {
|
|
359
|
+
const importCmd = program
|
|
360
|
+
.command("import")
|
|
361
|
+
.description("import data into the .acrm file (creates people + companies; deals only when the CSV has deal columns)");
|
|
362
|
+
importCmd
|
|
363
|
+
.command("csv <path>")
|
|
364
|
+
.description("import a CSV. Creates one person per email and one company per domain. Creates a deal only when the CSV has a 'deal_name' or 'deal' column — leads alone do not become deals.")
|
|
365
|
+
.option("-p, --port <port>", "port for the UI server", "3737")
|
|
366
|
+
.option("--no-ui", "do not launch the UI after import")
|
|
367
|
+
.option("--no-open", "do not auto-open the browser when launching the UI")
|
|
368
|
+
.addHelpText("after", `
|
|
369
|
+
Recognized columns (header is trim+lowercase only — use snake_case, not "Company Name"):
|
|
370
|
+
|
|
371
|
+
Person email | email_address | email_addresses
|
|
372
|
+
name | full_name | person_name (or first_name + last_name)
|
|
373
|
+
job_title | title | role
|
|
374
|
+
linkedin_url | linkedin
|
|
375
|
+
|
|
376
|
+
Company company | company_name | organization
|
|
377
|
+
domain | website | company_domain
|
|
378
|
+
|
|
379
|
+
Deal deal_name | deal (presence triggers deal creation)
|
|
380
|
+
deal_stage | stage
|
|
381
|
+
deal_value | value
|
|
382
|
+
close_date | deal_close_date
|
|
383
|
+
next_step | deal_next_step
|
|
384
|
+
|
|
385
|
+
Identity:
|
|
386
|
+
- companies are deduplicated by normalized domain (or domain-from-email)
|
|
387
|
+
- people are deduplicated by lowercased email
|
|
388
|
+
- rows without an email skip person creation
|
|
389
|
+
- rows without a domain or email skip company creation
|
|
390
|
+
`)
|
|
391
|
+
.action(async (csvPath, opts) => {
|
|
392
|
+
const root = program.opts();
|
|
393
|
+
setJsonMode(root.json);
|
|
394
|
+
const port = Number(opts.port);
|
|
395
|
+
if (opts.ui && (!Number.isInteger(port) || port <= 0 || port > 65535)) {
|
|
396
|
+
fail(`invalid port: ${opts.port}`, ERR.IMPORT);
|
|
397
|
+
process.exit(1);
|
|
398
|
+
}
|
|
399
|
+
let lix = null;
|
|
400
|
+
try {
|
|
401
|
+
const abs = path.resolve(csvPath);
|
|
402
|
+
const text = readFileSync(abs, "utf8");
|
|
403
|
+
const rows = parseCsv(text);
|
|
404
|
+
const source = `csv:${path.basename(abs)}`;
|
|
405
|
+
lix = await openWorkspace({ workspace: root.workspace });
|
|
406
|
+
const stats = {
|
|
407
|
+
rows: rows.length,
|
|
408
|
+
companies_created: 0,
|
|
409
|
+
people_created: 0,
|
|
410
|
+
deals_created: 0,
|
|
411
|
+
};
|
|
412
|
+
for (let i = 0; i < rows.length; i++) {
|
|
413
|
+
await importRow(lix, rows[i], source, i + 1, stats);
|
|
414
|
+
}
|
|
415
|
+
ok(stats);
|
|
416
|
+
if (opts.ui) {
|
|
417
|
+
const resolved = root.workspace
|
|
418
|
+
? root.workspace.endsWith(".acrm")
|
|
419
|
+
? root.workspace
|
|
420
|
+
: root.workspace + ".acrm"
|
|
421
|
+
: (findWorkspace() ?? "workspace.acrm");
|
|
422
|
+
const workspaceLabel = path.basename(resolved);
|
|
423
|
+
startUiServer(lix, workspaceLabel, { port, open: opts.open });
|
|
424
|
+
// server now owns the lix handle
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
await lix.close();
|
|
428
|
+
if (!isJson()) {
|
|
429
|
+
const bold = process.env.NO_COLOR ? "" : "\x1b[1m";
|
|
430
|
+
const reset = process.env.NO_COLOR ? "" : "\x1b[0m";
|
|
431
|
+
process.stdout.write(`\nNext: ${bold}acrm ui${reset} to validate the import in your browser\n`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
catch (e) {
|
|
435
|
+
if (lix) {
|
|
436
|
+
try {
|
|
437
|
+
await lix.close();
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
// ignore
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
if (e instanceof AcrmError)
|
|
444
|
+
fail(e.message, e.code, e.hint);
|
|
445
|
+
else
|
|
446
|
+
fail(e instanceof Error ? e.message : String(e), ERR.IMPORT);
|
|
447
|
+
process.exit(1);
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { openWorkspace } from "../workspace/open.js";
|
|
2
|
+
import { registerAllSchemas } from "../workspace/schemas/index.js";
|
|
3
|
+
import { exec } from "../db/execute.js";
|
|
4
|
+
import { fail, isJson, ok, setJsonMode } from "../output/json.js";
|
|
5
|
+
import { generateUuid } from "../lib/ids.js";
|
|
6
|
+
import { AcrmError, ERR } from "../lib/errors.js";
|
|
7
|
+
const OBJECTS = [
|
|
8
|
+
{ object_slug: "people", singular_name: "Person", plural_name: "People" },
|
|
9
|
+
{ object_slug: "companies", singular_name: "Company", plural_name: "Companies" },
|
|
10
|
+
{ object_slug: "deals", singular_name: "Deal", plural_name: "Deals" },
|
|
11
|
+
];
|
|
12
|
+
const ATTRIBUTES = [
|
|
13
|
+
// companies
|
|
14
|
+
{ object_slug: "companies", attribute_slug: "name", title: "Name", attribute_type: "text", is_multivalued: false, is_unique: false },
|
|
15
|
+
{ object_slug: "companies", attribute_slug: "domains", title: "Domains", attribute_type: "domain", is_multivalued: true, is_unique: true },
|
|
16
|
+
{ object_slug: "companies", attribute_slug: "description", title: "Description", attribute_type: "text", is_multivalued: false, is_unique: false },
|
|
17
|
+
{ object_slug: "companies", attribute_slug: "linkedin_url", title: "LinkedIn", attribute_type: "url", is_multivalued: false, is_unique: false },
|
|
18
|
+
{ object_slug: "companies", attribute_slug: "team", title: "Team", attribute_type: "record-reference", is_multivalued: true, is_unique: false, config: { target_object: "people", inverse: "company" } },
|
|
19
|
+
{ object_slug: "companies", attribute_slug: "associated_deals", title: "Associated deals", attribute_type: "record-reference", is_multivalued: true, is_unique: false, config: { target_object: "deals", inverse: "associated_company" } },
|
|
20
|
+
// people
|
|
21
|
+
{ object_slug: "people", attribute_slug: "name", title: "Name", attribute_type: "personal-name", is_multivalued: false, is_unique: false },
|
|
22
|
+
{ object_slug: "people", attribute_slug: "email_addresses", title: "Email addresses", attribute_type: "email-address", is_multivalued: true, is_unique: true },
|
|
23
|
+
{ object_slug: "people", attribute_slug: "job_title", title: "Job title", attribute_type: "text", is_multivalued: false, is_unique: false },
|
|
24
|
+
{ object_slug: "people", attribute_slug: "linkedin_url", title: "LinkedIn", attribute_type: "url", is_multivalued: false, is_unique: false },
|
|
25
|
+
{ object_slug: "people", attribute_slug: "company", title: "Company", attribute_type: "record-reference", is_multivalued: false, is_unique: false, config: { target_object: "companies", inverse: "team" } },
|
|
26
|
+
{ object_slug: "people", attribute_slug: "associated_deals", title: "Associated deals", attribute_type: "record-reference", is_multivalued: true, is_unique: false, config: { target_object: "deals", inverse: "associated_people" } },
|
|
27
|
+
// deals
|
|
28
|
+
{ object_slug: "deals", attribute_slug: "name", title: "Name", attribute_type: "text", is_multivalued: false, is_unique: false },
|
|
29
|
+
{ object_slug: "deals", attribute_slug: "stage", title: "Stage", attribute_type: "status", is_multivalued: false, is_unique: false, config: { options: [{ id: "lead", title: "Lead" }, { id: "in_progress", title: "In Progress" }, { id: "won", title: "Won 🎉" }, { id: "lost", title: "Lost" }] } },
|
|
30
|
+
{ object_slug: "deals", attribute_slug: "value", title: "Value", attribute_type: "currency", is_multivalued: false, is_unique: false, config: { currency_code: "USD" } },
|
|
31
|
+
{ object_slug: "deals", attribute_slug: "associated_company", title: "Associated company", attribute_type: "record-reference", is_multivalued: false, is_unique: false, config: { target_object: "companies", inverse: "associated_deals" } },
|
|
32
|
+
{ object_slug: "deals", attribute_slug: "associated_people", title: "Associated people", attribute_type: "record-reference", is_multivalued: true, is_unique: false, config: { target_object: "people", inverse: "associated_deals" } },
|
|
33
|
+
{ object_slug: "deals", attribute_slug: "close_date", title: "Close date", attribute_type: "date", is_multivalued: false, is_unique: false },
|
|
34
|
+
{ object_slug: "deals", attribute_slug: "next_step", title: "Next step", attribute_type: "text", is_multivalued: false, is_unique: false },
|
|
35
|
+
];
|
|
36
|
+
async function seedObjects(lix) {
|
|
37
|
+
for (const o of OBJECTS) {
|
|
38
|
+
const have = await exec(lix, "SELECT object_slug FROM acrm_object WHERE object_slug = $1", [o.object_slug]);
|
|
39
|
+
if (have.rows.length)
|
|
40
|
+
continue;
|
|
41
|
+
await exec(lix, "INSERT INTO acrm_object (object_slug, singular_name, plural_name) VALUES ($1, $2, $3)", [o.object_slug, o.singular_name, o.plural_name]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function seedAttributes(lix) {
|
|
45
|
+
for (const a of ATTRIBUTES) {
|
|
46
|
+
const have = await exec(lix, "SELECT attribute_slug FROM acrm_attribute WHERE object_slug = $1 AND attribute_slug = $2", [a.object_slug, a.attribute_slug]);
|
|
47
|
+
if (have.rows.length)
|
|
48
|
+
continue;
|
|
49
|
+
const params = [
|
|
50
|
+
a.object_slug,
|
|
51
|
+
a.attribute_slug,
|
|
52
|
+
a.title,
|
|
53
|
+
a.attribute_type,
|
|
54
|
+
a.is_multivalued,
|
|
55
|
+
a.is_unique,
|
|
56
|
+
a.config ? JSON.stringify(a.config) : null,
|
|
57
|
+
];
|
|
58
|
+
await exec(lix, `INSERT INTO acrm_attribute
|
|
59
|
+
(object_slug, attribute_slug, title, attribute_type, is_multivalued, is_unique, config_json)
|
|
60
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)`, params);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function registerInit(program) {
|
|
64
|
+
program
|
|
65
|
+
.command("init <name>")
|
|
66
|
+
.description("create a new .acrm file in the current directory (e.g. `acrm init cluster.acrm`)")
|
|
67
|
+
.action(async (name) => {
|
|
68
|
+
const root = program.opts();
|
|
69
|
+
setJsonMode(root.json);
|
|
70
|
+
try {
|
|
71
|
+
const lix = await openWorkspace({ workspace: name, create: true });
|
|
72
|
+
try {
|
|
73
|
+
await registerAllSchemas(lix);
|
|
74
|
+
await seedObjects(lix);
|
|
75
|
+
await seedAttributes(lix);
|
|
76
|
+
const workspaceId = await generateUuid(lix);
|
|
77
|
+
ok({ initialized: true, workspace_id: workspaceId });
|
|
78
|
+
if (!isJson()) {
|
|
79
|
+
const bold = process.env.NO_COLOR ? "" : "\x1b[1m";
|
|
80
|
+
const reset = process.env.NO_COLOR ? "" : "\x1b[0m";
|
|
81
|
+
process.stdout.write(`\nNext: ${bold}acrm import csv <path>${reset} to load your leads\n`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
await lix.close();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
if (e instanceof AcrmError)
|
|
90
|
+
fail(e.message, e.code, e.hint);
|
|
91
|
+
else
|
|
92
|
+
fail(e instanceof Error ? e.message : String(e), ERR.INIT);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|