@desplega.ai/agent-fs 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +102 -0
  2. package/dist/__tests__/api-client.test.d.ts +2 -0
  3. package/dist/__tests__/api-client.test.d.ts.map +1 -0
  4. package/dist/__tests__/api-client.test.js +86 -0
  5. package/dist/__tests__/api-client.test.js.map +1 -0
  6. package/dist/__tests__/param-mapping.test.d.ts +2 -0
  7. package/dist/__tests__/param-mapping.test.d.ts.map +1 -0
  8. package/dist/__tests__/param-mapping.test.js +53 -0
  9. package/dist/__tests__/param-mapping.test.js.map +1 -0
  10. package/dist/api-client.d.ts +17 -0
  11. package/dist/api-client.d.ts.map +1 -0
  12. package/dist/api-client.js +59 -0
  13. package/dist/api-client.js.map +1 -0
  14. package/dist/cli.js +191 -32
  15. package/dist/commands/auth.d.ts +4 -0
  16. package/dist/commands/auth.d.ts.map +1 -0
  17. package/dist/commands/auth.js +81 -0
  18. package/dist/commands/auth.js.map +1 -0
  19. package/dist/commands/comment.d.ts +4 -0
  20. package/dist/commands/comment.d.ts.map +1 -0
  21. package/dist/commands/comment.js +165 -0
  22. package/dist/commands/comment.js.map +1 -0
  23. package/dist/commands/config-cmd.d.ts +3 -0
  24. package/dist/commands/config-cmd.d.ts.map +1 -0
  25. package/dist/commands/config-cmd.js +147 -0
  26. package/dist/commands/config-cmd.js.map +1 -0
  27. package/dist/commands/daemon.d.ts +3 -0
  28. package/dist/commands/daemon.d.ts.map +1 -0
  29. package/dist/commands/daemon.js +33 -0
  30. package/dist/commands/daemon.js.map +1 -0
  31. package/dist/commands/docs.d.ts +3 -0
  32. package/dist/commands/docs.d.ts.map +1 -0
  33. package/dist/commands/docs.js +13 -0
  34. package/dist/commands/docs.js.map +1 -0
  35. package/dist/commands/drive.d.ts +4 -0
  36. package/dist/commands/drive.d.ts.map +1 -0
  37. package/dist/commands/drive.js +86 -0
  38. package/dist/commands/drive.js.map +1 -0
  39. package/dist/commands/init.d.ts +3 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +20 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/onboard.d.ts +3 -0
  44. package/dist/commands/onboard.d.ts.map +1 -0
  45. package/dist/commands/onboard.js +229 -0
  46. package/dist/commands/onboard.js.map +1 -0
  47. package/dist/commands/ops.d.ts +4 -0
  48. package/dist/commands/ops.d.ts.map +1 -0
  49. package/dist/commands/ops.js +100 -0
  50. package/dist/commands/ops.js.map +1 -0
  51. package/dist/formatters.d.ts +11 -0
  52. package/dist/formatters.d.ts.map +1 -0
  53. package/dist/formatters.js +257 -0
  54. package/dist/formatters.js.map +1 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/{src/index.ts → dist/index.js} +33 -46
  58. package/dist/index.js.map +1 -0
  59. package/package.json +21 -10
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function authCommands(client: ApiClient): Command;
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQlD,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,WAqE7C"}
@@ -0,0 +1,81 @@
1
+ import { Command } from "commander";
2
+ import { setConfigValue, createUser, createDatabase, listUserOrgs, } from "@/core";
3
+ export function authCommands(client) {
4
+ const cmd = new Command("auth").description("Authentication commands");
5
+ cmd
6
+ .command("register")
7
+ .argument("<email>", "Email address")
8
+ .description("Register a new user")
9
+ .action(async (email) => {
10
+ // Try daemon first, fall back to direct DB registration
11
+ try {
12
+ const result = await client.post("/auth/register", { email });
13
+ printRegistration(result, client);
14
+ }
15
+ catch {
16
+ // Daemon not running — register directly against DB
17
+ try {
18
+ const db = createDatabase();
19
+ const result = createUser(db, { email });
20
+ const orgs = listUserOrgs(db, result.user.id);
21
+ printRegistration({
22
+ apiKey: result.apiKey,
23
+ userId: result.user.id,
24
+ orgId: orgs[0]?.id,
25
+ }, client);
26
+ }
27
+ catch (err) {
28
+ if (err.message?.includes("UNIQUE")) {
29
+ console.error("Error: User with this email already exists.");
30
+ }
31
+ else {
32
+ console.error(`Error: ${err.message}`);
33
+ }
34
+ process.exit(1);
35
+ }
36
+ }
37
+ });
38
+ cmd
39
+ .command("whoami")
40
+ .description("Show current user info")
41
+ .action(async () => {
42
+ try {
43
+ const result = await client.get("/auth/me");
44
+ console.log(JSON.stringify(result, null, 2));
45
+ }
46
+ catch {
47
+ // Daemon not running — look up directly from DB
48
+ try {
49
+ const { getConfig, getUserByApiKey, createDatabase, listUserOrgs } = await import("@/core");
50
+ const config = getConfig();
51
+ if (!config.auth.apiKey) {
52
+ console.error("Not logged in. Run: agent-fs auth register <email>");
53
+ process.exit(1);
54
+ }
55
+ const db = createDatabase();
56
+ const user = getUserByApiKey(db, config.auth.apiKey);
57
+ if (!user) {
58
+ console.error("Invalid API key in config.");
59
+ process.exit(1);
60
+ }
61
+ const orgs = listUserOrgs(db, user.id);
62
+ console.log(JSON.stringify({ ...user, orgs }, null, 2));
63
+ }
64
+ catch (err) {
65
+ console.error(`Error: ${err.message}`);
66
+ process.exit(1);
67
+ }
68
+ }
69
+ });
70
+ return cmd;
71
+ }
72
+ function printRegistration(result, client) {
73
+ console.log(`Registered successfully!`);
74
+ console.log(`API Key: ${result.apiKey}`);
75
+ console.log(`User ID: ${result.userId}`);
76
+ console.log(`Org ID: ${result.orgId}`);
77
+ setConfigValue("auth.apiKey", result.apiKey);
78
+ client.setApiKey(result.apiKey);
79
+ console.log("\nAPI key saved to config.");
80
+ }
81
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function commentCommands(client: ApiClient, getOrgId: () => string | Promise<string>): Command;
4
+ //# sourceMappingURL=comment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/commands/comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WA8J1F"}
@@ -0,0 +1,165 @@
1
+ import { Command } from "commander";
2
+ export function commentCommands(client, getOrgId) {
3
+ const cmd = new Command("comment").description("Document comments");
4
+ async function callOp(opName, params) {
5
+ try {
6
+ return await client.callOp(await getOrgId(), opName, params);
7
+ }
8
+ catch (err) {
9
+ if (err?.cause?.code === "ECONNREFUSED" || err?.message?.includes("fetch failed")) {
10
+ console.error("Cannot connect to agent-fs daemon.\n" +
11
+ "Start with: agent-fs daemon start\n" +
12
+ "Or set AGENT_FS_API_URL to connect to a remote server.");
13
+ process.exit(1);
14
+ }
15
+ throw err;
16
+ }
17
+ }
18
+ cmd
19
+ .command("add")
20
+ .argument("<path>", "File path to comment on")
21
+ .requiredOption("--body <text>", "Comment body")
22
+ .option("--line <n>", "Line number (sets both line-start and line-end)")
23
+ .option("--line-start <n>", "Start line")
24
+ .option("--line-end <n>", "End line")
25
+ .option("--quoted-content <text>", "Quoted content from the file")
26
+ .description("Add a comment to a file")
27
+ .action(async (path, opts) => {
28
+ try {
29
+ const params = { path, body: opts.body };
30
+ if (opts.quotedContent)
31
+ params.quotedContent = opts.quotedContent;
32
+ if (opts.line) {
33
+ params.lineStart = parseInt(opts.line);
34
+ params.lineEnd = parseInt(opts.line);
35
+ }
36
+ if (opts.lineStart)
37
+ params.lineStart = parseInt(opts.lineStart);
38
+ if (opts.lineEnd)
39
+ params.lineEnd = parseInt(opts.lineEnd);
40
+ const result = await callOp("comment-add", params);
41
+ console.log(JSON.stringify(result, null, 2));
42
+ }
43
+ catch (err) {
44
+ console.error(`Error: ${err.message}`);
45
+ process.exit(1);
46
+ }
47
+ });
48
+ cmd
49
+ .command("reply")
50
+ .argument("<comment-id>", "Parent comment ID to reply to")
51
+ .requiredOption("--body <text>", "Reply body")
52
+ .description("Reply to a comment")
53
+ .action(async (commentId, opts) => {
54
+ try {
55
+ const result = await callOp("comment-add", {
56
+ parentId: commentId,
57
+ body: opts.body,
58
+ });
59
+ console.log(JSON.stringify(result, null, 2));
60
+ }
61
+ catch (err) {
62
+ console.error(`Error: ${err.message}`);
63
+ process.exit(1);
64
+ }
65
+ });
66
+ cmd
67
+ .command("list")
68
+ .argument("[path]", "File path to list comments for")
69
+ .option("--resolved", "Show resolved comments")
70
+ .option("--limit <n>", "Max results")
71
+ .option("--offset <n>", "Skip N results")
72
+ .description("List comments")
73
+ .action(async (path, opts) => {
74
+ try {
75
+ const params = {};
76
+ if (path)
77
+ params.path = path;
78
+ if (opts.resolved)
79
+ params.resolved = true;
80
+ if (opts.limit)
81
+ params.limit = parseInt(opts.limit);
82
+ if (opts.offset)
83
+ params.offset = parseInt(opts.offset);
84
+ const result = await callOp("comment-list", params);
85
+ console.log(JSON.stringify(result, null, 2));
86
+ }
87
+ catch (err) {
88
+ console.error(`Error: ${err.message}`);
89
+ process.exit(1);
90
+ }
91
+ });
92
+ cmd
93
+ .command("get")
94
+ .argument("<id>", "Comment ID")
95
+ .description("Get a comment with its replies")
96
+ .action(async (id) => {
97
+ try {
98
+ const result = await callOp("comment-get", { id });
99
+ console.log(JSON.stringify(result, null, 2));
100
+ }
101
+ catch (err) {
102
+ console.error(`Error: ${err.message}`);
103
+ process.exit(1);
104
+ }
105
+ });
106
+ cmd
107
+ .command("update")
108
+ .argument("<id>", "Comment ID")
109
+ .requiredOption("--body <text>", "New comment body")
110
+ .description("Update a comment")
111
+ .action(async (id, opts) => {
112
+ try {
113
+ const result = await callOp("comment-update", { id, body: opts.body });
114
+ console.log(JSON.stringify(result, null, 2));
115
+ }
116
+ catch (err) {
117
+ console.error(`Error: ${err.message}`);
118
+ process.exit(1);
119
+ }
120
+ });
121
+ cmd
122
+ .command("delete")
123
+ .argument("<id>", "Comment ID")
124
+ .description("Delete a comment (soft delete)")
125
+ .action(async (id) => {
126
+ try {
127
+ const result = await callOp("comment-delete", { id });
128
+ console.log(JSON.stringify(result, null, 2));
129
+ }
130
+ catch (err) {
131
+ console.error(`Error: ${err.message}`);
132
+ process.exit(1);
133
+ }
134
+ });
135
+ cmd
136
+ .command("resolve")
137
+ .argument("<id>", "Comment ID")
138
+ .description("Resolve a comment")
139
+ .action(async (id) => {
140
+ try {
141
+ const result = await callOp("comment-resolve", { id, resolved: true });
142
+ console.log(JSON.stringify(result, null, 2));
143
+ }
144
+ catch (err) {
145
+ console.error(`Error: ${err.message}`);
146
+ process.exit(1);
147
+ }
148
+ });
149
+ cmd
150
+ .command("reopen")
151
+ .argument("<id>", "Comment ID")
152
+ .description("Reopen a resolved comment")
153
+ .action(async (id) => {
154
+ try {
155
+ const result = await callOp("comment-resolve", { id, resolved: false });
156
+ console.log(JSON.stringify(result, null, 2));
157
+ }
158
+ catch (err) {
159
+ console.error(`Error: ${err.message}`);
160
+ process.exit(1);
161
+ }
162
+ });
163
+ return cmd;
164
+ }
165
+ //# sourceMappingURL=comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.js","sourceRoot":"","sources":["../../src/commands/comment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function configCommands(): Command;
3
+ //# sourceMappingURL=config-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/config-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,cAAc,YAqJ7B"}
@@ -0,0 +1,147 @@
1
+ import { Command } from "commander";
2
+ import { existsSync } from "node:fs";
3
+ import { getConfig, setConfigValue, getDbPath, getConfigPath, AgentS3Client, createEmbeddingProviderFromEnv, } from "@/core";
4
+ export function configCommands() {
5
+ const cmd = new Command("config").description("Configuration management");
6
+ cmd
7
+ .command("get")
8
+ .argument("<key>", "Config key (dot notation, e.g., s3.bucket)")
9
+ .description("Get a config value")
10
+ .action((key) => {
11
+ const config = getConfig();
12
+ const keys = key.split(".");
13
+ let value = config;
14
+ for (const k of keys) {
15
+ value = value?.[k];
16
+ }
17
+ if (value === undefined) {
18
+ console.error(`Key not found: ${key}`);
19
+ process.exit(1);
20
+ }
21
+ console.log(typeof value === "object" ? JSON.stringify(value, null, 2) : String(value));
22
+ });
23
+ cmd
24
+ .command("set")
25
+ .argument("<key>", "Config key")
26
+ .argument("<value>", "Config value")
27
+ .description("Set a config value")
28
+ .action((key, value) => {
29
+ // Try to parse as JSON for objects/numbers/booleans
30
+ let parsed = value;
31
+ try {
32
+ parsed = JSON.parse(value);
33
+ }
34
+ catch { }
35
+ setConfigValue(key, parsed);
36
+ console.log(`Set ${key} = ${JSON.stringify(parsed)}`);
37
+ });
38
+ cmd
39
+ .command("list")
40
+ .description("Show all config")
41
+ .action(() => {
42
+ console.log(JSON.stringify(getConfig(), null, 2));
43
+ });
44
+ cmd
45
+ .command("validate")
46
+ .description("Check that config, database, S3, and embeddings are healthy")
47
+ .action(async () => {
48
+ const results = [];
49
+ const config = getConfig();
50
+ // 1. Config file exists
51
+ const configExists = existsSync(getConfigPath());
52
+ results.push({
53
+ name: "Config file",
54
+ ok: configExists,
55
+ message: configExists ? getConfigPath() : "Not found — run `agent-fs onboard`",
56
+ });
57
+ // 2. Required S3 fields
58
+ const s3Fields = ["endpoint", "bucket", "accessKeyId", "secretAccessKey"];
59
+ const missingS3 = s3Fields.filter((f) => !config.s3[f]);
60
+ results.push({
61
+ name: "S3 config",
62
+ ok: missingS3.length === 0,
63
+ message: missingS3.length === 0
64
+ ? `${config.s3.provider} → ${config.s3.endpoint}/${config.s3.bucket}`
65
+ : `Missing: ${missingS3.join(", ")}`,
66
+ });
67
+ // 3. S3 connectivity
68
+ if (missingS3.length === 0) {
69
+ try {
70
+ const s3 = new AgentS3Client(config.s3);
71
+ await s3.listObjects("");
72
+ results.push({ name: "S3 connectivity", ok: true, message: "Connected" });
73
+ }
74
+ catch (err) {
75
+ results.push({
76
+ name: "S3 connectivity",
77
+ ok: false,
78
+ message: err.message || "Connection failed",
79
+ });
80
+ }
81
+ }
82
+ // 4. Database
83
+ const dbExists = existsSync(getDbPath());
84
+ results.push({
85
+ name: "Database",
86
+ ok: dbExists,
87
+ message: dbExists ? getDbPath() : "Not found — run `agent-fs onboard`",
88
+ });
89
+ // 5. Auth
90
+ results.push({
91
+ name: "Auth",
92
+ ok: !!config.auth.apiKey,
93
+ message: config.auth.apiKey ? "API key configured" : "No API key — run `agent-fs onboard`",
94
+ });
95
+ // 6. Embedding provider
96
+ const embProvider = config.embedding.provider;
97
+ const hasEmbKey = !!config.embedding.apiKey || !!process.env.OPENAI_API_KEY || !!process.env.GEMINI_API_KEY;
98
+ if (embProvider === "openai" || embProvider === "gemini") {
99
+ if (hasEmbKey) {
100
+ try {
101
+ const provider = await createEmbeddingProviderFromEnv(config.embedding);
102
+ results.push({
103
+ name: "Embeddings",
104
+ ok: !!provider,
105
+ message: provider ? `${embProvider} ready` : `${embProvider} configured but failed to init`,
106
+ });
107
+ }
108
+ catch (err) {
109
+ results.push({ name: "Embeddings", ok: false, message: err.message });
110
+ }
111
+ }
112
+ else {
113
+ results.push({
114
+ name: "Embeddings",
115
+ ok: false,
116
+ message: `${embProvider} selected but no API key`,
117
+ });
118
+ }
119
+ }
120
+ else {
121
+ results.push({
122
+ name: "Embeddings",
123
+ ok: true,
124
+ message: "local/disabled (semantic search may be unavailable)",
125
+ });
126
+ }
127
+ // Print results
128
+ console.log("\nagent-fs health check\n");
129
+ let allOk = true;
130
+ for (const r of results) {
131
+ const icon = r.ok ? "\u2713" : "\u2717";
132
+ console.log(` ${icon} ${r.name}: ${r.message}`);
133
+ if (!r.ok)
134
+ allOk = false;
135
+ }
136
+ console.log();
137
+ if (allOk) {
138
+ console.log("All checks passed.");
139
+ }
140
+ else {
141
+ console.log("Some checks failed. Fix the issues above and re-run.");
142
+ process.exit(1);
143
+ }
144
+ });
145
+ return cmd;
146
+ }
147
+ //# sourceMappingURL=config-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.js","sourceRoot":"","sources":["../../src/commands/config-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function daemonCommands(): Command;
3
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAgB,cAAc,YAiC7B"}
@@ -0,0 +1,33 @@
1
+ import { Command } from "commander";
2
+ export function daemonCommands() {
3
+ const cmd = new Command("daemon").description("Daemon lifecycle management");
4
+ cmd
5
+ .command("start")
6
+ .description("Start the agent-fs daemon")
7
+ .action(async () => {
8
+ const { startDaemon } = await import("@/server/daemon.js");
9
+ startDaemon();
10
+ });
11
+ cmd
12
+ .command("stop")
13
+ .description("Stop the agent-fs daemon")
14
+ .action(async () => {
15
+ const { stopDaemon } = await import("@/server/daemon.js");
16
+ stopDaemon();
17
+ });
18
+ cmd
19
+ .command("status")
20
+ .description("Check daemon status")
21
+ .action(async () => {
22
+ const { daemonStatus } = await import("@/server/daemon.js");
23
+ const status = daemonStatus();
24
+ if (status.running) {
25
+ console.log(`Daemon running (PID: ${status.pid})`);
26
+ }
27
+ else {
28
+ console.log("Daemon is not running");
29
+ }
30
+ });
31
+ return cmd;
32
+ }
33
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAE7E,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC3D,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC1D,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function docsCommand(): Command;
3
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,WAAW,YAQ1B"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "commander";
2
+ // @ts-ignore — bun supports text imports, inlined at build time
3
+ import content from "../../../../skills/agent-fs/SKILL.md" with { type: "text" };
4
+ export function docsCommand() {
5
+ return new Command("docs")
6
+ .description("Show agent-fs documentation and command reference")
7
+ .action(() => {
8
+ // Strip YAML frontmatter
9
+ const stripped = content.replace(/^---[\s\S]*?---\n*/, "");
10
+ console.log(stripped);
11
+ });
12
+ }
13
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,gEAAgE;AAChE,OAAO,OAAO,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEjF,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,GAAG,EAAE;QACX,yBAAyB;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function driveCommands(client: ApiClient): Command;
4
+ //# sourceMappingURL=drive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../../src/commands/drive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAclD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,WA8E9C"}
@@ -0,0 +1,86 @@
1
+ import { Command } from "commander";
2
+ import { createDatabase, listDrives, createDrive, listUserOrgs, getUserByApiKey, getConfig, inviteToOrg, } from "@/core";
3
+ export function driveCommands(client) {
4
+ const cmd = new Command("drive").description("Drive management");
5
+ cmd
6
+ .command("list")
7
+ .description("List drives in current org")
8
+ .action(async () => {
9
+ try {
10
+ const { db, orgId } = getLocalContext();
11
+ const drives = listDrives(db, orgId);
12
+ console.log(JSON.stringify({ drives }, null, 2));
13
+ }
14
+ catch (err) {
15
+ console.error(`Error: ${err.message}`);
16
+ process.exit(1);
17
+ }
18
+ });
19
+ cmd
20
+ .command("create")
21
+ .argument("<name>", "Drive name")
22
+ .description("Create a new drive")
23
+ .action(async (name) => {
24
+ try {
25
+ const { db, orgId } = getLocalContext();
26
+ const drive = createDrive(db, { orgId, name });
27
+ console.log(JSON.stringify(drive, null, 2));
28
+ }
29
+ catch (err) {
30
+ console.error(`Error: ${err.message}`);
31
+ process.exit(1);
32
+ }
33
+ });
34
+ cmd
35
+ .command("current")
36
+ .description("Show current drive context")
37
+ .action(async () => {
38
+ try {
39
+ const { db, orgId, userId } = getLocalContext();
40
+ const drives = listDrives(db, orgId);
41
+ const defaultDrive = drives.find((d) => d.isDefault);
42
+ console.log(JSON.stringify({ orgId, drive: defaultDrive ?? drives[0] ?? null }, null, 2));
43
+ }
44
+ catch (err) {
45
+ console.error(`Error: ${err.message}`);
46
+ process.exit(1);
47
+ }
48
+ });
49
+ cmd
50
+ .command("invite")
51
+ .argument("<email>", "User email to invite")
52
+ .requiredOption("--role <role>", "Role: viewer, editor, or admin")
53
+ .description("Invite a user to the current org")
54
+ .addHelpText("after", "\nThis invites the user to the organization that owns the current drive. The user will have access to all drives in the org based on their role.")
55
+ .action(async (email, opts) => {
56
+ try {
57
+ const { db, orgId } = getLocalContext();
58
+ inviteToOrg(db, {
59
+ orgId,
60
+ email,
61
+ role: opts.role,
62
+ });
63
+ console.log(`Invited ${email} as ${opts.role}`);
64
+ }
65
+ catch (err) {
66
+ console.error(`Error: ${err.message}`);
67
+ process.exit(1);
68
+ }
69
+ });
70
+ return cmd;
71
+ }
72
+ function getLocalContext() {
73
+ const config = getConfig();
74
+ if (!config.auth.apiKey) {
75
+ throw new Error("Not logged in. Run: agent-fs auth register <email>");
76
+ }
77
+ const db = createDatabase();
78
+ const user = getUserByApiKey(db, config.auth.apiKey);
79
+ if (!user)
80
+ throw new Error("Invalid API key in config.");
81
+ const orgs = listUserOrgs(db, user.id);
82
+ if (orgs.length === 0)
83
+ throw new Error("No orgs found.");
84
+ return { db, orgId: orgs[0].id, userId: user.id };
85
+ }
86
+ //# sourceMappingURL=drive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../src/commands/drive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,cAAc,EACd,UAAU,EACV,WAAW,EAGX,YAAY,EACZ,eAAe,EACf,SAAS,EAET,WAAW,GACZ,MAAM,QAAQ,CAAC;AAEhB,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEjE,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;SAChC,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EACnD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;SAC3C,cAAc,CAAC,eAAe,EAAE,gCAAgC,CAAC;SACjE,WAAW,CAAC,kCAAkC,CAAC;SAC/C,WAAW,CACV,OAAO,EACP,kJAAkJ,CACnJ;SACA,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAsB,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,WAAW,CAAC,EAAE,EAAE;gBACd,KAAK;gBACL,KAAK;gBACL,IAAI,EAAE,IAAI,CAAC,IAAqC;aACjD,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACzD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function initCommand(): Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,WAAW,YAkB1B"}