studiograph 1.0.0 → 1.0.2

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.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * studiograph r2 — Cloudflare R2 asset storage management
3
+ *
4
+ * studiograph r2 setup Set up R2 bucket and credentials
5
+ * studiograph r2 upload <dir> Upload a local directory to R2
6
+ * --prefix <path> Key prefix in bucket (e.g. fonts/)
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare const r2Command: Command;
@@ -0,0 +1,210 @@
1
+ /**
2
+ * studiograph r2 — Cloudflare R2 asset storage management
3
+ *
4
+ * studiograph r2 setup Set up R2 bucket and credentials
5
+ * studiograph r2 upload <dir> Upload a local directory to R2
6
+ * --prefix <path> Key prefix in bucket (e.g. fonts/)
7
+ */
8
+ import { Command } from 'commander';
9
+ import { intro, outro, text, spinner, log } from '@clack/prompts';
10
+ import { readdirSync, statSync, readFileSync } from 'fs';
11
+ import { join, relative, extname } from 'path';
12
+ import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
13
+ import { Workspace } from '../../core/workspace.js';
14
+ import { loadUserConfig, saveUserConfig } from '../../core/user-config.js';
15
+ // ── Content type map ──────────────────────────────────────────────────────
16
+ const CONTENT_TYPES = {
17
+ '.woff': 'font/woff',
18
+ '.woff2': 'font/woff2',
19
+ '.ttf': 'font/ttf',
20
+ '.otf': 'font/otf',
21
+ '.eot': 'application/vnd.ms-fontobject',
22
+ '.svg': 'image/svg+xml',
23
+ '.png': 'image/png',
24
+ '.jpg': 'image/jpeg',
25
+ '.jpeg': 'image/jpeg',
26
+ '.webp': 'image/webp',
27
+ '.gif': 'image/gif',
28
+ '.pdf': 'application/pdf',
29
+ '.js': 'application/javascript',
30
+ '.css': 'text/css',
31
+ '.json': 'application/json',
32
+ };
33
+ function contentType(filePath) {
34
+ return CONTENT_TYPES[extname(filePath).toLowerCase()] ?? 'application/octet-stream';
35
+ }
36
+ // ── Cloudflare REST API helper ────────────────────────────────────────────
37
+ async function cfApi(apiToken, path, method = 'GET', body) {
38
+ const res = await fetch(`https://api.cloudflare.com/client/v4${path}`, {
39
+ method,
40
+ headers: {
41
+ Authorization: `Bearer ${apiToken}`,
42
+ 'Content-Type': 'application/json',
43
+ },
44
+ body: body !== undefined ? JSON.stringify(body) : undefined,
45
+ });
46
+ return res.json();
47
+ }
48
+ // ── Walk a directory recursively ─────────────────────────────────────────
49
+ function walkDir(dir) {
50
+ const files = [];
51
+ for (const entry of readdirSync(dir)) {
52
+ const full = join(dir, entry);
53
+ if (statSync(full).isDirectory()) {
54
+ files.push(...walkDir(full));
55
+ }
56
+ else {
57
+ files.push(full);
58
+ }
59
+ }
60
+ return files;
61
+ }
62
+ // ── r2 command group ──────────────────────────────────────────────────────
63
+ export const r2Command = new Command('r2')
64
+ .description('Manage Cloudflare R2 asset storage');
65
+ // ── studiograph r2 setup ──────────────────────────────────────────────────
66
+ r2Command
67
+ .command('setup')
68
+ .description('Set up Cloudflare R2 bucket and save credentials')
69
+ .action(async () => {
70
+ const workspace = new Workspace();
71
+ if (!workspace.isWorkspace()) {
72
+ console.error('Not a Studiograph workspace. Run `studiograph init` first.');
73
+ process.exit(1);
74
+ }
75
+ const config = workspace.loadConfig();
76
+ intro('Set up Cloudflare R2');
77
+ const accountId = await text({
78
+ message: 'Cloudflare Account ID',
79
+ placeholder: 'Found in your Cloudflare dashboard URL: dash.cloudflare.com/{account-id}',
80
+ validate: (v) => v.trim() ? undefined : 'Required',
81
+ });
82
+ log.info(`Create an API token with R2:Edit permission:\nhttps://dash.cloudflare.com/${accountId}/api-tokens/create`);
83
+ const apiToken = await text({
84
+ message: 'Cloudflare API Token',
85
+ placeholder: 'Paste the token you just created',
86
+ validate: (v) => v.trim() ? undefined : 'Required',
87
+ });
88
+ const defaultBucket = config.team_name
89
+ .toLowerCase()
90
+ .replace(/\s+/g, '-')
91
+ .replace(/[^a-z0-9-]/g, '')
92
+ + '-assets';
93
+ const bucket = await text({
94
+ message: 'Bucket name',
95
+ initialValue: defaultBucket,
96
+ validate: (v) => v.trim() ? undefined : 'Required',
97
+ });
98
+ const s = spinner();
99
+ // Create bucket
100
+ s.start('Creating R2 bucket');
101
+ const createRes = await cfApi(apiToken, `/accounts/${accountId}/r2/buckets`, 'POST', { name: bucket });
102
+ if (!createRes.success) {
103
+ const code = createRes.errors?.[0]?.code;
104
+ if (code === 10006) {
105
+ s.stop('Bucket already exists — continuing');
106
+ }
107
+ else {
108
+ s.stop(`Failed to create bucket: ${createRes.errors?.[0]?.message ?? 'unknown error'}`);
109
+ process.exit(1);
110
+ }
111
+ }
112
+ else {
113
+ s.stop('Bucket created');
114
+ }
115
+ // Enable public access
116
+ s.start('Enabling public R2.dev access');
117
+ const pubRes = await cfApi(apiToken, `/accounts/${accountId}/r2/buckets/${bucket}/domains/managed`, 'PUT', { enabled: true });
118
+ let publicUrl = '';
119
+ if (pubRes.success && pubRes.result?.domain) {
120
+ publicUrl = `https://${pubRes.result.domain}`;
121
+ s.stop(`Public URL: ${publicUrl}`);
122
+ }
123
+ else {
124
+ s.stop('Could not retrieve public URL automatically');
125
+ log.warn(`Enable public access manually:\nhttps://dash.cloudflare.com/${accountId}/r2/buckets/${bucket}/settings`);
126
+ publicUrl = await text({
127
+ message: 'Paste your R2 public URL',
128
+ placeholder: 'https://pub-xxxx.r2.dev',
129
+ validate: (v) => v.trim() ? undefined : 'Required',
130
+ });
131
+ }
132
+ log.info(`Create an R2 API token to get an Access Key ID and Secret:\nhttps://dash.cloudflare.com/${accountId}/r2/api-token/create`);
133
+ const accessKeyId = await text({
134
+ message: 'R2 Access Key ID',
135
+ placeholder: 'Paste the Access Key ID from the token you just created',
136
+ validate: (v) => v.trim() ? undefined : 'Required',
137
+ });
138
+ const secretAccessKey = await text({
139
+ message: 'R2 Secret Access Key',
140
+ validate: (v) => v.trim() ? undefined : 'Required',
141
+ });
142
+ // Save non-sensitive config to workspace.json (safe to commit)
143
+ config.r2_config = {
144
+ account_id: accountId,
145
+ bucket,
146
+ public_url: publicUrl,
147
+ };
148
+ workspace.writeConfig(config);
149
+ // Save credentials to user config (never committed)
150
+ const userConfig = loadUserConfig();
151
+ userConfig.r2 = { access_key_id: accessKeyId, secret_access_key: secretAccessKey, api_token: apiToken };
152
+ saveUserConfig(userConfig);
153
+ outro(`R2 configured. Assets will be served from ${publicUrl}`);
154
+ });
155
+ // ── studiograph r2 upload <dir> ───────────────────────────────────────────
156
+ r2Command
157
+ .command('upload <dir>')
158
+ .description('Upload a local directory to the workspace R2 bucket')
159
+ .option('--prefix <prefix>', 'Key prefix in bucket (e.g. fonts/)', '')
160
+ .action(async (dir, opts) => {
161
+ const workspace = new Workspace();
162
+ if (!workspace.isWorkspace()) {
163
+ console.error('Not a Studiograph workspace. Run `studiograph init` first.');
164
+ process.exit(1);
165
+ }
166
+ const config = workspace.loadConfig();
167
+ const userConfig = loadUserConfig();
168
+ const r2 = config.r2_config;
169
+ const creds = userConfig.r2;
170
+ if (!r2?.account_id || !r2.bucket) {
171
+ console.error('R2 not configured. Run `studiograph r2 setup` first.');
172
+ process.exit(1);
173
+ }
174
+ if (!creds?.access_key_id || !creds.secret_access_key) {
175
+ console.error('R2 credentials not found in user config. Run `studiograph r2 setup` first.');
176
+ process.exit(1);
177
+ }
178
+ const client = new S3Client({
179
+ region: 'auto',
180
+ endpoint: `https://${r2.account_id}.r2.cloudflarestorage.com`,
181
+ credentials: {
182
+ accessKeyId: creds.access_key_id,
183
+ secretAccessKey: creds.secret_access_key,
184
+ },
185
+ });
186
+ const files = walkDir(dir);
187
+ const prefix = opts.prefix.replace(/\/?$/, '/').replace(/^\//, '');
188
+ const s = spinner();
189
+ s.start(`Uploading ${files.length} file(s) to ${r2.bucket}`);
190
+ let uploaded = 0;
191
+ for (const file of files) {
192
+ const relPath = relative(dir, file);
193
+ const key = prefix ? `${prefix}${relPath}` : relPath;
194
+ const body = readFileSync(file);
195
+ await client.send(new PutObjectCommand({
196
+ Bucket: r2.bucket,
197
+ Key: key,
198
+ Body: body,
199
+ ContentType: contentType(file),
200
+ CacheControl: 'public, max-age=31536000, immutable',
201
+ }));
202
+ uploaded++;
203
+ s.message(`${uploaded}/${files.length} — ${key}`);
204
+ }
205
+ s.stop(`Uploaded ${uploaded} file(s)`);
206
+ if (r2.public_url) {
207
+ log.success(`Files available at ${r2.public_url}/${prefix}`);
208
+ }
209
+ });
210
+ //# sourceMappingURL=r2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.js","sourceRoot":"","sources":["../../../src/cli/commands/r2.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -12,6 +12,7 @@ import { authCommand } from './commands/auth.js';
12
12
  import { membersCommand } from './commands/members.js';
13
13
  import { pullCommand, pushCommand } from './commands/sync.js';
14
14
  import { serveCommand } from './commands/serve.js';
15
+ import { r2Command } from './commands/r2.js';
15
16
  const program = new Command();
16
17
  program
17
18
  .name('studiograph')
@@ -26,6 +27,7 @@ program.addCommand(membersCommand);
26
27
  program.addCommand(pullCommand);
27
28
  program.addCommand(pushCommand);
28
29
  program.addCommand(serveCommand);
30
+ program.addCommand(r2Command);
29
31
  // Parse arguments
30
32
  program.parse();
31
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAE9B,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -8,10 +8,16 @@
8
8
  * This mirrors the pattern established by ~/.studiograph/auth.json
9
9
  * for GitHub tokens.
10
10
  */
11
+ export interface UserR2Config {
12
+ access_key_id: string;
13
+ secret_access_key: string;
14
+ api_token?: string;
15
+ }
11
16
  export interface UserConfig {
12
17
  model_provider?: string;
13
18
  model_id?: string;
14
19
  api_key?: string;
20
+ r2?: UserR2Config;
15
21
  }
16
22
  export declare const USER_CONFIG_PATH: string;
17
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"user-config.js","sourceRoot":"","sources":["../../src/core/user-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAQ7B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAe,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,OAAe,EAAE,MAAe;IACnF,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,OAAO,CAAC,cAAc,GAAG,QAAQ,CAAC;IAClC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC3B,IAAI,MAAM;QAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IACrC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"user-config.js","sourceRoot":"","sources":["../../src/core/user-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAe7B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAe,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,OAAe,EAAE,MAAe;IACnF,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,OAAO,CAAC,cAAc,GAAG,QAAQ,CAAC;IAClC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC3B,IAAI,MAAM;QAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IACrC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "studiograph",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Team-based AI agent platform with Git-backed knowledge graphs",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",