archer-wizard 0.2.0 → 0.2.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/dist/wizard/index.d.ts.map +1 -1
- package/dist/wizard/index.js +57 -23
- package/dist/wizard/index.js.map +1 -1
- package/dist/wizard/scanner.d.ts.map +1 -1
- package/dist/wizard/scanner.js +0 -23
- package/dist/wizard/scanner.js.map +1 -1
- package/package.json +1 -1
- package/src/wizard/index.ts +54 -24
- package/src/wizard/scanner.ts +0 -23
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"AAcA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAoF/C"}
|
package/dist/wizard/index.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import * as clack from '@clack/prompts';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
|
-
import { showAsciiArt,
|
|
3
|
+
import { showAsciiArt, showSuccessBox } from '../lib/ascii.js';
|
|
4
4
|
import { scanProject, promptForMissing } from './scanner.js';
|
|
5
5
|
import { detectAgents } from './detector.js';
|
|
6
6
|
import { injectIntoAgents } from './injector.js';
|
|
7
7
|
import { injectRules } from './rules.js';
|
|
8
|
+
// ─── Helpers ─────────────────────────────────────────────────
|
|
9
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
8
10
|
// ─── Wizard Sequence ────────────────────────────────────────
|
|
9
11
|
export async function runWizard() {
|
|
10
12
|
const cwd = process.cwd();
|
|
@@ -12,38 +14,70 @@ export async function runWizard() {
|
|
|
12
14
|
showAsciiArt();
|
|
13
15
|
// ─ Step 2: Start clack ─
|
|
14
16
|
clack.intro(pc.bgGreen(pc.black(' archer setup ')));
|
|
15
|
-
// ─ Step 3:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
// ─ Step 3: Scan for Supabase credentials ─
|
|
18
|
+
const s = clack.spinner();
|
|
19
|
+
s.start('scanning project for supabase credentials');
|
|
20
|
+
await sleep(600);
|
|
19
21
|
const scan = await scanProject(cwd);
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
await sleep(300);
|
|
23
|
+
// Build scan summary lines
|
|
24
|
+
const scanNotes = [];
|
|
25
|
+
if (scan.supabaseUrl)
|
|
26
|
+
scanNotes.push('SUPABASE_URL');
|
|
27
|
+
if (scan.serviceRoleKey)
|
|
28
|
+
scanNotes.push('SERVICE_ROLE_KEY');
|
|
29
|
+
if (scan.anonKey)
|
|
30
|
+
scanNotes.push('ANON_KEY');
|
|
31
|
+
if (scan.foundInFile)
|
|
32
|
+
scanNotes.push(`from ${scan.foundInFile}`);
|
|
33
|
+
if (scanNotes.length > 0) {
|
|
34
|
+
s.stop(`found ${pc.green(scanNotes.join(pc.dim(' · ')))}`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
s.stop(pc.yellow('no credentials found — will prompt'));
|
|
24
38
|
}
|
|
25
|
-
|
|
26
|
-
|
|
39
|
+
// ─ Step 4: Framework detection ─
|
|
40
|
+
if (scan.framework !== 'unknown' || scan.hasSupabaseInstalled) {
|
|
41
|
+
const s2 = clack.spinner();
|
|
42
|
+
s2.start('detecting project framework');
|
|
43
|
+
await sleep(400);
|
|
44
|
+
const parts = [];
|
|
45
|
+
if (scan.framework !== 'unknown')
|
|
46
|
+
parts.push(pc.bold(scan.framework));
|
|
47
|
+
if (scan.hasSupabaseInstalled)
|
|
48
|
+
parts.push(pc.dim('@supabase/supabase-js'));
|
|
49
|
+
s2.stop(`detected ${parts.join(pc.dim(' + '))}`);
|
|
27
50
|
}
|
|
28
|
-
// ─ Step
|
|
51
|
+
// ─ Step 5: Prompt for missing credentials ─
|
|
29
52
|
const credentials = await promptForMissing(scan);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
53
|
+
// ─ Step 6: Detect agents ─
|
|
54
|
+
const s3 = clack.spinner();
|
|
55
|
+
s3.start('scanning for AI agents');
|
|
56
|
+
await sleep(500);
|
|
33
57
|
const agents = detectAgents();
|
|
34
|
-
|
|
35
|
-
|
|
58
|
+
await sleep(200);
|
|
59
|
+
if (agents.length > 0) {
|
|
60
|
+
const names = agents.map((a) => pc.bold(a.name)).join(pc.dim(', '));
|
|
61
|
+
s3.stop(`found ${pc.green(String(agents.length))} agent${agents.length !== 1 ? 's' : ''} — ${names}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
s3.stop(pc.yellow('no agents found'));
|
|
65
|
+
}
|
|
66
|
+
// ─ Step 7: Inject into agents ─
|
|
36
67
|
const injectionResults = await injectIntoAgents(agents, credentials.supabaseUrl, credentials.serviceRoleKey);
|
|
37
|
-
|
|
38
|
-
// ─ Step 12: Filter successful injections ─
|
|
68
|
+
// ─ Step 8: Filter successful injections ─
|
|
39
69
|
const successfulAgents = agents.filter((a) => injectionResults.some((r) => r.agent === a.name && r.success));
|
|
40
|
-
// ─ Step
|
|
70
|
+
// ─ Step 9: Inject rules ─
|
|
41
71
|
if (successfulAgents.length > 0) {
|
|
42
|
-
|
|
72
|
+
const s4 = clack.spinner();
|
|
73
|
+
s4.start('writing agent rules');
|
|
74
|
+
await sleep(400);
|
|
43
75
|
injectRules(successfulAgents);
|
|
44
|
-
|
|
76
|
+
await sleep(200);
|
|
77
|
+
s4.stop(`rules injected into ${pc.green(String(successfulAgents.length))} agent${successfulAgents.length !== 1 ? 's' : ''}`);
|
|
45
78
|
}
|
|
46
|
-
// ─ Step
|
|
79
|
+
// ─ Step 10: Success ─
|
|
80
|
+
console.log();
|
|
47
81
|
showSuccessBox(successfulAgents.length);
|
|
48
82
|
clack.outro(pc.dim('docs → github.com/archer-mcp'));
|
|
49
83
|
}
|
package/dist/wizard/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/wizard/scanner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/wizard/scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,mBAAmB,CAAC;AAgL/D,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkElE;AAID,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAgD1D"}
|
package/dist/wizard/scanner.js
CHANGED
|
@@ -2,7 +2,6 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import * as clack from '@clack/prompts';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import { logSuccess, logError, maskCredential } from '../lib/ascii.js';
|
|
6
5
|
// Helper to search for keys in files
|
|
7
6
|
function searchInFiles(cwd, patterns) {
|
|
8
7
|
const results = new Map();
|
|
@@ -195,28 +194,6 @@ export async function scanProject(cwd) {
|
|
|
195
194
|
const serviceRoleKey = findByAliases(mergedEnv, SERVICE_ROLE_KEY_ALIASES);
|
|
196
195
|
const anonKey = findByAliases(mergedEnv, ANON_KEY_ALIASES);
|
|
197
196
|
const { framework, hasSupabaseInstalled } = detectFramework(cwd);
|
|
198
|
-
// Log found credentials
|
|
199
|
-
if (supabaseUrl) {
|
|
200
|
-
logSuccess(`SUPABASE_URL = ${maskCredential(supabaseUrl)}`);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
logError('missing SUPABASE_URL');
|
|
204
|
-
}
|
|
205
|
-
if (serviceRoleKey) {
|
|
206
|
-
logSuccess(`SUPABASE_SERVICE_ROLE_KEY = ${maskCredential(serviceRoleKey)}`);
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
logError('missing SUPABASE_SERVICE_ROLE_KEY');
|
|
210
|
-
}
|
|
211
|
-
if (anonKey) {
|
|
212
|
-
logSuccess(`SUPABASE_ANON_KEY = ${maskCredential(anonKey)}`);
|
|
213
|
-
}
|
|
214
|
-
if (foundInFile) {
|
|
215
|
-
logSuccess(`found credentials in ${foundInFile}`);
|
|
216
|
-
}
|
|
217
|
-
else if (codebaseResults.size > 0) {
|
|
218
|
-
logSuccess(`found credentials in codebase`);
|
|
219
|
-
}
|
|
220
197
|
return {
|
|
221
198
|
supabaseUrl,
|
|
222
199
|
serviceRoleKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/wizard/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/wizard/scanner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/wizard/index.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import * as clack from '@clack/prompts';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
|
-
import { showAsciiArt,
|
|
3
|
+
import { showAsciiArt, showSuccessBox } from '../lib/ascii.js';
|
|
4
4
|
import { scanProject, promptForMissing } from './scanner.js';
|
|
5
5
|
import { detectAgents } from './detector.js';
|
|
6
6
|
import { injectIntoAgents } from './injector.js';
|
|
7
7
|
import { injectRules } from './rules.js';
|
|
8
8
|
|
|
9
|
+
// ─── Helpers ─────────────────────────────────────────────────
|
|
10
|
+
|
|
11
|
+
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
|
|
12
|
+
|
|
9
13
|
// ─── Wizard Sequence ────────────────────────────────────────
|
|
10
14
|
|
|
11
15
|
export async function runWizard(): Promise<void> {
|
|
@@ -17,52 +21,78 @@ export async function runWizard(): Promise<void> {
|
|
|
17
21
|
// ─ Step 2: Start clack ─
|
|
18
22
|
clack.intro(pc.bgGreen(pc.black(' archer setup ')));
|
|
19
23
|
|
|
20
|
-
// ─ Step 3:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// ─ Step 4-6: Scan env files ─
|
|
24
|
+
// ─ Step 3: Scan for Supabase credentials ─
|
|
25
|
+
const s = clack.spinner();
|
|
26
|
+
s.start('scanning project for supabase credentials');
|
|
27
|
+
await sleep(600);
|
|
25
28
|
const scan = await scanProject(cwd);
|
|
26
|
-
|
|
29
|
+
await sleep(300);
|
|
30
|
+
|
|
31
|
+
// Build scan summary lines
|
|
32
|
+
const scanNotes: string[] = [];
|
|
33
|
+
if (scan.supabaseUrl) scanNotes.push('SUPABASE_URL');
|
|
34
|
+
if (scan.serviceRoleKey) scanNotes.push('SERVICE_ROLE_KEY');
|
|
35
|
+
if (scan.anonKey) scanNotes.push('ANON_KEY');
|
|
36
|
+
if (scan.foundInFile) scanNotes.push(`from ${scan.foundInFile}`);
|
|
27
37
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
if (scanNotes.length > 0) {
|
|
39
|
+
s.stop(`found ${pc.green(scanNotes.join(pc.dim(' · ')))}`);
|
|
40
|
+
} else {
|
|
41
|
+
s.stop(pc.yellow('no credentials found — will prompt'));
|
|
31
42
|
}
|
|
32
|
-
|
|
33
|
-
|
|
43
|
+
|
|
44
|
+
// ─ Step 4: Framework detection ─
|
|
45
|
+
if (scan.framework !== 'unknown' || scan.hasSupabaseInstalled) {
|
|
46
|
+
const s2 = clack.spinner();
|
|
47
|
+
s2.start('detecting project framework');
|
|
48
|
+
await sleep(400);
|
|
49
|
+
const parts: string[] = [];
|
|
50
|
+
if (scan.framework !== 'unknown') parts.push(pc.bold(scan.framework));
|
|
51
|
+
if (scan.hasSupabaseInstalled) parts.push(pc.dim('@supabase/supabase-js'));
|
|
52
|
+
s2.stop(`detected ${parts.join(pc.dim(' + '))}`);
|
|
34
53
|
}
|
|
35
54
|
|
|
36
|
-
// ─ Step
|
|
55
|
+
// ─ Step 5: Prompt for missing credentials ─
|
|
37
56
|
const credentials = await promptForMissing(scan);
|
|
38
|
-
console.log();
|
|
39
57
|
|
|
40
|
-
// ─ Step
|
|
41
|
-
|
|
58
|
+
// ─ Step 6: Detect agents ─
|
|
59
|
+
const s3 = clack.spinner();
|
|
60
|
+
s3.start('scanning for AI agents');
|
|
61
|
+
await sleep(500);
|
|
42
62
|
const agents = detectAgents();
|
|
43
|
-
|
|
63
|
+
await sleep(200);
|
|
64
|
+
|
|
65
|
+
if (agents.length > 0) {
|
|
66
|
+
const names = agents.map((a) => pc.bold(a.name)).join(pc.dim(', '));
|
|
67
|
+
s3.stop(`found ${pc.green(String(agents.length))} agent${agents.length !== 1 ? 's' : ''} — ${names}`);
|
|
68
|
+
} else {
|
|
69
|
+
s3.stop(pc.yellow('no agents found'));
|
|
70
|
+
}
|
|
44
71
|
|
|
45
|
-
// ─ Step
|
|
72
|
+
// ─ Step 7: Inject into agents ─
|
|
46
73
|
const injectionResults = await injectIntoAgents(
|
|
47
74
|
agents,
|
|
48
75
|
credentials.supabaseUrl,
|
|
49
76
|
credentials.serviceRoleKey,
|
|
50
77
|
);
|
|
51
|
-
console.log();
|
|
52
78
|
|
|
53
|
-
// ─ Step
|
|
79
|
+
// ─ Step 8: Filter successful injections ─
|
|
54
80
|
const successfulAgents = agents.filter((a) =>
|
|
55
81
|
injectionResults.some((r) => r.agent === a.name && r.success),
|
|
56
82
|
);
|
|
57
83
|
|
|
58
|
-
// ─ Step
|
|
84
|
+
// ─ Step 9: Inject rules ─
|
|
59
85
|
if (successfulAgents.length > 0) {
|
|
60
|
-
|
|
86
|
+
const s4 = clack.spinner();
|
|
87
|
+
s4.start('writing agent rules');
|
|
88
|
+
await sleep(400);
|
|
61
89
|
injectRules(successfulAgents);
|
|
62
|
-
|
|
90
|
+
await sleep(200);
|
|
91
|
+
s4.stop(`rules injected into ${pc.green(String(successfulAgents.length))} agent${successfulAgents.length !== 1 ? 's' : ''}`);
|
|
63
92
|
}
|
|
64
93
|
|
|
65
|
-
// ─ Step
|
|
94
|
+
// ─ Step 10: Success ─
|
|
95
|
+
console.log();
|
|
66
96
|
showSuccessBox(successfulAgents.length);
|
|
67
97
|
|
|
68
98
|
clack.outro(pc.dim('docs → github.com/archer-mcp'));
|
package/src/wizard/scanner.ts
CHANGED
|
@@ -2,7 +2,6 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import * as clack from '@clack/prompts';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import { logSuccess, logError, maskCredential } from '../lib/ascii.js';
|
|
6
5
|
import type { ScanResult, Framework } from '../types/index.js';
|
|
7
6
|
|
|
8
7
|
// Helper to search for keys in files
|
|
@@ -236,28 +235,6 @@ export async function scanProject(cwd: string): Promise<ScanResult> {
|
|
|
236
235
|
|
|
237
236
|
const { framework, hasSupabaseInstalled } = detectFramework(cwd);
|
|
238
237
|
|
|
239
|
-
// Log found credentials
|
|
240
|
-
if (supabaseUrl) {
|
|
241
|
-
logSuccess(`SUPABASE_URL = ${maskCredential(supabaseUrl)}`);
|
|
242
|
-
} else {
|
|
243
|
-
logError('missing SUPABASE_URL');
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if (serviceRoleKey) {
|
|
247
|
-
logSuccess(`SUPABASE_SERVICE_ROLE_KEY = ${maskCredential(serviceRoleKey)}`);
|
|
248
|
-
} else {
|
|
249
|
-
logError('missing SUPABASE_SERVICE_ROLE_KEY');
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
if (anonKey) {
|
|
253
|
-
logSuccess(`SUPABASE_ANON_KEY = ${maskCredential(anonKey)}`);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
if (foundInFile) {
|
|
257
|
-
logSuccess(`found credentials in ${foundInFile}`);
|
|
258
|
-
} else if (codebaseResults.size > 0) {
|
|
259
|
-
logSuccess(`found credentials in codebase`);
|
|
260
|
-
}
|
|
261
238
|
|
|
262
239
|
return {
|
|
263
240
|
supabaseUrl,
|