@m2015agg/supabase-skill 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/README.md +383 -0
- package/dist/commands/columns.d.ts +2 -0
- package/dist/commands/columns.js +121 -0
- package/dist/commands/columns.js.map +1 -0
- package/dist/commands/context.d.ts +2 -0
- package/dist/commands/context.js +236 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/cron.d.ts +2 -0
- package/dist/commands/cron.js +116 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/docs.d.ts +4 -0
- package/dist/commands/docs.js +182 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/envs.d.ts +2 -0
- package/dist/commands/envs.js +22 -0
- package/dist/commands/envs.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +85 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.js +129 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +102 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/snapshot.d.ts +2 -0
- package/dist/commands/snapshot.js +316 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/table.d.ts +2 -0
- package/dist/commands/table.js +169 -0
- package/dist/commands/table.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.js +30 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/util/claude-md.d.ts +3 -0
- package/dist/util/claude-md.js +48 -0
- package/dist/util/claude-md.js.map +1 -0
- package/dist/util/config.d.ts +15 -0
- package/dist/util/config.js +37 -0
- package/dist/util/config.js.map +1 -0
- package/dist/util/db.d.ts +85 -0
- package/dist/util/db.js +237 -0
- package/dist/util/db.js.map +1 -0
- package/dist/util/detect.d.ts +13 -0
- package/dist/util/detect.js +34 -0
- package/dist/util/detect.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { mkdirSync, writeFileSync, existsSync, rmSync } from "node:fs";
|
|
5
|
+
import { readConfig } from "../util/config.js";
|
|
6
|
+
import { openDb, initSchema, clearData, insertAll, } from "../util/db.js";
|
|
7
|
+
function write(msg) {
|
|
8
|
+
process.stdout.write(msg);
|
|
9
|
+
}
|
|
10
|
+
function fetchOpenAPISpec(projectRef) {
|
|
11
|
+
// Get API keys
|
|
12
|
+
const keysJson = execSync(`supabase projects api-keys --project-ref ${projectRef} -o json 2>&1`, { encoding: "utf-8", timeout: 15000 });
|
|
13
|
+
// Parse out the first JSON array (ignore CLI warnings after it)
|
|
14
|
+
const jsonMatch = keysJson.match(/\[[\s\S]*?\n\]/);
|
|
15
|
+
if (!jsonMatch)
|
|
16
|
+
throw new Error("Failed to parse API keys");
|
|
17
|
+
const keys = JSON.parse(jsonMatch[0]);
|
|
18
|
+
const serviceKey = keys.find((k) => k.name === "service_role")?.api_key;
|
|
19
|
+
if (!serviceKey)
|
|
20
|
+
throw new Error("No service_role key found");
|
|
21
|
+
const baseUrl = `https://${projectRef}.supabase.co`;
|
|
22
|
+
const spec = execSync(`curl -s "${baseUrl}/rest/v1/" -H "apikey: ${serviceKey}" -H "Authorization: Bearer ${serviceKey}" -H "Accept-Profile: bibleai"`, { encoding: "utf-8", timeout: 30000 });
|
|
23
|
+
return JSON.parse(spec);
|
|
24
|
+
}
|
|
25
|
+
function parseForeignKeys(desc) {
|
|
26
|
+
if (!desc)
|
|
27
|
+
return null;
|
|
28
|
+
const match = desc.match(/<fk table='([^']+)' column='([^']+)'\/>/);
|
|
29
|
+
if (!match)
|
|
30
|
+
return null;
|
|
31
|
+
return { table: match[1], column: match[2] };
|
|
32
|
+
}
|
|
33
|
+
function isPrimaryKey(desc) {
|
|
34
|
+
return desc?.includes("<pk/>") ?? false;
|
|
35
|
+
}
|
|
36
|
+
function generateTableMarkdown(name, def) {
|
|
37
|
+
const lines = [`# ${name}`, ""];
|
|
38
|
+
const required = new Set(def.required || []);
|
|
39
|
+
// Summary line
|
|
40
|
+
const colCount = Object.keys(def.properties).length;
|
|
41
|
+
const pks = Object.entries(def.properties).filter(([, v]) => isPrimaryKey(v.description));
|
|
42
|
+
const fks = Object.entries(def.properties).filter(([, v]) => parseForeignKeys(v.description));
|
|
43
|
+
lines.push(`${colCount} columns | ${pks.length} PK | ${fks.length} FK`);
|
|
44
|
+
lines.push("");
|
|
45
|
+
// Columns table
|
|
46
|
+
lines.push("| Column | Type | Nullable | Default | FK |");
|
|
47
|
+
lines.push("|--------|------|----------|---------|-----|");
|
|
48
|
+
for (const [colName, col] of Object.entries(def.properties)) {
|
|
49
|
+
const typeStr = col.format || col.type || "unknown";
|
|
50
|
+
const nullable = required.has(colName) ? "NOT NULL" : "nullable";
|
|
51
|
+
const defaultStr = col.default || "";
|
|
52
|
+
const fk = parseForeignKeys(col.description);
|
|
53
|
+
const fkStr = fk ? `→ ${fk.table}.${fk.column}` : "";
|
|
54
|
+
const pkMarker = isPrimaryKey(col.description) ? " **PK**" : "";
|
|
55
|
+
lines.push(`| ${colName}${pkMarker} | ${typeStr} | ${nullable} | ${defaultStr} | ${fkStr} |`);
|
|
56
|
+
}
|
|
57
|
+
// Description section for columns that have non-FK descriptions
|
|
58
|
+
const descriptions = Object.entries(def.properties)
|
|
59
|
+
.filter(([, v]) => v.description && !v.description.match(/^Note:\n/))
|
|
60
|
+
.map(([k, v]) => {
|
|
61
|
+
// Strip FK/PK annotations from description
|
|
62
|
+
const clean = (v.description || "")
|
|
63
|
+
.replace(/\n\nNote:\n.*$/s, "")
|
|
64
|
+
.replace(/<[^>]+>/g, "")
|
|
65
|
+
.trim();
|
|
66
|
+
return clean ? `- **${k}**: ${clean}` : null;
|
|
67
|
+
})
|
|
68
|
+
.filter(Boolean);
|
|
69
|
+
if (descriptions.length > 0) {
|
|
70
|
+
lines.push("");
|
|
71
|
+
lines.push("## Notes");
|
|
72
|
+
lines.push(...descriptions);
|
|
73
|
+
}
|
|
74
|
+
return lines.join("\n");
|
|
75
|
+
}
|
|
76
|
+
function generateIndexMarkdown(tables, views, rpcs, defs) {
|
|
77
|
+
const lines = [
|
|
78
|
+
"# Database Schema Index",
|
|
79
|
+
"",
|
|
80
|
+
`Generated: ${new Date().toISOString()}`,
|
|
81
|
+
"",
|
|
82
|
+
`**${tables.length} tables** | **${views.length} views** | **${rpcs.length} functions**`,
|
|
83
|
+
"",
|
|
84
|
+
"## Tables",
|
|
85
|
+
"",
|
|
86
|
+
"| Table | Columns | FKs | Description |",
|
|
87
|
+
"|-------|---------|-----|-------------|",
|
|
88
|
+
];
|
|
89
|
+
for (const name of tables) {
|
|
90
|
+
const def = defs[name];
|
|
91
|
+
if (!def)
|
|
92
|
+
continue;
|
|
93
|
+
const colCount = Object.keys(def.properties).length;
|
|
94
|
+
const fkCount = Object.values(def.properties).filter((v) => parseForeignKeys(v.description)).length;
|
|
95
|
+
// Try to infer purpose from column names
|
|
96
|
+
lines.push(`| [${name}](tables/${name}.md) | ${colCount} | ${fkCount} | |`);
|
|
97
|
+
}
|
|
98
|
+
if (views.length > 0) {
|
|
99
|
+
lines.push("", "## Views", "");
|
|
100
|
+
for (const name of views) {
|
|
101
|
+
const def = defs[name];
|
|
102
|
+
const colCount = def ? Object.keys(def.properties).length : 0;
|
|
103
|
+
lines.push(`- **${name}** (${colCount} columns)`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (rpcs.length > 0) {
|
|
107
|
+
lines.push("", "## Functions", "");
|
|
108
|
+
for (const name of rpcs) {
|
|
109
|
+
lines.push(`- \`${name}\``);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return lines.join("\n");
|
|
113
|
+
}
|
|
114
|
+
function generateRelationshipsJson(defs) {
|
|
115
|
+
const rels = {};
|
|
116
|
+
for (const [tableName, def] of Object.entries(defs)) {
|
|
117
|
+
for (const [colName, col] of Object.entries(def.properties)) {
|
|
118
|
+
const fk = parseForeignKeys(col.description);
|
|
119
|
+
if (fk) {
|
|
120
|
+
rels[`${tableName}.${colName}`] = `${fk.table}.${fk.column}`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return rels;
|
|
125
|
+
}
|
|
126
|
+
function generateFunctionsMarkdown(paths) {
|
|
127
|
+
const rpcs = Object.entries(paths)
|
|
128
|
+
.filter(([p]) => p.startsWith("/rpc/"))
|
|
129
|
+
.sort(([a], [b]) => a.localeCompare(b));
|
|
130
|
+
const lines = ["# Database Functions (RPCs)", "", `${rpcs.length} functions`, ""];
|
|
131
|
+
for (const [path, endpoint] of rpcs) {
|
|
132
|
+
const name = path.replace("/rpc/", "");
|
|
133
|
+
const post = endpoint.post;
|
|
134
|
+
lines.push(`## ${name}`);
|
|
135
|
+
if (post?.description) {
|
|
136
|
+
lines.push(post.description);
|
|
137
|
+
}
|
|
138
|
+
const params = post?.parameters?.filter((p) => p.in === "body") || [];
|
|
139
|
+
if (params.length > 0 && params[0].schema?.properties) {
|
|
140
|
+
const props = params[0].schema.properties;
|
|
141
|
+
lines.push("");
|
|
142
|
+
lines.push("**Parameters:**");
|
|
143
|
+
for (const [pName, pDef] of Object.entries(props)) {
|
|
144
|
+
lines.push(`- \`${pName}\`: ${pDef.format || pDef.type || "unknown"}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
lines.push("");
|
|
148
|
+
}
|
|
149
|
+
return lines.join("\n");
|
|
150
|
+
}
|
|
151
|
+
export function snapshotCommand() {
|
|
152
|
+
return new Command("snapshot")
|
|
153
|
+
.description("Snapshot database schema to local .supabase-schema/ directory for fast agent lookups")
|
|
154
|
+
.option("--project-ref <ref>", "Supabase project ref (defaults to stage from config)")
|
|
155
|
+
.option("--schema <name>", "Schema to snapshot", "bibleai")
|
|
156
|
+
.option("--output <dir>", "Output directory", ".supabase-schema")
|
|
157
|
+
.action((opts) => {
|
|
158
|
+
const config = readConfig();
|
|
159
|
+
// Resolve project ref
|
|
160
|
+
let ref = opts.projectRef;
|
|
161
|
+
if (!ref && config) {
|
|
162
|
+
const stageEnv = config.environments["stage"] || config.environments[config.defaultEnv];
|
|
163
|
+
if (stageEnv)
|
|
164
|
+
ref = stageEnv.ref;
|
|
165
|
+
}
|
|
166
|
+
if (!ref) {
|
|
167
|
+
write("Error: No project ref. Use --project-ref or run `supabase-skill install`.\n");
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
write(`\n Snapshotting schema from ${ref}...\n`);
|
|
171
|
+
// Fetch OpenAPI spec
|
|
172
|
+
write(" Fetching schema via PostgREST... ");
|
|
173
|
+
let spec;
|
|
174
|
+
try {
|
|
175
|
+
spec = fetchOpenAPISpec(ref);
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
write(`FAILED\n ${e.message}\n`);
|
|
179
|
+
process.exit(1);
|
|
180
|
+
}
|
|
181
|
+
write(`\u2713 ${Object.keys(spec.definitions).length} definitions\n`);
|
|
182
|
+
// Classify tables vs views (views typically start with v_)
|
|
183
|
+
const allNames = Object.keys(spec.definitions).sort();
|
|
184
|
+
const views = allNames.filter((n) => n.startsWith("v_"));
|
|
185
|
+
const tables = allNames.filter((n) => !n.startsWith("v_"));
|
|
186
|
+
// Extract RPCs
|
|
187
|
+
const rpcs = Object.keys(spec.paths)
|
|
188
|
+
.filter((p) => p.startsWith("/rpc/"))
|
|
189
|
+
.map((p) => p.replace("/rpc/", ""))
|
|
190
|
+
.sort();
|
|
191
|
+
// Create output directory
|
|
192
|
+
const outDir = join(process.cwd(), opts.output);
|
|
193
|
+
const tablesDir = join(outDir, "tables");
|
|
194
|
+
if (existsSync(outDir)) {
|
|
195
|
+
rmSync(outDir, { recursive: true });
|
|
196
|
+
}
|
|
197
|
+
mkdirSync(tablesDir, { recursive: true });
|
|
198
|
+
// Generate index
|
|
199
|
+
write(" Generating index... ");
|
|
200
|
+
writeFileSync(join(outDir, "index.md"), generateIndexMarkdown(tables, views, rpcs, spec.definitions));
|
|
201
|
+
write("\u2713\n");
|
|
202
|
+
// Generate per-table files
|
|
203
|
+
write(` Generating ${tables.length} table files... `);
|
|
204
|
+
for (const name of tables) {
|
|
205
|
+
const def = spec.definitions[name];
|
|
206
|
+
if (def) {
|
|
207
|
+
writeFileSync(join(tablesDir, `${name}.md`), generateTableMarkdown(name, def));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
write("\u2713\n");
|
|
211
|
+
// Generate view files in tables dir too (agents will look there)
|
|
212
|
+
if (views.length > 0) {
|
|
213
|
+
write(` Generating ${views.length} view files... `);
|
|
214
|
+
for (const name of views) {
|
|
215
|
+
const def = spec.definitions[name];
|
|
216
|
+
if (def) {
|
|
217
|
+
writeFileSync(join(tablesDir, `${name}.md`), generateTableMarkdown(name, def));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
write("\u2713\n");
|
|
221
|
+
}
|
|
222
|
+
// Generate relationships
|
|
223
|
+
write(" Generating relationships... ");
|
|
224
|
+
const rels = generateRelationshipsJson(spec.definitions);
|
|
225
|
+
writeFileSync(join(outDir, "relationships.json"), JSON.stringify(rels, null, 2));
|
|
226
|
+
write(`\u2713 ${Object.keys(rels).length} foreign keys\n`);
|
|
227
|
+
// Generate functions
|
|
228
|
+
write(" Generating functions... ");
|
|
229
|
+
writeFileSync(join(outDir, "functions.md"), generateFunctionsMarkdown(spec.paths));
|
|
230
|
+
write(`\u2713 ${rpcs.length} RPCs\n`);
|
|
231
|
+
// ─── SQLite Database ───
|
|
232
|
+
write(" Writing SQLite database... ");
|
|
233
|
+
try {
|
|
234
|
+
const db = openDb(outDir);
|
|
235
|
+
initSchema(db);
|
|
236
|
+
clearData(db);
|
|
237
|
+
// Build structured data from OpenAPI spec
|
|
238
|
+
const dbTables = [];
|
|
239
|
+
const dbColumns = [];
|
|
240
|
+
const dbRels = [];
|
|
241
|
+
for (const name of allNames) {
|
|
242
|
+
const def = spec.definitions[name];
|
|
243
|
+
if (!def)
|
|
244
|
+
continue;
|
|
245
|
+
const required = new Set(def.required || []);
|
|
246
|
+
const isView = name.startsWith("v_");
|
|
247
|
+
let pkCount = 0;
|
|
248
|
+
let fkCount = 0;
|
|
249
|
+
const colCount = Object.keys(def.properties).length;
|
|
250
|
+
for (const [colName, col] of Object.entries(def.properties)) {
|
|
251
|
+
const pk = isPrimaryKey(col.description);
|
|
252
|
+
const fk = parseForeignKeys(col.description);
|
|
253
|
+
if (pk)
|
|
254
|
+
pkCount++;
|
|
255
|
+
if (fk)
|
|
256
|
+
fkCount++;
|
|
257
|
+
// Clean description
|
|
258
|
+
let desc = null;
|
|
259
|
+
if (col.description && !col.description.match(/^Note:\n/)) {
|
|
260
|
+
desc = col.description
|
|
261
|
+
.replace(/\n\nNote:\n.*$/s, "")
|
|
262
|
+
.replace(/<[^>]+>/g, "")
|
|
263
|
+
.trim() || null;
|
|
264
|
+
}
|
|
265
|
+
dbColumns.push({
|
|
266
|
+
table_name: name,
|
|
267
|
+
name: colName,
|
|
268
|
+
type: col.format || col.type || null,
|
|
269
|
+
nullable: !required.has(colName),
|
|
270
|
+
default_value: col.default || null,
|
|
271
|
+
is_pk: pk,
|
|
272
|
+
fk_table: fk?.table || null,
|
|
273
|
+
fk_column: fk?.column || null,
|
|
274
|
+
description: desc,
|
|
275
|
+
});
|
|
276
|
+
if (fk) {
|
|
277
|
+
dbRels.push({
|
|
278
|
+
from_table: name,
|
|
279
|
+
from_column: colName,
|
|
280
|
+
to_table: fk.table,
|
|
281
|
+
to_column: fk.column,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
dbTables.push({ name, column_count: colCount, pk_count: pkCount, fk_count: fkCount, is_view: isView });
|
|
286
|
+
}
|
|
287
|
+
// Build function data
|
|
288
|
+
const dbFuncs = [];
|
|
289
|
+
const rpcPaths = Object.entries(spec.paths).filter(([p]) => p.startsWith("/rpc/"));
|
|
290
|
+
for (const [path, endpoint] of rpcPaths) {
|
|
291
|
+
const funcName = path.replace("/rpc/", "");
|
|
292
|
+
const post = endpoint.post;
|
|
293
|
+
const params = post?.parameters?.filter((p) => p.in === "body") || [];
|
|
294
|
+
let paramsJson = "[]";
|
|
295
|
+
if (params.length > 0 && params[0].schema?.properties) {
|
|
296
|
+
const props = params[0].schema.properties;
|
|
297
|
+
paramsJson = JSON.stringify(Object.entries(props).map(([n, d]) => ({ name: n, type: d.format || d.type || "unknown" })));
|
|
298
|
+
}
|
|
299
|
+
dbFuncs.push({ name: funcName, params: paramsJson, description: post?.description || null });
|
|
300
|
+
}
|
|
301
|
+
insertAll(db, dbTables, dbColumns, dbRels, dbFuncs);
|
|
302
|
+
db.close();
|
|
303
|
+
write("\u2713\n");
|
|
304
|
+
}
|
|
305
|
+
catch (e) {
|
|
306
|
+
const err = e;
|
|
307
|
+
write(`FAILED (${err.message}) — markdown files still available\n`);
|
|
308
|
+
if (err.stack)
|
|
309
|
+
write(` ${err.stack.split("\n").slice(1, 3).join("\n ")}\n`);
|
|
310
|
+
}
|
|
311
|
+
write(`\n Schema snapshot saved to ${opts.output}/\n`);
|
|
312
|
+
write(` ${tables.length} tables, ${views.length} views, ${rpcs.length} functions, ${Object.keys(rels).length} FKs\n`);
|
|
313
|
+
write(`\n Add to .gitignore: ${opts.output}/\n\n`);
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
4
|
+
import { hasDb, openDb, getTableColumns, getTableInfo, getAllTableNames, getRelationshipsFor, findMatchingFunctions, } from "../util/db.js";
|
|
5
|
+
function write(msg) {
|
|
6
|
+
process.stdout.write(msg);
|
|
7
|
+
}
|
|
8
|
+
function findTable(name, allTables) {
|
|
9
|
+
const exact = allTables.find((t) => t === name.toLowerCase());
|
|
10
|
+
return exact || allTables.find((t) => t.includes(name.toLowerCase()));
|
|
11
|
+
}
|
|
12
|
+
function renderColumnsSqlite(cols) {
|
|
13
|
+
write("| Column | Type | Nullable | Default | FK |\n");
|
|
14
|
+
write("|--------|------|----------|---------|-----|\n");
|
|
15
|
+
for (const col of cols) {
|
|
16
|
+
const pk = col.is_pk ? " **PK**" : "";
|
|
17
|
+
const nullable = col.nullable ? "nullable" : "NOT NULL";
|
|
18
|
+
const fk = col.fk_table ? `→ ${col.fk_table}.${col.fk_column}` : "";
|
|
19
|
+
write(`| ${col.name}${pk} | ${col.type || "unknown"} | ${nullable} | ${col.default_value || ""} | ${fk} |\n`);
|
|
20
|
+
}
|
|
21
|
+
const notes = cols.filter((c) => c.description);
|
|
22
|
+
if (notes.length > 0) {
|
|
23
|
+
write("\n## Notes\n");
|
|
24
|
+
for (const col of notes)
|
|
25
|
+
write(`- **${col.name}**: ${col.description}\n`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function runSqlite(schemaDir, name) {
|
|
29
|
+
const db = openDb(schemaDir);
|
|
30
|
+
const allTables = getAllTableNames(db);
|
|
31
|
+
const match = findTable(name, allTables);
|
|
32
|
+
if (!match) {
|
|
33
|
+
const similar = allTables.filter((t) => t.includes(name.toLowerCase().slice(0, 4)));
|
|
34
|
+
db.close();
|
|
35
|
+
write(`Table "${name}" not found.\n`);
|
|
36
|
+
if (similar.length > 0)
|
|
37
|
+
write(`Did you mean: ${similar.join(", ")}?\n`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const info = getTableInfo(db, match);
|
|
41
|
+
const cols = getTableColumns(db, match);
|
|
42
|
+
write(`# ${match}\n\n`);
|
|
43
|
+
write(`${info?.column_count || cols.length} columns | ${info?.pk_count || 0} PK | ${info?.fk_count || 0} FK\n\n`);
|
|
44
|
+
renderColumnsSqlite(cols);
|
|
45
|
+
// Relationships
|
|
46
|
+
const { outgoing, incoming } = getRelationshipsFor(db, match);
|
|
47
|
+
if (outgoing.length > 0 || incoming.length > 0) {
|
|
48
|
+
write("\n## Relationships\n\n");
|
|
49
|
+
if (outgoing.length > 0) {
|
|
50
|
+
write("**This table references:**\n");
|
|
51
|
+
for (const r of outgoing)
|
|
52
|
+
write(` → ${r.to_table}.${r.to_column} (via ${r.from_column})\n`);
|
|
53
|
+
write("\n");
|
|
54
|
+
}
|
|
55
|
+
if (incoming.length > 0) {
|
|
56
|
+
write("**Referenced by:**\n");
|
|
57
|
+
for (const r of incoming)
|
|
58
|
+
write(` ← ${r.from_table}.${r.from_column}\n`);
|
|
59
|
+
write("\n");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Related functions
|
|
63
|
+
const namePatterns = [match, match.endsWith("s") ? match.slice(0, -1) : match + "s"];
|
|
64
|
+
const funcs = new Set();
|
|
65
|
+
for (const pattern of namePatterns) {
|
|
66
|
+
for (const f of findMatchingFunctions(db, pattern))
|
|
67
|
+
funcs.add(f.name);
|
|
68
|
+
}
|
|
69
|
+
if (funcs.size > 0) {
|
|
70
|
+
write("## Related Functions\n\n");
|
|
71
|
+
for (const f of funcs)
|
|
72
|
+
write(`- \`${f}\`\n`);
|
|
73
|
+
write("\n");
|
|
74
|
+
}
|
|
75
|
+
// Related table summaries
|
|
76
|
+
const relatedNames = new Set([...outgoing.map((r) => r.to_table), ...incoming.map((r) => r.from_table)]);
|
|
77
|
+
if (relatedNames.size > 0) {
|
|
78
|
+
write("## Related Table Summaries\n\n");
|
|
79
|
+
for (const relName of relatedNames) {
|
|
80
|
+
const relInfo = getTableInfo(db, relName);
|
|
81
|
+
if (relInfo) {
|
|
82
|
+
write(`- **${relName}**: ${relInfo.column_count} columns | ${relInfo.pk_count} PK | ${relInfo.fk_count} FK\n`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
write("\n");
|
|
86
|
+
}
|
|
87
|
+
db.close();
|
|
88
|
+
}
|
|
89
|
+
function runMarkdown(schemaDir, name) {
|
|
90
|
+
const tablesDir = join(schemaDir, "tables");
|
|
91
|
+
const allTables = readdirSync(tablesDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
|
|
92
|
+
const match = findTable(name, allTables);
|
|
93
|
+
if (!match) {
|
|
94
|
+
const similar = allTables.filter((t) => t.includes(name.toLowerCase().slice(0, 4)));
|
|
95
|
+
write(`Table "${name}" not found.\n`);
|
|
96
|
+
if (similar.length > 0)
|
|
97
|
+
write(`Did you mean: ${similar.join(", ")}?\n`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
write(readFileSync(join(tablesDir, `${match}.md`), "utf-8"));
|
|
101
|
+
write("\n");
|
|
102
|
+
const relsFile = join(schemaDir, "relationships.json");
|
|
103
|
+
if (existsSync(relsFile)) {
|
|
104
|
+
const rels = JSON.parse(readFileSync(relsFile, "utf-8"));
|
|
105
|
+
const outgoing = [];
|
|
106
|
+
const incoming = [];
|
|
107
|
+
for (const [from, to] of Object.entries(rels)) {
|
|
108
|
+
if (from.split(".")[0] === match)
|
|
109
|
+
outgoing.push(` → ${to} (via ${from.split(".")[1]})`);
|
|
110
|
+
if (to.split(".")[0] === match)
|
|
111
|
+
incoming.push(` ← ${from}`);
|
|
112
|
+
}
|
|
113
|
+
if (outgoing.length > 0 || incoming.length > 0) {
|
|
114
|
+
write("\n## Relationships\n\n");
|
|
115
|
+
if (outgoing.length > 0) {
|
|
116
|
+
write("**This table references:**\n");
|
|
117
|
+
outgoing.forEach((r) => write(r + "\n"));
|
|
118
|
+
write("\n");
|
|
119
|
+
}
|
|
120
|
+
if (incoming.length > 0) {
|
|
121
|
+
write("**Referenced by:**\n");
|
|
122
|
+
incoming.forEach((r) => write(r + "\n"));
|
|
123
|
+
write("\n");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const funcsFile = join(schemaDir, "functions.md");
|
|
128
|
+
if (existsSync(funcsFile)) {
|
|
129
|
+
const content = readFileSync(funcsFile, "utf-8");
|
|
130
|
+
const namePatterns = [match, match.endsWith("s") ? match.slice(0, -1) : match + "s"];
|
|
131
|
+
const funcs = new Set();
|
|
132
|
+
for (const line of content.split("\n")) {
|
|
133
|
+
if (line.startsWith("## ")) {
|
|
134
|
+
const funcName = line.replace("## ", "");
|
|
135
|
+
for (const pattern of namePatterns) {
|
|
136
|
+
if (funcName.toLowerCase().includes(pattern.toLowerCase()))
|
|
137
|
+
funcs.add(funcName);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (funcs.size > 0) {
|
|
142
|
+
write("## Related Functions\n\n");
|
|
143
|
+
for (const f of funcs)
|
|
144
|
+
write(`- \`${f}\`\n`);
|
|
145
|
+
write("\n");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export function tableCommand() {
|
|
150
|
+
return new Command("table")
|
|
151
|
+
.description("Show full details for a table — columns, relationships, related tables, functions that use it")
|
|
152
|
+
.argument("<name>", "Table name (exact or partial match)")
|
|
153
|
+
.option("--dir <dir>", "Schema directory", ".supabase-schema")
|
|
154
|
+
.action((name, opts) => {
|
|
155
|
+
const schemaDir = join(process.cwd(), opts.dir);
|
|
156
|
+
if (!existsSync(schemaDir)) {
|
|
157
|
+
write(`No schema snapshot found at ${opts.dir}/\n`);
|
|
158
|
+
write("Run `supabase-skill snapshot` first.\n");
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
if (hasDb(schemaDir)) {
|
|
162
|
+
runSqlite(schemaDir, name);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
runMarkdown(schemaDir, name);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/commands/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { removeSection } from "../util/claude-md.js";
|
|
5
|
+
export function uninstallCommand() {
|
|
6
|
+
return new Command("uninstall")
|
|
7
|
+
.description("Remove supabase-skill entries from CLAUDE.md files")
|
|
8
|
+
.option("--global", "Remove from global ~/.claude/CLAUDE.md only")
|
|
9
|
+
.action((opts) => {
|
|
10
|
+
const results = [];
|
|
11
|
+
if (opts.global) {
|
|
12
|
+
const globalPath = join(homedir(), ".claude", "CLAUDE.md");
|
|
13
|
+
const result = removeSection(globalPath);
|
|
14
|
+
results.push(`~/.claude/CLAUDE.md: ${result}`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// Remove from current project
|
|
18
|
+
const cwd = process.cwd();
|
|
19
|
+
const claudeMd = join(cwd, "CLAUDE.md");
|
|
20
|
+
const dotClaudeMd = join(cwd, ".claude", "CLAUDE.md");
|
|
21
|
+
results.push(`CLAUDE.md: ${removeSection(claudeMd)}`);
|
|
22
|
+
results.push(`.claude/CLAUDE.md: ${removeSection(dotClaudeMd)}`);
|
|
23
|
+
}
|
|
24
|
+
process.stdout.write("supabase-skill uninstall:\n");
|
|
25
|
+
for (const r of results) {
|
|
26
|
+
process.stdout.write(` ${r}\n`);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.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,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;SAC5B,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,UAAU,EAAE,6CAA6C,CAAC;SACjE,MAAM,CAAC,CAAC,IAA0B,EAAE,EAAE;QACrC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YAEtD,OAAO,CAAC,IAAI,CAAC,cAAc,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,sBAAsB,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { installCommand } from "./commands/install.js";
|
|
4
|
+
import { initCommand } from "./commands/init.js";
|
|
5
|
+
import { docsCommand } from "./commands/docs.js";
|
|
6
|
+
import { uninstallCommand } from "./commands/uninstall.js";
|
|
7
|
+
import { envsCommand } from "./commands/envs.js";
|
|
8
|
+
import { snapshotCommand } from "./commands/snapshot.js";
|
|
9
|
+
import { searchCommand } from "./commands/search.js";
|
|
10
|
+
import { contextCommand } from "./commands/context.js";
|
|
11
|
+
import { columnsCommand } from "./commands/columns.js";
|
|
12
|
+
import { tableCommand } from "./commands/table.js";
|
|
13
|
+
import { cronCommand } from "./commands/cron.js";
|
|
14
|
+
const program = new Command();
|
|
15
|
+
program
|
|
16
|
+
.name("supabase-skill")
|
|
17
|
+
.description("Supabase CLI skill for AI agents. Installs comprehensive CLI instructions into CLAUDE.md with multi-environment support.")
|
|
18
|
+
.version("0.1.0");
|
|
19
|
+
program.addCommand(installCommand());
|
|
20
|
+
program.addCommand(initCommand());
|
|
21
|
+
program.addCommand(docsCommand());
|
|
22
|
+
program.addCommand(uninstallCommand());
|
|
23
|
+
program.addCommand(envsCommand());
|
|
24
|
+
program.addCommand(snapshotCommand());
|
|
25
|
+
program.addCommand(searchCommand());
|
|
26
|
+
program.addCommand(contextCommand());
|
|
27
|
+
program.addCommand(columnsCommand());
|
|
28
|
+
program.addCommand(tableCommand());
|
|
29
|
+
program.addCommand(cronCommand());
|
|
30
|
+
program.parse();
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,0HAA0H,CAAC;KACvI,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|