axgram 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 +126 -0
- package/dist/bin/axgram-hook.js +77 -0
- package/dist/bin/axgram-hook.js.map +1 -0
- package/dist/bin/axgram.js +386 -0
- package/dist/bin/axgram.js.map +1 -0
- package/dist/commands/hook-session-start.js +85 -0
- package/dist/commands/hook-session-start.js.map +1 -0
- package/dist/commands/hook-stop.js +73 -0
- package/dist/commands/hook-stop.js.map +1 -0
- package/dist/commands/import.js +56 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/invitations.js +153 -0
- package/dist/commands/invitations.js.map +1 -0
- package/dist/commands/login.js +125 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +11 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/members.js +231 -0
- package/dist/commands/members.js.map +1 -0
- package/dist/commands/mine.js +78 -0
- package/dist/commands/mine.js.map +1 -0
- package/dist/commands/orgs.js +153 -0
- package/dist/commands/orgs.js.map +1 -0
- package/dist/commands/projects.js +285 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/teams.js +153 -0
- package/dist/commands/teams.js.map +1 -0
- package/dist/commands/whoami.js +27 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/lib/auth.js +128 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/chunkers/exchange-pair.js +51 -0
- package/dist/lib/chunkers/exchange-pair.js.map +1 -0
- package/dist/lib/chunkers/index.js +74 -0
- package/dist/lib/chunkers/index.js.map +1 -0
- package/dist/lib/chunkers/line-group.js +20 -0
- package/dist/lib/chunkers/line-group.js.map +1 -0
- package/dist/lib/chunkers/paragraph.js +29 -0
- package/dist/lib/chunkers/paragraph.js.map +1 -0
- package/dist/lib/chunkers/types.js +3 -0
- package/dist/lib/chunkers/types.js.map +1 -0
- package/dist/lib/config-dir.js +30 -0
- package/dist/lib/config-dir.js.map +1 -0
- package/dist/lib/destructive-confirm.js +71 -0
- package/dist/lib/destructive-confirm.js.map +1 -0
- package/dist/lib/entity-extractor.js +182 -0
- package/dist/lib/entity-extractor.js.map +1 -0
- package/dist/lib/global-config.js +42 -0
- package/dist/lib/global-config.js.map +1 -0
- package/dist/lib/hook-settings.js +87 -0
- package/dist/lib/hook-settings.js.map +1 -0
- package/dist/lib/hook-state.js +38 -0
- package/dist/lib/hook-state.js.map +1 -0
- package/dist/lib/importers/chatgpt.js +89 -0
- package/dist/lib/importers/chatgpt.js.map +1 -0
- package/dist/lib/importers/claude.js +47 -0
- package/dist/lib/importers/claude.js.map +1 -0
- package/dist/lib/importers/gemini.js +38 -0
- package/dist/lib/importers/gemini.js.map +1 -0
- package/dist/lib/importers/markdown.js +47 -0
- package/dist/lib/importers/markdown.js.map +1 -0
- package/dist/lib/importers/obsidian.js +62 -0
- package/dist/lib/importers/obsidian.js.map +1 -0
- package/dist/lib/importers/run.js +51 -0
- package/dist/lib/importers/run.js.map +1 -0
- package/dist/lib/ingest.js +101 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/mcp-client.js +56 -0
- package/dist/lib/mcp-client.js.map +1 -0
- package/dist/lib/project-resolver.js +42 -0
- package/dist/lib/project-resolver.js.map +1 -0
- package/dist/lib/remote-url.js +23 -0
- package/dist/lib/remote-url.js.map +1 -0
- package/dist/lib/repo-bindings.js +52 -0
- package/dist/lib/repo-bindings.js.map +1 -0
- package/dist/lib/repo.js +72 -0
- package/dist/lib/repo.js.map +1 -0
- package/dist/lib/room-detector.js +99 -0
- package/dist/lib/room-detector.js.map +1 -0
- package/dist/lib/slugify.js +17 -0
- package/dist/lib/slugify.js.map +1 -0
- package/dist/lib/supabase-client.js +35 -0
- package/dist/lib/supabase-client.js.map +1 -0
- package/dist/lib/tool-vocab.js +114 -0
- package/dist/lib/tool-vocab.js.map +1 -0
- package/dist/lib/transcript.js +68 -0
- package/dist/lib/transcript.js.map +1 -0
- package/dist/lib/walker.js +81 -0
- package/dist/lib/walker.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Plan 5 Task 10: `axgram members` subcommands.
|
|
3
|
+
//
|
|
4
|
+
// ls, promote, demote, remove, leave. Email-or-id input resolution; the
|
|
5
|
+
// last-member self-leave routes the user to the explicit `axgram teams
|
|
6
|
+
// delete` flow rather than auto-chaining the destructive op.
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.membersLs = membersLs;
|
|
12
|
+
exports.membersPromote = membersPromote;
|
|
13
|
+
exports.membersDemote = membersDemote;
|
|
14
|
+
exports.membersRemove = membersRemove;
|
|
15
|
+
exports.membersLeave = membersLeave;
|
|
16
|
+
const node_readline_1 = __importDefault(require("node:readline"));
|
|
17
|
+
const supabase_client_1 = require("../lib/supabase-client");
|
|
18
|
+
const defaultLog = (m) => process.stdout.write(`${m}\n`);
|
|
19
|
+
const defaultErr = (m) => process.stderr.write(`${m}\n`);
|
|
20
|
+
const isUuid = (s) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s);
|
|
21
|
+
async function buildSupabase(deps) {
|
|
22
|
+
return deps.supabaseFactory ? deps.supabaseFactory() : (0, supabase_client_1.authenticatedSupabase)();
|
|
23
|
+
}
|
|
24
|
+
async function callerId(deps, s) {
|
|
25
|
+
if (deps.callerUserId)
|
|
26
|
+
return deps.callerUserId;
|
|
27
|
+
const { data } = await s.auth.getUser();
|
|
28
|
+
return data.user?.id ?? null;
|
|
29
|
+
}
|
|
30
|
+
async function resolveTeamId(s, idOrName) {
|
|
31
|
+
const q = s.from("teams").select("id");
|
|
32
|
+
const { data } = isUuid(idOrName)
|
|
33
|
+
? await q.eq("id", idOrName).maybeSingle()
|
|
34
|
+
: await q.eq("name", idOrName).maybeSingle();
|
|
35
|
+
return data?.id ?? null;
|
|
36
|
+
}
|
|
37
|
+
async function resolveMemberByEmailOrId(s, teamId, emailOrId) {
|
|
38
|
+
const q = s
|
|
39
|
+
.from("team_members_v")
|
|
40
|
+
.select("user_id, email, role")
|
|
41
|
+
.eq("team_id", teamId);
|
|
42
|
+
const matches = isUuid(emailOrId)
|
|
43
|
+
? await q.eq("user_id", emailOrId)
|
|
44
|
+
: await q.eq("email", emailOrId);
|
|
45
|
+
if (matches.error) {
|
|
46
|
+
throw new Error(`Failed to resolve member: ${matches.error.message}`);
|
|
47
|
+
}
|
|
48
|
+
if ((matches.data ?? []).length === 0)
|
|
49
|
+
return null;
|
|
50
|
+
if ((matches.data ?? []).length > 1) {
|
|
51
|
+
throw new Error(`Ambiguous match for "${emailOrId}" — pass the user_id explicitly.`);
|
|
52
|
+
}
|
|
53
|
+
return matches.data[0];
|
|
54
|
+
}
|
|
55
|
+
async function confirmDestructiveAction(msg, options, deps) {
|
|
56
|
+
if (options.yes)
|
|
57
|
+
return true;
|
|
58
|
+
const tty = deps.isTTY ?? !!process.stdin.isTTY;
|
|
59
|
+
if (!tty && !deps.prompt)
|
|
60
|
+
return false;
|
|
61
|
+
const ask = deps.prompt ??
|
|
62
|
+
((q) => {
|
|
63
|
+
const rl = node_readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
|
|
64
|
+
return new Promise((res) => {
|
|
65
|
+
rl.question(q, (a) => {
|
|
66
|
+
rl.close();
|
|
67
|
+
res(a.trim());
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
const a = await ask(`${msg} [y/N] `);
|
|
72
|
+
return a.toLowerCase() === "y" || a.toLowerCase() === "yes";
|
|
73
|
+
}
|
|
74
|
+
async function membersLs(teamFlag, deps = {}) {
|
|
75
|
+
const log = deps.log ?? defaultLog;
|
|
76
|
+
const errOut = deps.err ?? defaultErr;
|
|
77
|
+
const s = await buildSupabase(deps);
|
|
78
|
+
let q = s
|
|
79
|
+
.from("team_members_v")
|
|
80
|
+
.select("team_id, user_id, email, role, joined_at")
|
|
81
|
+
.order("joined_at", { ascending: true });
|
|
82
|
+
if (teamFlag) {
|
|
83
|
+
const tid = await resolveTeamId(s, teamFlag);
|
|
84
|
+
if (!tid) {
|
|
85
|
+
errOut(`No team found matching "${teamFlag}".`);
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
q = q.eq("team_id", tid);
|
|
89
|
+
}
|
|
90
|
+
const { data, error } = await q;
|
|
91
|
+
if (error) {
|
|
92
|
+
errOut(`Failed to list members: ${error.message}`);
|
|
93
|
+
return 1;
|
|
94
|
+
}
|
|
95
|
+
if (!data || data.length === 0) {
|
|
96
|
+
log("No members visible.");
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
for (const m of data) {
|
|
100
|
+
log(`${m.user_id} [${m.role}] ${m.email} (team ${m.team_id})`);
|
|
101
|
+
}
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
async function changeRole(s, teamId, userId, newRole) {
|
|
105
|
+
const { data, error } = await s.rpc("change_member_role", {
|
|
106
|
+
p_team_id: teamId,
|
|
107
|
+
p_user_id: userId,
|
|
108
|
+
p_new_role: newRole,
|
|
109
|
+
});
|
|
110
|
+
if (error)
|
|
111
|
+
throw error;
|
|
112
|
+
return data[0];
|
|
113
|
+
}
|
|
114
|
+
async function membersPromote(emailOrId, options, deps = {}) {
|
|
115
|
+
const log = deps.log ?? defaultLog;
|
|
116
|
+
const errOut = deps.err ?? defaultErr;
|
|
117
|
+
const s = await buildSupabase(deps);
|
|
118
|
+
if (!options.team) {
|
|
119
|
+
errOut("--team <id-or-name> is required.");
|
|
120
|
+
return 1;
|
|
121
|
+
}
|
|
122
|
+
const tid = await resolveTeamId(s, options.team);
|
|
123
|
+
if (!tid) {
|
|
124
|
+
errOut(`No team found matching "${options.team}".`);
|
|
125
|
+
return 1;
|
|
126
|
+
}
|
|
127
|
+
const target = await resolveMemberByEmailOrId(s, tid, emailOrId);
|
|
128
|
+
if (!target) {
|
|
129
|
+
errOut(`No member found matching "${emailOrId}".`);
|
|
130
|
+
return 1;
|
|
131
|
+
}
|
|
132
|
+
const newRole = target.role === "member" ? "admin" : "owner";
|
|
133
|
+
const r = await changeRole(s, tid, target.user_id, newRole);
|
|
134
|
+
if (!r.ok) {
|
|
135
|
+
errOut(`Promotion blocked: ${r.message ?? r.code}`);
|
|
136
|
+
return 1;
|
|
137
|
+
}
|
|
138
|
+
log(`Promoted ${target.email} → ${newRole}.`);
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
async function membersDemote(emailOrId, options, deps = {}) {
|
|
142
|
+
const log = deps.log ?? defaultLog;
|
|
143
|
+
const errOut = deps.err ?? defaultErr;
|
|
144
|
+
const s = await buildSupabase(deps);
|
|
145
|
+
if (!options.team) {
|
|
146
|
+
errOut("--team <id-or-name> is required.");
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
const tid = await resolveTeamId(s, options.team);
|
|
150
|
+
if (!tid) {
|
|
151
|
+
errOut(`No team found matching "${options.team}".`);
|
|
152
|
+
return 1;
|
|
153
|
+
}
|
|
154
|
+
const target = await resolveMemberByEmailOrId(s, tid, emailOrId);
|
|
155
|
+
if (!target) {
|
|
156
|
+
errOut(`No member found matching "${emailOrId}".`);
|
|
157
|
+
return 1;
|
|
158
|
+
}
|
|
159
|
+
const newRole = target.role === "owner" ? "admin" : "member";
|
|
160
|
+
const r = await changeRole(s, tid, target.user_id, newRole);
|
|
161
|
+
if (!r.ok) {
|
|
162
|
+
if (r.code === "last_owner") {
|
|
163
|
+
errOut("Cannot demote the only owner. Promote another member first, or use `axgram teams delete` to remove the team.");
|
|
164
|
+
return 1;
|
|
165
|
+
}
|
|
166
|
+
errOut(`Demotion blocked: ${r.message ?? r.code}`);
|
|
167
|
+
return 1;
|
|
168
|
+
}
|
|
169
|
+
log(`Demoted ${target.email} → ${newRole}.`);
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
async function membersRemove(emailOrId, options, deps = {}) {
|
|
173
|
+
const log = deps.log ?? defaultLog;
|
|
174
|
+
const errOut = deps.err ?? defaultErr;
|
|
175
|
+
const s = await buildSupabase(deps);
|
|
176
|
+
if (!options.team) {
|
|
177
|
+
errOut("--team <id-or-name> is required.");
|
|
178
|
+
return 1;
|
|
179
|
+
}
|
|
180
|
+
const tid = await resolveTeamId(s, options.team);
|
|
181
|
+
if (!tid) {
|
|
182
|
+
errOut(`No team found matching "${options.team}".`);
|
|
183
|
+
return 1;
|
|
184
|
+
}
|
|
185
|
+
const target = await resolveMemberByEmailOrId(s, tid, emailOrId);
|
|
186
|
+
if (!target) {
|
|
187
|
+
errOut(`No member found matching "${emailOrId}".`);
|
|
188
|
+
return 1;
|
|
189
|
+
}
|
|
190
|
+
const me = await callerId(deps, s);
|
|
191
|
+
const isSelf = me === target.user_id;
|
|
192
|
+
const action = isSelf ? "leave this team" : `remove ${target.email} from this team`;
|
|
193
|
+
const ok = await confirmDestructiveAction(`Confirm: ${action}?`, options, deps);
|
|
194
|
+
if (!ok) {
|
|
195
|
+
errOut("Aborted.");
|
|
196
|
+
return 1;
|
|
197
|
+
}
|
|
198
|
+
const { data, error } = await s.rpc("remove_member", {
|
|
199
|
+
p_team_id: tid,
|
|
200
|
+
p_user_id: target.user_id,
|
|
201
|
+
});
|
|
202
|
+
if (error) {
|
|
203
|
+
errOut(`Failed to remove member: ${error.message}`);
|
|
204
|
+
return 1;
|
|
205
|
+
}
|
|
206
|
+
const row = data[0];
|
|
207
|
+
if (!row.ok && row.code === "last_member_redirect_to_delete") {
|
|
208
|
+
log("");
|
|
209
|
+
log(`You're the only member of "${row.redirect_team_name}".`);
|
|
210
|
+
log("Leaving would orphan the team — delete it instead?");
|
|
211
|
+
log("");
|
|
212
|
+
log(`Run: axgram teams delete ${row.redirect_team_id}`);
|
|
213
|
+
return 1;
|
|
214
|
+
}
|
|
215
|
+
if (!row.ok && row.code === "last_owner") {
|
|
216
|
+
errOut(`Cannot remove the only owner. Promote another member first.`);
|
|
217
|
+
return 1;
|
|
218
|
+
}
|
|
219
|
+
log(isSelf ? "You have left the team." : `Removed ${target.email}.`);
|
|
220
|
+
return 0;
|
|
221
|
+
}
|
|
222
|
+
async function membersLeave(options, deps = {}) {
|
|
223
|
+
const s = await buildSupabase(deps);
|
|
224
|
+
const me = await callerId(deps, s);
|
|
225
|
+
if (!me) {
|
|
226
|
+
(deps.err ?? defaultErr)("Not logged in. Run `axgram login`.");
|
|
227
|
+
return 1;
|
|
228
|
+
}
|
|
229
|
+
return membersRemove(me, options, { ...deps, supabaseFactory: async () => s });
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/commands/members.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mineCommand = mineCommand;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const index_1 = require("../lib/chunkers/index");
|
|
7
|
+
const entity_extractor_1 = require("../lib/entity-extractor");
|
|
8
|
+
const ingest_1 = require("../lib/ingest");
|
|
9
|
+
const mcp_client_1 = require("../lib/mcp-client");
|
|
10
|
+
const project_resolver_1 = require("../lib/project-resolver");
|
|
11
|
+
const remote_url_1 = require("../lib/remote-url");
|
|
12
|
+
const room_detector_1 = require("../lib/room-detector");
|
|
13
|
+
const walker_1 = require("../lib/walker");
|
|
14
|
+
const DEFAULT_WORKER_URL = (0, remote_url_1.resolveRemoteUrl)();
|
|
15
|
+
async function mineCommand(opts, deps = {}) {
|
|
16
|
+
const log = deps.log ?? ((m) => process.stdout.write(`${m}\n`));
|
|
17
|
+
const err = deps.err ?? ((m) => process.stderr.write(`${m}\n`));
|
|
18
|
+
const resolved = await (0, project_resolver_1.resolveActiveProject)({ flag: opts.project });
|
|
19
|
+
if (!resolved.projectId) {
|
|
20
|
+
err(resolved.repoKey
|
|
21
|
+
? `No project bound to ${resolved.repoKey}. Run \`axgram projects link\` to bind one.`
|
|
22
|
+
: "No active project. Pass --project, set AXGRAM_PROJECT_ID, or run `axgram projects use <id>`.");
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
const projectId = resolved.projectId;
|
|
26
|
+
const absPath = (0, node_path_1.resolve)(opts.path);
|
|
27
|
+
const wing = opts.wing ?? (0, node_path_1.basename)(absPath);
|
|
28
|
+
if (!wing || wing === ".") {
|
|
29
|
+
err("Could not infer wing name from path. Pass --wing explicitly.");
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
log(`Mining ${absPath} → project ${projectId} (wing="${wing}", source=${resolved.source})`);
|
|
33
|
+
const items = [];
|
|
34
|
+
let filesSeen = 0;
|
|
35
|
+
for await (const file of (0, walker_1.walk)(absPath)) {
|
|
36
|
+
filesSeen++;
|
|
37
|
+
let content;
|
|
38
|
+
try {
|
|
39
|
+
content = await (0, promises_1.readFile)(file.path, "utf8");
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
err(`Skipping ${file.relativePath}: ${e.message}`);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (content.trim().length === 0)
|
|
46
|
+
continue;
|
|
47
|
+
const { chunks } = (0, index_1.chunk)(file.path, content);
|
|
48
|
+
for (const c of chunks) {
|
|
49
|
+
const room = opts.room ?? (0, room_detector_1.detectRoom)(c.content);
|
|
50
|
+
const entities = opts.noKg ? undefined : (0, entity_extractor_1.extractEntities)(c.content);
|
|
51
|
+
items.push({
|
|
52
|
+
wing,
|
|
53
|
+
room,
|
|
54
|
+
content: c.content,
|
|
55
|
+
...(file.relativePath ? { source_file: file.relativePath } : {}),
|
|
56
|
+
...(opts.importance !== undefined ? { importance: opts.importance } : {}),
|
|
57
|
+
...(entities ? { entities } : {}),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (items.length === 0) {
|
|
62
|
+
log("No mineable content found.");
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
log(`Walked ${filesSeen} files → ${items.length} chunks.`);
|
|
66
|
+
const factory = deps.mcpClientFactory ?? mcp_client_1.authenticatedMcpClient;
|
|
67
|
+
const client = await factory(opts.workerUrl ?? DEFAULT_WORKER_URL);
|
|
68
|
+
let summary;
|
|
69
|
+
try {
|
|
70
|
+
summary = await (0, ingest_1.ingestDrawers)(client, projectId, items, { log, err });
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await client.close();
|
|
74
|
+
}
|
|
75
|
+
log((0, ingest_1.formatSummary)(summary));
|
|
76
|
+
return summary.failed > 0 ? 1 : 0;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=mine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mine.js","sourceRoot":"","sources":["../../src/commands/mine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Plan 5 Task 9: `axgram orgs` subcommands.
|
|
3
|
+
//
|
|
4
|
+
// ls, create, rename, delete (type-to-confirm). Built on the Plan 5
|
|
5
|
+
// Task 2 RPCs through the user-scoped supabase client.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.orgsLs = orgsLs;
|
|
8
|
+
exports.orgsCreate = orgsCreate;
|
|
9
|
+
exports.orgsRename = orgsRename;
|
|
10
|
+
exports.orgsDelete = orgsDelete;
|
|
11
|
+
const supabase_client_1 = require("../lib/supabase-client");
|
|
12
|
+
const destructive_confirm_1 = require("../lib/destructive-confirm");
|
|
13
|
+
const defaultLog = (m) => process.stdout.write(`${m}\n`);
|
|
14
|
+
const defaultErr = (m) => process.stderr.write(`${m}\n`);
|
|
15
|
+
async function buildSupabase(deps) {
|
|
16
|
+
return deps.supabaseFactory ? deps.supabaseFactory() : (0, supabase_client_1.authenticatedSupabase)();
|
|
17
|
+
}
|
|
18
|
+
async function fetchOrgs(s) {
|
|
19
|
+
const { data, error } = await s
|
|
20
|
+
.from("orgs")
|
|
21
|
+
.select(`id, name,
|
|
22
|
+
teams!inner ( id, name,
|
|
23
|
+
memberships!inner ( role )
|
|
24
|
+
)`)
|
|
25
|
+
.order("name");
|
|
26
|
+
if (error)
|
|
27
|
+
throw new Error(`Failed to list orgs: ${error.message}`);
|
|
28
|
+
return (data ?? []).map((o) => {
|
|
29
|
+
const def = (o.teams ?? []).find((t) => t.name === "default") ?? o.teams?.[0];
|
|
30
|
+
return {
|
|
31
|
+
id: o.id,
|
|
32
|
+
name: o.name,
|
|
33
|
+
default_team_id: def?.id ?? null,
|
|
34
|
+
role: def?.memberships?.[0]?.role ?? null,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function resolveOrg(s, idOrName) {
|
|
39
|
+
// UUID → direct lookup; else match by name (case-sensitive).
|
|
40
|
+
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(idOrName);
|
|
41
|
+
const q = s.from("orgs").select("id, name");
|
|
42
|
+
const { data, error } = isUuid
|
|
43
|
+
? await q.eq("id", idOrName).maybeSingle()
|
|
44
|
+
: await q.eq("name", idOrName).maybeSingle();
|
|
45
|
+
if (error)
|
|
46
|
+
throw new Error(`Failed to resolve org: ${error.message}`);
|
|
47
|
+
if (!data)
|
|
48
|
+
return null;
|
|
49
|
+
return { id: data.id, name: data.name };
|
|
50
|
+
}
|
|
51
|
+
async function orgsLs(deps = {}) {
|
|
52
|
+
const log = deps.log ?? defaultLog;
|
|
53
|
+
const s = await buildSupabase(deps);
|
|
54
|
+
const orgs = await fetchOrgs(s);
|
|
55
|
+
if (orgs.length === 0) {
|
|
56
|
+
log("No orgs accessible. Run `axgram orgs create <name>`.");
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
for (const o of orgs) {
|
|
60
|
+
const role = o.role ? `[${o.role}]` : "[—]";
|
|
61
|
+
log(`${o.id} ${role} ${o.name}`);
|
|
62
|
+
}
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
async function orgsCreate(name, deps = {}) {
|
|
66
|
+
const log = deps.log ?? defaultLog;
|
|
67
|
+
const errOut = deps.err ?? defaultErr;
|
|
68
|
+
const s = await buildSupabase(deps);
|
|
69
|
+
const { data, error } = await s.rpc("create_org", { p_name: name });
|
|
70
|
+
if (error) {
|
|
71
|
+
if (error.message?.toLowerCase().includes("license")) {
|
|
72
|
+
errOut(`License gate denied org creation: ${error.message}`);
|
|
73
|
+
return 1;
|
|
74
|
+
}
|
|
75
|
+
errOut(`Failed to create org: ${error.message}`);
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
const row = data[0];
|
|
79
|
+
log(`Created org "${row.name}" (${row.org_id}).`);
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
async function orgsRename(orgIdOrName, newName, deps = {}) {
|
|
83
|
+
const log = deps.log ?? defaultLog;
|
|
84
|
+
const errOut = deps.err ?? defaultErr;
|
|
85
|
+
const s = await buildSupabase(deps);
|
|
86
|
+
const target = await resolveOrg(s, orgIdOrName);
|
|
87
|
+
if (!target) {
|
|
88
|
+
errOut(`No org found matching "${orgIdOrName}".`);
|
|
89
|
+
return 1;
|
|
90
|
+
}
|
|
91
|
+
const { error } = await s.rpc("rename_org", {
|
|
92
|
+
p_org_id: target.id,
|
|
93
|
+
p_new_name: newName,
|
|
94
|
+
});
|
|
95
|
+
if (error) {
|
|
96
|
+
errOut(`Failed to rename org: ${error.message}`);
|
|
97
|
+
return 1;
|
|
98
|
+
}
|
|
99
|
+
log(`Renamed org "${target.name}" → "${newName}".`);
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
async function orgsDelete(orgIdOrName, options, deps = {}) {
|
|
103
|
+
const log = deps.log ?? defaultLog;
|
|
104
|
+
const errOut = deps.err ?? defaultErr;
|
|
105
|
+
const s = await buildSupabase(deps);
|
|
106
|
+
const target = await resolveOrg(s, orgIdOrName);
|
|
107
|
+
if (!target) {
|
|
108
|
+
errOut(`No org found matching "${orgIdOrName}".`);
|
|
109
|
+
return 1;
|
|
110
|
+
}
|
|
111
|
+
const { data: counts, error: ce } = await s.rpc("count_org_descendants", {
|
|
112
|
+
p_org_id: target.id,
|
|
113
|
+
});
|
|
114
|
+
if (ce) {
|
|
115
|
+
errOut(`Failed to preview delete: ${ce.message}`);
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
const c = counts[0] ?? {};
|
|
119
|
+
const confirmed = await (0, destructive_confirm_1.confirmDestructive)({
|
|
120
|
+
targetKind: "org",
|
|
121
|
+
targetName: target.name,
|
|
122
|
+
counts: {
|
|
123
|
+
teams: c.teams ?? 0,
|
|
124
|
+
projects: c.projects ?? 0,
|
|
125
|
+
drawers: c.drawers ?? 0,
|
|
126
|
+
invitations: c.invitations ?? 0,
|
|
127
|
+
},
|
|
128
|
+
}, options, {
|
|
129
|
+
...(deps.log ? { log: deps.log } : {}),
|
|
130
|
+
...(deps.err ? { err: deps.err } : {}),
|
|
131
|
+
...(deps.prompt ? { prompt: deps.prompt } : {}),
|
|
132
|
+
...(deps.isTTY !== undefined ? { isTTY: deps.isTTY } : {}),
|
|
133
|
+
});
|
|
134
|
+
if (!confirmed)
|
|
135
|
+
return 1;
|
|
136
|
+
const { data, error } = await s.rpc("delete_org", {
|
|
137
|
+
p_org_id: target.id,
|
|
138
|
+
p_confirm_name: confirmed,
|
|
139
|
+
});
|
|
140
|
+
if (error) {
|
|
141
|
+
errOut(`Failed to delete org: ${error.message}`);
|
|
142
|
+
return 1;
|
|
143
|
+
}
|
|
144
|
+
const result = data[0];
|
|
145
|
+
if (!result.ok && result.code === "name_confirmation_mismatch") {
|
|
146
|
+
errOut("Server rejected confirmation (org may have been renamed). Aborted.");
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
log(`Deleted org "${target.name}". ` +
|
|
150
|
+
`Removed ${JSON.stringify(result.deleted_counts)}.`);
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=orgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orgs.js","sourceRoot":"","sources":["../../src/commands/orgs.ts"],"names":[],"mappings":"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"}
|