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
|
-
|
|
137
|
-
Base/Ours/Theirs
|
|
138
|
-
|
|
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`
|
|
150
|
-
|
|
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
|
-
|
|
201
|
-
`doctor --repair`
|
|
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
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
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
|
|
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 =
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
@@ -25,8 +25,9 @@ CAS 写入、验证、Project Lock/受管清单提交和 `doctor --repair` 恢
|
|
|
25
25
|
版本混用。
|
|
26
26
|
|
|
27
27
|
`add` 与 `remove` 是幂等操作:集合已满足时不启动事务。`update` 不改变集合,用当前
|
|
28
|
-
CLI 重建所选模块并应用目录声明的更新 recipe
|
|
29
|
-
|
|
28
|
+
CLI 重建所选模块并应用目录声明的更新 recipe。正式操作只处理计划涉及的文件,不检查
|
|
29
|
+
无关 Git 工作区改动;客户修改过的受管文件或模块 project-owned 扩展点会形成冲突,
|
|
30
|
+
不会被静默覆盖。
|
|
30
31
|
|
|
31
32
|
## 数据处置
|
|
32
33
|
|