@namewta/speculo 0.2.12 → 0.2.13
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/dist/src/cli.js +43 -5
- package/dist/src/cli.js.map +1 -1
- package/dist/src/version.d.ts +10 -0
- package/dist/src/version.js +87 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +1 -1
package/dist/src/cli.js
CHANGED
|
@@ -3,31 +3,52 @@ import { dirname, resolve } from "node:path";
|
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { initSpeculo } from "./index.js";
|
|
5
5
|
import { migrateSpeculo } from "./migrate.js";
|
|
6
|
+
import { checkForUpdate, formatVersionBanner, } from "./version.js";
|
|
6
7
|
function usage() {
|
|
7
8
|
return [
|
|
8
9
|
"Usage:",
|
|
9
10
|
" speculo init [--all] [target]",
|
|
10
11
|
" speculo migrate [--apply] [target]",
|
|
12
|
+
" speculo version",
|
|
11
13
|
"",
|
|
12
14
|
"Commands:",
|
|
13
15
|
" init Install or refresh Speculo core assets and selected workflow packages.",
|
|
14
16
|
" Existing workflow state under speculo/.speculo/ is never overwritten.",
|
|
15
17
|
" migrate Preview migration from v2 or transitional v3 state to the current v3 contract.",
|
|
16
18
|
" Pass --apply to perform the staged, rollback-safe migration.",
|
|
19
|
+
" version Print the current Speculo version and check for updates.",
|
|
17
20
|
"",
|
|
18
21
|
"Options:",
|
|
19
22
|
" --all Select every workflow and fully refresh all assets during init.",
|
|
20
23
|
" --apply Apply a migration; without this flag migrate is always dry-run.",
|
|
21
24
|
].join("\n");
|
|
22
25
|
}
|
|
26
|
+
function isInteractive() {
|
|
27
|
+
return process.stdin.isTTY === true;
|
|
28
|
+
}
|
|
29
|
+
async function showVersionWithCheck(packageRoot, packageName) {
|
|
30
|
+
const info = await checkForUpdate(packageRoot, packageName);
|
|
31
|
+
console.log(formatVersionBanner(info));
|
|
32
|
+
return info;
|
|
33
|
+
}
|
|
34
|
+
async function confirmContinue() {
|
|
35
|
+
if (!isInteractive()) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
const { confirm } = await import("@inquirer/prompts");
|
|
39
|
+
return confirm({
|
|
40
|
+
message: "是否继续运行 speculo init?",
|
|
41
|
+
default: true,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
23
44
|
async function main(argv) {
|
|
24
45
|
const allFlag = argv.includes("--all");
|
|
25
46
|
const applyFlag = argv.includes("--apply");
|
|
26
47
|
const positional = argv.filter((argument) => argument !== "--all" && argument !== "--apply");
|
|
27
48
|
const [command, targetArg, extra] = positional;
|
|
28
|
-
if (
|
|
49
|
+
if (command === "--help" || command === "-h") {
|
|
29
50
|
console.log(usage());
|
|
30
|
-
return
|
|
51
|
+
return 0;
|
|
31
52
|
}
|
|
32
53
|
if (extra) {
|
|
33
54
|
console.error("Unexpected argument: " + extra);
|
|
@@ -36,14 +57,29 @@ async function main(argv) {
|
|
|
36
57
|
}
|
|
37
58
|
const target = resolve(targetArg ?? ".");
|
|
38
59
|
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
60
|
+
const packageName = "@namewta/speculo";
|
|
39
61
|
try {
|
|
40
|
-
|
|
62
|
+
// ── version ──────────────────────────────────────────────
|
|
63
|
+
if (command === "version") {
|
|
64
|
+
await showVersionWithCheck(packageRoot, packageName);
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
// ── init (or no command → default to init) ───────────────
|
|
68
|
+
if (!command || command === "init") {
|
|
41
69
|
if (applyFlag) {
|
|
42
70
|
throw new Error("--apply is only valid with `speculo migrate`.");
|
|
43
71
|
}
|
|
44
|
-
|
|
72
|
+
// Show version info and check for updates
|
|
73
|
+
await showVersionWithCheck(packageRoot, packageName);
|
|
74
|
+
// Confirm before proceeding
|
|
75
|
+
const proceed = await confirmContinue();
|
|
76
|
+
if (!proceed) {
|
|
77
|
+
console.log("已取消。");
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
const result = await initSpeculo(targetArg ?? ".", {
|
|
45
81
|
packageRoot,
|
|
46
|
-
all: allFlag,
|
|
82
|
+
all: command === "init" ? allFlag : false,
|
|
47
83
|
});
|
|
48
84
|
console.log(result.mode === "init"
|
|
49
85
|
? "Speculo initialized in " + result.target
|
|
@@ -53,6 +89,7 @@ async function main(argv) {
|
|
|
53
89
|
}
|
|
54
90
|
return 0;
|
|
55
91
|
}
|
|
92
|
+
// ── migrate ──────────────────────────────────────────────
|
|
56
93
|
if (command === "migrate") {
|
|
57
94
|
if (allFlag) {
|
|
58
95
|
throw new Error("--all is only valid with `speculo init`.");
|
|
@@ -79,6 +116,7 @@ async function main(argv) {
|
|
|
79
116
|
}
|
|
80
117
|
return 0;
|
|
81
118
|
}
|
|
119
|
+
// ── update (deprecated) ──────────────────────────────────
|
|
82
120
|
if (command === "update") {
|
|
83
121
|
console.error("Warning: `speculo update` is deprecated. Use `speculo init`.");
|
|
84
122
|
const result = await initSpeculo(target, {
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type VersionInfo = {
|
|
2
|
+
local: string;
|
|
3
|
+
latest: string | null;
|
|
4
|
+
isOutdated: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function isLocalOutdated(local: string, latest: string): boolean;
|
|
7
|
+
export declare function getLocalVersion(packageRoot: string): Promise<string>;
|
|
8
|
+
export declare function fetchLatestVersion(packageName: string): Promise<string | null>;
|
|
9
|
+
export declare function checkForUpdate(packageRoot: string, packageName: string): Promise<VersionInfo>;
|
|
10
|
+
export declare function formatVersionBanner(info: VersionInfo): string;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { get } from "node:https";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
function parseVersion(version) {
|
|
5
|
+
return version.split(".").map((part) => {
|
|
6
|
+
const num = parseInt(part, 10);
|
|
7
|
+
return Number.isNaN(num) ? 0 : num;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function isLocalOutdated(local, latest) {
|
|
11
|
+
const localParts = parseVersion(local);
|
|
12
|
+
const latestParts = parseVersion(latest);
|
|
13
|
+
const length = Math.max(localParts.length, latestParts.length);
|
|
14
|
+
for (let index = 0; index < length; index += 1) {
|
|
15
|
+
const left = localParts[index] ?? 0;
|
|
16
|
+
const right = latestParts[index] ?? 0;
|
|
17
|
+
if (right > left)
|
|
18
|
+
return true;
|
|
19
|
+
if (left > right)
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
export async function getLocalVersion(packageRoot) {
|
|
25
|
+
const packagePath = join(packageRoot, "package.json");
|
|
26
|
+
const raw = await readFile(packagePath, "utf8");
|
|
27
|
+
const packageJson = JSON.parse(raw);
|
|
28
|
+
if (!packageJson.version || typeof packageJson.version !== "string") {
|
|
29
|
+
throw new Error("Missing or invalid version in " + packagePath);
|
|
30
|
+
}
|
|
31
|
+
return packageJson.version;
|
|
32
|
+
}
|
|
33
|
+
export async function fetchLatestVersion(packageName) {
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`;
|
|
36
|
+
const request = get(url, { timeout: 5000 }, (response) => {
|
|
37
|
+
if (response.statusCode !== 200) {
|
|
38
|
+
response.resume();
|
|
39
|
+
resolve(null);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
let data = "";
|
|
43
|
+
response.on("data", (chunk) => {
|
|
44
|
+
data += chunk.toString();
|
|
45
|
+
});
|
|
46
|
+
response.on("end", () => {
|
|
47
|
+
try {
|
|
48
|
+
const parsed = JSON.parse(data);
|
|
49
|
+
resolve(parsed.version && typeof parsed.version === "string"
|
|
50
|
+
? parsed.version
|
|
51
|
+
: null);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
resolve(null);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
request.on("error", () => resolve(null));
|
|
59
|
+
request.on("timeout", () => {
|
|
60
|
+
request.destroy();
|
|
61
|
+
resolve(null);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export async function checkForUpdate(packageRoot, packageName) {
|
|
66
|
+
const local = await getLocalVersion(packageRoot);
|
|
67
|
+
const latest = await fetchLatestVersion(packageName);
|
|
68
|
+
const isOutdated = latest !== null && isLocalOutdated(local, latest);
|
|
69
|
+
return { local, latest, isOutdated };
|
|
70
|
+
}
|
|
71
|
+
export function formatVersionBanner(info) {
|
|
72
|
+
const lines = [];
|
|
73
|
+
lines.push("");
|
|
74
|
+
lines.push(" Speculo v" + info.local);
|
|
75
|
+
if (info.latest !== null) {
|
|
76
|
+
if (info.isOutdated) {
|
|
77
|
+
lines.push(" 最新版本: v" + info.latest + "(已有新版本可用!)");
|
|
78
|
+
lines.push(" 升级命令: npm i -g @namewta/speculo@" + info.latest);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
lines.push(" 已是最新版本 ✓");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
lines.push("");
|
|
85
|
+
return lines.join("\n");
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"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"}
|