@loom-framework/core 0.1.0-alpha.156 → 0.1.0-alpha.158
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/references/process-builder.md +16 -1
- package/dist/cli/commands/eject.d.ts +12 -0
- package/dist/cli/commands/eject.d.ts.map +1 -0
- package/dist/cli/commands/eject.js +451 -0
- package/dist/cli/commands/eject.js.map +1 -0
- package/dist/cli/commands/generate-system-settings.d.ts +4 -4
- package/dist/cli/commands/generate-system-settings.d.ts.map +1 -1
- package/dist/cli/commands/generate-system-settings.js +147 -59
- package/dist/cli/commands/generate-system-settings.js.map +1 -1
- package/dist/cli/commands/init.js +30 -22
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/process.d.ts.map +1 -1
- package/dist/cli/commands/process.js +8 -2
- package/dist/cli/commands/process.js.map +1 -1
- package/dist/cli/helpers/app-tsx-wiring.d.ts +8 -0
- package/dist/cli/helpers/app-tsx-wiring.d.ts.map +1 -1
- package/dist/cli/helpers/app-tsx-wiring.js +164 -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 +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/templates/index.d.ts +3 -1
- package/dist/cli/templates/index.d.ts.map +1 -1
- package/dist/cli/templates/index.js +3 -1
- package/dist/cli/templates/index.js.map +1 -1
- package/dist/cli/templates/login-page.d.ts +4 -0
- package/dist/cli/templates/login-page.d.ts.map +1 -1
- package/dist/cli/templates/login-page.js +65 -3
- package/dist/cli/templates/login-page.js.map +1 -1
- package/dist/cli/templates/notification-center-page.d.ts +9 -0
- package/dist/cli/templates/notification-center-page.d.ts.map +1 -0
- package/dist/cli/templates/notification-center-page.js +258 -0
- package/dist/cli/templates/notification-center-page.js.map +1 -0
- package/dist/cli/templates/notification-detail-page.d.ts +9 -0
- package/dist/cli/templates/notification-detail-page.d.ts.map +1 -0
- package/dist/cli/templates/notification-detail-page.js +102 -0
- package/dist/cli/templates/notification-detail-page.js.map +1 -0
- package/package.json +1 -1
|
@@ -56,7 +56,15 @@ loom process generate weekly-report --description "Weekly analytics report"
|
|
|
56
56
|
# (AI should write the PROCESS.md content)
|
|
57
57
|
|
|
58
58
|
# Step 3: Add reference files if needed
|
|
59
|
-
#
|
|
59
|
+
# If this process requires additional context, create the references directory
|
|
60
|
+
# and add files that the AI agent will need during execution:
|
|
61
|
+
mkdir -p .claude/processes/weekly-report/references
|
|
62
|
+
# Then add reference files such as:
|
|
63
|
+
# - Skill references (CLI command usage, API docs)
|
|
64
|
+
# - Domain knowledge (data schemas, business rules)
|
|
65
|
+
# - Scripts or tools (data transforms, query templates)
|
|
66
|
+
# Only create the directory when reference files are actually needed.
|
|
67
|
+
# Skip this step if no additional context is required.
|
|
60
68
|
|
|
61
69
|
# Step 4: Register the process
|
|
62
70
|
loom process add --name "weekly-report" \
|
|
@@ -113,6 +121,13 @@ How success is measured:
|
|
|
113
121
|
How this process should improve:
|
|
114
122
|
- After N runs, review and optimize prompt
|
|
115
123
|
- Track common errors and add handling
|
|
124
|
+
|
|
125
|
+
## References
|
|
126
|
+
_List files in the `references/` directory that support this process:_
|
|
127
|
+
- _Skill references (e.g., CLI command usage, API docs)_
|
|
128
|
+
- _Domain knowledge (e.g., data schemas, business rules)_
|
|
129
|
+
- _Scripts or tools (e.g., data transforms, query templates)_
|
|
130
|
+
_Only create the `references/` directory and add files when needed._
|
|
116
131
|
```
|
|
117
132
|
|
|
118
133
|
### Tips
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loom eject system-settings <type>
|
|
3
|
+
* loom uneject system-settings <type>
|
|
4
|
+
*
|
|
5
|
+
* Eject: npm import -> local file (for customization)
|
|
6
|
+
* Uneject: local file -> npm import (revert customization)
|
|
7
|
+
*
|
|
8
|
+
* Supported types: model, skill, user, login, process, notification
|
|
9
|
+
*/
|
|
10
|
+
import type { Command } from 'commander';
|
|
11
|
+
export declare function registerEjectCommand(program: Command): void;
|
|
12
|
+
//# sourceMappingURL=eject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eject.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/eject.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwYzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0I3D"}
|
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loom eject system-settings <type>
|
|
3
|
+
* loom uneject system-settings <type>
|
|
4
|
+
*
|
|
5
|
+
* Eject: npm import -> local file (for customization)
|
|
6
|
+
* Uneject: local file -> npm import (revert customization)
|
|
7
|
+
*
|
|
8
|
+
* Supported types: model, skill, user, login, process, notification
|
|
9
|
+
*/
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { promises as fs } from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import crypto from 'crypto';
|
|
14
|
+
import { resolveProjectRoot } from '../utils.js';
|
|
15
|
+
import { modelManagementPageTemplate, skillManagementPageTemplate, userManagementPageTemplate, processManagementPageTemplate, loginPageTemplate, notificationCenterPageTemplate, notificationDetailPageTemplate } from '../templates/index.js';
|
|
16
|
+
import { backupFile } from '../helpers/backup.js';
|
|
17
|
+
const PAGE_CONFIG = {
|
|
18
|
+
model: {
|
|
19
|
+
pascalName: 'ModelManagement',
|
|
20
|
+
fileName: 'ModelManagement.tsx',
|
|
21
|
+
navKey: 'model-management',
|
|
22
|
+
navLabelZh: '模型管理',
|
|
23
|
+
navLabelEn: 'Model Management',
|
|
24
|
+
npmComponent: 'ModelManagementPage',
|
|
25
|
+
template: modelManagementPageTemplate,
|
|
26
|
+
},
|
|
27
|
+
skill: {
|
|
28
|
+
pascalName: 'SkillManagement',
|
|
29
|
+
fileName: 'SkillManagement.tsx',
|
|
30
|
+
navKey: 'skill-management',
|
|
31
|
+
navLabelZh: '技能管理',
|
|
32
|
+
navLabelEn: 'Skill Management',
|
|
33
|
+
npmComponent: 'SkillManagementPage',
|
|
34
|
+
template: skillManagementPageTemplate,
|
|
35
|
+
},
|
|
36
|
+
user: {
|
|
37
|
+
pascalName: 'UserManagement',
|
|
38
|
+
fileName: 'UserManagement.tsx',
|
|
39
|
+
navKey: 'user-management',
|
|
40
|
+
navLabelZh: '用户管理',
|
|
41
|
+
navLabelEn: 'User Management',
|
|
42
|
+
npmComponent: 'UserManagementPage',
|
|
43
|
+
template: userManagementPageTemplate,
|
|
44
|
+
},
|
|
45
|
+
login: {
|
|
46
|
+
pascalName: 'Login',
|
|
47
|
+
fileName: 'Login.tsx',
|
|
48
|
+
// No navKey — Login is rendered by AuthGuard fallback, not in navigation
|
|
49
|
+
npmComponent: 'LoginPage',
|
|
50
|
+
template: loginPageTemplate,
|
|
51
|
+
},
|
|
52
|
+
process: {
|
|
53
|
+
pascalName: 'ProcessManagement',
|
|
54
|
+
fileName: 'ProcessManagement.tsx',
|
|
55
|
+
navKey: 'process-management',
|
|
56
|
+
navLabelZh: '过程管理',
|
|
57
|
+
navLabelEn: 'Process Management',
|
|
58
|
+
npmComponent: 'ProcessManagementPage',
|
|
59
|
+
template: processManagementPageTemplate,
|
|
60
|
+
},
|
|
61
|
+
notification: {
|
|
62
|
+
pascalName: 'NotificationCenter',
|
|
63
|
+
fileName: 'NotificationCenter.tsx',
|
|
64
|
+
navKey: 'notifications',
|
|
65
|
+
navLabelZh: '通知',
|
|
66
|
+
navLabelEn: 'Notifications',
|
|
67
|
+
npmComponent: 'NotificationCenterPage',
|
|
68
|
+
template: notificationCenterPageTemplate,
|
|
69
|
+
extraFiles: [{
|
|
70
|
+
pascalName: 'NotificationDetail',
|
|
71
|
+
fileName: 'NotificationDetail.tsx',
|
|
72
|
+
navKey: 'notification-detail',
|
|
73
|
+
navLabelZh: '通知详情',
|
|
74
|
+
navLabelEn: 'Notification Detail',
|
|
75
|
+
npmComponent: 'NotificationDetailPage',
|
|
76
|
+
template: notificationDetailPageTemplate,
|
|
77
|
+
}],
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
const VALID_TYPES = Object.keys(PAGE_CONFIG);
|
|
81
|
+
function parsePageType(type) {
|
|
82
|
+
if (VALID_TYPES.includes(type))
|
|
83
|
+
return type;
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
function checksum(content) {
|
|
87
|
+
return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
88
|
+
}
|
|
89
|
+
async function saveChecksum(projectRoot, pascalName, content) {
|
|
90
|
+
const checksumDir = path.join(projectRoot, '.loom', 'checksums');
|
|
91
|
+
await fs.mkdir(checksumDir, { recursive: true });
|
|
92
|
+
await fs.writeFile(path.join(checksumDir, `${pascalName}.checksum`), checksum(content), 'utf-8');
|
|
93
|
+
}
|
|
94
|
+
async function readChecksum(projectRoot, pascalName) {
|
|
95
|
+
try {
|
|
96
|
+
return await fs.readFile(path.join(projectRoot, '.loom', 'checksums', `${pascalName}.checksum`), 'utf-8');
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function deleteChecksum(projectRoot, pascalName) {
|
|
103
|
+
try {
|
|
104
|
+
await fs.unlink(path.join(projectRoot, '.loom', 'checksums', `${pascalName}.checksum`));
|
|
105
|
+
}
|
|
106
|
+
catch { /* ignore */ }
|
|
107
|
+
}
|
|
108
|
+
function findLastImportEnd(content) {
|
|
109
|
+
const importRegex = /^import\s.+;?\s*$/gm;
|
|
110
|
+
let lastMatch = null;
|
|
111
|
+
let m;
|
|
112
|
+
while ((m = importRegex.exec(content)) !== null) {
|
|
113
|
+
lastMatch = m;
|
|
114
|
+
}
|
|
115
|
+
if (!lastMatch)
|
|
116
|
+
return null;
|
|
117
|
+
return lastMatch.index + lastMatch[0].length;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Add a name to the npm import from @loom-framework/frontend-antd.
|
|
121
|
+
* If the name already exists in any npm import, no-op.
|
|
122
|
+
* If no npm import exists, creates a new one.
|
|
123
|
+
*/
|
|
124
|
+
function addNpmImportName(content, name) {
|
|
125
|
+
const existingNpmImport = content.match(/import\s*\{([^}]+)\}\s*from\s*'@loom-framework\/frontend-antd';/);
|
|
126
|
+
if (existingNpmImport) {
|
|
127
|
+
const currentNames = existingNpmImport[1].split(',').map(s => s.trim()).filter(Boolean);
|
|
128
|
+
if (currentNames.includes(name))
|
|
129
|
+
return content;
|
|
130
|
+
const newNames = [...currentNames, name].join(', ');
|
|
131
|
+
const newImport = `import { ${newNames} } from '@loom-framework/frontend-antd';`;
|
|
132
|
+
return content.replace(existingNpmImport[0], newImport);
|
|
133
|
+
}
|
|
134
|
+
const importLine = `import { ${name} } from '@loom-framework/frontend-antd';`;
|
|
135
|
+
const lastImportEnd = findLastImportEnd(content);
|
|
136
|
+
if (lastImportEnd === null)
|
|
137
|
+
return content;
|
|
138
|
+
return content.slice(0, lastImportEnd) + '\n' + importLine + content.slice(lastImportEnd);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Remove a name from the npm import from @loom-framework/frontend-antd.
|
|
142
|
+
*/
|
|
143
|
+
function removeNpmImportName(content, name) {
|
|
144
|
+
const npmImportMatches = content.match(/import\s*\{([^}]+)\}\s*from\s*'@loom-framework\/frontend-antd';/g);
|
|
145
|
+
if (!npmImportMatches)
|
|
146
|
+
return content;
|
|
147
|
+
let modified = content;
|
|
148
|
+
for (const importLine of npmImportMatches) {
|
|
149
|
+
if (!importLine.includes(name))
|
|
150
|
+
continue;
|
|
151
|
+
const namesMatch = importLine.match(/import\s*\{([^}]+)\}/);
|
|
152
|
+
if (!namesMatch)
|
|
153
|
+
continue;
|
|
154
|
+
const importNames = namesMatch[1].split(',').map(s => s.trim()).filter(Boolean);
|
|
155
|
+
const filtered = importNames.filter(n => n !== name);
|
|
156
|
+
if (filtered.length > 0) {
|
|
157
|
+
const newImport = `import { ${filtered.join(', ')} } from '@loom-framework/frontend-antd';`;
|
|
158
|
+
modified = modified.replace(importLine, newImport);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
modified = modified.replace(importLine, '');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return modified;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Add a local import line: import XPage from './components/pages/X';
|
|
168
|
+
*/
|
|
169
|
+
function addLocalImportLine(content, pascalName) {
|
|
170
|
+
const importLine = `import ${pascalName}Page from './components/pages/${pascalName}';`;
|
|
171
|
+
if (content.includes(importLine))
|
|
172
|
+
return content;
|
|
173
|
+
const lastImportEnd = findLastImportEnd(content);
|
|
174
|
+
if (lastImportEnd === null)
|
|
175
|
+
return content;
|
|
176
|
+
return content.slice(0, lastImportEnd) + '\n' + importLine + content.slice(lastImportEnd);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Remove a local import line.
|
|
180
|
+
*/
|
|
181
|
+
function removeLocalImportLine(content, pascalName) {
|
|
182
|
+
const regex = new RegExp(`import\\s+${pascalName}Page\\s+from\\s*'\\.\\/components\\/pages\\/${pascalName}';\\n?`, 'g');
|
|
183
|
+
return content.replace(regex, '');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Replace the switch case for a page.
|
|
187
|
+
*/
|
|
188
|
+
function replaceSwitchCase(content, navKey, oldComponent, newComponent) {
|
|
189
|
+
const oldCaseRegex = new RegExp(`case\\s*'${navKey}':\\s*return\\s*<${oldComponent}\\s*\\/?>;`, 'g');
|
|
190
|
+
return content.replace(oldCaseRegex, `case '${navKey}': return <${newComponent} />;`);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Remove the switch case for a page.
|
|
194
|
+
*/
|
|
195
|
+
function removeSwitchCase(content, navKey, componentPatterns) {
|
|
196
|
+
let modified = content;
|
|
197
|
+
for (const pattern of componentPatterns) {
|
|
198
|
+
const regex = new RegExp(`\\s*case\\s*'${navKey}':\\s*return\\s*<${pattern}\\s*\\/?>;\\n?`, 'g');
|
|
199
|
+
modified = modified.replace(regex, '');
|
|
200
|
+
}
|
|
201
|
+
return modified;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Add a switch case before the default case.
|
|
205
|
+
*/
|
|
206
|
+
function addSwitchCase(content, navKey, componentName) {
|
|
207
|
+
if (content.includes(`case '${navKey}':`))
|
|
208
|
+
return content;
|
|
209
|
+
const caseLine = ` case '${navKey}': return <${componentName} />;`;
|
|
210
|
+
const defaultIdx = content.indexOf('default:');
|
|
211
|
+
if (defaultIdx === -1)
|
|
212
|
+
return content;
|
|
213
|
+
const lineStart = content.lastIndexOf('\n', defaultIdx) + 1;
|
|
214
|
+
return content.slice(0, lineStart) + caseLine + '\n' + content.slice(lineStart);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* For login eject: add fallback prop to AuthGuard
|
|
218
|
+
* <AuthGuard> → <AuthGuard fallback={<Login />}>
|
|
219
|
+
*/
|
|
220
|
+
function addAuthGuardFallback(content) {
|
|
221
|
+
if (content.includes('fallback={<Login'))
|
|
222
|
+
return content;
|
|
223
|
+
return content.replace(/<AuthGuard>/g, '<AuthGuard fallback={<Login />}>');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* For login uneject: remove fallback prop from AuthGuard
|
|
227
|
+
* <AuthGuard fallback={<Login />}> → <AuthGuard>
|
|
228
|
+
*/
|
|
229
|
+
function removeAuthGuardFallback(content) {
|
|
230
|
+
return content.replace(/<AuthGuard\s+fallback=\{<Login\s*\/>\}>/g, '<AuthGuard>');
|
|
231
|
+
}
|
|
232
|
+
async function ejectSingleFile(projectRoot, pageDir, fileConfig, initialAppContent, force) {
|
|
233
|
+
const { pascalName, fileName, navKey, npmComponent, template, isLogin } = fileConfig;
|
|
234
|
+
const pagePath = path.join(pageDir, fileName);
|
|
235
|
+
// Check if local file already exists
|
|
236
|
+
try {
|
|
237
|
+
await fs.access(pagePath);
|
|
238
|
+
if (!force) {
|
|
239
|
+
console.error(chalk.red(`Local file already exists: ${path.relative(projectRoot, pagePath)}`));
|
|
240
|
+
console.error(chalk.yellow('Use --force to overwrite.'));
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
console.log(chalk.yellow(`Overwriting existing local file "${pascalName}"`));
|
|
244
|
+
const backupPath = await backupFile(projectRoot, pagePath);
|
|
245
|
+
if (backupPath)
|
|
246
|
+
console.log(chalk.dim(` Backup: ${path.relative(projectRoot, backupPath)}`));
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// File does not exist, proceed
|
|
250
|
+
}
|
|
251
|
+
// Generate local file from template
|
|
252
|
+
const templateContent = template();
|
|
253
|
+
await fs.mkdir(pageDir, { recursive: true });
|
|
254
|
+
await fs.writeFile(pagePath, templateContent, 'utf-8');
|
|
255
|
+
await saveChecksum(projectRoot, pascalName, templateContent);
|
|
256
|
+
console.log(chalk.green(' ✓'), `Local file created: ${path.relative(projectRoot, pagePath)}`);
|
|
257
|
+
// Modify App.tsx content passed in
|
|
258
|
+
let appContent = initialAppContent;
|
|
259
|
+
let modified = false;
|
|
260
|
+
if (isLogin) {
|
|
261
|
+
appContent = addLocalImportLine(appContent, pascalName);
|
|
262
|
+
appContent = addAuthGuardFallback(appContent);
|
|
263
|
+
appContent = removeNpmImportName(appContent, npmComponent);
|
|
264
|
+
modified = true;
|
|
265
|
+
}
|
|
266
|
+
else if (navKey) {
|
|
267
|
+
appContent = removeNpmImportName(appContent, npmComponent);
|
|
268
|
+
appContent = addLocalImportLine(appContent, pascalName);
|
|
269
|
+
appContent = replaceSwitchCase(appContent, navKey, npmComponent, `${pascalName}Page`);
|
|
270
|
+
if (!appContent.includes(`case '${navKey}':`)) {
|
|
271
|
+
appContent = addSwitchCase(appContent, navKey, `${pascalName}Page`);
|
|
272
|
+
}
|
|
273
|
+
modified = true;
|
|
274
|
+
}
|
|
275
|
+
return { appContent, modified };
|
|
276
|
+
}
|
|
277
|
+
async function unejectSingleFile(projectRoot, pageDir, fileConfig, initialAppContent, force) {
|
|
278
|
+
const { pascalName, fileName, navKey, npmComponent, isLogin } = fileConfig;
|
|
279
|
+
const pagePath = path.join(pageDir, fileName);
|
|
280
|
+
// Confirm local file exists
|
|
281
|
+
try {
|
|
282
|
+
await fs.access(pagePath);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
console.error(chalk.red(`No local file found: ${path.relative(projectRoot, pagePath)}`));
|
|
286
|
+
console.error(chalk.yellow('This page is already using the npm import.'));
|
|
287
|
+
process.exit(1);
|
|
288
|
+
}
|
|
289
|
+
// Check if modified (compare checksum)
|
|
290
|
+
const currentContent = await fs.readFile(pagePath, 'utf-8');
|
|
291
|
+
const savedChecksum = await readChecksum(projectRoot, pascalName);
|
|
292
|
+
if (savedChecksum !== null && checksum(currentContent) !== savedChecksum && !force) {
|
|
293
|
+
console.error(chalk.yellow(`Local file "${pascalName}" has been modified since eject.`));
|
|
294
|
+
console.error(chalk.yellow('Use --force to delete the modified file (changes will be lost).'));
|
|
295
|
+
console.error(chalk.dim('Tip: Copy your customizations before unejecting, then apply them to a new eject.'));
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
// Backup before deletion
|
|
299
|
+
const backupPath = await backupFile(projectRoot, pagePath);
|
|
300
|
+
if (backupPath)
|
|
301
|
+
console.log(chalk.dim(` Backup: ${path.relative(projectRoot, backupPath)}`));
|
|
302
|
+
// Delete local file
|
|
303
|
+
await fs.unlink(pagePath);
|
|
304
|
+
await deleteChecksum(projectRoot, pascalName);
|
|
305
|
+
console.log(chalk.green(' ✓'), `Local file removed: ${path.relative(projectRoot, pagePath)}`);
|
|
306
|
+
// Modify App.tsx content passed in
|
|
307
|
+
let appContent = initialAppContent;
|
|
308
|
+
let modified = false;
|
|
309
|
+
if (isLogin) {
|
|
310
|
+
appContent = removeLocalImportLine(appContent, pascalName);
|
|
311
|
+
appContent = removeAuthGuardFallback(appContent);
|
|
312
|
+
appContent = addNpmImportName(appContent, npmComponent);
|
|
313
|
+
modified = true;
|
|
314
|
+
}
|
|
315
|
+
else if (navKey) {
|
|
316
|
+
appContent = removeLocalImportLine(appContent, pascalName);
|
|
317
|
+
appContent = addNpmImportName(appContent, npmComponent);
|
|
318
|
+
appContent = replaceSwitchCase(appContent, navKey, `${pascalName}Page`, npmComponent);
|
|
319
|
+
if (!appContent.includes(`case '${navKey}':`)) {
|
|
320
|
+
appContent = addSwitchCase(appContent, navKey, npmComponent);
|
|
321
|
+
}
|
|
322
|
+
modified = true;
|
|
323
|
+
}
|
|
324
|
+
return { appContent, modified };
|
|
325
|
+
}
|
|
326
|
+
// ── Register commands ──
|
|
327
|
+
export function registerEjectCommand(program) {
|
|
328
|
+
const ejectCmd = program
|
|
329
|
+
.command('eject')
|
|
330
|
+
.description('Eject framework-managed files for local customization');
|
|
331
|
+
ejectCmd
|
|
332
|
+
.command('system-settings <type>')
|
|
333
|
+
.description('Eject a system settings page from npm import to local file')
|
|
334
|
+
.option('--force', 'Overwrite existing local file')
|
|
335
|
+
.action(async (type, cmdOptions) => {
|
|
336
|
+
const pageType = parsePageType(type);
|
|
337
|
+
if (!pageType) {
|
|
338
|
+
console.error(chalk.red(`Invalid type "${type}". Use: ${VALID_TYPES.join(', ')}.`));
|
|
339
|
+
process.exit(1);
|
|
340
|
+
}
|
|
341
|
+
const config = PAGE_CONFIG[pageType];
|
|
342
|
+
try {
|
|
343
|
+
const projectRoot = await resolveProjectRoot();
|
|
344
|
+
const pageDir = path.join(projectRoot, 'frontend', 'src', 'components', 'pages');
|
|
345
|
+
const appTsxPath = path.join(projectRoot, 'frontend', 'src', 'App.tsx');
|
|
346
|
+
// Backup App.tsx before modification
|
|
347
|
+
const appBackup = await backupFile(projectRoot, appTsxPath);
|
|
348
|
+
if (appBackup)
|
|
349
|
+
console.log(chalk.dim(` App.tsx backup: ${path.relative(projectRoot, appBackup)}`));
|
|
350
|
+
// Read App.tsx content once
|
|
351
|
+
let appContent = await fs.readFile(appTsxPath, 'utf-8');
|
|
352
|
+
let anyModified = false;
|
|
353
|
+
// Eject main file
|
|
354
|
+
const mainResult = await ejectSingleFile(projectRoot, pageDir, {
|
|
355
|
+
...config,
|
|
356
|
+
isLogin: pageType === 'login',
|
|
357
|
+
}, appContent, cmdOptions.force);
|
|
358
|
+
if (mainResult.modified) {
|
|
359
|
+
appContent = mainResult.appContent;
|
|
360
|
+
anyModified = true;
|
|
361
|
+
}
|
|
362
|
+
// Eject extra files (e.g., NotificationDetail for notification type)
|
|
363
|
+
if (config.extraFiles) {
|
|
364
|
+
for (const extra of config.extraFiles) {
|
|
365
|
+
const result = await ejectSingleFile(projectRoot, pageDir, {
|
|
366
|
+
...extra,
|
|
367
|
+
isLogin: false,
|
|
368
|
+
}, appContent, cmdOptions.force);
|
|
369
|
+
if (result.modified) {
|
|
370
|
+
appContent = result.appContent;
|
|
371
|
+
anyModified = true;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (anyModified) {
|
|
376
|
+
await fs.writeFile(appTsxPath, appContent, 'utf-8');
|
|
377
|
+
console.log(chalk.green(' ✓'), 'App.tsx switched to local import');
|
|
378
|
+
}
|
|
379
|
+
console.log();
|
|
380
|
+
console.log(chalk.cyan(` "${config.pascalName}" is now ejected. Edit the local file to customize.`));
|
|
381
|
+
console.log(chalk.dim(` Run "loom uneject system-settings ${type}" to revert to npm import.`));
|
|
382
|
+
}
|
|
383
|
+
catch (err) {
|
|
384
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
385
|
+
console.error(chalk.red('Eject failed:'), message);
|
|
386
|
+
process.exit(1);
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
const unejectCmd = program
|
|
390
|
+
.command('uneject')
|
|
391
|
+
.description('Revert ejected files back to npm imports');
|
|
392
|
+
unejectCmd
|
|
393
|
+
.command('system-settings <type>')
|
|
394
|
+
.description('Revert an ejected system settings page back to npm import')
|
|
395
|
+
.option('--force', 'Delete local file even if it has been modified')
|
|
396
|
+
.action(async (type, cmdOptions) => {
|
|
397
|
+
const pageType = parsePageType(type);
|
|
398
|
+
if (!pageType) {
|
|
399
|
+
console.error(chalk.red(`Invalid type "${type}". Use: ${VALID_TYPES.join(', ')}.`));
|
|
400
|
+
process.exit(1);
|
|
401
|
+
}
|
|
402
|
+
const config = PAGE_CONFIG[pageType];
|
|
403
|
+
try {
|
|
404
|
+
const projectRoot = await resolveProjectRoot();
|
|
405
|
+
const pageDir = path.join(projectRoot, 'frontend', 'src', 'components', 'pages');
|
|
406
|
+
const appTsxPath = path.join(projectRoot, 'frontend', 'src', 'App.tsx');
|
|
407
|
+
// Backup App.tsx
|
|
408
|
+
const appBackup = await backupFile(projectRoot, appTsxPath);
|
|
409
|
+
if (appBackup)
|
|
410
|
+
console.log(chalk.dim(` App.tsx backup: ${path.relative(projectRoot, appBackup)}`));
|
|
411
|
+
// Read App.tsx content once
|
|
412
|
+
let appContent = await fs.readFile(appTsxPath, 'utf-8');
|
|
413
|
+
let anyModified = false;
|
|
414
|
+
// Uneject main file
|
|
415
|
+
const mainResult = await unejectSingleFile(projectRoot, pageDir, {
|
|
416
|
+
...config,
|
|
417
|
+
isLogin: pageType === 'login',
|
|
418
|
+
}, appContent, cmdOptions.force);
|
|
419
|
+
if (mainResult.modified) {
|
|
420
|
+
appContent = mainResult.appContent;
|
|
421
|
+
anyModified = true;
|
|
422
|
+
}
|
|
423
|
+
// Uneject extra files
|
|
424
|
+
if (config.extraFiles) {
|
|
425
|
+
for (const extra of config.extraFiles) {
|
|
426
|
+
const result = await unejectSingleFile(projectRoot, pageDir, {
|
|
427
|
+
...extra,
|
|
428
|
+
isLogin: false,
|
|
429
|
+
}, appContent, cmdOptions.force);
|
|
430
|
+
if (result.modified) {
|
|
431
|
+
appContent = result.appContent;
|
|
432
|
+
anyModified = true;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (anyModified) {
|
|
437
|
+
await fs.writeFile(appTsxPath, appContent, 'utf-8');
|
|
438
|
+
console.log(chalk.green(' ✓'), 'App.tsx switched back to npm import');
|
|
439
|
+
}
|
|
440
|
+
console.log();
|
|
441
|
+
console.log(chalk.cyan(` "${config.pascalName}" is now using npm import from @loom-framework/frontend-antd.`));
|
|
442
|
+
console.log(chalk.dim(` Run "loom eject system-settings ${type}" to customize again.`));
|
|
443
|
+
}
|
|
444
|
+
catch (err) {
|
|
445
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
446
|
+
console.error(chalk.red('Uneject failed:'), message);
|
|
447
|
+
process.exit(1);
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=eject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eject.js","sourceRoot":"","sources":["../../../src/cli/commands/eject.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* loom generate system-settings <model|skill|user|process>
|
|
2
|
+
* loom generate system-settings <model|skill|user|login|process|notification>
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* System management pages are now built into @loom-framework/frontend-antd.
|
|
5
|
+
* Default behavior: wire npm imports into App.tsx (no local files).
|
|
6
|
+
* Use --local to generate local source files for customization (eject).
|
|
7
7
|
*/
|
|
8
8
|
import type { Command } from 'commander';
|
|
9
9
|
export declare function registerGenerateSystemSettingsCommand(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-system-settings.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate-system-settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;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;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgGzC,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsF5E"}
|