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
|
-
|
|
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
|
@@ -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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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+
|
|
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
|
-
|
|
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
|
@@ -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
|
|
package/template/package.json
CHANGED
|
@@ -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}":
|
|
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",
|