@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 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
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAuthCommands(program: Command): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerContactCommands(program: Command): void;
3
+ //# sourceMappingURL=contacts.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerEmailCommands(program: Command): void;
3
+ //# sourceMappingURL=email.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerFormCommands(program: Command): void;
3
+ //# sourceMappingURL=forms.d.ts.map
@@ -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":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE9E,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uBAAuB,CAAC,CAAA;IAEvC,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAEzC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACtB,OAAM;YACR,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAA;gBAC/E,OAAM;YACR,CAAC;YAED,UAAU,CACR,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,EACpD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC;gBAC9C,CAAC,CAAC,IAAc;gBAChB,CAAC,CAAC,EAAY;gBACd,CAAC,CAAC,YAAsB,IAAI,MAAM;gBACjC,CAAC,CAAC,WAAwB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG;gBAC9C,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBACvB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAoB,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,GAAG;aAC3E,CAAC,CACH,CAAA;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,UAAU,CAAE,CAAW,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,MAAM,CAAC;SAC5C,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,CAAC;SAClE,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;SAChE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,GAA4B;gBACpC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,YAAY,EAAE,IAAI,CAAC,KAAK;aACzB,CAAA;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YACtE,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YAC7E,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;YAEhD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACtB,OAAM;YACR,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACpC,YAAY,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,sBAAsB,CAAC,CAAA;YACvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;YAC9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,sCAAsC,CAAC,CAAA;YAC5E,OAAO,CAAC,GAAG,CAAC,kDAAkD,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YACnF,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;YAC7E,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAA;YACnF,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;YACvE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;YACxD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,UAAU,CAAE,CAAW,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;SAC3B,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;YACtC,YAAY,CAAC,eAAe,CAAC,CAAA;QAC/B,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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerWebhookCommands(program: Command): void;
3
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -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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"}
@@ -0,0 +1,9 @@
1
+ import Conf from 'conf';
2
+ interface ArcConfig {
3
+ api_key: string;
4
+ api_url: string;
5
+ default_format: 'table' | 'json';
6
+ }
7
+ export declare const config: Conf<ArcConfig>;
8
+ export {};
9
+ //# sourceMappingURL=config.d.ts.map
@@ -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,10 @@
1
+ import Conf from 'conf';
2
+ export const config = new Conf({
3
+ projectName: 'arc',
4
+ defaults: {
5
+ api_key: '',
6
+ api_url: 'http://localhost:3000',
7
+ default_format: 'table',
8
+ },
9
+ });
10
+ //# sourceMappingURL=config.js.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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
+ }