create-windy 0.3.13 → 0.3.16

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 CHANGED
@@ -59,7 +59,7 @@ npx create-windy@latest my-dashboard \
59
59
  `system.operations`。
60
60
  - 默认不选:离线 `system.license`、文件、任务、通知、工作流、搜索、数据治理、
61
61
  Agent、批量数据和示例工单等模块。
62
- - 默认代码质量:Oxlint + Oxfmt。Husky 会在提交前通过 lint-staged 自动格式化暂存
62
+ - 默认代码质量:Oxlint + Oxfmt。Husky 会在提交前通过 lint-staged 自动格式化并检查暂存
63
63
  文件,不会把未暂存内容带入提交;lint、typecheck 和 test 保留为显式命令。
64
64
  - `--no-oxc` 会物理排除 Oxc 配置、Husky hook、lint-staged、依赖和质量脚本。
65
65
  - 默认法律许可证:`UNLICENSED`,不会生成 `LICENSE` 文件。
@@ -133,9 +133,10 @@ bun run windy update
133
133
  bun run windy reconcile --to <精确目标版本>
134
134
  ```
135
135
 
136
- 更新器要求 Git 工作区干净,从 npm 历史 artifact 重建 Base,并以
137
- Base/Ours/Theirs 合并共享脚手架。`package.json` 使用字段级合并;已发布 migration
138
- 只允许追加;冲突发生时不写项目,验证失败则从 `.windy/backups/` 自动回滚。项目锁定
136
+ 更新器不检查 Git 工作区是否干净:只规划目标版本实际变更的受管文件,从 npm 历史
137
+ artifact 重建 Base,并以 Base/Ours/Theirs 合并共享脚手架。未触及的业务修改不会进入
138
+ 更新判断;`package.json` 使用字段级合并;已发布 migration 只允许追加;冲突发生时不写
139
+ 项目,验证失败则从 `.windy/backups/` 自动回滚。项目锁定
139
140
  的 CLI 检测到新版后,会委托给目标版本生成完整更新计划。受管清单 schema v3 用不含
140
141
  hash 的 missing tombstone 记住客户删除的 `project-owned` 路径;后续版本不会把它
141
142
  当作首次新增而重建,客户自行恢复文件后则采纳客户实际正文基线。既有 schema v1/v2
@@ -146,8 +147,8 @@ hash 的 missing tombstone 记住客户删除的 `project-owned` 路径;后续
146
147
  `.windy/files.json` 和无正文报告,不修改项目源码或推进 Project Lock。来源/目标均
147
148
  校验公网 npm artifact identity 与 integrity,只有内置不可变 proof 完整命中的
148
149
  `windy-managed` 文件可以对账;`shared-scaffold` 也必须精确命中内置 proof,
149
- `project-owned` 和未知语义差异保持未决。执行前同样要求 Git 工作区干净;中断仍
150
- 通过 `doctor --repair` 恢复事务。
150
+ `project-owned` 和未知语义差异保持未决。对账不修改项目源码;中断仍通过
151
+ `doctor --repair` 恢复事务。
151
152
 
152
153
  公网 `0.3.0` 的默认 Git + Oxc 项目需要先运行
153
154
  `create-windy@0.3.2 reconcile --to 0.3.0`,确认后增加 `--apply`,提交生成的清单和
@@ -197,8 +198,8 @@ bun run windy module remove work-order --dry-run
197
198
  bun run windy module remove work-order --confirm-data-disposition
198
199
  ```
199
200
 
200
- 命令要求 Git 工作区干净,复用 `update` 的三方计划、CAS 事务、验证和
201
- `doctor --repair` 恢复;CLI 与项目 Windy 版本也必须完全一致,旧项目先执行
201
+ 命令不检查 Git 工作区是否干净,复用 `update` 的三方计划、CAS 事务、验证和
202
+ `doctor --repair` 恢复;未触及的业务改动完全保留。CLI 与项目 Windy 版本也必须完全一致,旧项目先执行
202
203
  `bun run windy update`。卸载默认保留业务数据,不执行 down migration,并把模块
203
204
  migration 证据保留到 `.windy/module-history/`。目录声明 `archive-data` 或 `manual`
204
205
  时,还必须通过 `--data-plan` 提供已审阅的处置文档;CLI 不连接数据库或自动执行
package/dist/cli.js CHANGED
@@ -4011,7 +4011,7 @@ create-windy \u9ED8\u8BA4\u5EFA\u7ACB \`main\` \u5206\u652F\u5E76\u521B\u5EFA \`
4011
4011
 
4012
4012
  // src/project-package.ts
4013
4013
  var defaultLintStaged = {
4014
- "*.{cjs,css,cts,html,js,json,jsonc,jsx,less,md,mdx,mjs,mts,scss,ts,tsx,vue,yaml,yml}": "oxfmt --write"
4014
+ "*.{cjs,css,cts,html,js,json,jsonc,jsx,less,md,mdx,mjs,mts,scss,ts,tsx,vue,yaml,yml}": ["oxfmt --write", "oxlint"]
4015
4015
  };
4016
4016
  function createStarterPackage(source, projectName, includeOxc = true, projectLicense = "UNLICENSED", selectedModules = [], generatorVersion) {
4017
4017
  const { "lint-staged": sourceLintStaged, ...sourceWithoutLintStaged } = source;
@@ -4566,7 +4566,7 @@ function isMissing4(error) {
4566
4566
  import { createInterface as createInterface2 } from "readline/promises";
4567
4567
  import { stdin, stdout } from "process";
4568
4568
 
4569
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/key.js
4569
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/key.js
4570
4570
  var keybindings = ["emacs", "vim"];
4571
4571
  var keybindingLookup = new Set(keybindings);
4572
4572
  function isKeybinding(value) {
@@ -4583,7 +4583,7 @@ var isDownKey = (key, keybindings2 = []) => key.name === "down" || keybindings2.
4583
4583
  var isSpaceKey = (key) => key.name === "space";
4584
4584
  var isNumberKey = (key) => "1234567890".includes(key.name);
4585
4585
  var isEnterKey = (key) => key.name === "enter" || key.name === "return";
4586
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/errors.js
4586
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/errors.js
4587
4587
  class AbortPromptError extends Error {
4588
4588
  name = "AbortPromptError";
4589
4589
  message = "Prompt was aborted";
@@ -4609,10 +4609,10 @@ class HookError extends Error {
4609
4609
  class ValidationError extends Error {
4610
4610
  name = "ValidationError";
4611
4611
  }
4612
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/use-state.js
4612
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/use-state.js
4613
4613
  import { AsyncResource as AsyncResource2 } from "async_hooks";
4614
4614
 
4615
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/hook-engine.js
4615
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/hook-engine.js
4616
4616
  import { AsyncLocalStorage, AsyncResource } from "async_hooks";
4617
4617
  var hookStorage = new AsyncLocalStorage;
4618
4618
  function createStore(rl) {
@@ -4717,7 +4717,7 @@ var effectScheduler = {
4717
4717
  }
4718
4718
  };
4719
4719
 
4720
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/use-state.js
4720
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/use-state.js
4721
4721
  function isFactory(value) {
4722
4722
  return typeof value === "function";
4723
4723
  }
@@ -4738,7 +4738,7 @@ function useState(defaultValue) {
4738
4738
  });
4739
4739
  }
4740
4740
 
4741
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/use-effect.js
4741
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/use-effect.js
4742
4742
  function useEffect(cb, depArray) {
4743
4743
  withPointer((pointer) => {
4744
4744
  const oldDeps = pointer.get();
@@ -4750,7 +4750,7 @@ function useEffect(cb, depArray) {
4750
4750
  });
4751
4751
  }
4752
4752
 
4753
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/theme.js
4753
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/theme.js
4754
4754
  import { styleText } from "util";
4755
4755
 
4756
4756
  // ../../node_modules/.bun/@inquirer+figures@2.0.7/node_modules/@inquirer/figures/dist/index.js
@@ -5042,7 +5042,7 @@ var figures = shouldUseMain ? mainSymbols : fallbackSymbols;
5042
5042
  var dist_default = figures;
5043
5043
  var replacements = Object.entries(specialMainSymbols);
5044
5044
 
5045
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/theme.js
5045
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/theme.js
5046
5046
  var defaultTheme = {
5047
5047
  prefix: {
5048
5048
  idle: styleText("blue", "?"),
@@ -5070,7 +5070,7 @@ function getDefaultTheme() {
5070
5070
  };
5071
5071
  }
5072
5072
 
5073
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/make-theme.js
5073
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/make-theme.js
5074
5074
  function isPlainObject(value) {
5075
5075
  if (typeof value !== "object" || value === null)
5076
5076
  return false;
@@ -5098,7 +5098,7 @@ function makeTheme(...themes) {
5098
5098
  return deepMerge(...themesToMerge);
5099
5099
  }
5100
5100
 
5101
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/use-prefix.js
5101
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/use-prefix.js
5102
5102
  function usePrefix({ status = "idle", theme }) {
5103
5103
  const [showLoader, setShowLoader] = useState(false);
5104
5104
  const [tick, setTick] = useState(0);
@@ -5128,7 +5128,7 @@ function usePrefix({ status = "idle", theme }) {
5128
5128
  const iconName = status === "loading" ? "idle" : status;
5129
5129
  return typeof prefix === "string" ? prefix : prefix[iconName] ?? prefix["idle"];
5130
5130
  }
5131
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/use-memo.js
5131
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/use-memo.js
5132
5132
  function useMemo(fn, dependencies) {
5133
5133
  return withPointer((pointer) => {
5134
5134
  const prev = pointer.get();
@@ -5140,12 +5140,12 @@ function useMemo(fn, dependencies) {
5140
5140
  return prev.value;
5141
5141
  });
5142
5142
  }
5143
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/use-ref.js
5143
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/use-ref.js
5144
5144
  function useRef(val) {
5145
5145
  return useState({ current: val })[0];
5146
5146
  }
5147
5147
 
5148
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/use-keypress.js
5148
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/use-keypress.js
5149
5149
  function useKeypress(userHandler) {
5150
5150
  const signal = useRef(userHandler);
5151
5151
  signal.current = userHandler;
@@ -5163,7 +5163,7 @@ function useKeypress(userHandler) {
5163
5163
  };
5164
5164
  }, []);
5165
5165
  }
5166
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/utils.js
5166
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/utils.js
5167
5167
  var import_cli_width = __toESM(require_cli_width(), 1);
5168
5168
 
5169
5169
  // ../../node_modules/.bun/fast-string-truncated-width@3.0.3/node_modules/fast-string-truncated-width/dist/utils.js
@@ -5507,7 +5507,7 @@ function wrapAnsi(string, columns, options) {
5507
5507
  `);
5508
5508
  }
5509
5509
 
5510
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/utils.js
5510
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/utils.js
5511
5511
  function breakLines(content, width) {
5512
5512
  return content.split(`
5513
5513
  `).flatMap((line) => wrapAnsi(line, width, { trim: false, wordWrap: false }).split(`
@@ -5518,7 +5518,7 @@ function readlineWidth() {
5518
5518
  return import_cli_width.default({ defaultWidth: 80, output: readline().output });
5519
5519
  }
5520
5520
 
5521
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/pagination/use-pagination.js
5521
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/pagination/use-pagination.js
5522
5522
  function usePointerPosition({ active, renderedItems, pageSize, loop }) {
5523
5523
  const state = useRef({
5524
5524
  lastPointer: active,
@@ -5584,7 +5584,7 @@ function usePagination({ items, active, renderItem, pageSize, loop = true }) {
5584
5584
  return pageBuffer.filter((line) => typeof line === "string").join(`
5585
5585
  `);
5586
5586
  }
5587
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/create-prompt.js
5587
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/create-prompt.js
5588
5588
  var import_mute_stream = __toESM(require_lib(), 1);
5589
5589
  import * as readline2 from "readline";
5590
5590
  import { AsyncResource as AsyncResource3 } from "async_hooks";
@@ -5797,7 +5797,7 @@ var {
5797
5797
  unload
5798
5798
  } = signalExitWrap(processOk(process3) ? new SignalExit(process3) : new SignalExitFallback);
5799
5799
 
5800
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/screen-manager.js
5800
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/screen-manager.js
5801
5801
  import { stripVTControlCharacters } from "util";
5802
5802
 
5803
5803
  // ../../node_modules/.bun/@inquirer+ansi@2.0.7/node_modules/@inquirer/ansi/dist/index.js
@@ -5816,7 +5816,7 @@ var cursorTo = (x, y) => {
5816
5816
  var eraseLine = ESC2 + "2K";
5817
5817
  var eraseLines = (lines) => lines > 0 ? (eraseLine + cursorUp(1)).repeat(lines - 1) + eraseLine + cursorLeft : "";
5818
5818
 
5819
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/screen-manager.js
5819
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/screen-manager.js
5820
5820
  var height = (content) => content.split(`
5821
5821
  `).length;
5822
5822
  var lastLine = (content) => content.split(`
@@ -5882,7 +5882,7 @@ class ScreenManager {
5882
5882
  }
5883
5883
  }
5884
5884
 
5885
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/promise-polyfill.js
5885
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/promise-polyfill.js
5886
5886
  class PromisePolyfill extends Promise {
5887
5887
  static withResolver() {
5888
5888
  let resolve6;
@@ -5895,7 +5895,7 @@ class PromisePolyfill extends Promise {
5895
5895
  }
5896
5896
  }
5897
5897
 
5898
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/create-prompt.js
5898
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/create-prompt.js
5899
5899
  import path from "path";
5900
5900
  var nativeSetImmediate = globalThis.setImmediate;
5901
5901
  function getCallSites() {
@@ -6006,7 +6006,7 @@ function createPrompt(view) {
6006
6006
  };
6007
6007
  return prompt;
6008
6008
  }
6009
- // ../../node_modules/.bun/@inquirer+core@11.2.1+e154a6929a67600d/node_modules/@inquirer/core/dist/lib/Separator.js
6009
+ // ../../node_modules/.bun/@inquirer+core@11.2.1+7cb241fc07b679d9/node_modules/@inquirer/core/dist/lib/Separator.js
6010
6010
  import { styleText as styleText2 } from "util";
6011
6011
  class Separator {
6012
6012
  separator = styleText2("dim", Array.from({ length: 15 }).join(dist_default.line));
@@ -6020,7 +6020,7 @@ class Separator {
6020
6020
  return Boolean(choice && typeof choice === "object" && "type" in choice && choice.type === "separator");
6021
6021
  }
6022
6022
  }
6023
- // ../../node_modules/.bun/@inquirer+checkbox@5.2.1+e154a6929a67600d/node_modules/@inquirer/checkbox/dist/index.js
6023
+ // ../../node_modules/.bun/@inquirer+checkbox@5.2.1+7cb241fc07b679d9/node_modules/@inquirer/checkbox/dist/index.js
6024
6024
  import { styleText as styleText3 } from "util";
6025
6025
  var checkboxTheme = {
6026
6026
  icon: {
@@ -8869,6 +8869,10 @@ async function planFile(path2, baseRoot, targetRoot, source, target, ours, prove
8869
8869
  if (!oursChanged && !targetChanged) {
8870
8870
  return readyPlannedFile(path2, ownership, "preserve", "\u53CC\u65B9\u672A\u4FEE\u6539", expected);
8871
8871
  }
8872
+ if (targetChanged && path2.endsWith("package.json") && base) {
8873
+ const merged = mergePackageJson(base, ours, theirs);
8874
+ return merged.content ? readyPlannedFile(path2, ownership, "update", "package.json \u5B57\u6BB5\u7EA7\u5408\u5E76", expected, merged.content) : conflict2(path2, ownership, `\u5B57\u6BB5\u51B2\u7A81\uFF1A${merged.conflicts.join("\u3001")}`, expected);
8875
+ }
8872
8876
  if (!oursChanged) {
8873
8877
  return readyPlannedFile(path2, ownership, "update", "\u4EC5 Windy \u4FEE\u6539", expected, theirs);
8874
8878
  }
@@ -8878,10 +8882,6 @@ async function planFile(path2, baseRoot, targetRoot, source, target, ours, prove
8878
8882
  if (hashContent(ours) === target.hash) {
8879
8883
  return readyPlannedFile(path2, ownership, "preserve", "\u5DF2\u5305\u542B\u76EE\u6807\u5185\u5BB9", expected);
8880
8884
  }
8881
- if (path2.endsWith("package.json") && base) {
8882
- const merged = mergePackageJson(base, ours, theirs);
8883
- return merged.content ? readyPlannedFile(path2, ownership, "update", "package.json \u5B57\u6BB5\u7EA7\u5408\u5E76", expected, merged.content) : conflict2(path2, ownership, `\u5B57\u6BB5\u51B2\u7A81\uFF1A${merged.conflicts.join("\u3001")}`, expected);
8884
- }
8885
8885
  if (base) {
8886
8886
  const merged = await mergeTextFile(base, ours, theirs);
8887
8887
  return merged.content ? readyPlannedFile(path2, ownership, "update", "\u4E09\u65B9\u5408\u5E76", expected, merged.content) : conflict2(path2, ownership, merged.conflict || "\u4E09\u65B9\u5408\u5E76\u5931\u8D25", expected);
@@ -8995,15 +8995,6 @@ function isMissing5(error) {
8995
8995
  // src/update/preflight.ts
8996
8996
  async function assertProjectReadyForUpdate(projectDirectory) {
8997
8997
  await assertNoPendingUpdate(projectDirectory);
8998
- await assertGitClean(projectDirectory);
8999
- }
9000
- async function assertGitClean(projectDirectory) {
9001
- const result2 = await captureProcess("git", ["status", "--porcelain"], projectDirectory);
9002
- if (result2.code !== 0)
9003
- throw new Error("\u66F4\u65B0\u8981\u6C42\u5F53\u524D\u76EE\u5F55\u662F\u6709\u6548\u7684 Git \u4ED3\u5E93");
9004
- if (result2.stdout.trim()) {
9005
- throw new Error("\u66F4\u65B0\u524D\u8BF7\u5148\u63D0\u4EA4\u6216\u6682\u5B58\u4E4B\u5916\u59A5\u5584\u5904\u7406 Git \u5DE5\u4F5C\u533A\u6539\u52A8");
9006
- }
9007
8998
  }
9008
8999
  async function assertNoPendingUpdate(projectDirectory) {
9009
9000
  const root = await resolveProjectRoot(projectDirectory);
@@ -9099,7 +9090,10 @@ var recipes = [
9099
9090
  { id: "starter-0.3.9-to-0.3.10", from: "0.3.9", to: "0.3.10" },
9100
9091
  { id: "starter-0.3.10-to-0.3.11", from: "0.3.10", to: "0.3.11" },
9101
9092
  { id: "starter-0.3.11-to-0.3.12", from: "0.3.11", to: "0.3.12" },
9102
- { id: "starter-0.3.12-to-0.3.13", from: "0.3.12", to: "0.3.13" }
9093
+ { id: "starter-0.3.12-to-0.3.13", from: "0.3.12", to: "0.3.13" },
9094
+ { id: "starter-0.3.13-to-0.3.14", from: "0.3.13", to: "0.3.14" },
9095
+ { id: "starter-0.3.14-to-0.3.15", from: "0.3.14", to: "0.3.15" },
9096
+ { id: "starter-0.3.15-to-0.3.16", from: "0.3.15", to: "0.3.16" }
9103
9097
  ];
9104
9098
  function resolveRecipeChain(sourceVersion, targetVersion) {
9105
9099
  if (sourceVersion === targetVersion)
@@ -11277,7 +11271,9 @@ async function main() {
11277
11271
  }
11278
11272
  await createProject(await applyInteractiveSelection(options));
11279
11273
  }
11280
- main().catch((error) => {
11274
+ try {
11275
+ await main();
11276
+ } catch (error) {
11281
11277
  console.error(error instanceof Error ? error.message : String(error));
11282
11278
  process.exitCode = 1;
11283
- });
11279
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-windy",
3
- "version": "0.3.13",
3
+ "version": "0.3.16",
4
4
  "description": "创建单组织、单租户、私有部署优先的 Windy 企业 Dashboard Starter",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "templateCommit": "f5aaae44748b7023cea669439ab887629f76935b",
4
- "generatorVersion": "0.3.13",
3
+ "templateCommit": "39074967cfcee6aca5ff6d3e2791b93ab90e70af",
4
+ "generatorVersion": "0.3.16",
5
5
  "modules": [
6
6
  {
7
7
  "name": "system",
@@ -76,7 +76,8 @@ composable。
76
76
 
77
77
  ## 从 0.2.32 升级
78
78
 
79
- 先提交当前业务改动并保持 Git 工作区干净,然后执行:
79
+ 可直接在现有业务改动上执行:更新不会检查无关工作区改动;若平台变更与同一共享文件
80
+ 重叠,计划会报告三方合并冲突:
80
81
 
81
82
  ```bash
82
83
  bunx --bun create-windy@latest update --check --cwd .
@@ -25,8 +25,9 @@ CAS 写入、验证、Project Lock/受管清单提交和 `doctor --repair` 恢
25
25
  版本混用。
26
26
 
27
27
  `add` 与 `remove` 是幂等操作:集合已满足时不启动事务。`update` 不改变集合,用当前
28
- CLI 重建所选模块并应用目录声明的更新 recipe。正式操作要求 Git 工作区干净;客户
29
- 修改过的受管文件或模块 project-owned 扩展点会形成冲突,不会被静默覆盖。
28
+ CLI 重建所选模块并应用目录声明的更新 recipe。正式操作只处理计划涉及的文件,不检查
29
+ 无关 Git 工作区改动;客户修改过的受管文件或模块 project-owned 扩展点会形成冲突,
30
+ 不会被静默覆盖。
30
31
 
31
32
  ## 数据处置
32
33
 
@@ -70,7 +70,10 @@
70
70
  "test": "bun test --path-ignore-patterns='packages/create-windy/template/**' && bun run --cwd apps/web test"
71
71
  },
72
72
  "lint-staged": {
73
- "*.{cjs,css,cts,html,js,json,jsonc,jsx,less,md,mdx,mjs,mts,scss,ts,tsx,vue,yaml,yml}": "oxfmt --write"
73
+ "*.{cjs,css,cts,html,js,json,jsonc,jsx,less,md,mdx,mjs,mts,scss,ts,tsx,vue,yaml,yml}": [
74
+ "oxfmt --write",
75
+ "oxlint"
76
+ ]
74
77
  },
75
78
  "devDependencies": {
76
79
  "@types/bun": "^1.3.14",