@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.
- package/builtin-skills/app-skill/SKILL.md +12 -7
- package/builtin-skills/app-skill/references/auth.md +164 -0
- package/builtin-skills/app-skill/references/models.md +2 -0
- package/builtin-skills/loom/SKILL.md +35 -3
- package/dist/backend/ai/engine.d.ts.map +1 -1
- package/dist/backend/ai/engine.js +1 -0
- package/dist/backend/ai/engine.js.map +1 -1
- package/dist/backend/auth/jwt.d.ts +16 -0
- package/dist/backend/auth/jwt.d.ts.map +1 -0
- package/dist/backend/auth/jwt.js +57 -0
- package/dist/backend/auth/jwt.js.map +1 -0
- package/dist/backend/auth/password.d.ts +10 -0
- package/dist/backend/auth/password.d.ts.map +1 -0
- package/dist/backend/auth/password.js +19 -0
- package/dist/backend/auth/password.js.map +1 -0
- package/dist/backend/auth/rbac.d.ts +34 -0
- package/dist/backend/auth/rbac.d.ts.map +1 -0
- package/dist/backend/auth/rbac.js +124 -0
- package/dist/backend/auth/rbac.js.map +1 -0
- package/dist/backend/auth/service-token.d.ts +11 -0
- package/dist/backend/auth/service-token.d.ts.map +1 -0
- package/dist/backend/auth/service-token.js +13 -0
- package/dist/backend/auth/service-token.js.map +1 -0
- package/dist/backend/auth/token-store.d.ts +27 -0
- package/dist/backend/auth/token-store.d.ts.map +1 -0
- package/dist/backend/auth/token-store.js +84 -0
- package/dist/backend/auth/token-store.js.map +1 -0
- package/dist/backend/auth/user-store.d.ts +41 -0
- package/dist/backend/auth/user-store.d.ts.map +1 -0
- package/dist/backend/auth/user-store.js +112 -0
- package/dist/backend/auth/user-store.js.map +1 -0
- package/dist/backend/index.d.ts +8 -0
- package/dist/backend/index.d.ts.map +1 -1
- package/dist/backend/index.js +48 -2
- package/dist/backend/index.js.map +1 -1
- package/dist/backend/routes/auth-routes.d.ts +26 -0
- package/dist/backend/routes/auth-routes.d.ts.map +1 -0
- package/dist/backend/routes/auth-routes.js +301 -0
- package/dist/backend/routes/auth-routes.js.map +1 -0
- package/dist/backend/routes/chat.d.ts.map +1 -1
- package/dist/backend/routes/chat.js +1 -0
- package/dist/backend/routes/chat.js.map +1 -1
- package/dist/backend/routes/data.d.ts.map +1 -1
- package/dist/backend/routes/data.js +8 -0
- package/dist/backend/routes/data.js.map +1 -1
- package/dist/backend/routes/index.d.ts +2 -0
- package/dist/backend/routes/index.d.ts.map +1 -1
- package/dist/backend/routes/index.js +1 -0
- package/dist/backend/routes/index.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +11 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +203 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/data.d.ts +5 -1
- package/dist/cli/commands/data.d.ts.map +1 -1
- package/dist/cli/commands/data.js +182 -40
- package/dist/cli/commands/data.js.map +1 -1
- package/dist/cli/commands/generate-system-settings.d.ts +2 -2
- package/dist/cli/commands/generate-system-settings.d.ts.map +1 -1
- package/dist/cli/commands/generate-system-settings.js +14 -6
- package/dist/cli/commands/generate-system-settings.js.map +1 -1
- package/dist/cli/commands/init.js +26 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/role.d.ts +9 -0
- package/dist/cli/commands/role.d.ts.map +1 -0
- package/dist/cli/commands/role.js +81 -0
- package/dist/cli/commands/role.js.map +1 -0
- package/dist/cli/commands/user-cmd.d.ts +9 -0
- package/dist/cli/commands/user-cmd.d.ts.map +1 -0
- package/dist/cli/commands/user-cmd.js +204 -0
- package/dist/cli/commands/user-cmd.js.map +1 -0
- package/dist/cli/generators/capability-generator.d.ts.map +1 -1
- package/dist/cli/generators/capability-generator.js +67 -6
- package/dist/cli/generators/capability-generator.js.map +1 -1
- package/dist/cli/helpers/app-tsx-wiring.d.ts +7 -0
- package/dist/cli/helpers/app-tsx-wiring.d.ts.map +1 -1
- package/dist/cli/helpers/app-tsx-wiring.js +44 -0
- package/dist/cli/helpers/app-tsx-wiring.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/credentials.d.ts +27 -0
- package/dist/cli/lib/credentials.d.ts.map +1 -0
- package/dist/cli/lib/credentials.js +112 -0
- package/dist/cli/lib/credentials.js.map +1 -0
- package/dist/cli/templates/auth-wiring.d.ts +17 -0
- package/dist/cli/templates/auth-wiring.d.ts.map +1 -0
- package/dist/cli/templates/auth-wiring.js +31 -0
- package/dist/cli/templates/auth-wiring.js.map +1 -0
- package/dist/cli/templates/index.d.ts +2 -0
- package/dist/cli/templates/index.d.ts.map +1 -1
- package/dist/cli/templates/index.js +2 -0
- package/dist/cli/templates/index.js.map +1 -1
- package/dist/cli/templates/login-page.d.ts +5 -0
- package/dist/cli/templates/login-page.d.ts.map +1 -0
- package/dist/cli/templates/login-page.js +13 -0
- package/dist/cli/templates/login-page.js.map +1 -0
- package/dist/cli/templates/loom-config.d.ts.map +1 -1
- package/dist/cli/templates/loom-config.js +13 -0
- package/dist/cli/templates/loom-config.js.map +1 -1
- package/dist/cli/templates/model-management-page.d.ts.map +1 -1
- package/dist/cli/templates/model-management-page.js +6 -5
- package/dist/cli/templates/model-management-page.js.map +1 -1
- package/dist/cli/templates/user-management-page.d.ts +9 -0
- package/dist/cli/templates/user-management-page.d.ts.map +1 -0
- package/dist/cli/templates/user-management-page.js +236 -0
- package/dist/cli/templates/user-management-page.js.map +1 -0
- package/dist/config.d.ts +249 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +28 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/ai.d.ts +2 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/auth.d.ts +64 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +5 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- 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
|
|
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,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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 {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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 {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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 {
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
.
|
|
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 {
|
|
172
|
+
const { projectRoot, config } = await loadContext();
|
|
109
173
|
if (modelName) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
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
|
|
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;
|
|
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 "
|
|
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;
|