@namewta/speculo 0.2.12 → 0.2.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/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":";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;AAC9C,OAAO,EACL,cAAc,EACd,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AAEtB,SAAS,KAAK;IACZ,OAAO;QACL,QAAQ;QACR,iCAAiC;QACjC,sCAAsC;QACtC,mBAAmB;QACnB,EAAE;QACF,WAAW;QACX,qFAAqF;QACrF,oFAAoF;QACpF,6FAA6F;QAC7F,2EAA2E;QAC3E,uEAAuE;QACvE,EAAE;QACF,UAAU;QACV,8EAA8E;QAC9E,8EAA8E;KAC/E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,WAAmB,EACnB,WAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC;QACb,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAC5B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS,CAC7D,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC;IAE/C,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,kBAAkB,CAAC;IAEvC,IAAI,CAAC;QACH,4DAA4D;QAC5D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACrD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YAED,0CAA0C;YAC1C,MAAM,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAErD,4BAA4B;YAC5B,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpB,OAAO,CAAC,CAAC;YACX,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,IAAI,GAAG,EAAE;gBACjD,WAAW;gBACX,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;aAC1C,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,IAAI,KAAK,MAAM;gBACpB,CAAC,CAAC,yBAAyB,GAAG,MAAM,CAAC,MAAM;gBAC3C,CAAC,CAAC,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAC1C,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,4DAA4D;QAC5D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE;gBAC1C,WAAW;gBACX,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,sCAAsC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;gBACpE,OAAO,CAAC,CAAC;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,OAAO;gBACZ,CAAC,CAAC,4BAA4B,GAAG,MAAM,CAAC,MAAM;gBAC9C,CAAC,CAAC,gCAAgC,GAAG,MAAM,CAAC,MAAM,CACrD,CAAC;YACF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI;oBACzB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,4DAA4D;QAC5D,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAC9E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;gBACvC,WAAW;gBACX,GAAG,EAAE,IAAI;aACV,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -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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"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,25 @@ argument-hint: "下一个会话将用于什么?"
|
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
编写一份交接文档,总结当前对话,使新的 agent
|
|
8
|
+
编写一份交接文档,总结当前对话,使新的 agent 可以继续此工作。
|
|
9
|
+
|
|
10
|
+
## 归档路径
|
|
11
|
+
|
|
12
|
+
报告文件必须写入以下规范路径:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
speculo/.speculo/commands/handoff/<YYYY-MM-DD>-<scope>-<topic>[-NN].md
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
- **<YYYY-MM-DD>** — 使用当前日期。
|
|
19
|
+
- **<scope>** — 工作区、工作流或变更的 scope 标识,使用小写 kebab-case。
|
|
20
|
+
- **<topic>** — 从交接范围或用户主题提取,使用小写 kebab-case;无法判断时使用 `speculo`。
|
|
21
|
+
- **[-NN]** — 同日同 scope 同 topic 的多份报告,从 `-01` 开始递增;仅首份可省略后缀。
|
|
22
|
+
|
|
23
|
+
> [!CAUTION]
|
|
24
|
+
> **禁止**将命令报告写入 `temp/`、系统临时目录或工作区内其他非规范位置。
|
|
25
|
+
|
|
26
|
+
## 内容要求
|
|
9
27
|
|
|
10
28
|
在文档中包含一个"建议 skills"部分,列出建议 agent 调用的 skills。
|
|
11
29
|
|