@wneng/create-keel 0.3.0 → 0.3.3

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 (34) hide show
  1. package/README.md +26 -1
  2. package/dist/index.js +118 -5
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -1
  5. package/src/templates/ci-gitee/files/PULL_REQUEST_TEMPLATE.md +62 -0
  6. package/src/templates/ci-gitee/files/pipeline.yml +150 -16
  7. package/src/templates/ci-gitee/fragment.yaml +4 -1
  8. package/src/templates/ci-github/files/PULL_REQUEST_TEMPLATE.md +62 -0
  9. package/src/templates/ci-github/files/ci.yml +199 -6
  10. package/src/templates/ci-github/fragment.yaml +4 -1
  11. package/src/templates/contracts-base/files/_spectral.yaml +21 -0
  12. package/src/templates/contracts-base/fragment.yaml +4 -1
  13. package/src/templates/docs-skeleton/files/README.md +3 -3
  14. package/src/templates/docs-skeleton/files/governance-checklists.md +3 -3
  15. package/src/templates/docs-skeleton/files/governance-security.md +6 -2
  16. package/src/templates/root-files/files/CODEOWNERS +40 -0
  17. package/src/templates/root-files/fragment.yaml +3 -0
  18. package/src/templates/server-go/files/_golangci.yml +41 -0
  19. package/src/templates/server-go/fragment.yaml +4 -1
  20. package/src/templates/server-java/files/checkstyle.xml +62 -0
  21. package/src/templates/server-java/files/pom.xml +57 -0
  22. package/src/templates/server-java/fragment.yaml +4 -1
  23. package/src/templates/server-node/files/_eslintrc.cjs +20 -0
  24. package/src/templates/server-node/files/_prettierrc +12 -0
  25. package/src/templates/server-node/files/package.json +14 -1
  26. package/src/templates/server-node/fragment.yaml +7 -1
  27. package/src/templates/server-python/files/pyproject.toml +44 -0
  28. package/src/templates/web-react/files/_eslintrc.cjs +34 -0
  29. package/src/templates/web-react/files/_prettierrc +12 -0
  30. package/src/templates/web-react/files/package.json +11 -1
  31. package/src/templates/web-react/fragment.yaml +7 -1
  32. package/src/templates/web-vue/files/_eslintrc.cjs +28 -0
  33. package/src/templates/web-vue/files/_prettierrc +12 -0
  34. package/src/templates/web-vue/fragment.yaml +7 -1
package/README.md CHANGED
@@ -5,7 +5,32 @@
5
5
  [![license](https://img.shields.io/npm/l/@wneng/create-keel.svg)](./LICENSE)
6
6
  [![node](https://img.shields.io/node/v/@wneng/create-keel.svg)](https://nodejs.org)
7
7
 
8
- Scaffolder for Contract First + Vibe Coding projects following the `keel` conventions (see root `AGENTS.md`).
8
+ Scaffolder for **Contract First + Vibe Coding** projects following the `keel` conventions (see root `AGENTS.md`).
9
+
10
+ > **完整中文安装与使用指南**:[`docs/03-工程规范与研发基础设施/keel-getting-started.md`](https://gitee.com/wangneng521/keel/blob/main/docs/03-%E5%B7%A5%E7%A8%8B%E8%A7%84%E8%8C%83%E4%B8%8E%E7%A0%94%E5%8F%91%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD/keel-getting-started.md)(13 节,含三档采用策略、工程规范四大类、AI 访问模式、常见故障排查)。
11
+
12
+ ## TL;DR
13
+
14
+ ```bash
15
+ # Quickstart:创建项目(交互式)
16
+ npx @wneng/create-keel create my-app
17
+
18
+ # 推荐第一次试用:带完整样例特性
19
+ npx @wneng/create-keel create demo --yes --sample-feature
20
+
21
+ # 给已有项目加特性
22
+ cd my-app
23
+ npx @wneng/create-keel feature add user-signup
24
+
25
+ # 完整档(To B 多客户交付)
26
+ npx @wneng/create-keel create my-full \
27
+ --backend java --frontend react --mobile flutter --miniapp wechat \
28
+ --agent rust-desktop --deploy kubernetes --contract rest+events \
29
+ --ai kiro --license apache-2.0 --gitLfs --integrations \
30
+ --ci github --roles qa,field,data,legal-security,marketing,design \
31
+ --engineering-standards full \
32
+ --yes
33
+ ```
9
34
 
10
35
  ## Usage
11
36
 
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/version.ts
4
- var SCAFFOLDER_VERSION = "0.3.0";
4
+ var SCAFFOLDER_VERSION = "0.3.3";
5
5
 
6
6
  // src/schema/options.ts
7
7
  import Ajv from "ajv";
@@ -414,6 +414,32 @@ function parseCreateArgs(args) {
414
414
  let engineeringStandards;
415
415
  let engineeringStandardsExplicit = false;
416
416
  let multiApp = false;
417
+ let backend;
418
+ let frontend;
419
+ let mobile;
420
+ let miniapp;
421
+ let agent;
422
+ let deploy;
423
+ let contract;
424
+ let ai;
425
+ let license;
426
+ let gitLfs;
427
+ let integrations;
428
+ function takeEnum(flag, next, enumValues) {
429
+ if (next === void 0 || next.startsWith("--")) {
430
+ throw new UserInputError(
431
+ `${flag} requires a value`,
432
+ `\u53EF\u9009\u503C\uFF1A${enumValues.join(" | ")}`
433
+ );
434
+ }
435
+ if (!enumValues.includes(next)) {
436
+ throw new UserInputError(
437
+ `invalid ${flag} value: ${JSON.stringify(next)}`,
438
+ `\u53EF\u9009\u503C\uFF1A${enumValues.join(" | ")}`
439
+ );
440
+ }
441
+ return next;
442
+ }
417
443
  for (let i = 0; i < args.length; i += 1) {
418
444
  const a = args[i];
419
445
  switch (a) {
@@ -438,6 +464,58 @@ function parseCreateArgs(args) {
438
464
  case "--multi-app":
439
465
  multiApp = true;
440
466
  break;
467
+ case "--gitLfs":
468
+ case "--git-lfs":
469
+ gitLfs = true;
470
+ break;
471
+ case "--integrations":
472
+ integrations = true;
473
+ break;
474
+ case "--backend": {
475
+ backend = takeEnum("--backend", args[i + 1], BACKEND_LANGUAGES);
476
+ i += 1;
477
+ break;
478
+ }
479
+ case "--frontend": {
480
+ frontend = takeEnum("--frontend", args[i + 1], FRONTEND_FRAMEWORKS);
481
+ i += 1;
482
+ break;
483
+ }
484
+ case "--mobile": {
485
+ mobile = takeEnum("--mobile", args[i + 1], MOBILE_KINDS);
486
+ i += 1;
487
+ break;
488
+ }
489
+ case "--miniapp": {
490
+ miniapp = takeEnum("--miniapp", args[i + 1], MINIAPP_KINDS);
491
+ i += 1;
492
+ break;
493
+ }
494
+ case "--agent": {
495
+ agent = takeEnum("--agent", args[i + 1], AGENT_KINDS);
496
+ i += 1;
497
+ break;
498
+ }
499
+ case "--deploy": {
500
+ deploy = takeEnum("--deploy", args[i + 1], DEPLOY_TARGETS);
501
+ i += 1;
502
+ break;
503
+ }
504
+ case "--contract": {
505
+ contract = takeEnum("--contract", args[i + 1], CONTRACT_KINDS);
506
+ i += 1;
507
+ break;
508
+ }
509
+ case "--ai": {
510
+ ai = takeEnum("--ai", args[i + 1], AI_TOOLS);
511
+ i += 1;
512
+ break;
513
+ }
514
+ case "--license": {
515
+ license = takeEnum("--license", args[i + 1], LICENSE_KINDS);
516
+ i += 1;
517
+ break;
518
+ }
441
519
  case "--engineering-standards": {
442
520
  const next = args[i + 1];
443
521
  if (next === void 0 || next.startsWith("--")) {
@@ -545,7 +623,18 @@ function parseCreateArgs(args) {
545
623
  ...roles !== void 0 ? { roles } : {},
546
624
  ...sampleFeature ? { sampleFeature: true } : {},
547
625
  ...engineeringStandards !== void 0 ? { engineeringStandards } : {},
548
- ...multiApp ? { multiApp: true } : {}
626
+ ...multiApp ? { multiApp: true } : {},
627
+ ...backend !== void 0 ? { backend } : {},
628
+ ...frontend !== void 0 ? { frontend } : {},
629
+ ...mobile !== void 0 ? { mobile } : {},
630
+ ...miniapp !== void 0 ? { miniapp } : {},
631
+ ...agent !== void 0 ? { agent } : {},
632
+ ...deploy !== void 0 ? { deploy } : {},
633
+ ...contract !== void 0 ? { contract } : {},
634
+ ...ai !== void 0 ? { ai } : {},
635
+ ...license !== void 0 ? { license } : {},
636
+ ...gitLfs !== void 0 ? { gitLfs } : {},
637
+ ...integrations !== void 0 ? { integrations } : {}
549
638
  };
550
639
  if (sampleFeature && dryRun) {
551
640
  throw new UserInputError(
@@ -553,7 +642,7 @@ function parseCreateArgs(args) {
553
642
  "\u8BF7\u53BB\u6389\u4E00\u9879\u540E\u91CD\u8BD5"
554
643
  );
555
644
  }
556
- if (!engineeringStandardsExplicit && yes) {
645
+ if (!engineeringStandardsExplicit) {
557
646
  return {
558
647
  projectName,
559
648
  flags: { ...flags, engineeringStandards: "standard" }
@@ -624,6 +713,17 @@ function helpText() {
624
713
  " Adoption tier for engineering standards: " + ADOPTION_TIERS.join("|"),
625
714
  " (default in --yes mode: standard; omitted in interactive mode)",
626
715
  " --multi-app Initialise the project in multi-app mode (<env>/apps/<name>/)",
716
+ " --backend <kind> " + BACKEND_LANGUAGES.join("|"),
717
+ " --frontend <kind> " + FRONTEND_FRAMEWORKS.join("|"),
718
+ " --mobile <kind> " + MOBILE_KINDS.join("|"),
719
+ " --miniapp <kind> " + MINIAPP_KINDS.join("|"),
720
+ " --agent <kind> " + AGENT_KINDS.join("|"),
721
+ " --deploy <kind> " + DEPLOY_TARGETS.join("|"),
722
+ " --contract <kind> " + CONTRACT_KINDS.join("|"),
723
+ " --ai <kind> " + AI_TOOLS.join("|"),
724
+ " --license <kind> " + LICENSE_KINDS.join("|"),
725
+ " --gitLfs Enable Git LFS in the generated project",
726
+ " --integrations Enable docs/06-\u96C6\u6210\u5BF9\u63A5/ at create time",
627
727
  " -h, --help Show this help",
628
728
  " -v, --version Show the scaffolder version",
629
729
  "",
@@ -710,7 +810,8 @@ var PARTIAL_OPTIONS_SCHEMA = {
710
810
  type: "array",
711
811
  items: { type: "string", enum: [...ROLE_KINDS] },
712
812
  uniqueItems: true
713
- }
813
+ },
814
+ multiApp: { type: "boolean" }
714
815
  }
715
816
  };
716
817
  var ajv2 = new Ajv2({ allErrors: true, strict: true });
@@ -2222,7 +2323,19 @@ async function resolveOptions(input) {
2222
2323
  ...merged,
2223
2324
  projectName,
2224
2325
  ...flags.ci !== void 0 ? { ci: flags.ci } : {},
2225
- ...flags.roles !== void 0 ? { roles: flags.roles } : {}
2326
+ ...flags.roles !== void 0 ? { roles: flags.roles } : {},
2327
+ ...flags.backend !== void 0 ? { backend: flags.backend } : {},
2328
+ ...flags.frontend !== void 0 ? { frontend: flags.frontend } : {},
2329
+ ...flags.mobile !== void 0 ? { mobile: flags.mobile } : {},
2330
+ ...flags.miniapp !== void 0 ? { miniapp: flags.miniapp } : {},
2331
+ ...flags.agent !== void 0 ? { agent: flags.agent } : {},
2332
+ ...flags.deploy !== void 0 ? { deploy: flags.deploy } : {},
2333
+ ...flags.contract !== void 0 ? { contract: flags.contract } : {},
2334
+ ...flags.ai !== void 0 ? { ai: flags.ai } : {},
2335
+ ...flags.license !== void 0 ? { license: flags.license } : {},
2336
+ ...flags.gitLfs !== void 0 ? { gitLfs: flags.gitLfs } : {},
2337
+ ...flags.integrations !== void 0 ? { integrations: flags.integrations } : {},
2338
+ ...flags.multiApp !== void 0 ? { multiApp: flags.multiApp } : {}
2226
2339
  };
2227
2340
  if (flags.yes) {
2228
2341
  const full = { ...buildDefaultOptions(projectName), ...merged };