@rool-dev/cli 0.3.0 → 0.3.1-dev.07199fc

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 CHANGED
@@ -19,12 +19,14 @@ rool <command> [options]
19
19
  | Command | Description |
20
20
  |---------|-------------|
21
21
  | `chat [prompt]` | Chat with a space (interactive if no prompt) |
22
- | `create <name>` | Create a new Rool app |
23
22
  | `media upload <file>` | Upload a file to a space and create an object with the media URL |
24
23
  | `space list` | List all spaces |
25
24
  | `space create <name>` | Create a new space |
26
25
  | `space delete <name>` | Delete a space |
27
- | `app publish <app-id> <path>` | Publish a directory as an app |
26
+ | `app create [name]` | Create a new Rool app |
27
+ | `app dev` | Start the dev server |
28
+ | `app build` | Build the app |
29
+ | `app publish` | Build and publish the app |
28
30
  | `app list` | List published apps |
29
31
  | `app unpublish <app-id>` | Unpublish an app |
30
32
  | `app slug [new-slug]` | Show or set your user slug |
@@ -43,13 +45,9 @@ rool <command> [options]
43
45
  | Option | Description | Default | Used by |
44
46
  |--------|-------------|---------|---------|
45
47
  | `-s, --space <name>` | space name | `Rool CLI` | `chat`, `media upload` |
46
- | `-c, --conversation <id>` | conversation ID | `rool-dev` | `chat` |
47
- | `--svelte` | use Svelte template | | `create` |
48
- | `--vanilla` | use vanilla TypeScript template | | `create` |
48
+ | `-c, --channel <id>` | channel ID | `rool-dev` | `chat` |
49
49
  | `-m, --message <text>` | optional comment/description | | `media upload` |
50
50
  | `-y, --yes` | skip confirmation prompt | | `space delete` |
51
- | `-n, --name <name>` | app display name (defaults to app-id) | | `app publish` |
52
- | `--no-spa` | disable SPA routing (404s will not serve index.html) | | `app publish` |
53
51
 
54
52
  ### Examples
55
53
 
@@ -63,15 +61,6 @@ rool chat
63
61
  # Use a specific space
64
62
  rool chat -s "My Project" "Summarize the current state"
65
63
 
66
- # Create a Svelte app
67
- rool create --svelte my-app
68
-
69
- # Create a vanilla TypeScript app
70
- rool create --vanilla my-app
71
-
72
- # Using npx
73
- npx @rool-dev/cli create --svelte my-app
74
-
75
64
  # Upload a file
76
65
  rool media upload photo.jpg
77
66
 
@@ -93,24 +82,6 @@ rool space delete "Old Project"
93
82
  # Delete without confirmation
94
83
  rool space delete "Old Project" -y
95
84
 
96
- # Publish a directory as an app
97
- rool app publish my-app ./dist
98
-
99
- # Publish with a custom name
100
- rool app publish my-app ./dist -n "My App"
101
-
102
- # List published apps
103
- rool app list
104
-
105
- # Unpublish an app
106
- rool app unpublish my-app
107
-
108
- # Show your user slug
109
- rool app slug
110
-
111
- # Set your user slug
112
- rool app slug my-slug
113
-
114
85
  # Show user info
115
86
  rool user
116
87
 
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBzC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqJlD"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBzC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4GlD"}
package/dist/app.js CHANGED
@@ -1,83 +1,61 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import archiver from 'archiver';
1
+ import { spawnSync } from 'node:child_process';
2
+ import { createRequire } from 'node:module';
3
+ import { resolve, dirname } from 'node:path';
4
4
  import { getClient } from './client.js';
5
5
  import { formatBytes } from './format.js';
6
- async function zipDirectory(dirPath) {
7
- return new Promise((resolve, reject) => {
8
- const archive = archiver('zip', { zlib: { level: 9 } });
9
- const chunks = [];
10
- archive.on('data', (chunk) => chunks.push(chunk));
11
- archive.on('end', () => resolve(Buffer.concat(chunks)));
12
- archive.on('error', reject);
13
- archive.directory(dirPath, false);
14
- archive.finalize();
6
+ /**
7
+ * Spawn a rool-app CLI command, forwarding the --env flag.
8
+ */
9
+ function spawnRoolApp(command, args, env) {
10
+ const require = createRequire(import.meta.url);
11
+ const appPkg = require.resolve('@rool-dev/app/package.json');
12
+ const bin = resolve(dirname(appPkg), 'dist/cli/index.js');
13
+ const fullArgs = [command, ...args];
14
+ if (env !== 'prod') {
15
+ fullArgs.push('--env', env);
16
+ }
17
+ const result = spawnSync(process.execPath, [bin, ...fullArgs], {
18
+ stdio: 'inherit',
19
+ cwd: process.cwd(),
15
20
  });
21
+ process.exit(result.status ?? 1);
16
22
  }
17
23
  export function registerApp(program) {
18
24
  const app = program
19
25
  .command('app')
20
- .description('Publish and manage apps');
26
+ .description('Create, develop, build, publish, and manage apps');
27
+ app
28
+ .command('create')
29
+ .description('Create a new Rool app')
30
+ .argument('[name]', 'app name (creates subdirectory)')
31
+ .action((name, _opts, command) => {
32
+ const { env } = command.optsWithGlobals();
33
+ spawnRoolApp('init', name ? [name] : [], env);
34
+ });
35
+ app
36
+ .command('dev')
37
+ .description('Start the dev server')
38
+ .action((_opts, command) => {
39
+ const { env } = command.optsWithGlobals();
40
+ spawnRoolApp('dev', [], env);
41
+ });
42
+ app
43
+ .command('build')
44
+ .description('Build the app')
45
+ .action((_opts, command) => {
46
+ const { env } = command.optsWithGlobals();
47
+ spawnRoolApp('build', [], env);
48
+ });
21
49
  app
22
50
  .command('publish')
23
- .description('Publish a directory as an app')
24
- .argument('<app-id>', 'unique app identifier')
25
- .argument('<path>', 'directory to publish')
26
- .option('-n, --name <name>', 'app display name (defaults to app-id)')
27
- .option('--no-spa', 'disable SPA routing (404s will not serve index.html)')
28
- .addHelpText('after', `
29
- Examples:
30
- # Publish a directory as an app
31
- $ rool app publish my-app ./dist
32
-
33
- # Publish with a custom name
34
- $ rool app publish my-app ./dist -n "My App"`)
35
- .action(async (rawAppId, dirPath, opts, command) => {
36
- const appId = rawAppId.toLowerCase();
51
+ .description('Build and publish the app')
52
+ .action((_opts, command) => {
37
53
  const { env } = command.optsWithGlobals();
38
- // Validate directory exists
39
- const resolvedPath = path.resolve(dirPath);
40
- if (!fs.existsSync(resolvedPath)) {
41
- console.error(`Directory not found: ${resolvedPath}`);
42
- process.exit(1);
43
- }
44
- const stat = fs.statSync(resolvedPath);
45
- if (!stat.isDirectory()) {
46
- console.error(`Not a directory: ${resolvedPath}`);
47
- process.exit(1);
48
- }
49
- // Check for index.html
50
- const indexPath = path.join(resolvedPath, 'index.html');
51
- if (!fs.existsSync(indexPath)) {
52
- console.error(`No index.html found in ${resolvedPath}`);
53
- console.error('The directory must contain an index.html file at the root.');
54
- process.exit(1);
55
- }
56
- console.log(`Packaging ${resolvedPath}...`);
57
- const zipBuffer = await zipDirectory(resolvedPath);
58
- console.log(`Bundle size: ${formatBytes(zipBuffer.length)}`);
59
- const client = await getClient(env);
60
- try {
61
- console.log(`Publishing ${appId}...`);
62
- const blob = new Blob([new Uint8Array(zipBuffer)], { type: 'application/zip' });
63
- const result = await client.publishApp(appId, { name: opts.name ?? appId, bundle: blob, spa: opts.spa });
64
- console.log('');
65
- console.log(`Published: ${result.name}`);
66
- console.log(`URL: ${result.url}`);
67
- console.log(`Size: ${formatBytes(result.sizeBytes)}`);
68
- console.log(`SPA routing: ${result.spa ? 'enabled' : 'disabled'}`);
69
- }
70
- finally {
71
- client.destroy();
72
- }
54
+ spawnRoolApp('publish', [], env);
73
55
  });
74
56
  app
75
57
  .command('list')
76
58
  .description('List published apps')
77
- .addHelpText('after', `
78
- Examples:
79
- # List published apps
80
- $ rool app list`)
81
59
  .action(async (_opts, command) => {
82
60
  const { env } = command.optsWithGlobals();
83
61
  const client = await getClient(env);
@@ -91,10 +69,9 @@ Examples:
91
69
  console.log('');
92
70
  for (const a of apps) {
93
71
  console.log(` ${a.appId}`);
94
- console.log(` Name: ${a.name}`);
72
+ console.log(` Name: ${a.manifest.name}`);
95
73
  console.log(` URL: ${a.url}`);
96
74
  console.log(` Size: ${formatBytes(a.sizeBytes)}`);
97
- console.log(` SPA: ${a.spa ? 'yes' : 'no'}`);
98
75
  console.log(` Updated: ${new Date(a.updatedAt).toLocaleString()}`);
99
76
  console.log('');
100
77
  }
@@ -108,10 +85,6 @@ Examples:
108
85
  .command('unpublish')
109
86
  .description('Unpublish an app')
110
87
  .argument('<app-id>', 'app to unpublish')
111
- .addHelpText('after', `
112
- Examples:
113
- # Unpublish an app
114
- $ rool app unpublish my-app`)
115
88
  .action(async (rawAppId, _opts, command) => {
116
89
  const appId = rawAppId.toLowerCase();
117
90
  const { env } = command.optsWithGlobals();
@@ -133,13 +106,6 @@ Examples:
133
106
  .command('slug')
134
107
  .description('Show or set your user slug')
135
108
  .argument('[new-slug]', 'new slug to set')
136
- .addHelpText('after', `
137
- Examples:
138
- # Show your user slug
139
- $ rool app slug
140
-
141
- # Set your user slug
142
- $ rool app slug my-slug`)
143
109
  .action(async (newSlug, _opts, command) => {
144
110
  const { env } = command.optsWithGlobals();
145
111
  const client = await getClient(env);
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
package/dist/chat.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import * as readline from 'node:readline';
2
2
  import { getClient } from './client.js';
3
3
  import { formatMarkdown } from './format.js';
4
- import { DEFAULT_SPACE_NAME, DEFAULT_CONVERSATION_ID } from './constants.js';
4
+ import { DEFAULT_SPACE_NAME, DEFAULT_CHANNEL_ID } from './constants.js';
5
5
  export function registerChat(program) {
6
6
  program
7
7
  .command('chat')
8
8
  .description('Chat with a space (interactive if no prompt)')
9
9
  .argument('[prompt...]', 'prompt to send')
10
10
  .option('-s, --space <name>', 'space name', DEFAULT_SPACE_NAME)
11
- .option('-c, --conversation <id>', 'conversation ID', DEFAULT_CONVERSATION_ID)
11
+ .option('-c, --channel <id>', 'channel ID', DEFAULT_CHANNEL_ID)
12
12
  .addHelpText('after', `
13
13
  Examples:
14
14
  # Chat with the default space
@@ -28,11 +28,11 @@ Examples:
28
28
  const spaceInfo = spaces.find(s => s.name === opts.space);
29
29
  let channel;
30
30
  if (spaceInfo) {
31
- channel = await client.openChannel(spaceInfo.id, opts.conversation);
31
+ channel = await client.openChannel(spaceInfo.id, opts.channel);
32
32
  }
33
33
  else {
34
34
  const space = await client.createSpace(opts.space);
35
- channel = await space.openChannel(opts.conversation);
35
+ channel = await space.openChannel(opts.channel);
36
36
  }
37
37
  if (prompt) {
38
38
  // One-shot mode
@@ -66,7 +66,7 @@ async function sendPrompt(space, prompt) {
66
66
  clearStatusLine();
67
67
  process.stdout.write(tool ? `[${tool.name}]` : 'Thinking...');
68
68
  };
69
- space.on('conversationUpdated', onUpdate);
69
+ space.on('channelUpdated', onUpdate);
70
70
  try {
71
71
  const result = await space.prompt(prompt);
72
72
  clearStatusLine();
@@ -77,7 +77,7 @@ async function sendPrompt(space, prompt) {
77
77
  throw err;
78
78
  }
79
79
  finally {
80
- space.off('conversationUpdated', onUpdate);
80
+ space.off('channelUpdated', onUpdate);
81
81
  }
82
82
  }
83
83
  async function interactiveMode(space, client) {
package/dist/chat.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export declare const VERSION: string;
2
2
  export declare const DEFAULT_SPACE_NAME = "Rool CLI";
3
- export declare const DEFAULT_CONVERSATION_ID = "rool-dev";
3
+ export declare const DEFAULT_CHANNEL_ID = "rool-dev";
4
4
  export type Environment = 'local' | 'dev' | 'prod';
5
5
  export declare const DEFAULT_ENV: Environment;
6
6
  export declare function getApiUrls(env: Environment): {
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AACnD,eAAO,MAAM,WAAW,EAAE,WAAoB,CAAC;AAQ/C,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGjF"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAE7C,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AACnD,eAAO,MAAM,WAAW,EAAE,WAAoB,CAAC;AAQ/C,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGjF"}
package/dist/constants.js CHANGED
@@ -3,7 +3,7 @@ const require = createRequire(import.meta.url);
3
3
  const pkg = require('../package.json');
4
4
  export const VERSION = pkg.version;
5
5
  export const DEFAULT_SPACE_NAME = 'Rool CLI';
6
- export const DEFAULT_CONVERSATION_ID = 'rool-dev';
6
+ export const DEFAULT_CHANNEL_ID = 'rool-dev';
7
7
  export const DEFAULT_ENV = 'prod';
8
8
  const ENV_URLS = {
9
9
  local: { target: 'http://localhost:1357', auth: 'https://api.dev.rool.dev/auth' },
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAGlD,MAAM,CAAC,MAAM,WAAW,GAAgB,MAAM,CAAC;AAE/C,MAAM,QAAQ,GAA0D;IACtE,KAAK,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,IAAI,EAAE,+BAA+B,EAAE;IACjF,GAAG,EAAE,EAAE,MAAM,EAAE,0BAA0B,EAAE,IAAI,EAAE,+BAA+B,EAAE;IAClF,IAAI,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,2BAA2B,EAAE;CAC5E,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,GAAgB;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAG7C,MAAM,CAAC,MAAM,WAAW,GAAgB,MAAM,CAAC;AAE/C,MAAM,QAAQ,GAA0D;IACtE,KAAK,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,IAAI,EAAE,+BAA+B,EAAE;IACjF,GAAG,EAAE,EAAE,MAAM,EAAE,0BAA0B,EAAE,IAAI,EAAE,+BAA+B,EAAE;IAClF,IAAI,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,2BAA2B,EAAE;CAC5E,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,GAAgB;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,aAAa,IAAI,OAAO,CAkBvC"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,aAAa,IAAI,OAAO,CAiBvC"}
package/dist/program.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import { Command } from 'commander';
2
2
  import { VERSION, DEFAULT_ENV } from './constants.js';
3
3
  import { registerChat } from './chat.js';
4
- import { registerCreate } from './create.js';
5
4
  import { registerMedia } from './media.js';
6
5
  import { registerSpace } from './space.js';
7
6
  import { registerApp } from './app.js';
@@ -21,7 +20,6 @@ export function createProgram() {
21
20
  .description('Command-line interface for the Rool platform')
22
21
  .option('-e, --env <environment>', 'target environment (local, dev, prod)', validateEnv, DEFAULT_ENV);
23
22
  registerChat(program);
24
- registerCreate(program);
25
23
  registerMedia(program);
26
24
  registerSpace(program);
27
25
  registerApp(program);
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAoB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,gCAAgC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,yBAAyB,EAAE,uCAAuC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAExG,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAoB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,gCAAgC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,yBAAyB,EAAE,uCAAuC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAExG,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rool-dev/cli",
3
- "version": "0.3.0",
3
+ "version": "0.3.1-dev.07199fc",
4
4
  "description": "Command-line interface for working with Rool Spaces",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -9,8 +9,7 @@
9
9
  "rool": "./dist/index.js"
10
10
  },
11
11
  "files": [
12
- "dist",
13
- "templates"
12
+ "dist"
14
13
  ],
15
14
  "publishConfig": {
16
15
  "access": "public"
@@ -34,16 +33,15 @@
34
33
  },
35
34
  "license": "MIT",
36
35
  "dependencies": {
37
- "archiver": "^7.0.1",
38
36
  "commander": "^14.0.3",
39
37
  "marked": "^15.0.12",
40
38
  "marked-terminal": "^7.3.0",
41
- "@rool-dev/sdk": "0.3.0"
39
+ "@rool-dev/app": "0.3.1-dev.07199fc",
40
+ "@rool-dev/sdk": "0.3.1-dev.07199fc"
42
41
  },
43
42
  "devDependencies": {
44
- "@types/archiver": "^7.0.0",
45
43
  "@types/marked-terminal": "^6.1.1",
46
- "@types/node": "^25.0.2",
44
+ "@types/node": "^25.5.0",
47
45
  "tsx": "^4.21.0",
48
46
  "typescript": "^5.9.3"
49
47
  },
package/dist/create.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import { type Command } from 'commander';
2
- export declare function registerCreate(program: Command): void;
3
- //# sourceMappingURL=create.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6ErD"}
package/dist/create.js DELETED
@@ -1,120 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
- const cliPkgJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8'));
6
- function getTemplatesDir() {
7
- // In development: packages/cli/src -> packages/cli/templates
8
- // In production: packages/cli/dist -> packages/cli/templates
9
- return path.resolve(__dirname, '..', 'templates');
10
- }
11
- const SKIP_DIRS = new Set(['node_modules', '.git', 'dist']);
12
- function copyDir(src, dest, replacements) {
13
- fs.mkdirSync(dest, { recursive: true });
14
- for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
15
- const srcPath = path.join(src, entry.name);
16
- const destPath = path.join(dest, entry.name);
17
- if (entry.isDirectory()) {
18
- if (!SKIP_DIRS.has(entry.name)) {
19
- copyDir(srcPath, destPath, replacements);
20
- }
21
- }
22
- else {
23
- let content = fs.readFileSync(srcPath, 'utf-8');
24
- for (const [from, to] of replacements) {
25
- content = content.replaceAll(from, to);
26
- }
27
- fs.writeFileSync(destPath, content);
28
- }
29
- }
30
- }
31
- function toValidPackageName(name) {
32
- return name
33
- .toLowerCase()
34
- .replace(/\s+/g, '-')
35
- .replace(/[^a-z0-9-_]/g, '');
36
- }
37
- function toTitleCase(name) {
38
- return name
39
- .split(/[-_\s]+/)
40
- .map(word => word.charAt(0).toUpperCase() + word.slice(1))
41
- .join(' ');
42
- }
43
- export function registerCreate(program) {
44
- program
45
- .command('create')
46
- .description('Create a new Rool app')
47
- .argument('<name>', 'project name')
48
- .option('--svelte', 'use Svelte template')
49
- .option('--vanilla', 'use vanilla TypeScript template')
50
- .addHelpText('after', `
51
- Examples:
52
- # Create a Svelte app
53
- $ rool create --svelte my-app
54
-
55
- # Create a vanilla TypeScript app
56
- $ rool create --vanilla my-app
57
-
58
- # Using npx
59
- $ npx @rool-dev/cli create --svelte my-app`)
60
- .action(async (name, opts) => {
61
- // Determine framework
62
- let framework;
63
- if (opts.svelte && opts.vanilla) {
64
- console.error('Error: Cannot use both --svelte and --vanilla');
65
- process.exit(1);
66
- }
67
- else if (opts.svelte) {
68
- framework = 'svelte';
69
- }
70
- else if (opts.vanilla) {
71
- framework = 'vanilla';
72
- }
73
- else {
74
- console.error('Error: Please specify a framework: --svelte or --vanilla');
75
- process.exit(1);
76
- }
77
- // Check if directory exists
78
- const targetDir = path.resolve(process.cwd(), name);
79
- if (fs.existsSync(targetDir)) {
80
- console.error(`Error: Directory "${name}" already exists`);
81
- process.exit(1);
82
- }
83
- // Find template
84
- const templatesDir = getTemplatesDir();
85
- const templateDir = path.join(templatesDir, framework);
86
- if (!fs.existsSync(templateDir)) {
87
- console.error(`Error: Template "${framework}" not found at ${templateDir}`);
88
- process.exit(1);
89
- }
90
- // Copy template with replacements
91
- const packageName = toValidPackageName(name);
92
- const title = toTitleCase(name);
93
- console.log(`Creating ${framework} app in ${name}/...\n`);
94
- copyDir(templateDir, targetDir, [
95
- ['rool-app', packageName],
96
- ['Rool App', title],
97
- ['"@rool-dev/sdk": "workspace:*"', `"@rool-dev/sdk": "^${cliPkgJson.version}"`],
98
- ['"@rool-dev/svelte": "workspace:*"', `"@rool-dev/svelte": "^${cliPkgJson.version}"`],
99
- ]);
100
- // Print next steps
101
- console.log(`Done! Next steps:\n`);
102
- console.log(` cd ${name}`);
103
- console.log(` pnpm install`);
104
- console.log(` pnpm dev\n`);
105
- console.log(`Key patterns:`);
106
- if (framework === 'svelte') {
107
- console.log(` • createRool() initializes the reactive client`);
108
- console.log(` • rool.openSpace() connects to a space`);
109
- console.log(` • space.collection() creates reactive queries`);
110
- }
111
- else {
112
- console.log(` • new RoolClient() initializes the client`);
113
- console.log(` • client.openSpace() connects to a space`);
114
- console.log(` • space.on() subscribes to real-time events`);
115
- }
116
- console.log(` • space.prompt() invokes the AI agent\n`);
117
- console.log(`Docs: https://docs.rool.dev`);
118
- });
119
- }
120
- //# sourceMappingURL=create.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
@@ -1,55 +0,0 @@
1
- # Rool App
2
-
3
- A Svelte 5 app built on Rool Spaces - a persistent, collaborative environment for AI-driven object management.
4
-
5
- ## Technology Stack
6
-
7
- - **Framework**: Svelte 5
8
- - **Styling**: TailwindCSS v4
9
- - **Language**: TypeScript
10
- - **Package manager**: pnpm
11
-
12
- For Rool documentation, **always read the README first**:
13
-
14
- ```
15
- node_modules/@rool-dev/svelte/README.md # The svelte wrapper
16
- node_modules/@rool-dev/sdk/README.md # The core SDK
17
- ```
18
-
19
- ## Rool Primitives
20
-
21
- **RoolClient** - Authentication and space lifecycle. One per app.
22
-
23
- **ReactiveSpace** - The workspace. Contains objects and conversations.
24
- - `space.collection({ where? })` - Reactive query returning `{ objects }`
25
- - `space.prompt(text)` - Invoke AI to create/modify objects
26
- - `space.checkpoint()` - Create undo point before mutations
27
- - `space.interactions` - Chat history for current conversation
28
-
29
- **Objects** - Key-value records with `id` field. Created via `space.createObject()` or AI. References between objects are data fields whose values are object IDs.
30
-
31
- ## Key Patterns
32
-
33
- ```typescript
34
- // Reactive collection - auto-updates when objects change
35
- let collection = space.collection({ where: { type: 'task' } });
36
- let tasks = $derived(collection.objects);
37
-
38
- // AI mutation - always checkpoint first for undo
39
- await space.checkpoint();
40
- await space.prompt('Create a task for tomorrow');
41
- ```
42
-
43
- Use `space.on('objectCreated', ...)` for side effects outside Svelte's reactivity.
44
-
45
- ## Entry Point
46
-
47
- `src/main.ts` mounts `App.svelte`, which handles auth and space setup.
48
-
49
-
50
- ## Adding Functionality
51
-
52
- Useful packages to consider:
53
-
54
- - **@iconify/svelte** - Icons (`<Icon icon="mdi:home" />`)
55
- - **@humanspeak/svelte-markdown** - Render markdown from AI responses
@@ -1,12 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
- <title>Rool App</title>
7
- </head>
8
- <body>
9
- <div id="app"></div>
10
- <script type="module" src="/src/main.ts"></script>
11
- </body>
12
- </html>
@@ -1,25 +0,0 @@
1
- {
2
- "name": "rool-app",
3
- "private": true,
4
- "version": "0.0.0",
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "vite build",
9
- "preview": "vite preview",
10
- "typecheck": "tsc --noEmit && svelte-check --tsconfig ./tsconfig.json"
11
- },
12
- "dependencies": {
13
- "@rool-dev/sdk": "workspace:*",
14
- "@rool-dev/svelte": "workspace:*"
15
- },
16
- "devDependencies": {
17
- "@sveltejs/vite-plugin-svelte": "^5.0.0",
18
- "@tailwindcss/vite": "^4.0.0",
19
- "svelte": "^5.0.0",
20
- "svelte-check": "^4.0.0",
21
- "tailwindcss": "^4.0.0",
22
- "typescript": "^5.0.0",
23
- "vite": "^6.0.0"
24
- }
25
- }
@@ -1,57 +0,0 @@
1
- <script lang="ts">
2
- import { createRool, type ReactiveChannel } from '@rool-dev/svelte';
3
- import Splash from './Splash.svelte';
4
- import Header from './Header.svelte';
5
- import Chat from './Chat.svelte';
6
- import Objects from './Objects.svelte';
7
-
8
- const APP_NAME = 'Rool App';
9
-
10
- const rool = createRool();
11
- rool.init();
12
-
13
- let space = $state<ReactiveChannel | null>(null);
14
-
15
- // Open space when ready
16
- $effect(() => {
17
- if (rool.authenticated && rool.spaces && !space) {
18
- openSpace();
19
- }
20
- });
21
-
22
- async function openSpace() {
23
- const spaces = rool.spaces!;
24
- const existing = spaces.find(s => s.name === APP_NAME);
25
-
26
- if (existing) {
27
- space = await rool.openChannel(existing.id, 'main');
28
- } else {
29
- const newSpace = await rool.createSpace(APP_NAME);
30
- space = await rool.openChannel(newSpace.id, 'main');
31
- }
32
- }
33
- </script>
34
-
35
- {#if rool.authenticated === undefined}
36
- <div class="min-h-dvh flex items-center justify-center bg-gray-50">
37
- <p class="text-gray-500">Loading...</p>
38
- </div>
39
- {:else if rool.authenticated === false}
40
- <Splash appName={APP_NAME} onLogin={() => rool.login(APP_NAME)} />
41
- {:else}
42
- <div class="min-h-dvh flex flex-col bg-gray-50">
43
- <Header appName={APP_NAME} {space} onLogout={() => rool.logout()} />
44
-
45
- {#if !space}
46
- <div class="flex-1 flex items-center justify-center">
47
- <p class="text-gray-500">Loading space...</p>
48
- </div>
49
- {:else}
50
- <!-- Mobile: horizontal swipe with scroll-snap. Desktop: side-by-side -->
51
- <div class="flex-1 flex overflow-x-auto snap-x snap-mandatory md:overflow-visible min-h-0">
52
- <Chat {space} />
53
- <Objects {space} />
54
- </div>
55
- {/if}
56
- </div>
57
- {/if}
@@ -1,92 +0,0 @@
1
- <script lang="ts">
2
- import type { ReactiveChannel } from '@rool-dev/svelte';
3
-
4
- interface Props {
5
- space: ReactiveChannel;
6
- }
7
-
8
- let { space }: Props = $props();
9
-
10
- let input = $state('');
11
- let isSending = $state(false);
12
- let messagesEl: HTMLElement | null = $state(null);
13
-
14
- let interactions = $derived(space.interactions);
15
-
16
- // Auto-scroll on new messages
17
- $effect(() => {
18
- if (interactions.length > 0 && messagesEl) {
19
- messagesEl.scrollTop = messagesEl.scrollHeight;
20
- }
21
- });
22
-
23
- async function send() {
24
- if (!input.trim() || isSending) return;
25
-
26
- const text = input.trim();
27
- input = '';
28
- isSending = true;
29
-
30
- try {
31
- await space.checkpoint();
32
- await space.prompt(text);
33
- } finally {
34
- isSending = false;
35
- }
36
- }
37
-
38
- function handleKeydown(e: KeyboardEvent) {
39
- if (e.key === 'Enter' && !e.shiftKey) {
40
- e.preventDefault();
41
- send();
42
- }
43
- }
44
- </script>
45
-
46
- <div class="w-full shrink-0 snap-start md:flex-1 md:shrink md:snap-align-none flex flex-col min-w-0">
47
- <div class="flex-1 overflow-y-auto p-4 space-y-4" bind:this={messagesEl}>
48
- {#if interactions.length === 0}
49
- <div class="text-center py-16 text-gray-500">
50
- <p class="text-lg mb-2">Welcome!</p>
51
- <p class="text-sm">Ask the AI to create objects, answer questions, or help with tasks.</p>
52
- </div>
53
- {:else}
54
- {#each interactions as msg (msg.id)}
55
- <div class="flex justify-end">
56
- <div class="max-w-[75%] bg-blue-600 text-white rounded-2xl rounded-br-sm px-4 py-2">
57
- <p class="text-sm whitespace-pre-wrap">{msg.input}</p>
58
- </div>
59
- </div>
60
- <div class="flex justify-start">
61
- <div class="max-w-[75%] bg-white border border-gray-200 rounded-2xl rounded-bl-sm px-4 py-2 shadow-sm">
62
- {#if msg.output}
63
- <p class="text-sm text-gray-700 whitespace-pre-wrap">{msg.output}</p>
64
- {:else}
65
- <p class="text-sm text-gray-400 italic">Thinking...</p>
66
- {/if}
67
- </div>
68
- </div>
69
- {/each}
70
- {/if}
71
- </div>
72
-
73
- <div class="border-t border-gray-200 bg-white p-4">
74
- <div class="flex gap-2">
75
- <textarea
76
- class="flex-1 px-4 py-2 border border-gray-300 rounded-xl resize-none focus:outline-none focus:ring-2 focus:ring-blue-500 min-h-[44px] max-h-32"
77
- placeholder="Type a message..."
78
- rows="1"
79
- bind:value={input}
80
- onkeydown={handleKeydown}
81
- disabled={isSending}
82
- ></textarea>
83
- <button
84
- class="px-5 py-2 bg-blue-600 text-white rounded-xl hover:bg-blue-700 disabled:opacity-50"
85
- onclick={send}
86
- disabled={isSending || !input.trim()}
87
- >
88
- {isSending ? '...' : 'Send'}
89
- </button>
90
- </div>
91
- </div>
92
- </div>
@@ -1,26 +0,0 @@
1
- <script lang="ts">
2
- import type { ReactiveChannel } from '@rool-dev/svelte';
3
-
4
- interface Props {
5
- appName: string;
6
- space: ReactiveChannel | null;
7
- onLogout: () => void;
8
- }
9
-
10
- let { appName, space, onLogout }: Props = $props();
11
- </script>
12
-
13
- <header class="bg-white border-b border-gray-200 px-4 py-3 flex items-center justify-between">
14
- <h1 class="text-lg font-semibold text-gray-900">{appName}</h1>
15
- <div class="flex items-center gap-3">
16
- {#if space}
17
- <span class="text-sm text-gray-500 hidden sm:inline">{space.name}</span>
18
- {/if}
19
- <button
20
- class="px-3 py-1.5 text-sm text-gray-500 hover:text-gray-700"
21
- onclick={onLogout}
22
- >
23
- Sign out
24
- </button>
25
- </div>
26
- </header>
@@ -1,39 +0,0 @@
1
- <script lang="ts">
2
- import type { ReactiveChannel, ReactiveWatch } from '@rool-dev/svelte';
3
-
4
- interface Props {
5
- space: ReactiveChannel;
6
- }
7
-
8
- let { space }: Props = $props();
9
-
10
- let collection = $state<ReactiveWatch | null>(null);
11
-
12
- $effect(() => {
13
- const c = space.watch({});
14
- collection = c;
15
- return () => c.close();
16
- });
17
-
18
- let objects = $derived(collection?.objects ?? []);
19
- </script>
20
-
21
- <!-- Mobile: full width swipe panel. Desktop: side panel -->
22
- <aside class="w-full shrink-0 snap-start md:w-80 md:shrink md:snap-align-none border-l border-gray-200 bg-white flex flex-col">
23
- <div class="px-4 py-3 border-b border-gray-200">
24
- <h2 class="font-medium text-gray-700">Objects ({objects.length})</h2>
25
- </div>
26
- <div class="flex-1 overflow-y-auto p-4 space-y-3">
27
- {#if objects.length === 0}
28
- <p class="text-gray-400 text-sm text-center py-4">
29
- Objects created by the AI will appear here
30
- </p>
31
- {:else}
32
- {#each objects as obj (obj.id)}
33
- <div class="p-3 bg-gray-50 rounded-lg border border-gray-200">
34
- <pre class="text-xs text-gray-600 overflow-auto">{JSON.stringify(obj, null, 2)}</pre>
35
- </div>
36
- {/each}
37
- {/if}
38
- </div>
39
- </aside>
@@ -1,21 +0,0 @@
1
- <script lang="ts">
2
- interface Props {
3
- appName: string;
4
- onLogin: () => void;
5
- }
6
-
7
- let { appName, onLogin }: Props = $props();
8
- </script>
9
-
10
- <div class="min-h-dvh flex flex-col items-center justify-center bg-gray-50 p-8">
11
- <div class="text-center max-w-sm">
12
- <h1 class="text-3xl font-bold text-gray-900 mb-2">{appName}</h1>
13
- <p class="text-gray-500 mb-8">Sign in to get started</p>
14
- <button
15
- class="px-6 py-3 bg-gray-900 hover:bg-gray-800 text-white font-medium rounded-lg transition-colors"
16
- onclick={onLogin}
17
- >
18
- Sign in
19
- </button>
20
- </div>
21
- </div>
@@ -1 +0,0 @@
1
- @import 'tailwindcss';
@@ -1,5 +0,0 @@
1
- import { mount } from 'svelte';
2
- import App from './App.svelte';
3
- import './app.css';
4
-
5
- mount(App, { target: document.getElementById('app')! });
@@ -1,13 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ESNext",
4
- "module": "ESNext",
5
- "moduleResolution": "bundler",
6
- "verbatimModuleSyntax": true,
7
- "resolveJsonModule": true,
8
- "isolatedModules": true,
9
- "strict": true,
10
- "noEmit": true
11
- },
12
- "include": ["src/**/*.ts", "src/**/*.svelte"]
13
- }
@@ -1,8 +0,0 @@
1
- import { defineConfig } from 'vite';
2
- import { svelte } from '@sveltejs/vite-plugin-svelte';
3
- import tailwindcss from '@tailwindcss/vite';
4
-
5
- export default defineConfig({
6
- base: './',
7
- plugins: [tailwindcss(), svelte()],
8
- });
@@ -1,59 +0,0 @@
1
- # Rool App
2
-
3
- A vanilla TypeScript app built on Rool Spaces - a persistent, collaborative environment for AI-driven object management.
4
-
5
- ## Technology Stack
6
-
7
- - **Language**: TypeScript
8
- - **Styling**: TailwindCSS v4
9
- - **Bundler**: Vite
10
- - **Package manager**: pnpm
11
-
12
- For Rool documentation, **always read the README first**:
13
-
14
- ```
15
- node_modules/@rool-dev/sdk/README.md
16
- ```
17
-
18
- ## Rool Primitives
19
-
20
- **RoolClient** - Authentication and space lifecycle. One per app.
21
-
22
- **RoolSpace** - The workspace. Contains objects and conversations.
23
- - `space.prompt(text)` - Invoke AI to create/modify objects
24
- - `space.checkpoint()` - Create undo point before mutations
25
- - `space.on(event, handler)` - Subscribe to real-time events
26
- - `space.findObjects({ where? })` - Query objects
27
-
28
- **Objects** - Key-value records with `id` field. Created via `space.createObject()` or AI. References between objects are data fields whose values are object IDs.
29
-
30
- ## Event-Driven Pattern
31
-
32
- The SDK emits events for all changes. Build reactive UIs by subscribing:
33
-
34
- ```typescript
35
- space.on('objectCreated', ({ objectId, object, source }) => {
36
- // source: 'local_user' | 'remote_user' | 'remote_agent' | 'system'
37
- updateUI(object);
38
- });
39
-
40
- space.on('objectUpdated', ({ objectId, object }) => { ... });
41
- space.on('objectDeleted', ({ objectId }) => { ... });
42
- ```
43
-
44
- ## Key Pattern
45
-
46
- ```typescript
47
- // Always checkpoint before AI mutations for undo support
48
- await space.checkpoint();
49
- const { message, objects } = await space.prompt('Create a task');
50
- ```
51
-
52
- ## Entry Point
53
-
54
- `src/main.ts` - Single file with auth, rendering, and event handlers.
55
-
56
- ## Adding Functionality
57
-
58
- Useful packages:
59
- - **marked** - Render markdown from AI responses
@@ -1,12 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
- <title>Rool App</title>
7
- </head>
8
- <body>
9
- <div id="app"></div>
10
- <script type="module" src="/src/main.ts"></script>
11
- </body>
12
- </html>
@@ -1,21 +0,0 @@
1
- {
2
- "name": "rool-app",
3
- "private": true,
4
- "version": "0.0.0",
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "vite build",
9
- "preview": "vite preview",
10
- "typecheck": "tsc --noEmit"
11
- },
12
- "dependencies": {
13
- "@rool-dev/sdk": "workspace:*"
14
- },
15
- "devDependencies": {
16
- "@tailwindcss/vite": "^4.0.0",
17
- "tailwindcss": "^4.0.0",
18
- "typescript": "^5.0.0",
19
- "vite": "^6.0.0"
20
- }
21
- }
@@ -1 +0,0 @@
1
- @import 'tailwindcss';
@@ -1,165 +0,0 @@
1
- import { RoolClient, type RoolChannel, generateEntityId } from '@rool-dev/sdk';
2
- import './app.css';
3
-
4
- const APP_NAME = 'Rool App';
5
-
6
- const client = new RoolClient();
7
- const app = document.getElementById('app')!;
8
-
9
- let logEl: HTMLElement;
10
- let inputEl: HTMLInputElement;
11
- let buttonEl: HTMLButtonElement;
12
-
13
- // --- Rendering ---
14
-
15
- function renderSplash() {
16
- app.innerHTML = `
17
- <div class="min-h-dvh flex flex-col items-center justify-center bg-gray-50 p-8">
18
- <div class="text-center max-w-sm">
19
- <h1 class="text-3xl font-bold text-gray-900 mb-2">${APP_NAME}</h1>
20
- <p class="text-gray-500 mb-8">Sign in to get started</p>
21
- <button id="login-btn" class="px-6 py-3 bg-gray-900 hover:bg-gray-800 text-white font-medium rounded-lg">
22
- Sign in
23
- </button>
24
- </div>
25
- </div>
26
- `;
27
- document.getElementById('login-btn')!.onclick = () => client.login(APP_NAME);
28
- }
29
-
30
- function renderApp(space: RoolChannel) {
31
- app.innerHTML = `
32
- <div class="min-h-dvh flex flex-col bg-gray-900 text-gray-100 font-mono text-sm">
33
- <header class="flex items-center justify-between px-4 py-2 border-b border-gray-700">
34
- <span class="text-gray-400">${APP_NAME}</span>
35
- <button id="logout-btn" class="text-gray-500 hover:text-gray-300">logout</button>
36
- </header>
37
- <div id="log" class="flex-1 overflow-y-auto p-4 space-y-1"></div>
38
- <form id="prompt-form" class="border-t border-gray-700 p-4">
39
- <div class="flex gap-2">
40
- <span class="text-green-400">&gt;</span>
41
- <input
42
- type="text"
43
- id="prompt-input"
44
- placeholder="Type a prompt..."
45
- class="flex-1 bg-transparent outline-none text-gray-100 placeholder-gray-600"
46
- autocomplete="off"
47
- />
48
- <button type="submit" id="submit-btn" class="text-gray-500 hover:text-gray-300 disabled:opacity-50">
49
- send
50
- </button>
51
- </div>
52
- </form>
53
- </div>
54
- `;
55
-
56
- logEl = document.getElementById('log')!;
57
- inputEl = document.getElementById('prompt-input') as HTMLInputElement;
58
- buttonEl = document.getElementById('submit-btn') as HTMLButtonElement;
59
-
60
- document.getElementById('logout-btn')!.onclick = () => {
61
- client.logout();
62
- location.reload();
63
- };
64
-
65
- const form = document.getElementById('prompt-form') as HTMLFormElement;
66
- form.onsubmit = async (e) => {
67
- e.preventDefault();
68
- const text = inputEl.value.trim();
69
- if (!text) return;
70
-
71
- log('prompt', text);
72
- inputEl.value = '';
73
- inputEl.disabled = true;
74
- buttonEl.disabled = true;
75
-
76
- try {
77
- await space.checkpoint();
78
- const { message } = await space.prompt(text);
79
- log('response', message);
80
- } catch (err) {
81
- log('error', err instanceof Error ? err.message : String(err));
82
- } finally {
83
- inputEl.disabled = false;
84
- buttonEl.disabled = false;
85
- inputEl.focus();
86
- }
87
- };
88
-
89
- // Subscribe to space events
90
- space.on('objectCreated', ({ objectId, object }) => {
91
- log('objectCreated', `${objectId}: ${JSON.stringify(object)}`);
92
- });
93
-
94
- space.on('objectUpdated', ({ objectId, object }) => {
95
- log('objectUpdated', `${objectId}: ${JSON.stringify(object)}`);
96
- });
97
-
98
- space.on('objectDeleted', ({ objectId }) => {
99
- log('objectDeleted', objectId);
100
- });
101
-
102
- space.on('linked', ({ sourceId, relation, targetId }) => {
103
- log('linked', `${sourceId} --${relation}--> ${targetId}`);
104
- });
105
-
106
- space.on('unlinked', ({ sourceId, relation, targetId }) => {
107
- log('unlinked', `${sourceId} --${relation}--> ${targetId}`);
108
- });
109
-
110
- log('info', `Connected to space "${space.name}"`);
111
- log('info', 'Type a prompt to create or modify objects. Events will appear here.');
112
- inputEl.focus();
113
- }
114
-
115
- function log(type: string, content: string) {
116
- const line = document.createElement('div');
117
- const colors: Record<string, string> = {
118
- prompt: 'text-green-400',
119
- response: 'text-blue-400',
120
- info: 'text-gray-500',
121
- error: 'text-red-400',
122
- objectCreated: 'text-yellow-400',
123
- objectUpdated: 'text-yellow-400',
124
- objectDeleted: 'text-orange-400',
125
- linked: 'text-purple-400',
126
- unlinked: 'text-purple-400',
127
- };
128
- const color = colors[type] || 'text-gray-400';
129
-
130
- line.innerHTML = `<span class="${color}">[${type}]</span> <span class="text-gray-300">${escapeHtml(content)}</span>`;
131
- logEl.appendChild(line);
132
- logEl.scrollTop = logEl.scrollHeight;
133
- }
134
-
135
- function escapeHtml(text: string): string {
136
- return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
137
- }
138
-
139
- // --- Main ---
140
-
141
- async function main() {
142
- const authenticated = await client.initialize();
143
-
144
- if (!authenticated) {
145
- renderSplash();
146
- return;
147
- }
148
-
149
- // Find or create a space for this app
150
- const spaces = await client.listSpaces();
151
- const existing = spaces.find((s) => s.name === APP_NAME);
152
-
153
- const channelId = generateEntityId();
154
- let channel: RoolChannel;
155
- if (existing) {
156
- channel = await client.openChannel(existing.id, channelId);
157
- } else {
158
- const space = await client.createSpace(APP_NAME);
159
- channel = await space.openChannel(channelId);
160
- }
161
-
162
- renderApp(channel);
163
- }
164
-
165
- main().catch(console.error);
@@ -1,10 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ESNext",
4
- "module": "ESNext",
5
- "moduleResolution": "bundler",
6
- "strict": true,
7
- "noEmit": true
8
- },
9
- "include": ["src/**/*"]
10
- }
@@ -1,7 +0,0 @@
1
- import { defineConfig } from 'vite';
2
- import tailwindcss from '@tailwindcss/vite';
3
-
4
- export default defineConfig({
5
- base: './',
6
- plugins: [tailwindcss()],
7
- });