@chenmk/superflow 0.2.5 → 0.4.0

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.
Files changed (116) hide show
  1. package/README.md +24 -2
  2. package/README.zh-CN.md +17 -1
  3. package/assets/manifest.json +7 -4
  4. package/assets/prompts/superflow-clarify.md +6 -0
  5. package/assets/prompts/superflow-design.md +3 -0
  6. package/assets/prompts/superflow-docs.md +4 -1
  7. package/assets/prompts/superflow-pipeline.md +8 -0
  8. package/assets/scripts/superflow-archive-command-hook.sh +80 -0
  9. package/assets/scripts/superflow-delivery-check.sh +23 -4
  10. package/assets/scripts/superflow-dependency-update-hook.sh +1 -1
  11. package/assets/scripts/superflow-managed-work-check.mjs +194 -0
  12. package/assets/scripts/superflow-managed-work-guard.sh +103 -0
  13. package/assets/skills/openspec-propose/SKILL.md +11 -0
  14. package/assets/skills/superflow-archive/SKILL.md +5 -0
  15. package/assets/skills/superflow-clarify/SKILL.md +26 -7
  16. package/assets/skills/superflow-design/SKILL.md +38 -7
  17. package/assets/skills/superflow-docs/SKILL.md +27 -0
  18. package/assets/skills/superflow-pipeline/SKILL.md +75 -0
  19. package/assets/skills/superflow-pipeline/references/api-design-template.md +11 -0
  20. package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +27 -0
  21. package/assets/skills/superflow-pipeline/references/document-templates.md +8 -0
  22. package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +29 -1
  23. package/assets/skills/superflow-pipeline/references/managed-work.md +58 -0
  24. package/assets/skills/superflow-pipeline/references/quality-gate.md +3 -0
  25. package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +51 -0
  26. package/assets/skills/superflow-pipeline/references/test-execution-template.md +10 -0
  27. package/assets/skills/superflow-pipeline/scripts/superflow-archive.sh +1 -1
  28. package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +215 -2
  29. package/assets/skills/superflow-verify/SKILL.md +7 -0
  30. package/assets/skills-en/openspec-propose/SKILL.md +14 -0
  31. package/assets/skills-en/superflow-archive/SKILL.md +6 -0
  32. package/assets/skills-en/superflow-clarify/SKILL.md +26 -7
  33. package/assets/skills-en/superflow-design/SKILL.md +38 -6
  34. package/assets/skills-en/superflow-docs/SKILL.md +27 -0
  35. package/assets/skills-en/superflow-pipeline/SKILL.md +76 -0
  36. package/assets/skills-en/superflow-pipeline/references/api-design-template.md +13 -0
  37. package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +16 -0
  38. package/assets/skills-en/superflow-pipeline/references/document-templates.md +5 -0
  39. package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +17 -0
  40. package/assets/skills-en/superflow-pipeline/references/managed-work.md +34 -0
  41. package/assets/skills-en/superflow-pipeline/references/quality-gate.md +25 -0
  42. package/assets/skills-en/superflow-pipeline/references/superpower-technical-design-template.md +57 -0
  43. package/assets/skills-en/superflow-pipeline/references/test-execution-template.md +12 -0
  44. package/assets/skills-en/superflow-pipeline/scripts/superflow-archive.sh +1 -1
  45. package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +214 -2
  46. package/assets/skills-en/superflow-verify/SKILL.md +8 -0
  47. package/dist/app/cli.js +120 -102
  48. package/dist/app/cli.js.map +1 -1
  49. package/dist/app/commands/archive.js +7 -3
  50. package/dist/app/commands/archive.js.map +1 -1
  51. package/dist/app/commands/change-guard.js +27 -0
  52. package/dist/app/commands/change-guard.js.map +1 -0
  53. package/dist/app/commands/design.js +2 -20
  54. package/dist/app/commands/design.js.map +1 -1
  55. package/dist/app/commands/init.js +7 -7
  56. package/dist/app/commands/init.js.map +1 -1
  57. package/dist/app/commands/managed-service.js +5 -0
  58. package/dist/app/commands/managed-service.js.map +1 -0
  59. package/dist/app/commands/pipeline.js +123 -3
  60. package/dist/app/commands/pipeline.js.map +1 -1
  61. package/dist/app/commands/status.js +199 -77
  62. package/dist/app/commands/status.js.map +1 -1
  63. package/dist/app/commands/uninstall.js +5 -2
  64. package/dist/app/commands/uninstall.js.map +1 -1
  65. package/dist/app/commands/update.js +33 -11
  66. package/dist/app/commands/update.js.map +1 -1
  67. package/dist/app/commands/verify.js +7 -3
  68. package/dist/app/commands/verify.js.map +1 -1
  69. package/dist/domains/config/cli-help.js +103 -73
  70. package/dist/domains/config/cli-help.js.map +1 -1
  71. package/dist/domains/config/context.js +1 -5
  72. package/dist/domains/config/context.js.map +1 -1
  73. package/dist/domains/deps.js +3 -6
  74. package/dist/domains/deps.js.map +1 -1
  75. package/dist/domains/hook.js +71 -37
  76. package/dist/domains/hook.js.map +1 -1
  77. package/dist/domains/managed-work/contract.js +218 -0
  78. package/dist/domains/managed-work/contract.js.map +1 -0
  79. package/dist/domains/managed-work/i18n.js +12 -0
  80. package/dist/domains/managed-work/i18n.js.map +1 -0
  81. package/dist/domains/managed-work/input.js +111 -0
  82. package/dist/domains/managed-work/input.js.map +1 -0
  83. package/dist/domains/managed-work/journal.js +122 -0
  84. package/dist/domains/managed-work/journal.js.map +1 -0
  85. package/dist/domains/managed-work/lock.js +40 -0
  86. package/dist/domains/managed-work/lock.js.map +1 -0
  87. package/dist/domains/managed-work/notifications.js +53 -0
  88. package/dist/domains/managed-work/notifications.js.map +1 -0
  89. package/dist/domains/managed-work/paths.js +18 -0
  90. package/dist/domains/managed-work/paths.js.map +1 -0
  91. package/dist/domains/managed-work/prompts.js +218 -0
  92. package/dist/domains/managed-work/prompts.js.map +1 -0
  93. package/dist/domains/managed-work/runner.js +626 -0
  94. package/dist/domains/managed-work/runner.js.map +1 -0
  95. package/dist/domains/managed-work/schemas.js +85 -0
  96. package/dist/domains/managed-work/schemas.js.map +1 -0
  97. package/dist/domains/managed-work/service.js +121 -0
  98. package/dist/domains/managed-work/service.js.map +1 -0
  99. package/dist/domains/managed-work/state.js +90 -0
  100. package/dist/domains/managed-work/state.js.map +1 -0
  101. package/dist/domains/managed-work/storage.js +181 -0
  102. package/dist/domains/managed-work/storage.js.map +1 -0
  103. package/dist/domains/managed-work/types.js +16 -0
  104. package/dist/domains/managed-work/types.js.map +1 -0
  105. package/dist/domains/managed-work/wait.js +40 -0
  106. package/dist/domains/managed-work/wait.js.map +1 -0
  107. package/dist/platform/agent-process.js +308 -0
  108. package/dist/platform/agent-process.js.map +1 -0
  109. package/dist/platform/assets.js +9 -0
  110. package/dist/platform/assets.js.map +1 -0
  111. package/dist/platform/process-liveness.js +10 -0
  112. package/dist/platform/process-liveness.js.map +1 -0
  113. package/dist/platform/version-check.js +30 -9
  114. package/dist/platform/version-check.js.map +1 -1
  115. package/package.json +3 -2
  116. package/scripts/release-notes-check.js +102 -0
@@ -0,0 +1,308 @@
1
+ import { existsSync, readFileSync, unlinkSync } from "fs";
2
+ import path from "path";
3
+ import spawn from "cross-spawn";
4
+ import { managedText } from "../domains/managed-work/i18n.js";
5
+ export class LocalAgentInvoker {
6
+ async invoke(invocation) {
7
+ return runAgentProcess(invocation);
8
+ }
9
+ }
10
+ export function buildAgentCommand(invocation) {
11
+ if (invocation.agent === "codex")
12
+ return buildCodexCommand(invocation);
13
+ return buildClaudeCommand(invocation);
14
+ }
15
+ async function runAgentProcess(invocation) {
16
+ const command = buildAgentCommand(invocation);
17
+ if (command.outputFile && existsSync(command.outputFile))
18
+ unlinkSync(command.outputFile);
19
+ return new Promise((resolve, reject) => {
20
+ const child = spawn(command.command, command.args, {
21
+ cwd: invocation.projectRoot,
22
+ env: {
23
+ ...process.env,
24
+ SUPERFLOW_MANAGED_TASK_ID: invocation.taskId,
25
+ SUPERFLOW_MANAGED_RUN_ID: invocation.runId,
26
+ SUPERFLOW_MANAGED_ROLE: invocation.role,
27
+ SUPERFLOW_MANAGED_PROJECT_ROOT: invocation.projectRoot,
28
+ },
29
+ detached: process.platform !== "win32",
30
+ stdio: ["pipe", "pipe", "pipe"],
31
+ shell: false,
32
+ });
33
+ let stdout = "";
34
+ let stderr = "";
35
+ let lineBuffer = "";
36
+ let sessionId = invocation.sessionId;
37
+ let lastOutputAt = Date.now();
38
+ let finished = false;
39
+ const warningTimer = setTimeout(() => {
40
+ invocation.onProgress?.(managedText(invocation.language, "连续一段时间没有新进展,后台仍在观察进程", "No new progress for a while; the background service is still observing the process"));
41
+ }, invocation.timeout.warningMs);
42
+ let stalledTimer = setTimeout(onStalled, invocation.timeout.stalledMs);
43
+ const hardTimer = setTimeout(() => {
44
+ stopChild(child.pid);
45
+ finishError(new Error(managedText(invocation.language, `单次 Agent 调用超过 ${invocation.timeout.hardMs}ms`, `Single Agent invocation exceeded ${invocation.timeout.hardMs}ms`)));
46
+ }, invocation.timeout.hardMs);
47
+ if (invocation.sessionId)
48
+ invocation.onSession?.(invocation.sessionId);
49
+ child.stdout?.on("data", (chunk) => {
50
+ const text = chunk.toString();
51
+ stdout += text;
52
+ lastOutputAt = Date.now();
53
+ clearTimeout(stalledTimer);
54
+ stalledTimer = setTimeout(onStalled, invocation.timeout.stalledMs);
55
+ lineBuffer += text;
56
+ const lines = lineBuffer.split(/\r?\n/);
57
+ lineBuffer = lines.pop() ?? "";
58
+ for (const line of lines) {
59
+ const event = safeJson(line);
60
+ const discoveredSession = extractSessionId(event);
61
+ if (!sessionId && discoveredSession) {
62
+ sessionId = discoveredSession;
63
+ invocation.onSession?.(discoveredSession);
64
+ }
65
+ const progress = extractProgress(event);
66
+ if (progress)
67
+ invocation.onProgress?.(progress);
68
+ }
69
+ });
70
+ child.stderr?.on("data", (chunk) => {
71
+ stderr += chunk.toString();
72
+ lastOutputAt = Date.now();
73
+ });
74
+ child.on("error", finishError);
75
+ child.on("close", (code) => {
76
+ if (finished)
77
+ return;
78
+ cleanupTimers();
79
+ finished = true;
80
+ if ((code ?? 1) !== 0) {
81
+ reject(new Error(formatAgentFailure(invocation.agent, code, stdout, stderr, invocation.language)));
82
+ return;
83
+ }
84
+ try {
85
+ const output = extractStructuredOutput(invocation.agent, stdout, command.outputFile, invocation.language);
86
+ const resolvedSession = sessionId ??
87
+ extractSessionFromLines(stdout) ??
88
+ command.initialSessionId;
89
+ if (!resolvedSession)
90
+ throw new Error(managedText(invocation.language, "Agent 输出中缺少可恢复 session ID", "Agent output is missing a resumable session ID"));
91
+ resolve({
92
+ sessionId: resolvedSession,
93
+ output,
94
+ stdout,
95
+ stderr,
96
+ exitCode: code ?? 0,
97
+ });
98
+ }
99
+ catch (error) {
100
+ reject(error);
101
+ }
102
+ });
103
+ child.stdin?.end(invocation.prompt);
104
+ function onStalled() {
105
+ if (Date.now() - lastOutputAt < invocation.timeout.stalledMs)
106
+ return;
107
+ stopChild(child.pid);
108
+ finishError(new Error(managedText(invocation.language, "Agent 长时间没有输出,已保存现场并中断", "Agent produced no output for too long; state was preserved and the process was interrupted")));
109
+ }
110
+ function finishError(error) {
111
+ if (finished)
112
+ return;
113
+ finished = true;
114
+ cleanupTimers();
115
+ reject(error);
116
+ }
117
+ function cleanupTimers() {
118
+ clearTimeout(warningTimer);
119
+ clearTimeout(stalledTimer);
120
+ clearTimeout(hardTimer);
121
+ }
122
+ });
123
+ }
124
+ export function formatAgentFailure(agent, code, stdout, stderr, language) {
125
+ const details = [stderr.trim(), extractFailureFromEvents(stdout)]
126
+ .filter(Boolean)
127
+ .join("\n")
128
+ .slice(-2_000);
129
+ return managedText(language, `${agent} 调用失败,退出码 ${code ?? 1}: ${redactFailure(details) || "未返回错误详情"}`, `${agent} invocation failed with exit code ${code ?? 1}: ${redactFailure(details) || "no error details returned"}`);
130
+ }
131
+ function extractFailureFromEvents(stdout) {
132
+ const lines = stdout.split(/\r?\n/).filter(Boolean);
133
+ const messages = [];
134
+ for (let index = lines.length - 1; index >= 0 && messages.length < 4; index--) {
135
+ const event = safeJson(lines[index]);
136
+ if (!event)
137
+ continue;
138
+ for (const key of ["error", "message", "result", "reason"]) {
139
+ const value = event[key];
140
+ if (typeof value === "string" && value.trim())
141
+ messages.push(value.trim());
142
+ }
143
+ }
144
+ return messages.join("\n");
145
+ }
146
+ function redactFailure(value) {
147
+ return value
148
+ .replace(/(authorization\s*[:=]\s*bearer\s+)[^\s"']+/gi, "$1<redacted>")
149
+ .replace(/(["']?(?:token|password|secret|cookie|api[_-]?key)["']?\s*[:=]\s*["']?)[^\s"',}]+/gi, "$1<redacted>");
150
+ }
151
+ function buildCodexCommand(invocation) {
152
+ const outputFile = path.join(path.dirname(invocation.schemaPath), `${invocation.role}-last.json`);
153
+ if (invocation.sessionId) {
154
+ return {
155
+ command: "codex",
156
+ args: [
157
+ "exec",
158
+ "resume",
159
+ invocation.sessionId,
160
+ "--json",
161
+ "--output-schema",
162
+ invocation.schemaPath,
163
+ "-o",
164
+ outputFile,
165
+ "-",
166
+ ],
167
+ outputFile,
168
+ initialSessionId: invocation.sessionId,
169
+ };
170
+ }
171
+ const additionalRoots = invocation.writableRoots.flatMap((root) => [
172
+ "--add-dir",
173
+ root,
174
+ ]);
175
+ return {
176
+ command: "codex",
177
+ args: [
178
+ "exec",
179
+ "-C",
180
+ invocation.projectRoot,
181
+ "--sandbox",
182
+ invocation.role === "supervisor" ? "read-only" : "workspace-write",
183
+ ...additionalRoots,
184
+ "--json",
185
+ "--output-schema",
186
+ invocation.schemaPath,
187
+ "-o",
188
+ outputFile,
189
+ "-",
190
+ ],
191
+ outputFile,
192
+ initialSessionId: null,
193
+ };
194
+ }
195
+ function buildClaudeCommand(invocation) {
196
+ const schema = readFileSync(invocation.schemaPath, "utf-8");
197
+ const args = ["-p"];
198
+ let initialSessionId = invocation.sessionId;
199
+ if (invocation.sessionId)
200
+ args.push("--resume", invocation.sessionId);
201
+ else {
202
+ initialSessionId = cryptoRandomUuid();
203
+ args.push("--session-id", initialSessionId);
204
+ }
205
+ args.push("--output-format", "stream-json", "--verbose", "--json-schema", schema, "--permission-mode", invocation.role === "supervisor" ? "plan" : "auto");
206
+ for (const root of invocation.writableRoots)
207
+ args.push("--add-dir", root);
208
+ return { command: "claude", args, outputFile: null, initialSessionId };
209
+ }
210
+ function extractStructuredOutput(agent, stdout, outputFile, language) {
211
+ if (agent === "codex" && outputFile && existsSync(outputFile)) {
212
+ return parseStructuredValue(readFileSync(outputFile, "utf-8"), language);
213
+ }
214
+ const events = stdout.split(/\r?\n/).map(safeJson).filter(Boolean);
215
+ for (let index = events.length - 1; index >= 0; index--) {
216
+ const event = events[index];
217
+ for (const key of ["structured_output", "structuredOutput", "result"]) {
218
+ if (event[key] !== undefined)
219
+ return parseStructuredValue(event[key], language);
220
+ }
221
+ }
222
+ return parseStructuredValue(stdout, language);
223
+ }
224
+ function parseStructuredValue(value, language) {
225
+ if (typeof value === "object" && value !== null)
226
+ return value;
227
+ if (typeof value !== "string") {
228
+ throw new Error(managedText(language, "Agent 未返回结构化结果", "Agent did not return structured output"));
229
+ }
230
+ const trimmed = value.trim();
231
+ try {
232
+ return JSON.parse(trimmed);
233
+ }
234
+ catch {
235
+ const match = trimmed.match(/\{[\s\S]*\}/);
236
+ if (!match) {
237
+ throw new Error(managedText(language, "Agent 最终输出不是 JSON", "Agent final output is not JSON"));
238
+ }
239
+ return JSON.parse(match[0]);
240
+ }
241
+ }
242
+ function extractSessionFromLines(stdout) {
243
+ for (const line of stdout.split(/\r?\n/)) {
244
+ const sessionId = extractSessionId(safeJson(line));
245
+ if (sessionId)
246
+ return sessionId;
247
+ }
248
+ return null;
249
+ }
250
+ function extractSessionId(value) {
251
+ if (!value || typeof value !== "object")
252
+ return null;
253
+ const object = value;
254
+ for (const key of ["session_id", "sessionId", "thread_id", "threadId"]) {
255
+ if (typeof object[key] === "string" && isUuid(object[key]))
256
+ return object[key];
257
+ }
258
+ for (const child of Object.values(object)) {
259
+ const nested = extractSessionId(child);
260
+ if (nested)
261
+ return nested;
262
+ }
263
+ return null;
264
+ }
265
+ function extractProgress(value) {
266
+ if (!value || typeof value !== "object")
267
+ return null;
268
+ const object = value;
269
+ for (const key of ["message", "summary", "text"]) {
270
+ if (typeof object[key] === "string" && object[key].length > 0) {
271
+ return object[key].slice(0, 240);
272
+ }
273
+ }
274
+ return null;
275
+ }
276
+ function safeJson(value) {
277
+ try {
278
+ return JSON.parse(value);
279
+ }
280
+ catch {
281
+ return null;
282
+ }
283
+ }
284
+ function stopChild(pid) {
285
+ if (!pid)
286
+ return;
287
+ try {
288
+ if (process.platform === "win32")
289
+ process.kill(pid, "SIGTERM");
290
+ else
291
+ process.kill(-pid, "SIGTERM");
292
+ }
293
+ catch {
294
+ try {
295
+ process.kill(pid, "SIGTERM");
296
+ }
297
+ catch {
298
+ // Process already exited.
299
+ }
300
+ }
301
+ }
302
+ function isUuid(value) {
303
+ return (typeof value === "string" && /^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(value));
304
+ }
305
+ function cryptoRandomUuid() {
306
+ return globalThis.crypto.randomUUID();
307
+ }
308
+ //# sourceMappingURL=agent-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-process.js","sourceRoot":"","sources":["../../src/platform/agent-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ const __filename = fileURLToPath(import.meta.url);
4
+ const __dirname = path.dirname(__filename);
5
+ // src/platform/assets.ts and dist/platform/assets.js are both two levels
6
+ // below the package root.
7
+ export const PACKAGE_ROOT = path.resolve(__dirname, '..', '..');
8
+ export const ASSETS_DIR = path.join(PACKAGE_ROOT, 'assets');
9
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/platform/assets.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,yEAAyE;AACzE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export function isProcessAlive(pid) {
2
+ try {
3
+ process.kill(pid, 0);
4
+ return true;
5
+ }
6
+ catch (error) {
7
+ return error.code === "EPERM";
8
+ }
9
+ }
10
+ //# sourceMappingURL=process-liveness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-liveness.js","sourceRoot":"","sources":["../../src/platform/process-liveness.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAC3D,CAAC;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
- import { runCommand } from './process.js';
2
- const PACKAGE_NAME = '@chenmk/superflow';
1
+ import { runCommand } from "./process.js";
2
+ const PACKAGE_NAME = "@chenmk/superflow";
3
3
  const CHECK_INTERVAL_MS = 1000 * 60 * 60 * 24; // 一天检查一次
4
4
  let lastCheck = 0;
5
5
  let cachedLatest = null;
@@ -9,13 +9,13 @@ let cachedLatest = null;
9
9
  */
10
10
  export async function checkForUpdates(currentVersion) {
11
11
  if (Date.now() - lastCheck < CHECK_INTERVAL_MS && cachedLatest) {
12
- if (cachedLatest !== currentVersion) {
12
+ if (isNewerVersion(cachedLatest, currentVersion)) {
13
13
  printUpdateHint(currentVersion, cachedLatest);
14
14
  }
15
15
  return;
16
16
  }
17
17
  try {
18
- const result = await runCommand('npm', ['view', PACKAGE_NAME, 'version'], {
18
+ const result = await runCommand("npm", ["view", PACKAGE_NAME, "version"], {
19
19
  timeout: 5000,
20
20
  });
21
21
  if (result.code !== 0)
@@ -23,7 +23,7 @@ export async function checkForUpdates(currentVersion) {
23
23
  const latest = result.stdout.trim();
24
24
  lastCheck = Date.now();
25
25
  cachedLatest = latest;
26
- if (latest !== currentVersion) {
26
+ if (isNewerVersion(latest, currentVersion)) {
27
27
  printUpdateHint(currentVersion, latest);
28
28
  }
29
29
  }
@@ -31,15 +31,36 @@ export async function checkForUpdates(currentVersion) {
31
31
  // npm view failed(无网络、npm 未安装等),静默跳过
32
32
  }
33
33
  }
34
+ export function isNewerVersion(candidate, current) {
35
+ const left = parseVersion(candidate);
36
+ const right = parseVersion(current);
37
+ if (!left || !right)
38
+ return false;
39
+ for (let index = 0; index < 3; index++) {
40
+ if (left[index] !== right[index])
41
+ return left[index] > right[index];
42
+ }
43
+ return left.prerelease === null && right.prerelease !== null;
44
+ }
45
+ function parseVersion(value) {
46
+ const match = value
47
+ .trim()
48
+ .match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([^+]+))?(?:\+.+)?$/);
49
+ if (!match)
50
+ return null;
51
+ const result = [Number(match[1]), Number(match[2]), Number(match[3])];
52
+ result.prerelease = match[4] ?? null;
53
+ return result;
54
+ }
34
55
  function printUpdateHint(current, latest) {
35
56
  // 只在终端输出(stderr 避免干扰 --json 输出)
36
57
  const msg = [
37
- '',
58
+ "",
38
59
  `\x1b[33m⚠ superflow ${latest} 可用(当前 ${current})\x1b[0m`,
39
60
  ` 升级: \x1b[36mnpm install -g ${PACKAGE_NAME}@latest\x1b[0m`,
40
61
  ` 或: \x1b[36msuperflow update --with-package\x1b[0m`,
41
- '',
42
- ].join('\n');
43
- process.stderr.write(msg + '\n');
62
+ "",
63
+ ].join("\n");
64
+ process.stderr.write(msg + "\n");
44
65
  }
45
66
  //# sourceMappingURL=version-check.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/platform/version-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,YAAY,GAAG,mBAAmB,CAAC;AACzC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS;AAExD,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,cAAsB;IAC1D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,iBAAiB,IAAI,YAAY,EAAE,CAAC;QAC/D,IAAI,YAAY,KAAK,cAAc,EAAE,CAAC;YACpC,eAAe,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAChD,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE;YACxE,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,YAAY,GAAG,MAAM,CAAC;QAEtB,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;YAC9B,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,MAAc;IACtD,gCAAgC;IAChC,MAAM,GAAG,GAAG;QACV,EAAE;QACF,wBAAwB,MAAM,UAAU,OAAO,UAAU;QACzD,iCAAiC,YAAY,gBAAgB;QAC7D,sDAAsD;QACtD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/platform/version-check.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chenmk/superflow",
3
- "version": "0.2.5",
3
+ "version": "0.4.0",
4
4
  "description": "SuperBridge Flow workflow CLI for Claude Code, Codex, and OpenCode",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -39,7 +39,8 @@
39
39
  "dev": "tsx watch src/cli/index.ts",
40
40
  "postinstall": "node scripts/postinstall.js",
41
41
  "prepack": "npm run build",
42
- "prepublishOnly": "npm test && npm run build",
42
+ "prepublishOnly": "npm run release:check && npm test && npm run build",
43
+ "release:check": "node scripts/release-notes-check.js",
43
44
  "test": "vitest run",
44
45
  "test:watch": "vitest",
45
46
  "lint": "eslint src/ test/",
@@ -0,0 +1,102 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { readFileSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ function runGit(args, cwd) {
7
+ return execFileSync("git", args, {
8
+ cwd,
9
+ encoding: "utf8",
10
+ stdio: ["ignore", "pipe", "pipe"],
11
+ }).trim();
12
+ }
13
+
14
+ function findPreviousTag(tag, cwd) {
15
+ try {
16
+ return runGit(["describe", "--tags", "--abbrev=0", `${tag}^`], cwd);
17
+ } catch {
18
+ return "";
19
+ }
20
+ }
21
+
22
+ export function validateReleaseMetadata(metadata) {
23
+ const { tag, objectType, subject, body, previousTag } = metadata;
24
+ if (!/^v\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(tag)) {
25
+ throw new Error(`版本标签格式错误:${tag},应使用 vX.Y.Z`);
26
+ }
27
+ if (objectType !== "tag") {
28
+ throw new Error(`版本标签 ${tag} 必须是 annotated tag,不能是轻量标签`);
29
+ }
30
+
31
+ const version = tag.slice(1);
32
+ if (!subject.includes(version)) {
33
+ throw new Error(`标签标题必须包含当前版本 ${version}`);
34
+ }
35
+ if (!body) {
36
+ throw new Error(`标签 ${tag} 缺少版本升级说明`);
37
+ }
38
+ if (!/(升级内容|upgrade from|changes since)/i.test(body)) {
39
+ throw new Error("版本说明必须明确标注“升级内容”或对应英文表述");
40
+ }
41
+
42
+ const requiredSections = [
43
+ ["升级摘要", /^## (升级摘要|Upgrade Summary)$/im],
44
+ ["主要更新", /^## (主要更新|Highlights|What's Changed)$/im],
45
+ ["验证结果", /^## (验证结果|Quality Verification|Validation)$/im],
46
+ ["升级方式", /^## (升级方式|Upgrade)$/im],
47
+ ];
48
+ for (const [label, pattern] of requiredSections) {
49
+ if (!pattern.test(body)) {
50
+ throw new Error(`版本说明缺少“## ${label}”章节`);
51
+ }
52
+ }
53
+ const bulletCount = body.match(/^[-*] .+/gm)?.length ?? 0;
54
+ if (bulletCount < 3) {
55
+ throw new Error("版本说明的主要更新和验证结果至少需要 3 条清晰条目");
56
+ }
57
+
58
+ if (previousTag) {
59
+ const previousVersion = previousTag.replace(/^v/, "");
60
+ if (!body.includes(previousVersion)) {
61
+ throw new Error(`版本说明必须包含上一版本 ${previousVersion}`);
62
+ }
63
+ }
64
+ }
65
+
66
+ export function inspectReleaseTag(tag, cwd = process.cwd()) {
67
+ const ref = `refs/tags/${tag}`;
68
+ const metadata = {
69
+ tag,
70
+ objectType: runGit(["cat-file", "-t", ref], cwd),
71
+ subject: runGit(["for-each-ref", ref, "--format=%(contents:subject)"], cwd),
72
+ body: runGit(["for-each-ref", ref, "--format=%(contents:body)"], cwd),
73
+ previousTag: findPreviousTag(tag, cwd),
74
+ };
75
+ validateReleaseMetadata(metadata);
76
+ return metadata;
77
+ }
78
+
79
+ function currentPackageTag() {
80
+ const packageJson = JSON.parse(
81
+ readFileSync(new URL("../package.json", import.meta.url), "utf8"),
82
+ );
83
+ return `v${packageJson.version}`;
84
+ }
85
+
86
+ function main() {
87
+ const tag = process.argv[2] ?? currentPackageTag();
88
+ const metadata = inspectReleaseTag(tag);
89
+ const from = metadata.previousTag || "首个版本";
90
+ process.stdout.write(`版本发布说明校验通过:${from} → ${tag}\n`);
91
+ }
92
+
93
+ const entryPath = process.argv[1] ? path.resolve(process.argv[1]) : "";
94
+ if (entryPath === fileURLToPath(import.meta.url)) {
95
+ try {
96
+ main();
97
+ } catch (error) {
98
+ const message = error instanceof Error ? error.message : String(error);
99
+ process.stderr.write(`版本发布说明校验失败:${message}\n`);
100
+ process.exitCode = 1;
101
+ }
102
+ }