@m2015agg/supabase-skill 0.1.1 → 0.2.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/commands/docs.js +21 -2
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/init.js +53 -26
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +160 -58
- package/dist/commands/install.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/util/config.d.ts +3 -0
- package/dist/util/config.js +1 -1
- package/dist/util/config.js.map +1 -1
- package/dist/util/detect.d.ts +19 -0
- package/dist/util/detect.js +54 -6
- package/dist/util/detect.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/docs.js
CHANGED
|
@@ -12,10 +12,29 @@ function buildEnvSection(config) {
|
|
|
12
12
|
const label = env.toUpperCase();
|
|
13
13
|
lines.push(`- **${label}**: \`${ref}\` (${name})${warning}`);
|
|
14
14
|
}
|
|
15
|
-
// Add
|
|
15
|
+
// Add routing rules
|
|
16
|
+
lines.push("");
|
|
17
|
+
lines.push("**Environment routing** (use these refs when user says...):");
|
|
18
|
+
for (const [env, { ref }] of Object.entries(config.environments)) {
|
|
19
|
+
const aliases = env === "prod"
|
|
20
|
+
? `"prod", "production", "live"`
|
|
21
|
+
: env === "stage"
|
|
22
|
+
? `"stage", "staging", "test", "preview"`
|
|
23
|
+
: `"dev", "development", "local"`;
|
|
24
|
+
lines.push(`- ${aliases} → \`--project-ref ${ref}\``);
|
|
25
|
+
}
|
|
16
26
|
if (config.environments["prod"]) {
|
|
17
|
-
lines.push(`- **Default**:
|
|
27
|
+
lines.push(`- **Default**: Always use STAGE unless user explicitly says "prod". PROD requires approval.`);
|
|
28
|
+
}
|
|
29
|
+
// Add env var instructions for direct API access
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push("**Direct API access** (for curl/psql when supabase CLI isn't enough):");
|
|
32
|
+
lines.push("- Read keys from `.env` file — NEVER hardcode keys in commands");
|
|
33
|
+
for (const [env] of Object.entries(config.environments)) {
|
|
34
|
+
const prefix = `SUPABASE_${env.toUpperCase()}`;
|
|
35
|
+
lines.push(`- ${env.toUpperCase()}: \`$${prefix}_URL\`, \`$${prefix}_SERVICE_KEY\`, \`$${prefix}_ANON_KEY\``);
|
|
18
36
|
}
|
|
37
|
+
lines.push("- Load with: `source .env` or `export $(grep -v '^#' .env | xargs)`");
|
|
19
38
|
return lines.join("\n");
|
|
20
39
|
}
|
|
21
40
|
export function getSkillDoc(config = null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AAEjE,SAAS,eAAe,CAAC,MAA0B;IACjD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO;;wDAE6C,CAAC;IACvD,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACnC,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,wDAAwD,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,OAAO,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,sBAAsB;
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -9,7 +9,7 @@ function write(msg) {
|
|
|
9
9
|
}
|
|
10
10
|
export function initCommand() {
|
|
11
11
|
return new Command("init")
|
|
12
|
-
.description("Initialize supabase-skill in the current project (CLAUDE.md + .env + .gitignore)")
|
|
12
|
+
.description("Initialize supabase-skill in the current project (CLAUDE.md + .env with keys + .gitignore)")
|
|
13
13
|
.action(() => {
|
|
14
14
|
const cwd = process.cwd();
|
|
15
15
|
const results = [];
|
|
@@ -19,7 +19,7 @@ export function initCommand() {
|
|
|
19
19
|
write(" Proceeding with generic skill doc (no environment refs).\n\n");
|
|
20
20
|
}
|
|
21
21
|
const skillDoc = getSkillDoc(config);
|
|
22
|
-
// 1. Upsert into project CLAUDE.md
|
|
22
|
+
// 1. Upsert into project CLAUDE.md (NO secrets — only refs + commands)
|
|
23
23
|
const claudeMd = join(cwd, "CLAUDE.md");
|
|
24
24
|
const claudeResult = upsertSection(claudeMd, skillDoc);
|
|
25
25
|
results.push(`CLAUDE.md: ${claudeResult}`);
|
|
@@ -30,56 +30,83 @@ export function initCommand() {
|
|
|
30
30
|
const dotResult = upsertSection(dotClaudeMd, skillDoc);
|
|
31
31
|
results.push(`.claude/CLAUDE.md: ${dotResult}`);
|
|
32
32
|
}
|
|
33
|
-
// 2. .env —
|
|
33
|
+
// 2. .env — write refs + API keys (secrets go here, NOT in CLAUDE.md)
|
|
34
34
|
const envPath = join(cwd, ".env");
|
|
35
|
-
const
|
|
35
|
+
const envLines = ["", "# supabase-skill environments"];
|
|
36
36
|
if (config && Object.keys(config.environments).length > 0) {
|
|
37
|
-
for (const [env,
|
|
38
|
-
|
|
37
|
+
for (const [env, envConfig] of Object.entries(config.environments)) {
|
|
38
|
+
const prefix = `SUPABASE_${env.toUpperCase()}`;
|
|
39
|
+
envLines.push(`${prefix}_REF=${envConfig.ref}`);
|
|
40
|
+
envLines.push(`${prefix}_URL=${envConfig.dbUrl || `https://${envConfig.ref}.supabase.co`}`);
|
|
41
|
+
if (envConfig.anonKey) {
|
|
42
|
+
envLines.push(`${prefix}_ANON_KEY=${envConfig.anonKey}`);
|
|
43
|
+
}
|
|
44
|
+
if (envConfig.serviceKey) {
|
|
45
|
+
envLines.push(`${prefix}_SERVICE_KEY=${envConfig.serviceKey}`);
|
|
46
|
+
}
|
|
47
|
+
envLines.push("");
|
|
39
48
|
}
|
|
40
49
|
}
|
|
41
50
|
else {
|
|
42
|
-
|
|
43
|
-
|
|
51
|
+
envLines.push("SUPABASE_STAGE_REF=");
|
|
52
|
+
envLines.push("SUPABASE_STAGE_URL=");
|
|
53
|
+
envLines.push("SUPABASE_STAGE_ANON_KEY=");
|
|
54
|
+
envLines.push("SUPABASE_STAGE_SERVICE_KEY=");
|
|
55
|
+
envLines.push("");
|
|
56
|
+
envLines.push("SUPABASE_PROD_REF=");
|
|
57
|
+
envLines.push("SUPABASE_PROD_URL=");
|
|
58
|
+
envLines.push("SUPABASE_PROD_ANON_KEY=");
|
|
59
|
+
envLines.push("SUPABASE_PROD_SERVICE_KEY=");
|
|
60
|
+
envLines.push("");
|
|
44
61
|
}
|
|
45
62
|
if (!existsSync(envPath)) {
|
|
46
|
-
writeFileSync(envPath,
|
|
47
|
-
results.push(".env: created with project refs");
|
|
63
|
+
writeFileSync(envPath, envLines.join("\n") + "\n", { mode: 0o600 });
|
|
64
|
+
results.push(".env: created with project refs + API keys (mode 600)");
|
|
48
65
|
}
|
|
49
66
|
else {
|
|
50
67
|
const envContent = readFileSync(envPath, "utf-8");
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
55
|
-
if (missing.length > 0) {
|
|
56
|
-
appendFileSync(envPath, "\n# supabase-skill\n" + missing.join("\n") + "\n");
|
|
57
|
-
results.push(`.env: appended ${missing.length} project ref(s)`);
|
|
68
|
+
// Check if we already have supabase-skill section
|
|
69
|
+
if (envContent.includes("# supabase-skill environments")) {
|
|
70
|
+
results.push(".env: supabase-skill section already present (not overwriting)");
|
|
58
71
|
}
|
|
59
72
|
else {
|
|
60
|
-
|
|
73
|
+
appendFileSync(envPath, envLines.join("\n") + "\n");
|
|
74
|
+
const keyCount = envLines.filter((l) => l.includes("_SERVICE_KEY=") && !l.endsWith("=")).length;
|
|
75
|
+
results.push(`.env: appended refs + ${keyCount} service key(s)`);
|
|
61
76
|
}
|
|
62
77
|
}
|
|
63
|
-
// 3. .gitignore
|
|
78
|
+
// 3. .gitignore — ensure .env is listed
|
|
64
79
|
const gitignorePath = join(cwd, ".gitignore");
|
|
65
80
|
if (!existsSync(gitignorePath)) {
|
|
66
|
-
writeFileSync(gitignorePath, ".env\n");
|
|
67
|
-
results.push(".gitignore: created with .env");
|
|
81
|
+
writeFileSync(gitignorePath, ".env\n.supabase-schema/\n");
|
|
82
|
+
results.push(".gitignore: created with .env + .supabase-schema/");
|
|
68
83
|
}
|
|
69
84
|
else {
|
|
70
85
|
const giContent = readFileSync(gitignorePath, "utf-8");
|
|
71
|
-
|
|
72
|
-
|
|
86
|
+
const additions = [];
|
|
87
|
+
if (!giContent.includes(".env"))
|
|
88
|
+
additions.push(".env");
|
|
89
|
+
if (!giContent.includes(".supabase-schema"))
|
|
90
|
+
additions.push(".supabase-schema/");
|
|
91
|
+
if (additions.length > 0) {
|
|
92
|
+
appendFileSync(gitignorePath, additions.join("\n") + "\n");
|
|
93
|
+
results.push(`.gitignore: appended ${additions.join(", ")}`);
|
|
73
94
|
}
|
|
74
95
|
else {
|
|
75
|
-
|
|
76
|
-
results.push(".gitignore: appended .env");
|
|
96
|
+
results.push(".gitignore: .env + .supabase-schema/ already listed");
|
|
77
97
|
}
|
|
78
98
|
}
|
|
79
|
-
write("
|
|
99
|
+
write("\nsupabase-skill init complete:\n");
|
|
80
100
|
for (const r of results) {
|
|
81
101
|
write(` ${r}\n`);
|
|
82
102
|
}
|
|
103
|
+
write("\nSecurity:\n");
|
|
104
|
+
write(" ✓ API keys in .env only (never in CLAUDE.md)\n");
|
|
105
|
+
write(" ✓ .env is gitignored\n");
|
|
106
|
+
write(" ✓ Claude reads keys from .env when it needs direct API access\n");
|
|
107
|
+
write("\nNext:\n");
|
|
108
|
+
write(" supabase-skill snapshot # cache your schema locally\n");
|
|
109
|
+
write(" supabase-skill cron # set up nightly refresh\n\n");
|
|
83
110
|
});
|
|
84
111
|
}
|
|
85
112
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,SAAS,KAAK,CAAC,GAAW;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/install.js
CHANGED
|
@@ -3,9 +3,10 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { readFileSync, writeFileSync, existsSync, appendFileSync } from "node:fs";
|
|
5
5
|
import { createInterface } from "node:readline";
|
|
6
|
+
import { execSync } from "node:child_process";
|
|
6
7
|
import { upsertSection } from "../util/claude-md.js";
|
|
7
8
|
import { writeConfig, getDefaultConfig } from "../util/config.js";
|
|
8
|
-
import { isSupabaseCLIInstalled, isLoggedIn, listProjects } from "../util/detect.js";
|
|
9
|
+
import { isSupabaseCLIInstalled, isLoggedIn, listProjects, listBranches, fetchApiKeys, installSupabaseCLI, } from "../util/detect.js";
|
|
9
10
|
import { getSkillDoc } from "./docs.js";
|
|
10
11
|
function prompt(question) {
|
|
11
12
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -21,78 +22,173 @@ function write(msg) {
|
|
|
21
22
|
}
|
|
22
23
|
export function installCommand() {
|
|
23
24
|
return new Command("install")
|
|
24
|
-
.description("
|
|
25
|
+
.description("Guided setup: install CLI, login, configure environments, fetch API keys, update CLAUDE.md")
|
|
25
26
|
.option("--skip-shell", "Skip shell profile modification")
|
|
26
27
|
.option("--non-interactive", "Skip interactive prompts (use existing config or defaults)")
|
|
27
28
|
.action(async (opts) => {
|
|
28
29
|
const home = homedir();
|
|
29
30
|
const results = [];
|
|
30
|
-
|
|
31
|
-
write("\n
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
write(
|
|
39
|
-
process.exit(1);
|
|
31
|
+
const isInteractive = !opts.nonInteractive && process.stdin.isTTY;
|
|
32
|
+
write("\n ╔══════════════════════════════════════╗\n");
|
|
33
|
+
write(" ║ supabase-skill setup wizard ║\n");
|
|
34
|
+
write(" ╚══════════════════════════════════════╝\n\n");
|
|
35
|
+
// ─── Step 1: Supabase CLI ───
|
|
36
|
+
write(" Step 1/5: Supabase CLI\n");
|
|
37
|
+
let { installed, version } = isSupabaseCLIInstalled();
|
|
38
|
+
if (installed) {
|
|
39
|
+
write(` ✓ Found v${version}\n\n`);
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
write(` ${i + 1}. ${p.name} (${p.id})\n`);
|
|
60
|
-
});
|
|
61
|
-
write("\n Tag each project (prod/stage/dev/skip):\n");
|
|
62
|
-
for (const project of projects) {
|
|
63
|
-
const answer = await prompt(` ${project.name} (${project.id}) \u2192 `);
|
|
64
|
-
const env = answer.toLowerCase();
|
|
65
|
-
if (env === "prod" || env === "stage" || env === "dev") {
|
|
66
|
-
config.environments[env] = { ref: project.id, name: project.name };
|
|
41
|
+
else {
|
|
42
|
+
write(" ✗ Not installed\n");
|
|
43
|
+
if (isInteractive) {
|
|
44
|
+
const answer = await prompt(" Install now via npm? (y/n) → ");
|
|
45
|
+
if (answer.toLowerCase() === "y") {
|
|
46
|
+
write(" Installing supabase CLI...\n");
|
|
47
|
+
const ok = installSupabaseCLI();
|
|
48
|
+
if (ok) {
|
|
49
|
+
const check = isSupabaseCLIInstalled();
|
|
50
|
+
write(` ✓ Installed v${check.version}\n\n`);
|
|
51
|
+
installed = true;
|
|
52
|
+
version = check.version;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
write(" ✗ Install failed. Try manually:\n");
|
|
56
|
+
write(" brew install supabase/tap/supabase\n");
|
|
57
|
+
write(" # or: npm install -g supabase\n\n");
|
|
58
|
+
process.exit(1);
|
|
67
59
|
}
|
|
68
60
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
61
|
+
else {
|
|
62
|
+
write(" Install it manually, then re-run: supabase-skill install\n\n");
|
|
63
|
+
process.exit(1);
|
|
72
64
|
}
|
|
73
|
-
|
|
74
|
-
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ─── Step 2: Login ───
|
|
71
|
+
write(" Step 2/5: Authentication\n");
|
|
72
|
+
let loggedIn = isLoggedIn();
|
|
73
|
+
if (loggedIn) {
|
|
74
|
+
write(" ✓ Logged in\n\n");
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
write(" ✗ Not logged in\n");
|
|
78
|
+
if (isInteractive) {
|
|
79
|
+
const answer = await prompt(" Open browser to login now? (y/n) → ");
|
|
80
|
+
if (answer.toLowerCase() === "y") {
|
|
81
|
+
write(" Opening browser for Supabase login...\n\n");
|
|
82
|
+
try {
|
|
83
|
+
execSync("supabase login", { stdio: "inherit", timeout: 120000 });
|
|
84
|
+
loggedIn = isLoggedIn();
|
|
85
|
+
if (loggedIn) {
|
|
86
|
+
write("\n ✓ Logged in\n\n");
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
write("\n ✗ Login may have failed. Re-run: supabase-skill install\n\n");
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
write(" ✗ Login failed. Run `supabase login` manually, then re-run install.\n\n");
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
75
97
|
}
|
|
76
98
|
else {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
config.defaultEnv = envKeys[0];
|
|
99
|
+
write(" Run `supabase login` first, then re-run: supabase-skill install\n\n");
|
|
100
|
+
process.exit(1);
|
|
80
101
|
}
|
|
81
102
|
}
|
|
82
103
|
else {
|
|
83
|
-
|
|
84
|
-
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// ─── Step 3: Discover Projects + Branches ───
|
|
108
|
+
write(" Step 3/5: Discovering projects & branches\n");
|
|
109
|
+
const config = getDefaultConfig();
|
|
110
|
+
const projects = listProjects();
|
|
111
|
+
if (projects.length === 0) {
|
|
112
|
+
write(" No projects found. Create a project at supabase.com first.\n\n");
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const items = [];
|
|
116
|
+
for (const p of projects) {
|
|
117
|
+
const ref = p.ref || p.id;
|
|
118
|
+
const status = p.status || "";
|
|
119
|
+
const statusTag = status === "ACTIVE_HEALTHY" ? " ✓" : status === "INACTIVE" ? " (inactive)" : "";
|
|
120
|
+
write(` ${items.length + 1}. ${p.name} (${ref})${statusTag}\n`);
|
|
121
|
+
items.push({ ref, name: p.name, type: "project" });
|
|
122
|
+
// Fetch branches for active projects
|
|
123
|
+
if (status === "ACTIVE_HEALTHY") {
|
|
124
|
+
write(` Checking branches... `);
|
|
125
|
+
const branches = listBranches(ref);
|
|
126
|
+
const nonDefault = branches.filter((b) => !b.is_default && b.project_ref !== ref);
|
|
127
|
+
if (nonDefault.length > 0) {
|
|
128
|
+
write(`${nonDefault.length} found\n`);
|
|
129
|
+
for (const b of nonDefault) {
|
|
130
|
+
const bStatus = b.preview_project_status === "ACTIVE_HEALTHY" ? " ✓" : "";
|
|
131
|
+
write(` └─ ${b.name} (${b.project_ref})${bStatus}\n`);
|
|
132
|
+
items.push({ ref: b.project_ref, name: `${p.name} [${b.name}]`, type: "branch", parentRef: ref });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
write("none\n");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (isInteractive) {
|
|
141
|
+
write("\n Tag each environment (prod/stage/dev/skip):\n");
|
|
142
|
+
for (const item of items) {
|
|
143
|
+
const indent = item.type === "branch" ? " " : " ";
|
|
144
|
+
const answer = await prompt(`${indent}${item.name} (${item.ref}) → `);
|
|
145
|
+
const env = answer.toLowerCase();
|
|
146
|
+
if (env === "prod" || env === "stage" || env === "dev") {
|
|
147
|
+
config.environments[env] = { ref: item.ref, name: item.name };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Set default env
|
|
152
|
+
if (config.environments["stage"]) {
|
|
153
|
+
config.defaultEnv = "stage";
|
|
154
|
+
}
|
|
155
|
+
else if (config.environments["dev"]) {
|
|
156
|
+
config.defaultEnv = "dev";
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const envKeys = Object.keys(config.environments);
|
|
160
|
+
if (envKeys.length > 0)
|
|
161
|
+
config.defaultEnv = envKeys[0];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
write("\n");
|
|
165
|
+
// ─── Step 4: Fetch API Keys ───
|
|
166
|
+
write(" Step 4/5: Fetching API keys\n");
|
|
167
|
+
for (const [env, envConfig] of Object.entries(config.environments)) {
|
|
168
|
+
write(` ${env.toUpperCase()} (${envConfig.ref})... `);
|
|
169
|
+
const keys = fetchApiKeys(envConfig.ref);
|
|
170
|
+
if (keys) {
|
|
171
|
+
envConfig.anonKey = keys.anonKey;
|
|
172
|
+
envConfig.serviceKey = keys.serviceKey;
|
|
173
|
+
envConfig.dbUrl = `https://${envConfig.ref}.supabase.co`;
|
|
174
|
+
write(`✓ anon + service_role keys saved\n`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
write("✗ could not fetch (will need manual setup)\n");
|
|
85
178
|
}
|
|
86
179
|
}
|
|
87
|
-
|
|
180
|
+
write("\n");
|
|
181
|
+
// ─── Step 5: Write Everything ───
|
|
182
|
+
write(" Step 5/5: Writing configuration\n");
|
|
183
|
+
// Config file (contains secrets — restrictive permissions)
|
|
88
184
|
writeConfig(config);
|
|
89
|
-
results.push("~/.config/supabase-skill/config.json: created");
|
|
90
|
-
//
|
|
185
|
+
results.push("~/.config/supabase-skill/config.json: created (mode 600)");
|
|
186
|
+
// CLAUDE.md (NO secrets — only refs, names, CLI commands)
|
|
91
187
|
const claudeMd = join(home, ".claude", "CLAUDE.md");
|
|
92
188
|
const skillDoc = getSkillDoc(config);
|
|
93
189
|
const claudeResult = upsertSection(claudeMd, skillDoc);
|
|
94
190
|
results.push(`~/.claude/CLAUDE.md: ${claudeResult}`);
|
|
95
|
-
//
|
|
191
|
+
// Shell profile
|
|
96
192
|
if (!opts.skipShell) {
|
|
97
193
|
const shell = process.env.SHELL || "/bin/bash";
|
|
98
194
|
const profileName = shell.includes("zsh") ? ".zshrc" : ".bashrc";
|
|
@@ -112,18 +208,24 @@ export function installCommand() {
|
|
|
112
208
|
results.push(`~/${profileName}: created with SUPABASE_ACCESS_TOKEN placeholder`);
|
|
113
209
|
}
|
|
114
210
|
}
|
|
115
|
-
// Output
|
|
116
|
-
write("\n
|
|
211
|
+
// Output summary
|
|
212
|
+
write("\n ── Setup Complete ──\n\n");
|
|
117
213
|
for (const r of results) {
|
|
118
214
|
write(` ${r}\n`);
|
|
119
215
|
}
|
|
120
216
|
if (Object.keys(config.environments).length > 0) {
|
|
121
|
-
write("\n
|
|
122
|
-
for (const [env, { ref, name }] of Object.entries(config.environments)) {
|
|
123
|
-
|
|
217
|
+
write("\n Environments:\n");
|
|
218
|
+
for (const [env, { ref, name, serviceKey }] of Object.entries(config.environments)) {
|
|
219
|
+
const keyStatus = serviceKey ? "✓ keys" : "✗ no keys";
|
|
220
|
+
const warning = env === "prod" ? " ⚠️" : "";
|
|
221
|
+
write(` ${env.toUpperCase()}: ${ref} (${name}) [${keyStatus}]${warning}\n`);
|
|
124
222
|
}
|
|
223
|
+
write("\n Security:\n");
|
|
224
|
+
write(" ✓ API keys stored in ~/.config/supabase-skill/config.json (mode 600)\n");
|
|
225
|
+
write(" ✓ CLAUDE.md contains only project refs (not secrets)\n");
|
|
226
|
+
write(" ✓ `supabase-skill init` writes service keys to .env (gitignored)\n");
|
|
125
227
|
}
|
|
126
|
-
write("\n Next: run `supabase-skill init
|
|
228
|
+
write("\n Next: cd into your project and run `supabase-skill init`\n\n");
|
|
127
229
|
});
|
|
128
230
|
}
|
|
129
231
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ const program = new Command();
|
|
|
15
15
|
program
|
|
16
16
|
.name("supabase-skill")
|
|
17
17
|
.description("Supabase CLI skill for AI agents. Installs comprehensive CLI instructions into CLAUDE.md with multi-environment support.")
|
|
18
|
-
.version("0.
|
|
18
|
+
.version("0.2.0");
|
|
19
19
|
program.addCommand(installCommand());
|
|
20
20
|
program.addCommand(initCommand());
|
|
21
21
|
program.addCommand(docsCommand());
|
package/dist/util/config.d.ts
CHANGED
package/dist/util/config.js
CHANGED
|
@@ -22,7 +22,7 @@ export function writeConfig(config) {
|
|
|
22
22
|
const dir = getConfigDir();
|
|
23
23
|
if (!existsSync(dir))
|
|
24
24
|
mkdirSync(dir, { recursive: true });
|
|
25
|
-
writeFileSync(getConfigPath(), JSON.stringify(config, null, 2) + "\n");
|
|
25
|
+
writeFileSync(getConfigPath(), JSON.stringify(config, null, 2) + "\n", { mode: 0o600 });
|
|
26
26
|
}
|
|
27
27
|
export function getDefaultConfig() {
|
|
28
28
|
return {
|
package/dist/util/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAmBlC,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAgB,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE;YACX,oBAAoB,EAAE,IAAI;YAC1B,gBAAgB,EAAE,IAAI;SACvB;KACF,CAAC;AACJ,CAAC"}
|
package/dist/util/detect.d.ts
CHANGED
|
@@ -4,6 +4,17 @@ export interface SupabaseProject {
|
|
|
4
4
|
organization_id: string;
|
|
5
5
|
region: string;
|
|
6
6
|
created_at: string;
|
|
7
|
+
status?: string;
|
|
8
|
+
ref?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SupabaseBranch {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
project_ref: string;
|
|
14
|
+
parent_project_ref: string;
|
|
15
|
+
is_default: boolean;
|
|
16
|
+
status: string;
|
|
17
|
+
preview_project_status: string;
|
|
7
18
|
}
|
|
8
19
|
export declare function isSupabaseCLIInstalled(): {
|
|
9
20
|
installed: boolean;
|
|
@@ -11,3 +22,11 @@ export declare function isSupabaseCLIInstalled(): {
|
|
|
11
22
|
};
|
|
12
23
|
export declare function isLoggedIn(): boolean;
|
|
13
24
|
export declare function listProjects(): SupabaseProject[];
|
|
25
|
+
export declare function listBranches(projectRef: string): SupabaseBranch[];
|
|
26
|
+
export interface ApiKeys {
|
|
27
|
+
anonKey: string;
|
|
28
|
+
serviceKey: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function fetchApiKeys(projectRef: string): ApiKeys | null;
|
|
31
|
+
export declare function installSupabaseCLI(): boolean;
|
|
32
|
+
export declare function loginSupabase(): boolean;
|
package/dist/util/detect.js
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
|
+
function parseJsonArray(output) {
|
|
3
|
+
const jsonMatch = output.match(/\[[\s\S]*\]/);
|
|
4
|
+
if (!jsonMatch)
|
|
5
|
+
return [];
|
|
6
|
+
try {
|
|
7
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
8
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
2
14
|
export function isSupabaseCLIInstalled() {
|
|
3
15
|
try {
|
|
4
16
|
const output = execSync("supabase --version 2>&1", { encoding: "utf-8" }).trim();
|
|
@@ -24,15 +36,51 @@ export function listProjects() {
|
|
|
24
36
|
encoding: "utf-8",
|
|
25
37
|
timeout: 15000,
|
|
26
38
|
});
|
|
27
|
-
|
|
28
|
-
const jsonMatch = output.match(/\[[\s\S]*\]/);
|
|
29
|
-
if (!jsonMatch)
|
|
30
|
-
return [];
|
|
31
|
-
const parsed = JSON.parse(jsonMatch[0]);
|
|
32
|
-
return Array.isArray(parsed) ? parsed : [];
|
|
39
|
+
return parseJsonArray(output);
|
|
33
40
|
}
|
|
34
41
|
catch {
|
|
35
42
|
return [];
|
|
36
43
|
}
|
|
37
44
|
}
|
|
45
|
+
export function listBranches(projectRef) {
|
|
46
|
+
try {
|
|
47
|
+
const output = execSync(`supabase branches list --project-ref ${projectRef} -o json 2>&1`, { encoding: "utf-8", timeout: 15000 });
|
|
48
|
+
return parseJsonArray(output);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function fetchApiKeys(projectRef) {
|
|
55
|
+
try {
|
|
56
|
+
const output = execSync(`supabase projects api-keys --project-ref ${projectRef} -o json 2>&1`, { encoding: "utf-8", timeout: 15000 });
|
|
57
|
+
const keys = parseJsonArray(output);
|
|
58
|
+
const anon = keys.find((k) => k.name === "anon")?.api_key || "";
|
|
59
|
+
const service = keys.find((k) => k.name === "service_role")?.api_key || "";
|
|
60
|
+
if (!anon && !service)
|
|
61
|
+
return null;
|
|
62
|
+
return { anonKey: anon, serviceKey: service };
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function installSupabaseCLI() {
|
|
69
|
+
try {
|
|
70
|
+
execSync("npm install -g supabase 2>&1", { encoding: "utf-8", timeout: 120000 });
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function loginSupabase() {
|
|
78
|
+
try {
|
|
79
|
+
execSync("supabase login", { encoding: "utf-8", timeout: 120000, stdio: "inherit" });
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
38
86
|
//# sourceMappingURL=detect.js.map
|
package/dist/util/detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/util/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/util/detect.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m2015agg/supabase-skill",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Supabase CLI skill for AI agents. Installs comprehensive CLI instructions into CLAUDE.md, AGENTS.md, or .cursorrules with multi-environment support.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|