@mchx/arc 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +7 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +35 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +71 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/contacts.d.ts +3 -0
- package/dist/commands/contacts.d.ts.map +1 -0
- package/dist/commands/contacts.js +197 -0
- package/dist/commands/contacts.js.map +1 -0
- package/dist/commands/email.d.ts +3 -0
- package/dist/commands/email.d.ts.map +1 -0
- package/dist/commands/email.js +50 -0
- package/dist/commands/email.js.map +1 -0
- package/dist/commands/forms.d.ts +3 -0
- package/dist/commands/forms.d.ts.map +1 -0
- package/dist/commands/forms.js +92 -0
- package/dist/commands/forms.js.map +1 -0
- package/dist/commands/webhooks.d.ts +3 -0
- package/dist/commands/webhooks.d.ts.map +1 -0
- package/dist/commands/webhooks.js +87 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +5 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +20 -0
- package/dist/output.js.map +1 -0
- package/package.json +35 -0
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class ApiError extends Error {
|
|
2
|
+
status: number;
|
|
3
|
+
body: Record<string, unknown>;
|
|
4
|
+
constructor(status: number, body: Record<string, unknown>);
|
|
5
|
+
}
|
|
6
|
+
export declare function api(method: string, path: string, body?: unknown, params?: Record<string, string>): Promise<any>;
|
|
7
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAS,SAAQ,KAAK;IAExB,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAD7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIvC;AAED,wBAAsB,GAAG,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,gBA6BhC"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { config } from './config.js';
|
|
2
|
+
export class ApiError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
body;
|
|
5
|
+
constructor(status, body) {
|
|
6
|
+
super(body.error || `API error ${status}`);
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.body = body;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function api(method, path, body, params) {
|
|
12
|
+
const apiKey = config.get('api_key');
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
throw new Error('Not authenticated. Run: arc login');
|
|
15
|
+
}
|
|
16
|
+
const apiUrl = config.get('api_url');
|
|
17
|
+
const url = new URL(`/api/v1${path}`, apiUrl);
|
|
18
|
+
if (params) {
|
|
19
|
+
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
20
|
+
}
|
|
21
|
+
const res = await fetch(url.toString(), {
|
|
22
|
+
method,
|
|
23
|
+
headers: {
|
|
24
|
+
Authorization: `Bearer ${apiKey}`,
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
},
|
|
27
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
28
|
+
});
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
throw new ApiError(res.status, data);
|
|
32
|
+
}
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,OAAO,QAAS,SAAQ,KAAK;IAExB;IACA;IAFT,YACS,MAAc,EACd,IAA6B;QAEpC,KAAK,CAAC,IAAI,CAAC,KAAe,IAAI,aAAa,MAAM,EAAE,CAAC,CAAA;QAH7C,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAyB;IAGtC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,MAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;IAC7C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACxE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QACtC,MAAM;QACN,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAqEpD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { config } from '../config.js';
|
|
2
|
+
import { printSuccess, printError } from '../output.js';
|
|
3
|
+
import { createInterface } from 'readline';
|
|
4
|
+
export function registerAuthCommands(program) {
|
|
5
|
+
program
|
|
6
|
+
.command('login')
|
|
7
|
+
.description('Authenticate with your Arc API key')
|
|
8
|
+
.option('--key <key>', 'API key (or enter interactively)')
|
|
9
|
+
.option('--url <url>', 'API URL (default: http://localhost:3000)')
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
let apiKey = opts.key;
|
|
12
|
+
if (!apiKey) {
|
|
13
|
+
const rl = createInterface({
|
|
14
|
+
input: process.stdin,
|
|
15
|
+
output: process.stdout,
|
|
16
|
+
});
|
|
17
|
+
apiKey = await new Promise((resolve) => {
|
|
18
|
+
rl.question('Enter your Arc API key: ', (answer) => {
|
|
19
|
+
rl.close();
|
|
20
|
+
resolve(answer.trim());
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (!apiKey.startsWith('arc_sk_')) {
|
|
25
|
+
printError('Invalid key format. Arc API keys start with arc_sk_');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
config.set('api_key', apiKey);
|
|
29
|
+
if (opts.url)
|
|
30
|
+
config.set('api_url', opts.url);
|
|
31
|
+
// Validate the key
|
|
32
|
+
try {
|
|
33
|
+
const res = await fetch(`${config.get('api_url')}/api/v1/contacts?limit=1`, {
|
|
34
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
35
|
+
});
|
|
36
|
+
if (res.ok) {
|
|
37
|
+
printSuccess('Authenticated successfully.');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
printError('Key is invalid or expired.');
|
|
41
|
+
config.set('api_key', '');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
printError(`Cannot reach ${config.get('api_url')}. Check the URL and try again.`);
|
|
47
|
+
config.set('api_key', '');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
program
|
|
52
|
+
.command('logout')
|
|
53
|
+
.description('Clear stored credentials')
|
|
54
|
+
.action(() => {
|
|
55
|
+
config.set('api_key', '');
|
|
56
|
+
printSuccess('Logged out.');
|
|
57
|
+
});
|
|
58
|
+
program
|
|
59
|
+
.command('whoami')
|
|
60
|
+
.description('Show current auth status')
|
|
61
|
+
.action(() => {
|
|
62
|
+
const key = config.get('api_key');
|
|
63
|
+
if (!key) {
|
|
64
|
+
console.log('Not authenticated. Run: arc login');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
console.log(`API URL: ${config.get('api_url')}`);
|
|
68
|
+
console.log(`API Key: ${key.slice(0, 15)}...`);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAkLvD"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { api } from '../api.js';
|
|
2
|
+
import { printTable, printJson, printError, printSuccess } from '../output.js';
|
|
3
|
+
export function registerContactCommands(program) {
|
|
4
|
+
const contacts = program
|
|
5
|
+
.command('contacts')
|
|
6
|
+
.description('Manage contacts');
|
|
7
|
+
contacts
|
|
8
|
+
.command('list')
|
|
9
|
+
.description('List contacts')
|
|
10
|
+
.option('--stage <stage>', 'Filter by stage')
|
|
11
|
+
.option('--tag <tag>', 'Filter by tag')
|
|
12
|
+
.option('--source <source>', 'Filter by source')
|
|
13
|
+
.option('-q, --query <query>', 'Search by name/email/company')
|
|
14
|
+
.option('--limit <n>', 'Max results', '20')
|
|
15
|
+
.option('--json', 'Output as JSON')
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
try {
|
|
18
|
+
const params = { limit: opts.limit };
|
|
19
|
+
if (opts.stage)
|
|
20
|
+
params.stage = opts.stage;
|
|
21
|
+
if (opts.tag)
|
|
22
|
+
params.tag = opts.tag;
|
|
23
|
+
if (opts.source)
|
|
24
|
+
params.source = opts.source;
|
|
25
|
+
if (opts.query)
|
|
26
|
+
params.q = opts.query;
|
|
27
|
+
const result = await api('GET', '/contacts', undefined, params);
|
|
28
|
+
if (opts.json) {
|
|
29
|
+
printJson(result.data);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (!result.data || result.data.length === 0) {
|
|
33
|
+
console.log('No contacts found.');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
printTable(['Name', 'Email', 'Stage', 'Source', 'Created'], result.data.map((c) => [
|
|
37
|
+
[c.first_name, c.last_name].filter(Boolean).join(' ') || '—',
|
|
38
|
+
c.email || '—',
|
|
39
|
+
c.stage || '—',
|
|
40
|
+
c.source || '—',
|
|
41
|
+
c.created_at ? new Date(c.created_at).toLocaleDateString() : '—',
|
|
42
|
+
]));
|
|
43
|
+
console.log(`\n${result.count} total`);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
printError(e.message);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
contacts
|
|
50
|
+
.command('add')
|
|
51
|
+
.description('Add a contact')
|
|
52
|
+
.argument('[json]', 'JSON object with contact data')
|
|
53
|
+
.option('--email <email>')
|
|
54
|
+
.option('--first-name <name>')
|
|
55
|
+
.option('--last-name <name>')
|
|
56
|
+
.option('--company <company>')
|
|
57
|
+
.option('--phone <phone>')
|
|
58
|
+
.option('--stage <stage>')
|
|
59
|
+
.option('--source <source>')
|
|
60
|
+
.option('--tags <tags>', 'Comma-separated tags')
|
|
61
|
+
.option('--upsert', 'Update if email exists')
|
|
62
|
+
.option('--json', 'Output as JSON')
|
|
63
|
+
.action(async (jsonArg, opts) => {
|
|
64
|
+
try {
|
|
65
|
+
let body;
|
|
66
|
+
if (jsonArg) {
|
|
67
|
+
body = JSON.parse(jsonArg);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
body = {};
|
|
71
|
+
if (opts.email)
|
|
72
|
+
body.email = opts.email;
|
|
73
|
+
if (opts.firstName)
|
|
74
|
+
body.first_name = opts.firstName;
|
|
75
|
+
if (opts.lastName)
|
|
76
|
+
body.last_name = opts.lastName;
|
|
77
|
+
if (opts.company)
|
|
78
|
+
body.company = opts.company;
|
|
79
|
+
if (opts.phone)
|
|
80
|
+
body.phone = opts.phone;
|
|
81
|
+
if (opts.stage)
|
|
82
|
+
body.stage = opts.stage;
|
|
83
|
+
if (opts.source)
|
|
84
|
+
body.source = opts.source;
|
|
85
|
+
if (opts.tags)
|
|
86
|
+
body.tags = opts.tags.split(',').map((t) => t.trim());
|
|
87
|
+
if (opts.upsert)
|
|
88
|
+
body.upsert = true;
|
|
89
|
+
}
|
|
90
|
+
const result = await api('POST', '/contacts', body);
|
|
91
|
+
if (opts.json) {
|
|
92
|
+
printJson(result.data);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
printSuccess(`Contact created: ${result.data.email || result.data.id}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
printError(e.message);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
contacts
|
|
103
|
+
.command('get')
|
|
104
|
+
.description('Get a contact by ID')
|
|
105
|
+
.argument('<id>', 'Contact ID')
|
|
106
|
+
.option('--json', 'Output as JSON')
|
|
107
|
+
.action(async (id, opts) => {
|
|
108
|
+
try {
|
|
109
|
+
const result = await api('GET', `/contacts/${id}`);
|
|
110
|
+
if (opts.json) {
|
|
111
|
+
printJson(result.data);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const c = result.data;
|
|
115
|
+
console.log(`Name: ${[c.first_name, c.last_name].filter(Boolean).join(' ') || '—'}`);
|
|
116
|
+
console.log(`Email: ${c.email || '—'}`);
|
|
117
|
+
console.log(`Phone: ${c.phone || '—'}`);
|
|
118
|
+
console.log(`Company: ${c.company || '—'}`);
|
|
119
|
+
console.log(`Stage: ${c.stage}`);
|
|
120
|
+
console.log(`Source: ${c.source || '—'}`);
|
|
121
|
+
console.log(`Tags: ${c.tags?.length ? c.tags.join(', ') : '—'}`);
|
|
122
|
+
if (c.notes)
|
|
123
|
+
console.log(`Notes: ${c.notes}`);
|
|
124
|
+
if (c.activities?.length) {
|
|
125
|
+
console.log(`\nRecent Activity:`);
|
|
126
|
+
c.activities.forEach((a) => {
|
|
127
|
+
console.log(` ${a.type} — ${new Date(a.created_at).toLocaleString()}`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
printError(e.message);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
contacts
|
|
137
|
+
.command('update')
|
|
138
|
+
.description('Update a contact')
|
|
139
|
+
.argument('<id>', 'Contact ID')
|
|
140
|
+
.option('--email <email>')
|
|
141
|
+
.option('--first-name <name>')
|
|
142
|
+
.option('--last-name <name>')
|
|
143
|
+
.option('--company <company>')
|
|
144
|
+
.option('--phone <phone>')
|
|
145
|
+
.option('--stage <stage>')
|
|
146
|
+
.option('--source <source>')
|
|
147
|
+
.option('--tags <tags>', 'Comma-separated tags')
|
|
148
|
+
.option('--notes <notes>')
|
|
149
|
+
.option('--json', 'Output as JSON')
|
|
150
|
+
.action(async (id, opts) => {
|
|
151
|
+
try {
|
|
152
|
+
const body = {};
|
|
153
|
+
if (opts.email)
|
|
154
|
+
body.email = opts.email;
|
|
155
|
+
if (opts.firstName)
|
|
156
|
+
body.first_name = opts.firstName;
|
|
157
|
+
if (opts.lastName)
|
|
158
|
+
body.last_name = opts.lastName;
|
|
159
|
+
if (opts.company)
|
|
160
|
+
body.company = opts.company;
|
|
161
|
+
if (opts.phone)
|
|
162
|
+
body.phone = opts.phone;
|
|
163
|
+
if (opts.stage)
|
|
164
|
+
body.stage = opts.stage;
|
|
165
|
+
if (opts.source)
|
|
166
|
+
body.source = opts.source;
|
|
167
|
+
if (opts.tags)
|
|
168
|
+
body.tags = opts.tags.split(',').map((t) => t.trim());
|
|
169
|
+
if (opts.notes)
|
|
170
|
+
body.notes = opts.notes;
|
|
171
|
+
const result = await api('PATCH', `/contacts/${id}`, body);
|
|
172
|
+
if (opts.json) {
|
|
173
|
+
printJson(result.data);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
printSuccess(`Contact updated: ${result.data.email || result.data.id}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
printError(e.message);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
contacts
|
|
184
|
+
.command('delete')
|
|
185
|
+
.description('Delete a contact')
|
|
186
|
+
.argument('<id>', 'Contact ID')
|
|
187
|
+
.action(async (id) => {
|
|
188
|
+
try {
|
|
189
|
+
await api('DELETE', `/contacts/${id}`);
|
|
190
|
+
printSuccess('Contact deleted.');
|
|
191
|
+
}
|
|
192
|
+
catch (e) {
|
|
193
|
+
printError(e.message);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=contacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/commands/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA+CrD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { api } from '../api.js';
|
|
2
|
+
import { printJson, printError, printSuccess } from '../output.js';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
export function registerEmailCommands(program) {
|
|
5
|
+
const email = program
|
|
6
|
+
.command('email')
|
|
7
|
+
.description('Send email via BYOK Resend');
|
|
8
|
+
email
|
|
9
|
+
.command('send')
|
|
10
|
+
.description('Send an email to a contact')
|
|
11
|
+
.requiredOption('--to <email>', 'Recipient email')
|
|
12
|
+
.requiredOption('--subject <subject>', 'Email subject')
|
|
13
|
+
.option('--html <html>', 'HTML body')
|
|
14
|
+
.option('--html-file <path>', 'Read HTML body from file')
|
|
15
|
+
.option('--from <from>', 'From address (overrides workspace default)')
|
|
16
|
+
.option('--contact-id <id>', 'Link to a contact by ID')
|
|
17
|
+
.option('--json', 'Output as JSON')
|
|
18
|
+
.action(async (opts) => {
|
|
19
|
+
try {
|
|
20
|
+
let html = opts.html;
|
|
21
|
+
if (opts.htmlFile) {
|
|
22
|
+
html = readFileSync(opts.htmlFile, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
if (!html) {
|
|
25
|
+
printError('Provide --html or --html-file');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const body = {
|
|
29
|
+
to: opts.to,
|
|
30
|
+
subject: opts.subject,
|
|
31
|
+
html,
|
|
32
|
+
};
|
|
33
|
+
if (opts.from)
|
|
34
|
+
body.from = opts.from;
|
|
35
|
+
if (opts.contactId)
|
|
36
|
+
body.contact_id = opts.contactId;
|
|
37
|
+
const result = await api('POST', '/email/send', body);
|
|
38
|
+
if (opts.json) {
|
|
39
|
+
printJson(result);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
printSuccess(`Email sent to ${opts.to} (ID: ${result.email_id})`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
printError(e.message);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/commands/email.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEjC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4BAA4B,CAAC,CAAA;IAE5C,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,cAAc,CAAC,cAAc,EAAE,iBAAiB,CAAC;SACjD,cAAc,CAAC,qBAAqB,EAAE,eAAe,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;SACpC,MAAM,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;SACrE,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;YAEpB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,UAAU,CAAC,+BAA+B,CAAC,CAAA;gBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YAED,MAAM,IAAI,GAA4B;gBACpC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI;aACL,CAAA;YACD,IAAI,IAAI,CAAC,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;YACpC,IAAI,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAA;YAEpD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;YAErD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,CAAC,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,iBAAiB,IAAI,CAAC,EAAE,SAAS,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAA;YACnE,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,UAAU,CAAE,CAAW,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/commands/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAgGpD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { api } from '../api.js';
|
|
2
|
+
import { config } from '../config.js';
|
|
3
|
+
import { printTable, printJson, printError, printSuccess } from '../output.js';
|
|
4
|
+
export function registerFormCommands(program) {
|
|
5
|
+
const forms = program
|
|
6
|
+
.command('forms')
|
|
7
|
+
.description('Manage form endpoints');
|
|
8
|
+
forms
|
|
9
|
+
.command('list')
|
|
10
|
+
.description('List form endpoints')
|
|
11
|
+
.option('--json', 'Output as JSON')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
try {
|
|
14
|
+
const result = await api('GET', '/forms');
|
|
15
|
+
if (opts.json) {
|
|
16
|
+
printJson(result.data);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (!result.data || result.data.length === 0) {
|
|
20
|
+
console.log('No forms yet. Create one with: arc forms create --name "My Form"');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
printTable(['Name', 'ID', 'Stage', 'Tags', 'Active', 'Created'], result.data.map((f) => [
|
|
24
|
+
f.name,
|
|
25
|
+
f.id,
|
|
26
|
+
f.assign_stage || 'lead',
|
|
27
|
+
f.assign_tags?.join(', ') || '—',
|
|
28
|
+
f.active ? 'yes' : 'no',
|
|
29
|
+
f.created_at ? new Date(f.created_at).toLocaleDateString() : '—',
|
|
30
|
+
]));
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
printError(e.message);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
forms
|
|
37
|
+
.command('create')
|
|
38
|
+
.description('Create a form endpoint')
|
|
39
|
+
.option('--name <name>', 'Form name', 'Form')
|
|
40
|
+
.option('--stage <stage>', 'Assign contacts to this stage', 'lead')
|
|
41
|
+
.option('--tags <tags>', 'Comma-separated tags to auto-assign')
|
|
42
|
+
.option('--origins <origins>', 'Comma-separated allowed origins')
|
|
43
|
+
.option('--json', 'Output as JSON')
|
|
44
|
+
.action(async (opts) => {
|
|
45
|
+
try {
|
|
46
|
+
const body = {
|
|
47
|
+
name: opts.name,
|
|
48
|
+
assign_stage: opts.stage,
|
|
49
|
+
};
|
|
50
|
+
if (opts.tags) {
|
|
51
|
+
body.assign_tags = opts.tags.split(',').map((t) => t.trim());
|
|
52
|
+
}
|
|
53
|
+
if (opts.origins) {
|
|
54
|
+
body.allowed_origins = opts.origins.split(',').map((o) => o.trim());
|
|
55
|
+
}
|
|
56
|
+
const result = await api('POST', '/forms', body);
|
|
57
|
+
if (opts.json) {
|
|
58
|
+
printJson(result.data);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const apiUrl = config.get('api_url');
|
|
62
|
+
printSuccess(`Form created: ${result.data.name}`);
|
|
63
|
+
console.log(`\nForm ID: ${result.data.id}`);
|
|
64
|
+
console.log(`Endpoint: ${apiUrl}/api/v1/forms/submit`);
|
|
65
|
+
console.log(`\nExample HTML:`);
|
|
66
|
+
console.log(` <form action="${apiUrl}/api/v1/forms/submit" method="POST">`);
|
|
67
|
+
console.log(` <input type="hidden" name="form_id" value="${result.data.id}" />`);
|
|
68
|
+
console.log(` <input type="hidden" name="_honey" style="display:none" />`);
|
|
69
|
+
console.log(` <input name="email" type="email" placeholder="Email" required />`);
|
|
70
|
+
console.log(` <input name="first_name" placeholder="First Name" />`);
|
|
71
|
+
console.log(` <button type="submit">Submit</button>`);
|
|
72
|
+
console.log(` </form>`);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
printError(e.message);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
forms
|
|
79
|
+
.command('delete')
|
|
80
|
+
.description('Delete a form endpoint')
|
|
81
|
+
.argument('<id>', 'Form ID')
|
|
82
|
+
.action(async (id) => {
|
|
83
|
+
try {
|
|
84
|
+
await api('DELETE', `/forms?id=${id}`);
|
|
85
|
+
printSuccess('Form deleted.');
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
printError(e.message);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=forms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/commands/forms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QA4FvD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { api } from '../api.js';
|
|
2
|
+
import { config } from '../config.js';
|
|
3
|
+
import { printTable, printJson, printError, printSuccess } from '../output.js';
|
|
4
|
+
export function registerWebhookCommands(program) {
|
|
5
|
+
const webhooks = program
|
|
6
|
+
.command('webhooks')
|
|
7
|
+
.description('Manage inbound webhooks');
|
|
8
|
+
webhooks
|
|
9
|
+
.command('list')
|
|
10
|
+
.description('List webhooks')
|
|
11
|
+
.option('--json', 'Output as JSON')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
try {
|
|
14
|
+
const result = await api('GET', '/webhooks');
|
|
15
|
+
if (opts.json) {
|
|
16
|
+
printJson(result.data);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (!result.data || result.data.length === 0) {
|
|
20
|
+
console.log('No webhooks yet. Create one with: arc webhooks create --name "Stripe"');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
printTable(['Name', 'ID', 'Action', 'Active', 'Created'], result.data.map((w) => [
|
|
24
|
+
w.name,
|
|
25
|
+
w.id,
|
|
26
|
+
w.target_action,
|
|
27
|
+
w.active ? 'yes' : 'no',
|
|
28
|
+
w.created_at ? new Date(w.created_at).toLocaleDateString() : '—',
|
|
29
|
+
]));
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
printError(e.message);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
webhooks
|
|
36
|
+
.command('create')
|
|
37
|
+
.description('Create an inbound webhook')
|
|
38
|
+
.option('--name <name>', 'Webhook name', 'Webhook')
|
|
39
|
+
.option('--action <action>', 'Target action: create_contact, update_contact, log_activity', 'create_contact')
|
|
40
|
+
.option('--mapping <json>', 'Field mapping as JSON: {"arc_field":"payload.path"}')
|
|
41
|
+
.option('--no-secret', 'Skip generating a signing secret')
|
|
42
|
+
.option('--json', 'Output as JSON')
|
|
43
|
+
.action(async (opts) => {
|
|
44
|
+
try {
|
|
45
|
+
const body = {
|
|
46
|
+
name: opts.name,
|
|
47
|
+
target_action: opts.action,
|
|
48
|
+
generate_secret: opts.secret !== false,
|
|
49
|
+
};
|
|
50
|
+
if (opts.mapping) {
|
|
51
|
+
body.field_mapping = JSON.parse(opts.mapping);
|
|
52
|
+
}
|
|
53
|
+
const result = await api('POST', '/webhooks', body);
|
|
54
|
+
if (opts.json) {
|
|
55
|
+
printJson(result.data);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const apiUrl = config.get('api_url');
|
|
59
|
+
printSuccess(`Webhook created: ${result.data.name}`);
|
|
60
|
+
console.log(`\nWebhook ID: ${result.data.id}`);
|
|
61
|
+
console.log(`Endpoint: ${apiUrl}/api/v1/webhooks/inbound/${result.data.id}`);
|
|
62
|
+
console.log(`Action: ${result.data.target_action}`);
|
|
63
|
+
if (result.data.secret) {
|
|
64
|
+
console.log(`Secret: ${result.data.secret}`);
|
|
65
|
+
console.log(`\n⚠ Save this secret — it won't be shown again.`);
|
|
66
|
+
console.log(`Use it to verify webhook signatures (HMAC-SHA256).`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
printError(e.message);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
webhooks
|
|
74
|
+
.command('delete')
|
|
75
|
+
.description('Delete a webhook')
|
|
76
|
+
.argument('<id>', 'Webhook ID')
|
|
77
|
+
.action(async (id) => {
|
|
78
|
+
try {
|
|
79
|
+
await api('DELETE', `/webhooks?id=${id}`);
|
|
80
|
+
printSuccess('Webhook deleted.');
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
printError(e.message);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,OAAO,GAAG,MAAM,CAAA;CACjC;AAED,eAAO,MAAM,MAAM,iBAOjB,CAAA"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAQvB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAY;IACxC,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE;QACR,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,uBAAuB;QAChC,cAAc,EAAE,OAAO;KACxB;CACF,CAAC,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { registerAuthCommands } from './commands/auth.js';
|
|
4
|
+
import { registerContactCommands } from './commands/contacts.js';
|
|
5
|
+
import { registerFormCommands } from './commands/forms.js';
|
|
6
|
+
import { registerWebhookCommands } from './commands/webhooks.js';
|
|
7
|
+
import { registerEmailCommands } from './commands/email.js';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name('arc')
|
|
11
|
+
.description('Arc — API-first marketing ops from the terminal')
|
|
12
|
+
.version('0.1.0');
|
|
13
|
+
registerAuthCommands(program);
|
|
14
|
+
registerContactCommands(program);
|
|
15
|
+
registerFormCommands(program);
|
|
16
|
+
registerWebhookCommands(program);
|
|
17
|
+
registerEmailCommands(program);
|
|
18
|
+
program.parse();
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,iDAAiD,CAAC;KAC9D,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function printTable(headers: string[], rows: string[][]): void;
|
|
2
|
+
export declare function printJson(data: unknown): void;
|
|
3
|
+
export declare function printError(msg: string): void;
|
|
4
|
+
export declare function printSuccess(msg: string): void;
|
|
5
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,QAQjB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,QAEtC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,QAErC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,QAEvC"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import Table from 'cli-table3';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export function printTable(headers, rows) {
|
|
4
|
+
const table = new Table({
|
|
5
|
+
head: headers.map((h) => chalk.bold(h)),
|
|
6
|
+
style: { head: [], border: [] },
|
|
7
|
+
});
|
|
8
|
+
rows.forEach((row) => table.push(row));
|
|
9
|
+
console.log(table.toString());
|
|
10
|
+
}
|
|
11
|
+
export function printJson(data) {
|
|
12
|
+
console.log(JSON.stringify(data, null, 2));
|
|
13
|
+
}
|
|
14
|
+
export function printError(msg) {
|
|
15
|
+
console.error(chalk.red(`Error: ${msg}`));
|
|
16
|
+
}
|
|
17
|
+
export function printSuccess(msg) {
|
|
18
|
+
console.log(chalk.green(msg));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,UAAU,UAAU,CACxB,OAAiB,EACjB,IAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;KAChC,CAAC,CAAA;IACF,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;AAC/B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mchx/arc",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Arc — API-first marketing ops from the terminal",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"arc": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"keywords": ["cli", "crm", "marketing", "api", "contacts"],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/mattchx/arc",
|
|
18
|
+
"directory": "packages/cli"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"dev": "tsc --watch",
|
|
23
|
+
"prepublishOnly": "tsc"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"chalk": "^5.4.1",
|
|
27
|
+
"cli-table3": "^0.6.5",
|
|
28
|
+
"commander": "^13.1.0",
|
|
29
|
+
"conf": "^13.1.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^22.0.0",
|
|
33
|
+
"typescript": "^5.7.0"
|
|
34
|
+
}
|
|
35
|
+
}
|