scaffold-engine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -0
- package/engine.project.example.json +23 -0
- package/package.json +49 -0
- package/scripts/postinstall.cjs +42 -0
- package/specs/catalogs/action-templates.yaml +189 -0
- package/specs/catalogs/child-templates.yaml +54 -0
- package/specs/catalogs/field-fragments.yaml +203 -0
- package/specs/catalogs/object-catalog.yaml +35 -0
- package/specs/catalogs/object-name-suggestions.yaml +30 -0
- package/specs/catalogs/object-templates.yaml +45 -0
- package/specs/catalogs/pattern-catalog.yaml +48 -0
- package/specs/catalogs/status-templates.yaml +16 -0
- package/specs/projects/crm-pilot/customer.yaml +122 -0
- package/specs/projects/crm-pilot/lead.from-nl.yaml +76 -0
- package/specs/projects/crm-pilot/lead.yaml +82 -0
- package/specs/projects/generated-from-nl/crm-customer.yaml +158 -0
- package/specs/projects/generated-from-nl/crm-lead.yaml +76 -0
- package/specs/projects/generated-from-nl/crm-opportunity.yaml +78 -0
- package/specs/projects/generated-from-nl/crm-quote.yaml +78 -0
- package/specs/projects/generated-from-nl/custom-documentLines.yaml +125 -0
- package/specs/projects/generated-from-nl/custom-treeEntity.yaml +78 -0
- package/specs/projects/generated-from-nl/erp-material-pattern-test.yaml +79 -0
- package/specs/projects/generated-from-nl/erp-material.yaml +78 -0
- package/specs/projects/generated-from-nl/hr-orgUnit.yaml +100 -0
- package/specs/projects/pattern-examples/document-lines-demo.yaml +125 -0
- package/specs/projects/pattern-examples/tree-entity-demo.yaml +79 -0
- package/specs/rules/business-model.schema.json +262 -0
- package/specs/rules/extension-boundaries.json +26 -0
- package/specs/rules/requirement-draft.schema.json +75 -0
- package/specs/rules/spec-governance.json +29 -0
- package/specs/templates/crm/customer.template.yaml +121 -0
- package/specs/templates/crm/lead.template.yaml +82 -0
- package/tools/analyze-requirement.cjs +950 -0
- package/tools/cli.cjs +59 -0
- package/tools/create-draft.cjs +18 -0
- package/tools/engine.cjs +47 -0
- package/tools/generate-draft.cjs +33 -0
- package/tools/generate-module.cjs +1218 -0
- package/tools/init-project.cjs +194 -0
- package/tools/lib/draft-toolkit.cjs +357 -0
- package/tools/lib/model-toolkit.cjs +482 -0
- package/tools/lib/pattern-renderers.cjs +166 -0
- package/tools/lib/renderers/detail-page-renderer.cjs +327 -0
- package/tools/lib/renderers/form-page-renderer.cjs +553 -0
- package/tools/lib/renderers/list-page-renderer.cjs +371 -0
- package/tools/lib/runtime-config.cjs +154 -0
- package/tools/patch-draft.cjs +57 -0
- package/tools/prompts/business-model-prompt.md +58 -0
- package/tools/run-requirement.cjs +672 -0
- package/tools/validate-draft.cjs +32 -0
- package/tools/validate-model.cjs +140 -0
- package/tools/verify-patterns.cjs +67 -0
package/tools/cli.cjs
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { spawnSync } = require('child_process');
|
|
4
|
+
const { initProject, parseArgs: parseInitArgs } = require('./init-project.cjs');
|
|
5
|
+
|
|
6
|
+
const argv = process.argv.slice(2);
|
|
7
|
+
const command = argv[0] || 'help';
|
|
8
|
+
const subArgs = argv.slice(1);
|
|
9
|
+
|
|
10
|
+
const commandMap = {
|
|
11
|
+
analyze: 'analyze-requirement.cjs',
|
|
12
|
+
run: 'run-requirement.cjs',
|
|
13
|
+
'draft:create': 'create-draft.cjs',
|
|
14
|
+
'draft:patch': 'patch-draft.cjs',
|
|
15
|
+
'draft:validate': 'validate-draft.cjs',
|
|
16
|
+
'draft:generate': 'generate-draft.cjs',
|
|
17
|
+
'model:validate': 'validate-model.cjs',
|
|
18
|
+
'model:generate': 'generate-module.cjs',
|
|
19
|
+
'verify:patterns': 'verify-patterns.cjs',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
if (command === 'init') {
|
|
24
|
+
const result = initProject(parseInitArgs(subArgs));
|
|
25
|
+
console.log(JSON.stringify(result, null, 2));
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (command === 'help' || !commandMap[command]) {
|
|
30
|
+
printHelp();
|
|
31
|
+
process.exit(command === 'help' ? 0 : 1);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const scriptPath = path.join(__dirname, commandMap[command]);
|
|
35
|
+
const result = spawnSync(process.execPath, [scriptPath, ...subArgs], {
|
|
36
|
+
cwd: process.cwd(),
|
|
37
|
+
stdio: 'inherit',
|
|
38
|
+
});
|
|
39
|
+
process.exit(result.status ?? 1);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.error(`\n❌ scaffold-engine 执行失败: ${error.message}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function printHelp() {
|
|
46
|
+
console.log(`scaffold-engine commands:
|
|
47
|
+
|
|
48
|
+
scaffold-engine init [--project-root <path>] [--force] [--no-cursor-rule]
|
|
49
|
+
scaffold-engine analyze <requirement> [--config <path>]
|
|
50
|
+
scaffold-engine run <requirement> [--config <path>]
|
|
51
|
+
scaffold-engine draft:create <requirement> [--config <path>]
|
|
52
|
+
scaffold-engine draft:patch --draft <draft-id|path> --patch <patch-file>
|
|
53
|
+
scaffold-engine draft:validate <draft-id|path> [--config <path>]
|
|
54
|
+
scaffold-engine draft:generate <draft-id|path> [--config <path>] [--dry-run]
|
|
55
|
+
scaffold-engine model:validate <spec-file>
|
|
56
|
+
scaffold-engine model:generate <spec-file> [--config <path>] [--dry-run]
|
|
57
|
+
scaffold-engine verify:patterns
|
|
58
|
+
`);
|
|
59
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const { analyzeRequirement, parseArgs, readRequirementText } = require('./analyze-requirement.cjs');
|
|
3
|
+
const { createDraft, saveDraft } = require('./lib/draft-toolkit.cjs');
|
|
4
|
+
const { loadRuntimeConfig } = require('./lib/model-toolkit.cjs');
|
|
5
|
+
|
|
6
|
+
const options = parseArgs(process.argv.slice(2));
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
const runtimeConfig = loadRuntimeConfig({ configPath: options.configPath });
|
|
10
|
+
const requirementText = readRequirementText(options);
|
|
11
|
+
const analysis = analyzeRequirement(requirementText, { configPath: options.configPath });
|
|
12
|
+
const draft = createDraft(requirementText, analysis);
|
|
13
|
+
const savedDraft = saveDraft(draft, { draftRoot: runtimeConfig.drafts.rootDir });
|
|
14
|
+
console.log(JSON.stringify(savedDraft, null, 2));
|
|
15
|
+
} catch (error) {
|
|
16
|
+
console.error(`\n❌ Draft 创建失败: ${error.message}`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
package/tools/engine.cjs
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const {
|
|
2
|
+
analyzeRequirement,
|
|
3
|
+
parseArgs,
|
|
4
|
+
readRequirementText,
|
|
5
|
+
renderMarkdown,
|
|
6
|
+
writeSuggestedSpec,
|
|
7
|
+
} = require('./analyze-requirement.cjs');
|
|
8
|
+
const {
|
|
9
|
+
createDraft,
|
|
10
|
+
generateDraft,
|
|
11
|
+
getDefaultDraftRoot,
|
|
12
|
+
loadDraft,
|
|
13
|
+
loadDraftSchema,
|
|
14
|
+
patchDraft,
|
|
15
|
+
resolveDraftReference,
|
|
16
|
+
saveDraft,
|
|
17
|
+
validateDraft,
|
|
18
|
+
} = require('./lib/draft-toolkit.cjs');
|
|
19
|
+
const {
|
|
20
|
+
loadSpec,
|
|
21
|
+
loadRuntimeConfig,
|
|
22
|
+
readJson,
|
|
23
|
+
resolveScaffoldPath,
|
|
24
|
+
validateModelFile,
|
|
25
|
+
} = require('./lib/model-toolkit.cjs');
|
|
26
|
+
|
|
27
|
+
module.exports = {
|
|
28
|
+
analyzeRequirement,
|
|
29
|
+
createDraft,
|
|
30
|
+
patchDraft,
|
|
31
|
+
validateDraft,
|
|
32
|
+
generateDraft,
|
|
33
|
+
getDefaultDraftRoot,
|
|
34
|
+
loadDraft,
|
|
35
|
+
resolveDraftReference,
|
|
36
|
+
saveDraft,
|
|
37
|
+
parseArgs,
|
|
38
|
+
readRequirementText,
|
|
39
|
+
renderMarkdown,
|
|
40
|
+
writeSuggestedSpec,
|
|
41
|
+
loadDraftSchema,
|
|
42
|
+
loadSpec,
|
|
43
|
+
loadRuntimeConfig,
|
|
44
|
+
readJson,
|
|
45
|
+
resolveScaffoldPath,
|
|
46
|
+
validateModelFile,
|
|
47
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const { generateDraft, loadDraft, saveDraft } = require('./lib/draft-toolkit.cjs');
|
|
3
|
+
const { loadRuntimeConfig } = require('./lib/model-toolkit.cjs');
|
|
4
|
+
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const draftReference = args.find((item) => !item.startsWith('--'));
|
|
7
|
+
const dryRun = args.includes('--dry-run');
|
|
8
|
+
const configPath = readArgValue(args, '--config');
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const runtimeConfig = loadRuntimeConfig({ configPath });
|
|
12
|
+
if (!draftReference) {
|
|
13
|
+
throw new Error('请提供 draft 引用,例如: node ./tools/generate-draft.cjs <draft-path|draft-id>');
|
|
14
|
+
}
|
|
15
|
+
const draft = loadDraft(draftReference, { draftRoot: runtimeConfig.drafts.rootDir });
|
|
16
|
+
const nextDraft = generateDraft(draft, { dryRun, force: true, configPath });
|
|
17
|
+
const savedDraft = saveDraft(nextDraft, {
|
|
18
|
+
draftRoot: draft.storage?.draftRoot || runtimeConfig.drafts.rootDir,
|
|
19
|
+
fileName: draft.storage?.fileName,
|
|
20
|
+
});
|
|
21
|
+
console.log(JSON.stringify(savedDraft, null, 2));
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error(`\n❌ Draft 生成失败: ${error.message}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function readArgValue(argv, flag) {
|
|
28
|
+
const index = argv.indexOf(flag);
|
|
29
|
+
if (index === -1) {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
return argv[index + 1] || '';
|
|
33
|
+
}
|