@loom-framework/core 0.1.0-alpha.149 → 0.1.0-alpha.150

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 (125) hide show
  1. package/builtin-skills/app-skill/SKILL.md +12 -7
  2. package/builtin-skills/app-skill/references/auth.md +164 -0
  3. package/builtin-skills/app-skill/references/models.md +2 -0
  4. package/builtin-skills/loom/SKILL.md +35 -3
  5. package/dist/backend/ai/engine.d.ts.map +1 -1
  6. package/dist/backend/ai/engine.js +1 -0
  7. package/dist/backend/ai/engine.js.map +1 -1
  8. package/dist/backend/auth/jwt.d.ts +16 -0
  9. package/dist/backend/auth/jwt.d.ts.map +1 -0
  10. package/dist/backend/auth/jwt.js +57 -0
  11. package/dist/backend/auth/jwt.js.map +1 -0
  12. package/dist/backend/auth/password.d.ts +10 -0
  13. package/dist/backend/auth/password.d.ts.map +1 -0
  14. package/dist/backend/auth/password.js +19 -0
  15. package/dist/backend/auth/password.js.map +1 -0
  16. package/dist/backend/auth/rbac.d.ts +34 -0
  17. package/dist/backend/auth/rbac.d.ts.map +1 -0
  18. package/dist/backend/auth/rbac.js +124 -0
  19. package/dist/backend/auth/rbac.js.map +1 -0
  20. package/dist/backend/auth/service-token.d.ts +11 -0
  21. package/dist/backend/auth/service-token.d.ts.map +1 -0
  22. package/dist/backend/auth/service-token.js +13 -0
  23. package/dist/backend/auth/service-token.js.map +1 -0
  24. package/dist/backend/auth/token-store.d.ts +27 -0
  25. package/dist/backend/auth/token-store.d.ts.map +1 -0
  26. package/dist/backend/auth/token-store.js +84 -0
  27. package/dist/backend/auth/token-store.js.map +1 -0
  28. package/dist/backend/auth/user-store.d.ts +41 -0
  29. package/dist/backend/auth/user-store.d.ts.map +1 -0
  30. package/dist/backend/auth/user-store.js +112 -0
  31. package/dist/backend/auth/user-store.js.map +1 -0
  32. package/dist/backend/index.d.ts +8 -0
  33. package/dist/backend/index.d.ts.map +1 -1
  34. package/dist/backend/index.js +48 -2
  35. package/dist/backend/index.js.map +1 -1
  36. package/dist/backend/routes/auth-routes.d.ts +26 -0
  37. package/dist/backend/routes/auth-routes.d.ts.map +1 -0
  38. package/dist/backend/routes/auth-routes.js +301 -0
  39. package/dist/backend/routes/auth-routes.js.map +1 -0
  40. package/dist/backend/routes/chat.d.ts.map +1 -1
  41. package/dist/backend/routes/chat.js +1 -0
  42. package/dist/backend/routes/chat.js.map +1 -1
  43. package/dist/backend/routes/data.d.ts.map +1 -1
  44. package/dist/backend/routes/data.js +8 -0
  45. package/dist/backend/routes/data.js.map +1 -1
  46. package/dist/backend/routes/index.d.ts +2 -0
  47. package/dist/backend/routes/index.d.ts.map +1 -1
  48. package/dist/backend/routes/index.js +1 -0
  49. package/dist/backend/routes/index.js.map +1 -1
  50. package/dist/cli/commands/auth.d.ts +11 -0
  51. package/dist/cli/commands/auth.d.ts.map +1 -0
  52. package/dist/cli/commands/auth.js +203 -0
  53. package/dist/cli/commands/auth.js.map +1 -0
  54. package/dist/cli/commands/data.d.ts +5 -1
  55. package/dist/cli/commands/data.d.ts.map +1 -1
  56. package/dist/cli/commands/data.js +182 -40
  57. package/dist/cli/commands/data.js.map +1 -1
  58. package/dist/cli/commands/generate-system-settings.d.ts +2 -2
  59. package/dist/cli/commands/generate-system-settings.d.ts.map +1 -1
  60. package/dist/cli/commands/generate-system-settings.js +14 -6
  61. package/dist/cli/commands/generate-system-settings.js.map +1 -1
  62. package/dist/cli/commands/init.js +26 -2
  63. package/dist/cli/commands/init.js.map +1 -1
  64. package/dist/cli/commands/role.d.ts +9 -0
  65. package/dist/cli/commands/role.d.ts.map +1 -0
  66. package/dist/cli/commands/role.js +81 -0
  67. package/dist/cli/commands/role.js.map +1 -0
  68. package/dist/cli/commands/user-cmd.d.ts +9 -0
  69. package/dist/cli/commands/user-cmd.d.ts.map +1 -0
  70. package/dist/cli/commands/user-cmd.js +204 -0
  71. package/dist/cli/commands/user-cmd.js.map +1 -0
  72. package/dist/cli/generators/capability-generator.d.ts.map +1 -1
  73. package/dist/cli/generators/capability-generator.js +67 -6
  74. package/dist/cli/generators/capability-generator.js.map +1 -1
  75. package/dist/cli/helpers/app-tsx-wiring.d.ts +7 -0
  76. package/dist/cli/helpers/app-tsx-wiring.d.ts.map +1 -1
  77. package/dist/cli/helpers/app-tsx-wiring.js +44 -0
  78. package/dist/cli/helpers/app-tsx-wiring.js.map +1 -1
  79. package/dist/cli/index.d.ts.map +1 -1
  80. package/dist/cli/index.js +6 -0
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/cli/lib/credentials.d.ts +27 -0
  83. package/dist/cli/lib/credentials.d.ts.map +1 -0
  84. package/dist/cli/lib/credentials.js +112 -0
  85. package/dist/cli/lib/credentials.js.map +1 -0
  86. package/dist/cli/templates/auth-wiring.d.ts +17 -0
  87. package/dist/cli/templates/auth-wiring.d.ts.map +1 -0
  88. package/dist/cli/templates/auth-wiring.js +31 -0
  89. package/dist/cli/templates/auth-wiring.js.map +1 -0
  90. package/dist/cli/templates/index.d.ts +2 -0
  91. package/dist/cli/templates/index.d.ts.map +1 -1
  92. package/dist/cli/templates/index.js +2 -0
  93. package/dist/cli/templates/index.js.map +1 -1
  94. package/dist/cli/templates/login-page.d.ts +5 -0
  95. package/dist/cli/templates/login-page.d.ts.map +1 -0
  96. package/dist/cli/templates/login-page.js +13 -0
  97. package/dist/cli/templates/login-page.js.map +1 -0
  98. package/dist/cli/templates/loom-config.d.ts.map +1 -1
  99. package/dist/cli/templates/loom-config.js +13 -0
  100. package/dist/cli/templates/loom-config.js.map +1 -1
  101. package/dist/cli/templates/model-management-page.d.ts.map +1 -1
  102. package/dist/cli/templates/model-management-page.js +6 -5
  103. package/dist/cli/templates/model-management-page.js.map +1 -1
  104. package/dist/cli/templates/user-management-page.d.ts +9 -0
  105. package/dist/cli/templates/user-management-page.d.ts.map +1 -0
  106. package/dist/cli/templates/user-management-page.js +236 -0
  107. package/dist/cli/templates/user-management-page.js.map +1 -0
  108. package/dist/config.d.ts +249 -1
  109. package/dist/config.d.ts.map +1 -1
  110. package/dist/config.js +28 -1
  111. package/dist/config.js.map +1 -1
  112. package/dist/index.d.ts +1 -1
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/types/ai.d.ts +2 -0
  116. package/dist/types/ai.d.ts.map +1 -1
  117. package/dist/types/auth.d.ts +64 -0
  118. package/dist/types/auth.d.ts.map +1 -0
  119. package/dist/types/auth.js +5 -0
  120. package/dist/types/auth.js.map +1 -0
  121. package/dist/types/config.d.ts +2 -0
  122. package/dist/types/config.d.ts.map +1 -1
  123. package/dist/types/index.d.ts +1 -0
  124. package/dist/types/index.d.ts.map +1 -1
  125. package/package.json +5 -1
@@ -0,0 +1,203 @@
1
+ /**
2
+ * loom auth - Authentication commands
3
+ *
4
+ * loom auth login - Login and print access token
5
+ * loom auth register - Register a new user (admin only)
6
+ * loom auth logout - Logout (revoke refresh token on server)
7
+ * loom auth whoami - Show current user info
8
+ */
9
+ import chalk from 'chalk';
10
+ /** Resolve token from --token flag, LOOM_TOKEN env, or credential file fallback */
11
+ function resolveToken(tokenFlag) {
12
+ if (tokenFlag)
13
+ return tokenFlag;
14
+ const envToken = process.env.LOOM_TOKEN;
15
+ if (envToken)
16
+ return envToken;
17
+ return null;
18
+ }
19
+ export function registerAuthCommand(program) {
20
+ const auth = program
21
+ .command('auth')
22
+ .description('Authentication operations');
23
+ // loom auth login
24
+ auth
25
+ .command('login')
26
+ .description('Login and print access token')
27
+ .option('-u, --username <username>', 'Username')
28
+ .option('-p, --password <password>', 'Password')
29
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
30
+ .action(async (options) => {
31
+ try {
32
+ const username = options.username || await promptInput('Username: ');
33
+ const password = options.password || await promptInput('Password: ', true);
34
+ const response = await fetch(`${options.server}/api/v1/auth/login`, {
35
+ method: 'POST',
36
+ headers: { 'Content-Type': 'application/json' },
37
+ body: JSON.stringify({ username, password }),
38
+ });
39
+ if (!response.ok) {
40
+ const data = await response.json();
41
+ console.error(chalk.red('Login failed:'), data.error || response.statusText);
42
+ process.exit(1);
43
+ }
44
+ const data = await response.json();
45
+ console.log(chalk.green(`Logged in as ${data.user.username} (role: ${data.user.role})`));
46
+ console.log();
47
+ console.log(chalk.bold('Access token:'));
48
+ console.log(chalk.cyan(data.accessToken));
49
+ console.log();
50
+ console.log(chalk.dim('Use this token in other commands:'));
51
+ console.log(chalk.dim(` loom data read <model> --token ${data.accessToken}`));
52
+ console.log(chalk.dim('Or set environment variable:'));
53
+ console.log(chalk.dim(` export LOOM_TOKEN=${data.accessToken}`));
54
+ }
55
+ catch (err) {
56
+ const message = err instanceof Error ? err.message : String(err);
57
+ console.error(chalk.red('Login failed:'), message);
58
+ process.exit(1);
59
+ }
60
+ });
61
+ // loom auth register
62
+ auth
63
+ .command('register')
64
+ .description('Register a new user (admin only)')
65
+ .option('-u, --username <username>', 'Username')
66
+ .option('-p, --password <password>', 'Password')
67
+ .option('-r, --role <role>', 'Role')
68
+ .option('--token <token>', 'Auth token (admin)')
69
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
70
+ .action(async (options) => {
71
+ try {
72
+ const username = options.username || await promptInput('Username: ');
73
+ const password = options.password || await promptInput('Password: ', true);
74
+ const headers = { 'Content-Type': 'application/json' };
75
+ // Resolve token for admin auth
76
+ const token = resolveToken(options.token);
77
+ if (token)
78
+ headers.Authorization = `Bearer ${token}`;
79
+ const response = await fetch(`${options.server}/api/v1/auth/register`, {
80
+ method: 'POST',
81
+ headers,
82
+ body: JSON.stringify({ username, password, role: options.role }),
83
+ });
84
+ if (!response.ok) {
85
+ const data = await response.json();
86
+ console.error(chalk.red('Registration failed:'), data.error || response.statusText);
87
+ process.exit(1);
88
+ }
89
+ const data = await response.json();
90
+ console.log(chalk.green(`User created: ${data.user.username} (role: ${data.user.role})`));
91
+ if (data.serviceToken) {
92
+ console.log();
93
+ console.log(chalk.bold('Service token (for Process automation):'));
94
+ console.log(chalk.cyan(data.serviceToken));
95
+ console.log(chalk.dim('Store this token securely — it will not be shown again.'));
96
+ }
97
+ }
98
+ catch (err) {
99
+ const message = err instanceof Error ? err.message : String(err);
100
+ console.error(chalk.red('Registration failed:'), message);
101
+ process.exit(1);
102
+ }
103
+ });
104
+ // loom auth logout
105
+ auth
106
+ .command('logout')
107
+ .description('Logout (revoke refresh token on server)')
108
+ .requiredOption('--refresh-token <token>', 'Refresh token to revoke')
109
+ .option('--token <token>', 'Auth token')
110
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
111
+ .action(async (options) => {
112
+ try {
113
+ const headers = { 'Content-Type': 'application/json' };
114
+ const token = resolveToken(options.token);
115
+ if (token)
116
+ headers.Authorization = `Bearer ${token}`;
117
+ const response = await fetch(`${options.server}/api/v1/auth/logout`, {
118
+ method: 'POST',
119
+ headers,
120
+ body: JSON.stringify({ refreshToken: options.refreshToken }),
121
+ });
122
+ if (!response.ok) {
123
+ const data = await response.json();
124
+ console.error(chalk.red('Logout failed:'), data.error || response.statusText);
125
+ process.exit(1);
126
+ }
127
+ console.log(chalk.green('Logged out'));
128
+ }
129
+ catch (err) {
130
+ const message = err instanceof Error ? err.message : String(err);
131
+ console.error(chalk.red('Logout failed:'), message);
132
+ process.exit(1);
133
+ }
134
+ });
135
+ // loom auth whoami
136
+ auth
137
+ .command('whoami')
138
+ .description('Show current user info')
139
+ .option('--token <token>', 'Auth token')
140
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
141
+ .action(async (options) => {
142
+ try {
143
+ const token = resolveToken(options.token);
144
+ if (!token) {
145
+ console.error(chalk.red('Auth required. Provide --token or set LOOM_TOKEN.'));
146
+ process.exit(1);
147
+ }
148
+ const response = await fetch(`${options.server}/api/v1/auth/whoami`, {
149
+ headers: { Authorization: `Bearer ${token}` },
150
+ });
151
+ if (!response.ok) {
152
+ const data = await response.json();
153
+ console.error(chalk.red('Whoami failed:'), data.error || response.statusText);
154
+ process.exit(1);
155
+ }
156
+ const data = await response.json();
157
+ console.log(chalk.bold(`User: ${data.user.username}`));
158
+ console.log(` ID: ${data.user.userId}`);
159
+ console.log(` Role: ${data.user.role}`);
160
+ }
161
+ catch (err) {
162
+ const message = err instanceof Error ? err.message : String(err);
163
+ console.error(chalk.red('Whoami failed:'), message);
164
+ process.exit(1);
165
+ }
166
+ });
167
+ }
168
+ async function promptInput(prompt, hidden = false) {
169
+ const { createInterface } = await import('readline');
170
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
171
+ return new Promise((resolve) => {
172
+ if (hidden) {
173
+ const stdin = process.stdin;
174
+ const onData = (char) => {
175
+ const str = char.toString();
176
+ if (str === '\n' || str === '\r') {
177
+ stdin.removeListener('data', onData);
178
+ }
179
+ else if (str === '\u0003') {
180
+ process.exit();
181
+ }
182
+ else {
183
+ process.stdout.clearLine(0);
184
+ process.stdout.cursorTo(0);
185
+ process.stdout.write(prompt);
186
+ }
187
+ };
188
+ rl.question(prompt, (answer) => {
189
+ process.stdout.write('\n');
190
+ rl.close();
191
+ resolve(answer);
192
+ });
193
+ stdin.on('data', onData);
194
+ }
195
+ else {
196
+ rl.question(prompt, (answer) => {
197
+ rl.close();
198
+ resolve(answer);
199
+ });
200
+ }
201
+ });
202
+ }
203
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,15 @@
1
1
  /**
2
- * loom data - Data operations via DataAdapter
2
+ * loom data - Data operations via DataAdapter or HTTP API
3
3
  *
4
4
  * loom data read <model> [--filter] [--id]
5
5
  * loom data write <model> --data <json>
6
6
  * loom data update <model> --id <id> --data <json>
7
7
  * loom data delete <model> --id <id>
8
8
  * loom data schema [model]
9
+ *
10
+ * When auth is configured, routes through HTTP API for server-side RBAC.
11
+ * Token is passed via --token or LOOM_TOKEN environment variable.
12
+ * When auth is not configured, uses local DataAdapter directly (backward compatible).
9
13
  */
10
14
  import type { Command } from 'commander';
11
15
  export declare function registerDataCommand(program: Command): void;
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8H1D"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiM1D"}
@@ -1,11 +1,15 @@
1
1
  /**
2
- * loom data - Data operations via DataAdapter
2
+ * loom data - Data operations via DataAdapter or HTTP API
3
3
  *
4
4
  * loom data read <model> [--filter] [--id]
5
5
  * loom data write <model> --data <json>
6
6
  * loom data update <model> --id <id> --data <json>
7
7
  * loom data delete <model> --id <id>
8
8
  * loom data schema [model]
9
+ *
10
+ * When auth is configured, routes through HTTP API for server-side RBAC.
11
+ * Token is passed via --token or LOOM_TOKEN environment variable.
12
+ * When auth is not configured, uses local DataAdapter directly (backward compatible).
9
13
  */
10
14
  import chalk from 'chalk';
11
15
  import { loadConfig } from '../../config.js';
@@ -16,7 +20,7 @@ import path from 'path';
16
20
  export function registerDataCommand(program) {
17
21
  const data = program
18
22
  .command('data')
19
- .description('Data operations via DataAdapter');
23
+ .description('Data operations via DataAdapter or HTTP API');
20
24
  // loom data read <model>
21
25
  data
22
26
  .command('read <model>')
@@ -24,18 +28,32 @@ export function registerDataCommand(program) {
24
28
  .option('--id <id>', 'Record ID for single lookup')
25
29
  .option('--filter <json>', 'Filter conditions as JSON string')
26
30
  .option('--limit <number>', 'Max records to return', parseInt)
31
+ .option('--token <token>', 'Auth token (required when auth is enabled)')
32
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
27
33
  .action(async (model, options) => {
28
34
  try {
29
- const { projectRoot, adapter } = await createContext();
30
- const readOptions = {};
31
- if (options.id)
32
- readOptions.id = options.id;
33
- if (options.filter)
34
- readOptions.filter = JSON.parse(options.filter);
35
- if (options.limit)
36
- readOptions.limit = options.limit;
37
- const result = await adapter.read(model, readOptions);
38
- console.log(JSON.stringify(result, null, 2));
35
+ const { projectRoot, config } = await loadContext();
36
+ if (config.auth) {
37
+ const token = resolveToken(options.token);
38
+ if (!token) {
39
+ console.error(chalk.red('Auth required. Provide --token or set LOOM_TOKEN.'));
40
+ process.exit(1);
41
+ }
42
+ const result = await apiRead(options.server, model, token, options);
43
+ console.log(JSON.stringify(result, null, 2));
44
+ }
45
+ else {
46
+ const adapter = await createAdapter(config, projectRoot);
47
+ const readOptions = {};
48
+ if (options.id)
49
+ readOptions.id = options.id;
50
+ if (options.filter)
51
+ readOptions.filter = JSON.parse(options.filter);
52
+ if (options.limit)
53
+ readOptions.limit = options.limit;
54
+ const result = await adapter.read(model, readOptions);
55
+ console.log(JSON.stringify(result, null, 2));
56
+ }
39
57
  }
40
58
  catch (err) {
41
59
  const message = err instanceof Error ? err.message : String(err);
@@ -48,13 +66,28 @@ export function registerDataCommand(program) {
48
66
  .command('write <model>')
49
67
  .description('Write a new data record')
50
68
  .requiredOption('--data <json>', 'Record data as JSON string')
69
+ .option('--token <token>', 'Auth token (required when auth is enabled)')
70
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
51
71
  .action(async (model, options) => {
52
72
  try {
53
- const { adapter } = await createContext();
54
- const record = JSON.parse(options.data);
55
- const result = await adapter.write(model, record);
56
- console.log(chalk.green('Record written:'));
57
- console.log(JSON.stringify(result, null, 2));
73
+ const { projectRoot, config } = await loadContext();
74
+ if (config.auth) {
75
+ const token = resolveToken(options.token);
76
+ if (!token) {
77
+ console.error(chalk.red('Auth required. Provide --token or set LOOM_TOKEN.'));
78
+ process.exit(1);
79
+ }
80
+ const result = await apiWrite(options.server, model, token, JSON.parse(options.data));
81
+ console.log(chalk.green('Record written:'));
82
+ console.log(JSON.stringify(result, null, 2));
83
+ }
84
+ else {
85
+ const adapter = await createAdapter(config, projectRoot);
86
+ const record = JSON.parse(options.data);
87
+ const result = await adapter.write(model, record);
88
+ console.log(chalk.green('Record written:'));
89
+ console.log(JSON.stringify(result, null, 2));
90
+ }
58
91
  }
59
92
  catch (err) {
60
93
  const message = err instanceof Error ? err.message : String(err);
@@ -68,13 +101,28 @@ export function registerDataCommand(program) {
68
101
  .description('Update an existing data record')
69
102
  .requiredOption('--id <id>', 'Record ID to update')
70
103
  .requiredOption('--data <json>', 'Fields to update as JSON string')
104
+ .option('--token <token>', 'Auth token (required when auth is enabled)')
105
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
71
106
  .action(async (model, options) => {
72
107
  try {
73
- const { adapter } = await createContext();
74
- const updates = JSON.parse(options.data);
75
- const result = await adapter.update(model, options.id, updates);
76
- console.log(chalk.green('Record updated:'));
77
- console.log(JSON.stringify(result, null, 2));
108
+ const { projectRoot, config } = await loadContext();
109
+ if (config.auth) {
110
+ const token = resolveToken(options.token);
111
+ if (!token) {
112
+ console.error(chalk.red('Auth required. Provide --token or set LOOM_TOKEN.'));
113
+ process.exit(1);
114
+ }
115
+ const result = await apiUpdate(options.server, model, options.id, token, JSON.parse(options.data));
116
+ console.log(chalk.green('Record updated:'));
117
+ console.log(JSON.stringify(result, null, 2));
118
+ }
119
+ else {
120
+ const adapter = await createAdapter(config, projectRoot);
121
+ const updates = JSON.parse(options.data);
122
+ const result = await adapter.update(model, options.id, updates);
123
+ console.log(chalk.green('Record updated:'));
124
+ console.log(JSON.stringify(result, null, 2));
125
+ }
78
126
  }
79
127
  catch (err) {
80
128
  const message = err instanceof Error ? err.message : String(err);
@@ -87,11 +135,25 @@ export function registerDataCommand(program) {
87
135
  .command('delete <model>')
88
136
  .description('Delete a data record by ID')
89
137
  .requiredOption('--id <id>', 'Record ID to delete')
138
+ .option('--token <token>', 'Auth token (required when auth is enabled)')
139
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
90
140
  .action(async (model, options) => {
91
141
  try {
92
- const { adapter } = await createContext();
93
- await adapter.delete(model, options.id);
94
- console.log(chalk.green(`Record deleted: ${model}/${options.id}`));
142
+ const { projectRoot, config } = await loadContext();
143
+ if (config.auth) {
144
+ const token = resolveToken(options.token);
145
+ if (!token) {
146
+ console.error(chalk.red('Auth required. Provide --token or set LOOM_TOKEN.'));
147
+ process.exit(1);
148
+ }
149
+ await apiDelete(options.server, model, options.id, token);
150
+ console.log(chalk.green(`Record deleted: ${model}/${options.id}`));
151
+ }
152
+ else {
153
+ const adapter = await createAdapter(config, projectRoot);
154
+ await adapter.delete(model, options.id);
155
+ console.log(chalk.green(`Record deleted: ${model}/${options.id}`));
156
+ }
95
157
  }
96
158
  catch (err) {
97
159
  const message = err instanceof Error ? err.message : String(err);
@@ -103,21 +165,35 @@ export function registerDataCommand(program) {
103
165
  data
104
166
  .command('schema [model]')
105
167
  .description('View model schema definitions')
106
- .action(async (modelName) => {
168
+ .option('--token <token>', 'Auth token (required when auth is enabled)')
169
+ .option('--server <url>', 'Server URL', 'http://localhost:3000')
170
+ .action(async (modelName, options) => {
107
171
  try {
108
- const { config, adapter } = await createContext();
172
+ const { projectRoot, config } = await loadContext();
109
173
  if (modelName) {
110
- const schema = await adapter.getSchema(modelName);
111
- if (!schema) {
112
- console.error(chalk.red(`Model not found: ${modelName}`));
113
- const models = await adapter.listModels();
114
- console.log(chalk.dim('Available models:'), models.join(', '));
115
- process.exit(1);
174
+ if (config.auth) {
175
+ const token = resolveToken(options?.token);
176
+ if (!token) {
177
+ console.error(chalk.red('Auth required. Provide --token or set LOOM_TOKEN.'));
178
+ process.exit(1);
179
+ }
180
+ const schema = await apiSchema(options.server, modelName, token);
181
+ console.log(JSON.stringify(schema, null, 2));
182
+ }
183
+ else {
184
+ const adapter = await createAdapter(config, projectRoot);
185
+ const schema = await adapter.getSchema(modelName);
186
+ if (!schema) {
187
+ console.error(chalk.red(`Model not found: ${modelName}`));
188
+ const models = await adapter.listModels();
189
+ console.log(chalk.dim('Available models:'), models.join(', '));
190
+ process.exit(1);
191
+ }
192
+ console.log(JSON.stringify(schema, null, 2));
116
193
  }
117
- console.log(JSON.stringify(schema, null, 2));
118
194
  }
119
195
  else {
120
- // List all models
196
+ // List all models (no auth needed — this is config info)
121
197
  const models = config.data.models;
122
198
  console.log(chalk.bold(`Models (${models.length}):`));
123
199
  console.log();
@@ -135,12 +211,13 @@ export function registerDataCommand(program) {
135
211
  }
136
212
  });
137
213
  }
138
- /**
139
- * Create DataAdapter context from config
140
- */
141
- async function createContext() {
214
+ // ── Context helpers ──
215
+ async function loadContext() {
142
216
  const projectRoot = await resolveProjectRoot();
143
217
  const config = await loadConfig(projectRoot);
218
+ return { projectRoot, config };
219
+ }
220
+ async function createAdapter(config, projectRoot) {
144
221
  let adapter;
145
222
  if (config.data.defaultAdapter === 'sqlite') {
146
223
  adapter = new SQLiteAdapter({
@@ -155,6 +232,71 @@ async function createContext() {
155
232
  });
156
233
  }
157
234
  await adapter.initialize();
158
- return { projectRoot, config, adapter };
235
+ return adapter;
236
+ }
237
+ /** Resolve token from --token flag or LOOM_TOKEN env */
238
+ function resolveToken(tokenFlag) {
239
+ if (tokenFlag)
240
+ return tokenFlag;
241
+ const envToken = process.env.LOOM_TOKEN;
242
+ if (envToken)
243
+ return envToken;
244
+ return null;
245
+ }
246
+ // ── HTTP API helpers ──
247
+ async function apiRequest(url, token, options) {
248
+ const response = await fetch(url, {
249
+ ...options,
250
+ headers: {
251
+ 'Content-Type': 'application/json',
252
+ Authorization: `Bearer ${token}`,
253
+ ...options?.headers,
254
+ },
255
+ });
256
+ if (response.status === 401)
257
+ throw new Error('Authentication failed. Token may be expired.');
258
+ if (response.status === 403) {
259
+ const data = await response.json();
260
+ throw new Error(`Permission denied: ${data.error || 'Insufficient permissions'}${data.required ? ` (required: ${data.required}, actual: ${data.actual})` : ''}`);
261
+ }
262
+ if (!response.ok) {
263
+ const data = await response.json();
264
+ throw new Error(data.error || response.statusText);
265
+ }
266
+ return response;
267
+ }
268
+ async function apiRead(server, model, token, options) {
269
+ const params = new URLSearchParams();
270
+ if (options.filter)
271
+ params.set('filter', options.filter);
272
+ if (options.limit)
273
+ params.set('limit', String(options.limit));
274
+ const qs = params.toString() ? `?${params.toString()}` : '';
275
+ const url = options.id
276
+ ? `${server}/api/v1/data/${model}/${options.id}`
277
+ : `${server}/api/v1/data/${model}${qs}`;
278
+ const res = await apiRequest(url, token);
279
+ return res.json();
280
+ }
281
+ async function apiWrite(server, model, token, data) {
282
+ const res = await apiRequest(`${server}/api/v1/data/${model}`, token, {
283
+ method: 'POST',
284
+ body: JSON.stringify(data),
285
+ });
286
+ return res.json();
287
+ }
288
+ async function apiUpdate(server, model, id, token, data) {
289
+ const res = await apiRequest(`${server}/api/v1/data/${model}/${id}`, token, {
290
+ method: 'PUT',
291
+ body: JSON.stringify(data),
292
+ });
293
+ return res.json();
294
+ }
295
+ async function apiDelete(server, model, id, token) {
296
+ await apiRequest(`${server}/api/v1/data/${model}/${id}`, token, { method: 'DELETE' });
297
+ }
298
+ async function apiSchema(server, model, token) {
299
+ const res = await apiRequest(`${server}/api/v1/data/${model}/schema`, token);
300
+ return res.json();
159
301
  }
160
302
  //# sourceMappingURL=data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/cli/commands/data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/cli/commands/data.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * loom generate system-settings <model|skill>
2
+ * loom generate system-settings <model|skill|user>
3
3
  *
4
- * Generate system management pages (ModelManagement, SkillManagement) as local source files.
4
+ * Generate system management pages (ModelManagement, SkillManagement, UserManagement) as local source files.
5
5
  * Each page is generated individually; the first one creates the system-settings submenu in App.tsx.
6
6
  */
7
7
  import type { Command } from 'commander';
@@ -1 +1 @@
1
- {"version":3,"file":"generate-system-settings.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate-system-settings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqCzC,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D5E"}
1
+ {"version":3,"file":"generate-system-settings.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate-system-settings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CzC,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D5E"}
@@ -1,14 +1,14 @@
1
1
  /**
2
- * loom generate system-settings <model|skill>
2
+ * loom generate system-settings <model|skill|user>
3
3
  *
4
- * Generate system management pages (ModelManagement, SkillManagement) as local source files.
4
+ * Generate system management pages (ModelManagement, SkillManagement, UserManagement) as local source files.
5
5
  * Each page is generated individually; the first one creates the system-settings submenu in App.tsx.
6
6
  */
7
7
  import chalk from 'chalk';
8
8
  import { promises as fs } from 'fs';
9
9
  import path from 'path';
10
10
  import { resolveProjectRoot } from '../utils.js';
11
- import { modelManagementPageTemplate, skillManagementPageTemplate } from '../templates/index.js';
11
+ import { modelManagementPageTemplate, skillManagementPageTemplate, userManagementPageTemplate } from '../templates/index.js';
12
12
  import { wireAppTsxForSystemSettings } from '../helpers/app-tsx-wiring.js';
13
13
  import { backupFile } from '../helpers/backup.js';
14
14
  const PAGE_CONFIG = {
@@ -28,15 +28,23 @@ const PAGE_CONFIG = {
28
28
  navLabelEn: 'Skill Management',
29
29
  template: skillManagementPageTemplate,
30
30
  },
31
+ user: {
32
+ pascalName: 'UserManagement',
33
+ fileName: 'UserManagement.tsx',
34
+ navKey: 'user-management',
35
+ navLabelZh: '用户管理',
36
+ navLabelEn: 'User Management',
37
+ template: userManagementPageTemplate,
38
+ },
31
39
  };
32
40
  export function registerGenerateSystemSettingsCommand(program) {
33
41
  program
34
42
  .command('system-settings <type>')
35
- .description('Generate a system management page (model|skill)')
43
+ .description('Generate a system management page (model|skill|user)')
36
44
  .option('--force', 'Overwrite existing page file')
37
45
  .action(async (type, cmdOptions) => {
38
- if (type !== 'model' && type !== 'skill') {
39
- console.error(chalk.red(`Invalid type "${type}". Use "model" or "skill".`));
46
+ if (type !== 'model' && type !== 'skill' && type !== 'user') {
47
+ console.error(chalk.red(`Invalid type "${type}". Use "model", "skill", or "user".`));
40
48
  process.exit(1);
41
49
  }
42
50
  const pageType = type;