@chenmk/superflow 0.5.12 → 0.5.14

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 (97) hide show
  1. package/README.md +26 -0
  2. package/README.zh-CN.md +8 -0
  3. package/assets/manifest.json +33 -7
  4. package/assets/review-rules.json +24 -0
  5. package/assets/scripts/superflow-dependency-update-hook.sh +29 -0
  6. package/assets/scripts/superflow-doc-placement-hook.py +38 -0
  7. package/assets/scripts/superflow-java-build-hook.py +178 -0
  8. package/assets/scripts/superflow-java-stop-hook.sh +3 -0
  9. package/assets/scripts/superflow-loop-end-hook.sh +3 -0
  10. package/assets/scripts/superflow-loop-failure-hook.sh +3 -0
  11. package/assets/scripts/superflow-loop-observer.py +149 -0
  12. package/assets/scripts/superflow-sql-sync-hook.py +141 -3
  13. package/assets/scripts/superflow-test-report-lint.py +80 -2
  14. package/assets/skill-registry.json +229 -0
  15. package/assets/skills/openspec-propose/SKILL.md +14 -0
  16. package/assets/skills/superflow-clarify/SKILL.md +23 -1
  17. package/assets/skills/superflow-design/SKILL.md +6 -1
  18. package/assets/skills/superflow-docs/SKILL.md +24 -0
  19. package/assets/skills/superflow-implement/SKILL.md +8 -0
  20. package/assets/skills/superflow-pipeline/SKILL.md +31 -1
  21. package/assets/skills/superflow-pipeline/references/document-review-coverage.md +18 -0
  22. package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +17 -0
  23. package/assets/skills/superflow-pipeline/references/test-execution-template.md +11 -0
  24. package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +8 -2
  25. package/assets/skills/superflow-quick-dev/SKILL.md +44 -0
  26. package/assets/skills/superflow-verify/SKILL.md +45 -1
  27. package/assets/skills-en/openspec-propose/SKILL.md +14 -0
  28. package/assets/skills-en/superflow-clarify/SKILL.md +23 -1
  29. package/assets/skills-en/superflow-design/SKILL.md +6 -1
  30. package/assets/skills-en/superflow-docs/SKILL.md +24 -0
  31. package/assets/skills-en/superflow-implement/SKILL.md +9 -0
  32. package/assets/skills-en/superflow-pipeline/SKILL.md +34 -0
  33. package/assets/skills-en/superflow-pipeline/references/document-review-coverage.md +20 -0
  34. package/assets/skills-en/superflow-pipeline/references/test-execution-template.md +12 -0
  35. package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +8 -2
  36. package/assets/skills-en/superflow-quick-dev/SKILL.md +43 -0
  37. package/assets/skills-en/superflow-verify/SKILL.md +52 -1
  38. package/dist/app/cli.js +98 -0
  39. package/dist/app/cli.js.map +1 -1
  40. package/dist/app/commands/check.js +7 -3
  41. package/dist/app/commands/check.js.map +1 -1
  42. package/dist/app/commands/cleanup-audit.js +13 -0
  43. package/dist/app/commands/cleanup-audit.js.map +1 -0
  44. package/dist/app/commands/context-audit.js +43 -0
  45. package/dist/app/commands/context-audit.js.map +1 -0
  46. package/dist/app/commands/docs-audit.js +11 -0
  47. package/dist/app/commands/docs-audit.js.map +1 -0
  48. package/dist/app/commands/doctor.js +10 -0
  49. package/dist/app/commands/doctor.js.map +1 -1
  50. package/dist/app/commands/hook-migrate.js +25 -0
  51. package/dist/app/commands/hook-migrate.js.map +1 -0
  52. package/dist/app/commands/init.js +9 -19
  53. package/dist/app/commands/init.js.map +1 -1
  54. package/dist/app/commands/map-audit.js +10 -0
  55. package/dist/app/commands/map-audit.js.map +1 -0
  56. package/dist/app/commands/pipeline.js +13 -1
  57. package/dist/app/commands/pipeline.js.map +1 -1
  58. package/dist/app/commands/quick.js +136 -0
  59. package/dist/app/commands/quick.js.map +1 -0
  60. package/dist/app/commands/review-coverage.js +84 -0
  61. package/dist/app/commands/review-coverage.js.map +1 -0
  62. package/dist/app/commands/skill-audit.js +36 -0
  63. package/dist/app/commands/skill-audit.js.map +1 -0
  64. package/dist/app/commands/status.js +108 -7
  65. package/dist/app/commands/status.js.map +1 -1
  66. package/dist/app/commands/update.js +9 -12
  67. package/dist/app/commands/update.js.map +1 -1
  68. package/dist/domains/cleanup-audit.js +38 -0
  69. package/dist/domains/cleanup-audit.js.map +1 -0
  70. package/dist/domains/config/cli-help.js +14 -0
  71. package/dist/domains/config/cli-help.js.map +1 -1
  72. package/dist/domains/config/context.js +13 -10
  73. package/dist/domains/config/context.js.map +1 -1
  74. package/dist/domains/context-audit.js +39 -0
  75. package/dist/domains/context-audit.js.map +1 -0
  76. package/dist/domains/deps.js +18 -8
  77. package/dist/domains/deps.js.map +1 -1
  78. package/dist/domains/docs-audit.js +34 -0
  79. package/dist/domains/docs-audit.js.map +1 -0
  80. package/dist/domains/hook-migration.js +127 -0
  81. package/dist/domains/hook-migration.js.map +1 -0
  82. package/dist/domains/hook.js +76 -2
  83. package/dist/domains/hook.js.map +1 -1
  84. package/dist/domains/managed-work/control.js +56 -2
  85. package/dist/domains/managed-work/control.js.map +1 -1
  86. package/dist/domains/map-audit.js +23 -0
  87. package/dist/domains/map-audit.js.map +1 -0
  88. package/dist/domains/quick-dev/gate.js +91 -0
  89. package/dist/domains/quick-dev/gate.js.map +1 -0
  90. package/dist/domains/review/coverage.js +119 -0
  91. package/dist/domains/review/coverage.js.map +1 -0
  92. package/dist/domains/review/report.js +62 -0
  93. package/dist/domains/review/report.js.map +1 -0
  94. package/dist/domains/skill/registry.js +87 -0
  95. package/dist/domains/skill/registry.js.map +1 -0
  96. package/package.json +1 -1
  97. package/scripts/check-design-principles.mjs +4 -0
@@ -0,0 +1,91 @@
1
+ import { createHash } from "node:crypto";
2
+ const HIGH_RISK_PATTERNS = [
3
+ [/(?:\b(?:api|endpoint|public contract)\b|接口|公共\s*API)/i, "公共接口或 API 契约"],
4
+ [/(?:\b(?:db|database|schema|migration|sql)\b|表|数据库|迁移|索引)/i, "数据库或持久化"],
5
+ [/(?:\b(?:transaction|concurrency|lock)\b|事务|并发|锁)/i, "事务、并发或锁"],
6
+ [/(?:\b(?:auth|authorization|permission|security)\b|鉴权|权限|安全)/i, "安全或权限"],
7
+ [/(?:\b(?:payment|refund|billing)\b|支付|退款|结算)/i, "支付或资金语义"],
8
+ [/(?:\b(?:cross[- ]?module|cross[- ]?service)\b|跨模块|跨服务)/i, "跨模块或跨服务"],
9
+ ];
10
+ export function evaluateQuickGate(input) {
11
+ const reasons = [];
12
+ const target = input.request.trim().replace(/\s+/g, " ").slice(0, 120);
13
+ if (!target)
14
+ reasons.push("目标为空");
15
+ if (input.activeSddChange)
16
+ reasons.push("存在相关在途 SDD 变更");
17
+ if (input.dirtyWorktree)
18
+ reasons.push("工作树不是任务独占");
19
+ if (input.changedFiles.length === 0)
20
+ reasons.push("尚未确认测试 seam 或改动文件");
21
+ if (!input.testSeam?.trim())
22
+ reasons.push("未提供可核查的测试 seam");
23
+ const highRisk = HIGH_RISK_PATTERNS
24
+ .filter(([pattern]) => pattern.test(input.request))
25
+ .map(([, reason]) => reason);
26
+ reasons.push(...highRisk);
27
+ if (input.changedFiles.some((file) => /(?:^|\/)(?:sql|migration|migrations)(?:\/|$)|Mapper\.xml$|Controller\.java$|(?:^|\/)(?:pom\.xml|build\.gradle(?:\.kts)?|application[^/]*\.(?:yml|yaml|properties))$/i
28
+ .test(file))) {
29
+ reasons.push("改动路径触及数据库、公共入口或构建配置");
30
+ }
31
+ if (input.changedFiles.length > 3)
32
+ reasons.push("改动文件超过单一小任务范围");
33
+ const verdict = reasons.length === 0 ? "QUICK" : "STOP";
34
+ return {
35
+ verdict,
36
+ target,
37
+ reasons,
38
+ next: verdict === "QUICK"
39
+ ? "写入 quick spec,用户批准当前磁盘版本后再实施"
40
+ : "停止 Quick;先核实在途变更是否拥有同一行为,再由 superflow-clarify 对齐正式 SDD",
41
+ ...(verdict === "STOP" ? { nextSkill: "superflow-clarify" } : {}),
42
+ };
43
+ }
44
+ export function auditQuickSpec(content) {
45
+ const matched = /^status:\s*(draft|ready-for-dev|in-progress|done)\s*$/m.exec(content)?.[1];
46
+ const status = (matched ?? null);
47
+ const required = [
48
+ "## Intent",
49
+ "## Non-goals",
50
+ "## Current behavior",
51
+ "## Target behavior",
52
+ "## Test seam",
53
+ "## Implementation steps",
54
+ "## Acceptance Criteria",
55
+ "## Risks",
56
+ ];
57
+ const normalized = content
58
+ .replace(/^status:\s*(?:draft|ready-for-dev|in-progress|done)\s*$/m, "status: draft")
59
+ .replace(/^approved-digest:\s*[^\n]*\n?/m, "")
60
+ .replace(/\r\n?/g, "\n")
61
+ .trim();
62
+ const digest = createHash("sha256").update(normalized).digest("hex");
63
+ const approved = /^approved-digest:\s*([a-f0-9]{64})\s*$/m.exec(content)?.[1];
64
+ const errors = [
65
+ ...(status ? [] : ["status must be draft, ready-for-dev, in-progress, or done"]),
66
+ ...required.filter((heading) => !content.includes(heading)).map((heading) => `missing section: ${heading}`),
67
+ ];
68
+ if (!/^baseline:\s*[0-9a-f]{7,40}\s*$/m.test(content)) {
69
+ errors.push("quick spec requires a Git baseline commit");
70
+ }
71
+ for (const [index, heading] of required.entries()) {
72
+ const start = content.indexOf(heading);
73
+ if (start < 0)
74
+ continue;
75
+ const end = index + 1 < required.length
76
+ ? content.indexOf(required[index + 1], start + heading.length)
77
+ : content.length;
78
+ const body = content.slice(start + heading.length, end < 0 ? content.length : end)
79
+ .trim();
80
+ if (!body)
81
+ errors.push(`empty section: ${heading}`);
82
+ }
83
+ if (/\b(?:TODO|TBD)\b|待补充|<[^>]+>/.test(content)) {
84
+ errors.push("quick spec contains a placeholder");
85
+ }
86
+ if (status && status !== "draft" && approved !== digest) {
87
+ errors.push("approved Quick Spec content has changed; return to draft");
88
+ }
89
+ return { ok: errors.length === 0, status, errors, digest };
90
+ }
91
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/domains/quick-dev/gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ const DEFAULT_EXCLUDES = [
2
+ "**/*Test.java",
3
+ "**/*Tests.java",
4
+ "**/src/test/**",
5
+ "**/*.test.js",
6
+ "**/*.test.ts",
7
+ "**/*.spec.js",
8
+ "**/*.spec.ts",
9
+ "**/__tests__/**",
10
+ "**/generated/**",
11
+ "**/node_modules/**",
12
+ "**/target/**",
13
+ "**/build/**",
14
+ ".sdd/**",
15
+ "**/review.md",
16
+ ];
17
+ export function resolveReviewCoverage(changedFiles, rules, options = {}) {
18
+ const files = [];
19
+ const bundles = {};
20
+ const errors = [];
21
+ const seen = new Set();
22
+ const excludes = [...DEFAULT_EXCLUDES, ...(options.excludes ?? [])];
23
+ let included = 0;
24
+ for (const rawPath of changedFiles) {
25
+ const filePath = rawPath.replaceAll("\\", "/");
26
+ if (seen.has(filePath)) {
27
+ errors.push(`duplicate changed file: ${filePath}`);
28
+ }
29
+ seen.add(filePath);
30
+ const excludedBy = excludes.find((pattern) => matchGlob(pattern, filePath));
31
+ if (excludedBy) {
32
+ files.push({
33
+ path: filePath,
34
+ included: false,
35
+ reason: `default exclude: ${excludedBy}`,
36
+ rules: [],
37
+ });
38
+ continue;
39
+ }
40
+ included += 1;
41
+ const bundle = bundleName(filePath);
42
+ const rulesForFile = resolveRules(filePath, rules);
43
+ files.push({
44
+ path: filePath,
45
+ included: true,
46
+ bundle,
47
+ rules: rulesForFile,
48
+ });
49
+ (bundles[bundle] ??= []).push(filePath);
50
+ }
51
+ for (const paths of Object.values(bundles))
52
+ paths.sort();
53
+ const realBundles = Object.fromEntries(Object.entries(bundles).filter(([, paths]) => paths.length > 1));
54
+ return {
55
+ coverage: { total: changedFiles.length, included, excluded: changedFiles.length - included },
56
+ files,
57
+ bundles: realBundles,
58
+ risk: classifyRisk(files),
59
+ errors,
60
+ };
61
+ }
62
+ function classifyRisk(files) {
63
+ const included = files.filter((file) => file.included);
64
+ const highPaths = included.filter((file) => /(?:^|\/)(?:sql|migration|migrations|security|auth)(?:\/|$)|Mapper\.xml$|(?:^|\/)[^/]*Controller\.java$/i
65
+ .test(file.path));
66
+ if (highPaths.length > 0) {
67
+ return {
68
+ tier: "high",
69
+ reasons: highPaths.map((file) => `high-impact path: ${file.path}`),
70
+ };
71
+ }
72
+ if (included.length >= 3) {
73
+ return { tier: "medium", reasons: [`${included.length} included files`] };
74
+ }
75
+ return { tier: "low", reasons: ["small path-scoped diff"] };
76
+ }
77
+ function resolveRules(filePath, rules) {
78
+ const matching = rules.filter((rule) => matchGlob(rule.path, filePath));
79
+ const project = matching.find((rule) => rule.source === "project");
80
+ if (project)
81
+ return [project.rule];
82
+ const user = matching.find((rule) => rule.source === "user");
83
+ if (user)
84
+ return [user.rule];
85
+ return matching.length > 0 ? [matching[0].rule] : [];
86
+ }
87
+ function bundleName(filePath) {
88
+ const parts = filePath.split("/");
89
+ const module = parts[0] === "src" || parts.length === 1 ? "" : `${parts[0]}:`;
90
+ const base = filePath.split("/").pop() ?? filePath;
91
+ return module + base.split(".")[0].replace(/_[a-z]{2}(?:_[A-Z]{2})?$/, "");
92
+ }
93
+ function matchGlob(pattern, filePath) {
94
+ let expression = "";
95
+ for (let i = 0; i < pattern.length; i += 1) {
96
+ const char = pattern[i];
97
+ if (char === "*" && pattern[i + 1] === "*") {
98
+ if (pattern[i + 2] === "/") {
99
+ expression += "(?:.*/)?";
100
+ i += 2;
101
+ }
102
+ else {
103
+ expression += ".*";
104
+ i += 1;
105
+ }
106
+ }
107
+ else if (char === "*") {
108
+ expression += "[^/]*";
109
+ }
110
+ else if (char === "?") {
111
+ expression += "[^/]";
112
+ }
113
+ else {
114
+ expression += /[\\^$|+()[\]{}]/.test(char) ? `\\${char}` : char;
115
+ }
116
+ }
117
+ return new RegExp(`^${expression}$`).test(filePath);
118
+ }
119
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/domains/review/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ const STATES = new Set([
4
+ "DONE", "DONE_WITH_CONCERNS", "BLOCKED", "NEEDS_CONTEXT",
5
+ ]);
6
+ export function auditReviewReport(content, projectRoot) {
7
+ const lines = content.split(/\r?\n/);
8
+ const first = lines.find((line) => line.trim())?.trim() ?? "";
9
+ const state = STATES.has(first)
10
+ ? first
11
+ : null;
12
+ const issues = [];
13
+ if (!state)
14
+ issues.push("reviewer report must start with a four-state marker");
15
+ if (state === "DONE_WITH_CONCERNS" && !/^## Concerns\b/m.test(content)) {
16
+ issues.push("DONE_WITH_CONCERNS requires a Concerns section");
17
+ }
18
+ let findings = 0;
19
+ let inFindings = false;
20
+ for (const line of lines) {
21
+ if (/^## Findings\s*$/.test(line)) {
22
+ inFindings = true;
23
+ continue;
24
+ }
25
+ if (/^## /.test(line))
26
+ inFindings = false;
27
+ if (!inFindings)
28
+ continue;
29
+ if (!/^\s*-\s+/.test(line))
30
+ continue;
31
+ findings += 1;
32
+ const anchor = /(?:^|\s)([^\s:]+):([1-9]\d*)\b/.exec(line);
33
+ if (!anchor || !validAnchor(projectRoot, anchor[1], Number(anchor[2]))) {
34
+ issues.push(`invalid finding anchor: ${line.trim()}`);
35
+ }
36
+ }
37
+ return {
38
+ state,
39
+ eligibleForTriage: state === "DONE" && issues.length === 0,
40
+ findings,
41
+ issues,
42
+ };
43
+ }
44
+ function validAnchor(root, candidate, line) {
45
+ const absolute = path.resolve(root, candidate);
46
+ const relative = path.relative(root, absolute);
47
+ if (relative.startsWith("..") || path.isAbsolute(relative))
48
+ return false;
49
+ try {
50
+ const realRoot = fs.realpathSync(root);
51
+ const realFile = fs.realpathSync(absolute);
52
+ const realRelative = path.relative(realRoot, realFile);
53
+ if (realRelative.startsWith("..") || path.isAbsolute(realRelative))
54
+ return false;
55
+ const content = fs.readFileSync(realFile, "utf8");
56
+ return line <= content.split(/\r?\n/).length;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/domains/review/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ const OWNER_PATTERN = /^[a-z][a-z0-9-]{1,31}$/;
2
+ export function auditSkillRegistry(registry, assets) {
3
+ const errors = [];
4
+ const manifestSkills = unique(registry.skills);
5
+ const contracts = registry.contracts ?? [];
6
+ const byName = new Map();
7
+ for (const contract of contracts) {
8
+ if (!contract || typeof contract.name !== "string") {
9
+ errors.push("contract name is missing");
10
+ continue;
11
+ }
12
+ if (byName.has(contract.name)) {
13
+ errors.push(`duplicate contract: ${contract.name}`);
14
+ continue;
15
+ }
16
+ byName.set(contract.name, contract);
17
+ if (!OWNER_PATTERN.test(contract.owner)) {
18
+ errors.push(`invalid owner for ${contract.name}: ${contract.owner}`);
19
+ }
20
+ if (!nonEmptyList(contract.triggers)) {
21
+ errors.push(`triggers must not be empty: ${contract.name}`);
22
+ }
23
+ if (!nonEmptyList(contract.outputs)) {
24
+ errors.push(`outputs must not be empty: ${contract.name}`);
25
+ }
26
+ if (!Array.isArray(contract.excludes)) {
27
+ errors.push(`excludes must be an array: ${contract.name}`);
28
+ }
29
+ if (!Array.isArray(contract.neighbors)) {
30
+ errors.push(`neighbors must be an array: ${contract.name}`);
31
+ }
32
+ }
33
+ const missingContracts = manifestSkills.filter((name) => !byName.has(name));
34
+ for (const name of missingContracts) {
35
+ errors.push(`missing contract: ${name}`);
36
+ }
37
+ for (const name of byName.keys()) {
38
+ if (!manifestSkills.includes(name)) {
39
+ errors.push(`contract is not in manifest: ${name}`);
40
+ }
41
+ }
42
+ const mirrors = new Set(assets.en ?? []);
43
+ const missingMirrors = manifestSkills.filter((name) => !mirrors.has(name));
44
+ for (const name of missingMirrors) {
45
+ errors.push(`missing English mirror: ${name}`);
46
+ }
47
+ const known = new Set(manifestSkills);
48
+ for (const contract of contracts) {
49
+ for (const neighbor of contract.neighbors ?? []) {
50
+ if (!known.has(neighbor)) {
51
+ errors.push(`${contract.name} references unknown neighbor: ${neighbor}`);
52
+ }
53
+ }
54
+ }
55
+ const triggerOwners = new Map();
56
+ for (const contract of contracts) {
57
+ for (const trigger of contract.triggers ?? []) {
58
+ const normalized = trigger.trim().toLowerCase();
59
+ if (!normalized)
60
+ continue;
61
+ const previous = triggerOwners.get(normalized);
62
+ if (previous && previous !== contract.name) {
63
+ errors.push(`duplicate trigger '${trigger}' shared by ${previous} and ${contract.name}`);
64
+ }
65
+ else {
66
+ triggerOwners.set(normalized, contract.name);
67
+ }
68
+ }
69
+ }
70
+ return {
71
+ ok: errors.length === 0,
72
+ errors,
73
+ stats: {
74
+ manifestSkills: manifestSkills.length,
75
+ contracts: byName.size,
76
+ missingContracts: missingContracts.length,
77
+ missingMirrors: missingMirrors.length,
78
+ },
79
+ };
80
+ }
81
+ function unique(values) {
82
+ return [...new Set(Array.isArray(values) ? values : [])];
83
+ }
84
+ function nonEmptyList(values) {
85
+ return Array.isArray(values) && values.length > 0 && values.every((value) => typeof value === "string" && value.trim().length > 0);
86
+ }
87
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/domains/skill/registry.ts"],"names":[],"mappings":"AA8BA,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C,MAAM,UAAU,kBAAkB,CAChC,QAA4B,EAC5B,MAA2B;IAE3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEhD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,qBAAqB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,+BAA+B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,8BAA8B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,8BAA8B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,+BAA+B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,iCAAiC,QAAQ,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,CAAC,UAAU;gBAAE,SAAS;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,CACT,sBAAsB,OAAO,eAAe,QAAQ,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAC5E,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM;QACN,KAAK,EAAE;YACL,cAAc,EAAE,cAAc,CAAC,MAAM;YACrC,SAAS,EAAE,MAAM,CAAC,IAAI;YACtB,gBAAgB,EAAE,gBAAgB,CAAC,MAAM;YACzC,cAAc,EAAE,cAAc,CAAC,MAAM;SACtC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,MAAgB;IAC9B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,MAAe;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAC/D,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAChE,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chenmk/superflow",
3
- "version": "0.5.12",
3
+ "version": "0.5.14",
4
4
  "description": "SuperBridge Flow workflow CLI for Claude Code and Codex",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -10,6 +10,7 @@ const requirements = new Map([
10
10
  "docs/superflow-cli-design-principles.md",
11
11
  "docs/superflow-cli-evaluation-framework.md",
12
12
  "Codex、Claude",
13
+ "默认采用 ECC 治理",
13
14
  ],
14
15
  ],
15
16
  [
@@ -18,6 +19,7 @@ const requirements = new Map([
18
19
  "docs/superflow-cli-design-principles.md",
19
20
  "docs/superflow-cli-evaluation-framework.md",
20
21
  "docs/managed-work-design-principles.md",
22
+ "默认采用 ECC 治理",
21
23
  ],
22
24
  ],
23
25
  [
@@ -48,6 +50,7 @@ const requirements = new Map([
48
50
  "评价驱动维护",
49
51
  "Codex、Claude",
50
52
  "三个彼此独立但可衔接的入口",
53
+ "ECC 式能力治理",
51
54
  ],
52
55
  ],
53
56
  [
@@ -60,6 +63,7 @@ const requirements = new Map([
60
63
  "Evaluation-Driven Maintenance",
61
64
  "Codex and Claude",
62
65
  "three independent but composable entries",
66
+ "ECC-style capability governance",
63
67
  ],
64
68
  ],
65
69
  [