create-windy 0.3.12 → 0.3.15

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
@@ -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
@@ -853,8 +853,6 @@ var helpText = `create-windy <\u9879\u76EE\u540D> [\u9009\u9879]
853
853
  import { mkdir as mkdir4, readdir as readdir6, rm as rm4 } from "fs/promises";
854
854
 
855
855
  // src/commands.ts
856
- import { spawn } from "child_process";
857
-
858
856
  class CommandExecutionError extends Error {
859
857
  constructor(command, args, exitCode, signal) {
860
858
  const outcome = signal ? `\u4FE1\u53F7 ${signal}` : `\u9000\u51FA\u7801 ${exitCode ?? "\u672A\u77E5"}`;
@@ -863,16 +861,15 @@ class CommandExecutionError extends Error {
863
861
  }
864
862
  }
865
863
  async function runCommand(command, args, cwd) {
866
- await new Promise((resolve2, reject) => {
867
- const child = spawn(command, args, { cwd, stdio: "inherit" });
868
- child.once("error", reject);
869
- child.once("close", (code, signal) => {
870
- if (code === 0)
871
- resolve2();
872
- else
873
- reject(new CommandExecutionError(command, args, code, signal));
874
- });
864
+ const child = Bun.spawn([command, ...args], {
865
+ cwd,
866
+ stderr: "inherit",
867
+ stdin: "inherit",
868
+ stdout: "inherit"
875
869
  });
870
+ const exitCode = await child.exited;
871
+ if (exitCode !== 0)
872
+ throw new CommandExecutionError(command, args, exitCode, null);
876
873
  }
877
874
  async function installAndVerify(targetDirectory, install, verify, includeOxc, execute = runCommand) {
878
875
  if (install || verify)
@@ -887,7 +884,7 @@ async function installAndVerify(targetDirectory, install, verify, includeOxc, ex
887
884
  }
888
885
 
889
886
  // src/bun-runtime.ts
890
- import { spawn as spawn2 } from "child_process";
887
+ import { spawn } from "child_process";
891
888
  var minimumBunVersion = "1.3.14";
892
889
  async function assertSupportedBun(readVersion = readBunVersion) {
893
890
  let version;
@@ -907,7 +904,7 @@ async function assertSupportedBun(readVersion = readBunVersion) {
907
904
  }
908
905
  async function readBunVersion() {
909
906
  return await new Promise((resolve2, reject) => {
910
- const child = spawn2("bun", ["--version"], {
907
+ const child = spawn("bun", ["--version"], {
911
908
  stdio: ["ignore", "pipe", "pipe"]
912
909
  });
913
910
  let stdout = "";
@@ -4569,7 +4566,7 @@ function isMissing4(error) {
4569
4566
  import { createInterface as createInterface2 } from "readline/promises";
4570
4567
  import { stdin, stdout } from "process";
4571
4568
 
4572
- // ../../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
4573
4570
  var keybindings = ["emacs", "vim"];
4574
4571
  var keybindingLookup = new Set(keybindings);
4575
4572
  function isKeybinding(value) {
@@ -4586,7 +4583,7 @@ var isDownKey = (key, keybindings2 = []) => key.name === "down" || keybindings2.
4586
4583
  var isSpaceKey = (key) => key.name === "space";
4587
4584
  var isNumberKey = (key) => "1234567890".includes(key.name);
4588
4585
  var isEnterKey = (key) => key.name === "enter" || key.name === "return";
4589
- // ../../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
4590
4587
  class AbortPromptError extends Error {
4591
4588
  name = "AbortPromptError";
4592
4589
  message = "Prompt was aborted";
@@ -4612,10 +4609,10 @@ class HookError extends Error {
4612
4609
  class ValidationError extends Error {
4613
4610
  name = "ValidationError";
4614
4611
  }
4615
- // ../../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
4616
4613
  import { AsyncResource as AsyncResource2 } from "async_hooks";
4617
4614
 
4618
- // ../../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
4619
4616
  import { AsyncLocalStorage, AsyncResource } from "async_hooks";
4620
4617
  var hookStorage = new AsyncLocalStorage;
4621
4618
  function createStore(rl) {
@@ -4720,7 +4717,7 @@ var effectScheduler = {
4720
4717
  }
4721
4718
  };
4722
4719
 
4723
- // ../../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
4724
4721
  function isFactory(value) {
4725
4722
  return typeof value === "function";
4726
4723
  }
@@ -4741,7 +4738,7 @@ function useState(defaultValue) {
4741
4738
  });
4742
4739
  }
4743
4740
 
4744
- // ../../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
4745
4742
  function useEffect(cb, depArray) {
4746
4743
  withPointer((pointer) => {
4747
4744
  const oldDeps = pointer.get();
@@ -4753,7 +4750,7 @@ function useEffect(cb, depArray) {
4753
4750
  });
4754
4751
  }
4755
4752
 
4756
- // ../../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
4757
4754
  import { styleText } from "util";
4758
4755
 
4759
4756
  // ../../node_modules/.bun/@inquirer+figures@2.0.7/node_modules/@inquirer/figures/dist/index.js
@@ -5045,7 +5042,7 @@ var figures = shouldUseMain ? mainSymbols : fallbackSymbols;
5045
5042
  var dist_default = figures;
5046
5043
  var replacements = Object.entries(specialMainSymbols);
5047
5044
 
5048
- // ../../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
5049
5046
  var defaultTheme = {
5050
5047
  prefix: {
5051
5048
  idle: styleText("blue", "?"),
@@ -5073,7 +5070,7 @@ function getDefaultTheme() {
5073
5070
  };
5074
5071
  }
5075
5072
 
5076
- // ../../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
5077
5074
  function isPlainObject(value) {
5078
5075
  if (typeof value !== "object" || value === null)
5079
5076
  return false;
@@ -5101,7 +5098,7 @@ function makeTheme(...themes) {
5101
5098
  return deepMerge(...themesToMerge);
5102
5099
  }
5103
5100
 
5104
- // ../../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
5105
5102
  function usePrefix({ status = "idle", theme }) {
5106
5103
  const [showLoader, setShowLoader] = useState(false);
5107
5104
  const [tick, setTick] = useState(0);
@@ -5131,7 +5128,7 @@ function usePrefix({ status = "idle", theme }) {
5131
5128
  const iconName = status === "loading" ? "idle" : status;
5132
5129
  return typeof prefix === "string" ? prefix : prefix[iconName] ?? prefix["idle"];
5133
5130
  }
5134
- // ../../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
5135
5132
  function useMemo(fn, dependencies) {
5136
5133
  return withPointer((pointer) => {
5137
5134
  const prev = pointer.get();
@@ -5143,12 +5140,12 @@ function useMemo(fn, dependencies) {
5143
5140
  return prev.value;
5144
5141
  });
5145
5142
  }
5146
- // ../../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
5147
5144
  function useRef(val) {
5148
5145
  return useState({ current: val })[0];
5149
5146
  }
5150
5147
 
5151
- // ../../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
5152
5149
  function useKeypress(userHandler) {
5153
5150
  const signal = useRef(userHandler);
5154
5151
  signal.current = userHandler;
@@ -5166,7 +5163,7 @@ function useKeypress(userHandler) {
5166
5163
  };
5167
5164
  }, []);
5168
5165
  }
5169
- // ../../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
5170
5167
  var import_cli_width = __toESM(require_cli_width(), 1);
5171
5168
 
5172
5169
  // ../../node_modules/.bun/fast-string-truncated-width@3.0.3/node_modules/fast-string-truncated-width/dist/utils.js
@@ -5510,7 +5507,7 @@ function wrapAnsi(string, columns, options) {
5510
5507
  `);
5511
5508
  }
5512
5509
 
5513
- // ../../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
5514
5511
  function breakLines(content, width) {
5515
5512
  return content.split(`
5516
5513
  `).flatMap((line) => wrapAnsi(line, width, { trim: false, wordWrap: false }).split(`
@@ -5521,7 +5518,7 @@ function readlineWidth() {
5521
5518
  return import_cli_width.default({ defaultWidth: 80, output: readline().output });
5522
5519
  }
5523
5520
 
5524
- // ../../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
5525
5522
  function usePointerPosition({ active, renderedItems, pageSize, loop }) {
5526
5523
  const state = useRef({
5527
5524
  lastPointer: active,
@@ -5587,7 +5584,7 @@ function usePagination({ items, active, renderItem, pageSize, loop = true }) {
5587
5584
  return pageBuffer.filter((line) => typeof line === "string").join(`
5588
5585
  `);
5589
5586
  }
5590
- // ../../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
5591
5588
  var import_mute_stream = __toESM(require_lib(), 1);
5592
5589
  import * as readline2 from "readline";
5593
5590
  import { AsyncResource as AsyncResource3 } from "async_hooks";
@@ -5800,7 +5797,7 @@ var {
5800
5797
  unload
5801
5798
  } = signalExitWrap(processOk(process3) ? new SignalExit(process3) : new SignalExitFallback);
5802
5799
 
5803
- // ../../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
5804
5801
  import { stripVTControlCharacters } from "util";
5805
5802
 
5806
5803
  // ../../node_modules/.bun/@inquirer+ansi@2.0.7/node_modules/@inquirer/ansi/dist/index.js
@@ -5819,7 +5816,7 @@ var cursorTo = (x, y) => {
5819
5816
  var eraseLine = ESC2 + "2K";
5820
5817
  var eraseLines = (lines) => lines > 0 ? (eraseLine + cursorUp(1)).repeat(lines - 1) + eraseLine + cursorLeft : "";
5821
5818
 
5822
- // ../../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
5823
5820
  var height = (content) => content.split(`
5824
5821
  `).length;
5825
5822
  var lastLine = (content) => content.split(`
@@ -5885,7 +5882,7 @@ class ScreenManager {
5885
5882
  }
5886
5883
  }
5887
5884
 
5888
- // ../../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
5889
5886
  class PromisePolyfill extends Promise {
5890
5887
  static withResolver() {
5891
5888
  let resolve6;
@@ -5898,7 +5895,7 @@ class PromisePolyfill extends Promise {
5898
5895
  }
5899
5896
  }
5900
5897
 
5901
- // ../../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
5902
5899
  import path from "path";
5903
5900
  var nativeSetImmediate = globalThis.setImmediate;
5904
5901
  function getCallSites() {
@@ -6009,7 +6006,7 @@ function createPrompt(view) {
6009
6006
  };
6010
6007
  return prompt;
6011
6008
  }
6012
- // ../../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
6013
6010
  import { styleText as styleText2 } from "util";
6014
6011
  class Separator {
6015
6012
  separator = styleText2("dim", Array.from({ length: 15 }).join(dist_default.line));
@@ -6023,7 +6020,7 @@ class Separator {
6023
6020
  return Boolean(choice && typeof choice === "object" && "type" in choice && choice.type === "separator");
6024
6021
  }
6025
6022
  }
6026
- // ../../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
6027
6024
  import { styleText as styleText3 } from "util";
6028
6025
  var checkboxTheme = {
6029
6026
  icon: {
@@ -8496,7 +8493,7 @@ import { tmpdir } from "os";
8496
8493
  import { join as join18 } from "path";
8497
8494
 
8498
8495
  // src/update/process.ts
8499
- import { spawn as spawn3 } from "child_process";
8496
+ import { spawn as spawn2 } from "child_process";
8500
8497
  var LOCAL_GIT_ENVIRONMENT_VARIABLES = [
8501
8498
  "GIT_ALTERNATE_OBJECT_DIRECTORIES",
8502
8499
  "GIT_CONFIG",
@@ -8516,7 +8513,7 @@ var LOCAL_GIT_ENVIRONMENT_VARIABLES = [
8516
8513
  ];
8517
8514
  async function captureProcess(command, args, cwd, inherit = false) {
8518
8515
  return await new Promise((resolve6, reject) => {
8519
- const child = spawn3(command, args, {
8516
+ const child = spawn2(command, args, {
8520
8517
  cwd,
8521
8518
  env: withoutParentGitRepository(process.env),
8522
8519
  stdio: inherit ? "inherit" : ["ignore", "pipe", "pipe"]
@@ -8998,15 +8995,6 @@ function isMissing5(error) {
8998
8995
  // src/update/preflight.ts
8999
8996
  async function assertProjectReadyForUpdate(projectDirectory) {
9000
8997
  await assertNoPendingUpdate(projectDirectory);
9001
- await assertGitClean(projectDirectory);
9002
- }
9003
- async function assertGitClean(projectDirectory) {
9004
- const result2 = await captureProcess("git", ["status", "--porcelain"], projectDirectory);
9005
- if (result2.code !== 0)
9006
- throw new Error("\u66F4\u65B0\u8981\u6C42\u5F53\u524D\u76EE\u5F55\u662F\u6709\u6548\u7684 Git \u4ED3\u5E93");
9007
- if (result2.stdout.trim()) {
9008
- 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");
9009
- }
9010
8998
  }
9011
8999
  async function assertNoPendingUpdate(projectDirectory) {
9012
9000
  const root = await resolveProjectRoot(projectDirectory);
@@ -9101,7 +9089,10 @@ var recipes = [
9101
9089
  { id: "starter-0.3.8-to-0.3.9", from: "0.3.8", to: "0.3.9" },
9102
9090
  { id: "starter-0.3.9-to-0.3.10", from: "0.3.9", to: "0.3.10" },
9103
9091
  { id: "starter-0.3.10-to-0.3.11", from: "0.3.10", to: "0.3.11" },
9104
- { id: "starter-0.3.11-to-0.3.12", from: "0.3.11", to: "0.3.12" }
9092
+ { id: "starter-0.3.11-to-0.3.12", from: "0.3.11", to: "0.3.12" },
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" }
9105
9096
  ];
9106
9097
  function resolveRecipeChain(sourceVersion, targetVersion) {
9107
9098
  if (sourceVersion === targetVersion)
@@ -11279,7 +11270,9 @@ async function main() {
11279
11270
  }
11280
11271
  await createProject(await applyInteractiveSelection(options));
11281
11272
  }
11282
- main().catch((error) => {
11273
+ try {
11274
+ await main();
11275
+ } catch (error) {
11283
11276
  console.error(error instanceof Error ? error.message : String(error));
11284
11277
  process.exitCode = 1;
11285
- });
11278
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-windy",
3
- "version": "0.3.12",
3
+ "version": "0.3.15",
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": "e2545e4bb6f80639f12b79ffbdbd16e834bffa77",
4
- "generatorVersion": "0.3.12",
3
+ "templateCommit": "da31c4d38a1db64a5eaaeca914a9afe694d930c3",
4
+ "generatorVersion": "0.3.15",
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