@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.
Files changed (50) hide show
  1. package/README.md +383 -0
  2. package/dist/commands/columns.d.ts +2 -0
  3. package/dist/commands/columns.js +121 -0
  4. package/dist/commands/columns.js.map +1 -0
  5. package/dist/commands/context.d.ts +2 -0
  6. package/dist/commands/context.js +236 -0
  7. package/dist/commands/context.js.map +1 -0
  8. package/dist/commands/cron.d.ts +2 -0
  9. package/dist/commands/cron.js +116 -0
  10. package/dist/commands/cron.js.map +1 -0
  11. package/dist/commands/docs.d.ts +4 -0
  12. package/dist/commands/docs.js +182 -0
  13. package/dist/commands/docs.js.map +1 -0
  14. package/dist/commands/envs.d.ts +2 -0
  15. package/dist/commands/envs.js +22 -0
  16. package/dist/commands/envs.js.map +1 -0
  17. package/dist/commands/init.d.ts +2 -0
  18. package/dist/commands/init.js +85 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/install.d.ts +2 -0
  21. package/dist/commands/install.js +129 -0
  22. package/dist/commands/install.js.map +1 -0
  23. package/dist/commands/search.d.ts +2 -0
  24. package/dist/commands/search.js +102 -0
  25. package/dist/commands/search.js.map +1 -0
  26. package/dist/commands/snapshot.d.ts +2 -0
  27. package/dist/commands/snapshot.js +316 -0
  28. package/dist/commands/snapshot.js.map +1 -0
  29. package/dist/commands/table.d.ts +2 -0
  30. package/dist/commands/table.js +169 -0
  31. package/dist/commands/table.js.map +1 -0
  32. package/dist/commands/uninstall.d.ts +2 -0
  33. package/dist/commands/uninstall.js +30 -0
  34. package/dist/commands/uninstall.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.js +31 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/util/claude-md.d.ts +3 -0
  39. package/dist/util/claude-md.js +48 -0
  40. package/dist/util/claude-md.js.map +1 -0
  41. package/dist/util/config.d.ts +15 -0
  42. package/dist/util/config.js +37 -0
  43. package/dist/util/config.js.map +1 -0
  44. package/dist/util/db.d.ts +85 -0
  45. package/dist/util/db.js +237 -0
  46. package/dist/util/db.js.map +1 -0
  47. package/dist/util/detect.d.ts +13 -0
  48. package/dist/util/detect.js +34 -0
  49. package/dist/util/detect.js.map +1 -0
  50. 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,2 @@
1
+ import { Command } from "commander";
2
+ export declare function tableCommand(): Command;
@@ -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,2 @@
1
+ import { Command } from "commander";
2
+ export declare function uninstallCommand(): Command;
@@ -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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
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"}
@@ -0,0 +1,3 @@
1
+ export declare function getMarkedSnippet(content: string): string;
2
+ export declare function upsertSection(filePath: string, content: string): "created" | "updated" | "unchanged";
3
+ export declare function removeSection(filePath: string): "removed" | "not_found";