@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,85 @@
1
+ import { Command } from "commander";
2
+ import { join } from "node:path";
3
+ import { readFileSync, writeFileSync, existsSync, appendFileSync } from "node:fs";
4
+ import { upsertSection } from "../util/claude-md.js";
5
+ import { readConfig } from "../util/config.js";
6
+ import { getSkillDoc } from "./docs.js";
7
+ function write(msg) {
8
+ process.stdout.write(msg);
9
+ }
10
+ export function initCommand() {
11
+ return new Command("init")
12
+ .description("Initialize supabase-skill in the current project (CLAUDE.md + .env + .gitignore)")
13
+ .action(() => {
14
+ const cwd = process.cwd();
15
+ const results = [];
16
+ const config = readConfig();
17
+ if (!config) {
18
+ write(" No global config found. Run `supabase-skill install` first.\n");
19
+ write(" Proceeding with generic skill doc (no environment refs).\n\n");
20
+ }
21
+ const skillDoc = getSkillDoc(config);
22
+ // 1. Upsert into project CLAUDE.md
23
+ const claudeMd = join(cwd, "CLAUDE.md");
24
+ const claudeResult = upsertSection(claudeMd, skillDoc);
25
+ results.push(`CLAUDE.md: ${claudeResult}`);
26
+ // Also update .claude/CLAUDE.md if the directory exists
27
+ const dotClaudeDir = join(cwd, ".claude");
28
+ const dotClaudeMd = join(dotClaudeDir, "CLAUDE.md");
29
+ if (existsSync(dotClaudeDir)) {
30
+ const dotResult = upsertSection(dotClaudeMd, skillDoc);
31
+ results.push(`.claude/CLAUDE.md: ${dotResult}`);
32
+ }
33
+ // 2. .env — add project ref placeholders
34
+ const envPath = join(cwd, ".env");
35
+ const envVars = [];
36
+ if (config && Object.keys(config.environments).length > 0) {
37
+ for (const [env, { ref }] of Object.entries(config.environments)) {
38
+ envVars.push(`SUPABASE_${env.toUpperCase()}_REF=${ref}`);
39
+ }
40
+ }
41
+ else {
42
+ envVars.push("SUPABASE_STAGE_REF=");
43
+ envVars.push("SUPABASE_PROD_REF=");
44
+ }
45
+ if (!existsSync(envPath)) {
46
+ writeFileSync(envPath, envVars.join("\n") + "\n");
47
+ results.push(".env: created with project refs");
48
+ }
49
+ else {
50
+ const envContent = readFileSync(envPath, "utf-8");
51
+ const missing = envVars.filter((v) => {
52
+ const key = v.split("=")[0];
53
+ return !envContent.includes(key);
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)`);
58
+ }
59
+ else {
60
+ results.push(".env: project refs already present");
61
+ }
62
+ }
63
+ // 3. .gitignore
64
+ const gitignorePath = join(cwd, ".gitignore");
65
+ if (!existsSync(gitignorePath)) {
66
+ writeFileSync(gitignorePath, ".env\n");
67
+ results.push(".gitignore: created with .env");
68
+ }
69
+ else {
70
+ const giContent = readFileSync(gitignorePath, "utf-8");
71
+ if (giContent.includes(".env")) {
72
+ results.push(".gitignore: .env already listed");
73
+ }
74
+ else {
75
+ appendFileSync(gitignorePath, ".env\n");
76
+ results.push(".gitignore: appended .env");
77
+ }
78
+ }
79
+ write("supabase-skill init complete:\n");
80
+ for (const r of results) {
81
+ write(` ${r}\n`);
82
+ }
83
+ });
84
+ }
85
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function installCommand(): Command;
@@ -0,0 +1,129 @@
1
+ import { Command } from "commander";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { readFileSync, writeFileSync, existsSync, appendFileSync } from "node:fs";
5
+ import { createInterface } from "node:readline";
6
+ import { upsertSection } from "../util/claude-md.js";
7
+ import { writeConfig, getDefaultConfig } from "../util/config.js";
8
+ import { isSupabaseCLIInstalled, isLoggedIn, listProjects } from "../util/detect.js";
9
+ import { getSkillDoc } from "./docs.js";
10
+ function prompt(question) {
11
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
12
+ return new Promise((resolve) => {
13
+ rl.question(question, (answer) => {
14
+ rl.close();
15
+ resolve(answer.trim());
16
+ });
17
+ });
18
+ }
19
+ function write(msg) {
20
+ process.stdout.write(msg);
21
+ }
22
+ export function installCommand() {
23
+ return new Command("install")
24
+ .description("Set up supabase-skill globally (checks CLI, configures environments, updates ~/.claude/CLAUDE.md)")
25
+ .option("--skip-shell", "Skip shell profile modification")
26
+ .option("--non-interactive", "Skip interactive prompts (use existing config or defaults)")
27
+ .action(async (opts) => {
28
+ const home = homedir();
29
+ const results = [];
30
+ // 1. Check supabase CLI
31
+ write("\n Checking supabase CLI... ");
32
+ const { installed, version } = isSupabaseCLIInstalled();
33
+ if (!installed) {
34
+ write("NOT FOUND\n\n");
35
+ write(" Supabase CLI is required. Install it:\n");
36
+ write(" brew install supabase/tap/supabase\n");
37
+ write(" # or: npm install -g supabase\n");
38
+ write(" # or: https://supabase.com/docs/guides/cli/getting-started\n\n");
39
+ process.exit(1);
40
+ }
41
+ write(`\u2713 v${version}\n`);
42
+ // 2. Check login
43
+ write(" Checking login status... ");
44
+ const loggedIn = isLoggedIn();
45
+ if (!loggedIn) {
46
+ write("NOT LOGGED IN\n\n");
47
+ write(" Run: supabase login\n");
48
+ write(" Then re-run: supabase-skill install\n\n");
49
+ process.exit(1);
50
+ }
51
+ write("\u2713 logged in\n");
52
+ // 3. List projects and tag environments
53
+ const config = getDefaultConfig();
54
+ if (!opts.nonInteractive && process.stdin.isTTY) {
55
+ const projects = listProjects();
56
+ if (projects.length > 0) {
57
+ write(`\n Found ${projects.length} project(s):\n`);
58
+ projects.forEach((p, i) => {
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 };
67
+ }
68
+ }
69
+ // Set default env
70
+ if (config.environments["stage"]) {
71
+ config.defaultEnv = "stage";
72
+ }
73
+ else if (config.environments["dev"]) {
74
+ config.defaultEnv = "dev";
75
+ }
76
+ else {
77
+ const envKeys = Object.keys(config.environments);
78
+ if (envKeys.length > 0)
79
+ config.defaultEnv = envKeys[0];
80
+ }
81
+ }
82
+ else {
83
+ write("\n No projects found. You can configure environments later with:\n");
84
+ write(" supabase-skill install\n");
85
+ }
86
+ }
87
+ // 4. Write config
88
+ writeConfig(config);
89
+ results.push("~/.config/supabase-skill/config.json: created");
90
+ // 5. Upsert into global CLAUDE.md
91
+ const claudeMd = join(home, ".claude", "CLAUDE.md");
92
+ const skillDoc = getSkillDoc(config);
93
+ const claudeResult = upsertSection(claudeMd, skillDoc);
94
+ results.push(`~/.claude/CLAUDE.md: ${claudeResult}`);
95
+ // 6. Shell profile — ensure SUPABASE_ACCESS_TOKEN
96
+ if (!opts.skipShell) {
97
+ const shell = process.env.SHELL || "/bin/bash";
98
+ const profileName = shell.includes("zsh") ? ".zshrc" : ".bashrc";
99
+ const profilePath = join(home, profileName);
100
+ if (existsSync(profilePath)) {
101
+ const content = readFileSync(profilePath, "utf-8");
102
+ if (content.includes("SUPABASE_ACCESS_TOKEN")) {
103
+ results.push(`~/${profileName}: SUPABASE_ACCESS_TOKEN already present`);
104
+ }
105
+ else {
106
+ appendFileSync(profilePath, "\n# supabase-skill\nexport SUPABASE_ACCESS_TOKEN=\"\"\n");
107
+ results.push(`~/${profileName}: added SUPABASE_ACCESS_TOKEN placeholder`);
108
+ }
109
+ }
110
+ else {
111
+ writeFileSync(profilePath, "# supabase-skill\nexport SUPABASE_ACCESS_TOKEN=\"\"\n");
112
+ results.push(`~/${profileName}: created with SUPABASE_ACCESS_TOKEN placeholder`);
113
+ }
114
+ }
115
+ // Output results
116
+ write("\n supabase-skill install complete:\n");
117
+ for (const r of results) {
118
+ write(` ${r}\n`);
119
+ }
120
+ if (Object.keys(config.environments).length > 0) {
121
+ write("\n Configured environments:\n");
122
+ for (const [env, { ref, name }] of Object.entries(config.environments)) {
123
+ write(` ${env.toUpperCase()}: ${ref} (${name})\n`);
124
+ }
125
+ }
126
+ write("\n Next: run `supabase-skill init` in any project directory.\n\n");
127
+ });
128
+ }
129
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function searchCommand(): Command;
@@ -0,0 +1,102 @@
1
+ import { Command } from "commander";
2
+ import { join } from "node:path";
3
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
4
+ import { hasDb, openDb, searchFTS } from "../util/db.js";
5
+ function write(msg) {
6
+ process.stdout.write(msg);
7
+ }
8
+ function searchSqlite(schemaDir, query) {
9
+ const db = openDb(schemaDir);
10
+ const ftsResults = searchFTS(db, query);
11
+ db.close();
12
+ return ftsResults.map((r) => ({
13
+ type: r.type,
14
+ name: r.parent ? `${r.parent}.${r.name}` : r.name,
15
+ match: r.detail || "name",
16
+ file: r.type === "column" ? `tables/${r.parent}.md` : r.type === "table" ? `tables/${r.name}.md` : "functions.md",
17
+ }));
18
+ }
19
+ function searchMarkdown(schemaDir, query) {
20
+ const q = query.toLowerCase();
21
+ const results = [];
22
+ const tablesDir = join(schemaDir, "tables");
23
+ if (existsSync(tablesDir)) {
24
+ const files = readdirSync(tablesDir).filter((f) => f.endsWith(".md"));
25
+ for (const file of files) {
26
+ const tableName = file.replace(".md", "");
27
+ const content = readFileSync(join(tablesDir, file), "utf-8");
28
+ if (tableName.toLowerCase().includes(q)) {
29
+ results.push({ type: "table", name: tableName, match: "name", file: `tables/${file}` });
30
+ }
31
+ for (const line of content.split("\n")) {
32
+ if (line.startsWith("|") && !line.startsWith("| Column") && !line.startsWith("|---")) {
33
+ const cols = line.split("|").slice(1, -1).map((c) => c.trim());
34
+ if (cols.length > 0) {
35
+ const colName = cols[0].replace(/\s*\*\*PK\*\*/, "");
36
+ if (colName.toLowerCase().includes(q)) {
37
+ results.push({ type: "column", name: `${tableName}.${colName}`, match: cols[1] || "", file: `tables/${file}` });
38
+ }
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ const funcsFile = join(schemaDir, "functions.md");
45
+ if (existsSync(funcsFile)) {
46
+ for (const line of readFileSync(funcsFile, "utf-8").split("\n")) {
47
+ if (line.startsWith("## ") && line.toLowerCase().includes(q)) {
48
+ results.push({ type: "function", name: line.replace("## ", ""), match: "name", file: "functions.md" });
49
+ }
50
+ }
51
+ }
52
+ const relsFile = join(schemaDir, "relationships.json");
53
+ if (existsSync(relsFile)) {
54
+ const rels = JSON.parse(readFileSync(relsFile, "utf-8"));
55
+ for (const [from, to] of Object.entries(rels)) {
56
+ if (from.toLowerCase().includes(q) || to.toLowerCase().includes(q)) {
57
+ results.push({ type: "fk", name: `${from} → ${to}`, match: "relationship", file: "relationships.json" });
58
+ }
59
+ }
60
+ }
61
+ return results;
62
+ }
63
+ export function searchCommand() {
64
+ return new Command("search")
65
+ .description("Search the local schema snapshot for tables, columns, or functions (FTS5 powered)")
66
+ .argument("<query>", "Search term (table name, column name, or function name)")
67
+ .option("--dir <dir>", "Schema directory", ".supabase-schema")
68
+ .option("--json", "Output as JSON")
69
+ .action((query, opts) => {
70
+ const schemaDir = join(process.cwd(), opts.dir);
71
+ if (!existsSync(schemaDir)) {
72
+ write(`No schema snapshot found at ${opts.dir}/\n`);
73
+ write("Run `supabase-skill snapshot` first.\n");
74
+ process.exit(1);
75
+ }
76
+ const results = hasDb(schemaDir) ? searchSqlite(schemaDir, query) : searchMarkdown(schemaDir, query);
77
+ if (opts.json) {
78
+ write(JSON.stringify(results, null, 2) + "\n");
79
+ return;
80
+ }
81
+ if (results.length === 0) {
82
+ write(`No matches for "${query}"\n`);
83
+ return;
84
+ }
85
+ write(`\n${results.length} match(es) for "${query}":\n\n`);
86
+ const grouped = {};
87
+ for (const r of results) {
88
+ if (!grouped[r.type])
89
+ grouped[r.type] = [];
90
+ grouped[r.type].push(r);
91
+ }
92
+ for (const [type, items] of Object.entries(grouped)) {
93
+ write(` ${type.toUpperCase()}S:\n`);
94
+ for (const item of items) {
95
+ const detail = item.match && item.match !== "name" ? ` (${item.match})` : "";
96
+ write(` ${item.name}${detail} [${item.file}]\n`);
97
+ }
98
+ write("\n");
99
+ }
100
+ });
101
+ }
102
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function snapshotCommand(): Command;