@chenmk/superflow 0.5.17 → 0.5.18
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 +9 -0
- package/README.zh-CN.md +9 -0
- package/assets/manifest.json +29 -0
- package/assets/scripts/install-sql-pre-commit.sh +54 -39
- package/assets/scripts/superflow-delivery-check.sh +62 -11
- package/assets/scripts/superflow-review-coverage.mjs +133 -1
- package/assets/scripts/superflow-test-report-lint.py +131 -10
- package/assets/skills/superflow-design/SKILL.md +6 -0
- package/assets/skills/superflow-docs/SKILL.md +6 -0
- package/assets/skills/superflow-implement/SKILL.md +6 -0
- package/assets/skills/superflow-pipeline/references/document-review-coverage.md +42 -0
- package/assets/skills/superflow-table-impact-analysis/SKILL.md +6 -0
- package/assets/skills/superflow-verify/SKILL.md +6 -0
- package/assets/skills-en/superflow-design/SKILL.md +6 -0
- package/assets/skills-en/superflow-docs/SKILL.md +6 -0
- package/assets/skills-en/superflow-implement/SKILL.md +6 -0
- package/assets/skills-en/superflow-pipeline/references/document-review-coverage.md +54 -0
- package/assets/skills-en/superflow-table-impact-analysis/SKILL.md +6 -0
- package/assets/skills-en/superflow-verify/SKILL.md +6 -0
- package/dist/app/cli.js +11 -11
- package/dist/app/cli.js.map +1 -1
- package/dist/app/commands/doctor.js +36 -2
- package/dist/app/commands/doctor.js.map +1 -1
- package/dist/app/commands/hook-migrate.js +48 -8
- package/dist/app/commands/hook-migrate.js.map +1 -1
- package/dist/domains/config/cli-help.js +12 -2
- package/dist/domains/config/cli-help.js.map +1 -1
- package/dist/domains/config/manifest.js +1 -1
- package/dist/domains/config/manifest.js.map +1 -1
- package/dist/domains/hook-migration.js +70 -5
- package/dist/domains/hook-migration.js.map +1 -1
- package/dist/domains/hook.js +67 -23
- package/dist/domains/hook.js.map +1 -1
- package/dist/domains/skill/scripts.js +140 -11
- package/dist/domains/skill/scripts.js.map +1 -1
- package/package.json +1 -1
|
@@ -293,6 +293,80 @@ def hashed_file(base: Path, value: str, sha256: str) -> Path:
|
|
|
293
293
|
return file
|
|
294
294
|
|
|
295
295
|
|
|
296
|
+
def json_equal(left, right) -> bool:
|
|
297
|
+
"""JSON numbers are distinct from booleans, recursively at every level."""
|
|
298
|
+
if type(left) in (int, float) and type(right) in (int, float):
|
|
299
|
+
return left == right
|
|
300
|
+
if type(left) is not type(right):
|
|
301
|
+
return False
|
|
302
|
+
if isinstance(left, dict):
|
|
303
|
+
return left.keys() == right.keys() and all(json_equal(left[k], right[k]) for k in left)
|
|
304
|
+
if isinstance(left, list):
|
|
305
|
+
return len(left) == len(right) and all(json_equal(a, b) for a, b in zip(left, right))
|
|
306
|
+
return left == right
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def validate_database_receipt(receipt: dict, event: dict, case: dict,
|
|
310
|
+
entry: dict, coverage: dict, change: Path,
|
|
311
|
+
paths: set) -> None:
|
|
312
|
+
"""Compare frozen database obligations, never infer SQL semantics."""
|
|
313
|
+
layer = case.get("testLayer")
|
|
314
|
+
database = entry.get("database")
|
|
315
|
+
if (entry.get("persistence") or case.get("assertions", {}).get("persistence")) and not database:
|
|
316
|
+
raise ValueError("旧持久化 PASS 缺少数据库合同,应保留为 PARTIAL")
|
|
317
|
+
for key in ("testLayer", "mockBoundary", "database"):
|
|
318
|
+
if not json_equal(event.get(key), receipt.get(key)):
|
|
319
|
+
raise ValueError(f"原始执行输出与凭证 {key} 不一致")
|
|
320
|
+
if layer is not None and receipt.get("testLayer") != layer:
|
|
321
|
+
raise ValueError("testLayer 与冻结合同不一致")
|
|
322
|
+
if database and layer not in {"logic", "sql-binding", "database", "http-entry"}:
|
|
323
|
+
raise ValueError("数据库义务缺少 testLayer,应保留 PARTIAL")
|
|
324
|
+
if layer not in {"database", "http-entry"} or not database:
|
|
325
|
+
return
|
|
326
|
+
if case.get("evidenceKind") != "real" or receipt.get("evidenceKind") != "real":
|
|
327
|
+
raise ValueError("数据库义务必须使用 real 证据")
|
|
328
|
+
actual = receipt.get("database", {})
|
|
329
|
+
for key in ("engine", "major"):
|
|
330
|
+
if not json_equal(actual.get(key), database.get(key)):
|
|
331
|
+
raise ValueError(f"数据库 {key} 与冻结合同不一致;替代引擎不能 PASS")
|
|
332
|
+
boundary = case.get("mockBoundary")
|
|
333
|
+
if not boundary or not json_equal(receipt.get("mockBoundary"), boundary):
|
|
334
|
+
raise ValueError("mockBoundary 与冻结合同不一致")
|
|
335
|
+
if (not isinstance(boundary.get("allowed"), list)
|
|
336
|
+
or not boundary.get("forbidden")
|
|
337
|
+
or set(boundary["allowed"]) & set(boundary["forbidden"])):
|
|
338
|
+
raise ValueError("必测生产链不得 mock")
|
|
339
|
+
statements = case.get("statements")
|
|
340
|
+
if not statements or not json_equal(actual.get("statements"), statements):
|
|
341
|
+
raise ValueError("生产 SQL statement 身份与冻结用例不一致")
|
|
342
|
+
source_index = {s["id"]: s for s in coverage.get("sources", [])}
|
|
343
|
+
refs = database.get("schemaSourceRefs", []) + [s["sourceRef"] for s in statements]
|
|
344
|
+
if not database.get("schemaSourceRefs"):
|
|
345
|
+
raise ValueError("数据库合同缺少 schema 来源")
|
|
346
|
+
for ref in refs:
|
|
347
|
+
source = source_index[ref]
|
|
348
|
+
source_path = hashed_file(change, source["path"], source["sha256"])
|
|
349
|
+
if source_path not in paths:
|
|
350
|
+
raise ValueError("数据库 schema/生产 SQL 来源未纳入执行源码指纹")
|
|
351
|
+
expected = case.get("databaseAssertions")
|
|
352
|
+
assertions = actual.get("assertions")
|
|
353
|
+
if not expected or not isinstance(assertions, list) or len(assertions) != len(expected):
|
|
354
|
+
raise ValueError("缺少冻结数据库数据断言")
|
|
355
|
+
for frozen, observed in zip(expected, assertions):
|
|
356
|
+
if (any(not json_equal(observed.get(k), frozen.get(k)) for k in ("id", "kind", "expected"))
|
|
357
|
+
or "actual" not in observed or observed.get("result") != "PASS"):
|
|
358
|
+
raise ValueError("数据库数据/影响行数/不变断言未达到冻结预期")
|
|
359
|
+
wanted, found = frozen["expected"], observed["actual"]
|
|
360
|
+
if frozen["kind"] == "unchangedRows":
|
|
361
|
+
if (not isinstance(wanted, dict) or not wanted
|
|
362
|
+
or any(not isinstance(row, dict) or not row for row in wanted.values())
|
|
363
|
+
or not isinstance(found, dict) or set(found) != {"before", "after"}
|
|
364
|
+
or not json_equal(found["before"], wanted) or not json_equal(found["after"], wanted)):
|
|
365
|
+
raise ValueError("非目标/旧轮次缺少 keyed before/after 快照或值发生变化")
|
|
366
|
+
elif not json_equal(found, wanted):
|
|
367
|
+
raise ValueError("数据库数据/影响行数/不变断言未达到冻结预期")
|
|
368
|
+
|
|
369
|
+
|
|
296
370
|
def validate_execution_receipt(file: Path, case: dict, coverage: dict, change: Path) -> None:
|
|
297
371
|
receipt = json.loads(file.read_text(encoding="utf-8"))
|
|
298
372
|
if receipt.get("schemaVersion") != "superflow.execution-receipt.v1":
|
|
@@ -325,9 +399,9 @@ def validate_execution_receipt(file: Path, case: dict, coverage: dict, change: P
|
|
|
325
399
|
event = events[0]
|
|
326
400
|
for key in ["caseId", "entryId", "level", "status", "executed", "assertions", "persistence",
|
|
327
401
|
"evidenceKind", "sources", "build", "target"]:
|
|
328
|
-
if event.get(key)
|
|
402
|
+
if not json_equal(event.get(key), receipt.get(key)):
|
|
329
403
|
raise ValueError(f"原始执行输出与凭证 {key} 不一致")
|
|
330
|
-
if event.get("command")
|
|
404
|
+
if not json_equal(event.get("command"), {"argv": command["argv"], "exitCode": command["exitCode"]}):
|
|
331
405
|
raise ValueError("原始执行命令与凭证不一致")
|
|
332
406
|
sources = receipt["sources"]
|
|
333
407
|
if not isinstance(sources, list) or not sources:
|
|
@@ -345,6 +419,7 @@ def validate_execution_receipt(file: Path, case: dict, coverage: dict, change: P
|
|
|
345
419
|
source = source_index[ref]
|
|
346
420
|
if source.get("role") == "code" and (change / source["path"]).resolve() not in paths:
|
|
347
421
|
raise ValueError("执行凭证未覆盖该入口冻结的源码写入链")
|
|
422
|
+
validate_database_receipt(receipt, event, case, entry, coverage, change, paths)
|
|
348
423
|
build = receipt["build"]
|
|
349
424
|
target = receipt["target"]
|
|
350
425
|
fingerprint = hashlib.sha256("\n".join(sorted(source_tokens)).encode()).hexdigest()
|
|
@@ -366,7 +441,7 @@ def validate_execution_receipt(file: Path, case: dict, coverage: dict, change: P
|
|
|
366
441
|
build_events.append(value)
|
|
367
442
|
except ValueError:
|
|
368
443
|
continue
|
|
369
|
-
if len(build_events) != 1 or build_events[0]
|
|
444
|
+
if len(build_events) != 1 or not json_equal(build_events[0], expected_build):
|
|
370
445
|
raise ValueError("构建原始输出未关联当前源码与构建产物")
|
|
371
446
|
if target.get("buildSha256") != build["sha256"]:
|
|
372
447
|
raise ValueError("运行目标不是本次验证的构建产物")
|
|
@@ -383,7 +458,7 @@ def validate_execution_receipt(file: Path, case: dict, coverage: dict, change: P
|
|
|
383
458
|
raise ValueError("缺少冻结响应/状态/禁止副作用断言")
|
|
384
459
|
for assertion in assertions:
|
|
385
460
|
if (assertion.get("result") != "PASS" or "expected" not in assertion
|
|
386
|
-
or "actual" not in assertion or assertion["expected"]
|
|
461
|
+
or "actual" not in assertion or not json_equal(assertion["expected"], assertion["actual"])):
|
|
387
462
|
raise ValueError("断言失败或缺少预期值/实际值")
|
|
388
463
|
expected_writes = case.get("assertions", {}).get("persistence", [])
|
|
389
464
|
writes = receipt.get("persistence", [])
|
|
@@ -391,18 +466,61 @@ def validate_execution_receipt(file: Path, case: dict, coverage: dict, change: P
|
|
|
391
466
|
raise ValueError("缺少持久化字段同业务 ID 的调用前后对照")
|
|
392
467
|
for expected, actual in zip(expected_writes, writes):
|
|
393
468
|
for key in ["id", "table", "field", "expected"]:
|
|
394
|
-
if key not in actual or actual[key]
|
|
469
|
+
if key not in actual or not json_equal(actual[key], expected[key]):
|
|
395
470
|
raise ValueError("持久化断言与冻结字段/预期值不一致")
|
|
396
471
|
before, after = actual["before"], actual["after"]
|
|
397
472
|
if (not before.get("businessId") or before["businessId"] != after.get("businessId")
|
|
398
473
|
or "value" not in before or "value" not in after
|
|
399
|
-
or after["value"]
|
|
474
|
+
or not json_equal(after["value"], expected["expected"])
|
|
400
475
|
or (after["value"] is None and not expected.get("allowNull", False))
|
|
401
476
|
or actual.get("result") != "PASS"):
|
|
402
477
|
raise ValueError("持久化值未达到预期;结构存在/全 NULL/跨业务 ID 不能替代写入")
|
|
403
478
|
|
|
404
479
|
|
|
405
|
-
def
|
|
480
|
+
def check_git_index_files(root: Path, files: list[Path]) -> None:
|
|
481
|
+
"""Compare version-controlled dependencies with the actual commit snapshot.
|
|
482
|
+
|
|
483
|
+
Untracked/ignored local evidence may remain private. This does not require
|
|
484
|
+
publishing logs, and does not replace review of source/build applicability.
|
|
485
|
+
"""
|
|
486
|
+
root = root.resolve()
|
|
487
|
+
for file in set(files):
|
|
488
|
+
file = file.resolve()
|
|
489
|
+
try:
|
|
490
|
+
relative = file.relative_to(root).as_posix()
|
|
491
|
+
except ValueError:
|
|
492
|
+
continue
|
|
493
|
+
tracked = subprocess.run(["git", "-C", str(root), "ls-files", "--error-unmatch", "--", relative],
|
|
494
|
+
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
495
|
+
if tracked.returncode:
|
|
496
|
+
previous = subprocess.run(["git", "-C", str(root), "cat-file", "-e", "HEAD:" + relative],
|
|
497
|
+
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
498
|
+
if previous.returncode:
|
|
499
|
+
continue
|
|
500
|
+
indexed = subprocess.run(["git", "-C", str(root), "rev-parse", ":" + relative], capture_output=True)
|
|
501
|
+
working = subprocess.run(["git", "-C", str(root), "hash-object", "--path=" + relative, "--stdin"],
|
|
502
|
+
input=file.read_bytes(), capture_output=True)
|
|
503
|
+
if indexed.returncode or working.returncode or indexed.stdout.strip() != working.stdout.strip():
|
|
504
|
+
raise ValueError(f"Git index 与报告依赖工作树不一致:{relative};请暂存已验证快照")
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
def check_receipt_index(file: Path, report: Path, review: Path, root: Path) -> None:
|
|
508
|
+
receipt = json.loads(file.read_text())
|
|
509
|
+
dependencies = [file, report, review]
|
|
510
|
+
command = receipt["command"]
|
|
511
|
+
build = receipt["build"]
|
|
512
|
+
dependencies.extend((file.parent / value).resolve() for value in
|
|
513
|
+
[command["output"], build["artifact"], build["command"]["output"]])
|
|
514
|
+
dependencies.extend((file.parent / source["path"]).resolve() for source in receipt["sources"])
|
|
515
|
+
coverage = json.loads(review.read_text())["coverage"]
|
|
516
|
+
dependencies.extend((report.parent / source["path"]).resolve() for source in coverage.get("sources", []))
|
|
517
|
+
tests = infer_tests_path(report)
|
|
518
|
+
if tests is not None:
|
|
519
|
+
dependencies.append(tests)
|
|
520
|
+
check_git_index_files(root, dependencies)
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
def lint_case_evidence(report_path: Path, report_text: str, review_path: Path, index_root: Path | None = None) -> list[Issue]:
|
|
406
524
|
"""Check the frozen R/E/C index against per-case execution receipts."""
|
|
407
525
|
issues: list[Issue] = []
|
|
408
526
|
try:
|
|
@@ -458,6 +576,8 @@ def lint_case_evidence(report_path: Path, report_text: str, review_path: Path) -
|
|
|
458
576
|
try:
|
|
459
577
|
evidence_file = verified_file(report_path.parent, evidence.split("#", 1)[0])
|
|
460
578
|
validate_execution_receipt(evidence_file, case or {}, coverage, report_path.parent)
|
|
579
|
+
if index_root is not None:
|
|
580
|
+
check_receipt_index(evidence_file, report_path, review_path, index_root)
|
|
461
581
|
except (OSError, ValueError, KeyError, TypeError, AttributeError) as error:
|
|
462
582
|
issues.append(Issue("FAIL", report_path, 0, f"用例 {case_id} 的通过证据不可验证:{error}"))
|
|
463
583
|
if result != "PASS" and final_report_result(report_text) == "PASS":
|
|
@@ -483,7 +603,7 @@ def infer_tests_path(report: Path) -> Path | None:
|
|
|
483
603
|
|
|
484
604
|
|
|
485
605
|
def lint_report(path: Path, repo: Path | None, tests_path: Path | None = None,
|
|
486
|
-
review_path: Path | None = None) -> list[Issue]:
|
|
606
|
+
review_path: Path | None = None, index_root: Path | None = None) -> list[Issue]:
|
|
487
607
|
issues: list[Issue] = []
|
|
488
608
|
text = path.read_text(encoding="utf-8", errors="replace")
|
|
489
609
|
lines = text.splitlines()
|
|
@@ -500,7 +620,7 @@ def lint_report(path: Path, repo: Path | None, tests_path: Path | None = None,
|
|
|
500
620
|
if full and review_path is None:
|
|
501
621
|
issues.append(Issue("FAIL", path, 0, "完整 SDD 缺少冻结入口评审凭证,不能以旧关键词报告交付"))
|
|
502
622
|
if review_path is not None:
|
|
503
|
-
issues.extend(lint_case_evidence(path, text, review_path))
|
|
623
|
+
issues.extend(lint_case_evidence(path, text, review_path, index_root))
|
|
504
624
|
else:
|
|
505
625
|
issues.extend(lint_against_tests_contract(path, text, tests_path or infer_tests_path(path)))
|
|
506
626
|
|
|
@@ -622,6 +742,7 @@ def main() -> int:
|
|
|
622
742
|
parser.add_argument("--tests", default="")
|
|
623
743
|
parser.add_argument("--review", default="")
|
|
624
744
|
parser.add_argument("--repo-root", default="")
|
|
745
|
+
parser.add_argument("--git-index-root", default="")
|
|
625
746
|
parser.add_argument("--require-complete", action="store_true")
|
|
626
747
|
parser.add_argument("--warn-only", action="store_true")
|
|
627
748
|
args = parser.parse_args()
|
|
@@ -637,7 +758,7 @@ def main() -> int:
|
|
|
637
758
|
if tests_path is not None and not tests_path.exists():
|
|
638
759
|
all_issues.append(Issue("FAIL", path, 0, f"显式指定的 tests.md 不存在:{tests_path}"))
|
|
639
760
|
review_path = Path(args.review).resolve() if args.review else None
|
|
640
|
-
all_issues.extend(lint_report(path, repo, tests_path, review_path))
|
|
761
|
+
all_issues.extend(lint_report(path, repo, tests_path, review_path, Path(args.git_index_root) if args.git_index_root else None))
|
|
641
762
|
if args.require_complete:
|
|
642
763
|
text = path.read_text(encoding="utf-8")
|
|
643
764
|
if final_report_result(text) != "PASS":
|
|
@@ -169,3 +169,9 @@ Impact` and prove writers, readers, filters, derived sync paths, consumers,
|
|
|
169
169
|
Do not continue to `$superflow-implement` until the design guard passes. The next
|
|
170
170
|
phase may generate prompts, but this phase must not skip any required SDD
|
|
171
171
|
contract document or replace API/DB/tests with Superpowers prose.
|
|
172
|
+
|
|
173
|
+
### 数据库分层证据
|
|
174
|
+
|
|
175
|
+
按 [数据库合同](../superflow-pipeline/references/document-review-coverage.md#数据库分层合同)
|
|
176
|
+
冻结并继承 `testLayer`、entry.database、生产 statement、mockBoundary 和数据断言。
|
|
177
|
+
确定 schema 来源、引擎主版本、生产 Service/Mapper 边界、影响行数和非目标/旧轮次隔离断言。
|
|
@@ -489,3 +489,9 @@ technical design before prompt splitting or coding orchestration.
|
|
|
489
489
|
|
|
490
490
|
|
|
491
491
|
逐用例 PASS 必须提供可重放本地执行凭证;冻结服务/入口、源码写入链与持久化前后值断言。沿用 pipeline/references/document-review-coverage.md 的 execution-receipt.v1 合同,旧证据保留 PARTIAL;独立评审核对精确 Mapper statement 与原始输出,完整交付运行当前安装的 lint --require-complete。哈希不等同防伪或业务充分性。
|
|
492
|
+
|
|
493
|
+
### 数据库分层证据
|
|
494
|
+
|
|
495
|
+
按 [数据库合同](../superflow-pipeline/references/document-review-coverage.md#数据库分层合同)
|
|
496
|
+
冻结并继承 `testLayer`、entry.database、生产 statement、mockBoundary 和数据断言。
|
|
497
|
+
生成文档后用必要DB仅Mock反例和真实生产SQL正例审查;辅助层不强迫DB。
|
|
@@ -487,3 +487,9 @@ CR/Px prompts must include the real frontend payload, screenshot or page path, e
|
|
|
487
487
|
|
|
488
488
|
|
|
489
489
|
逐用例 PASS 必须提供可重放本地执行凭证;冻结服务/入口、源码写入链与持久化前后值断言。沿用 pipeline/references/document-review-coverage.md 的 execution-receipt.v1 合同,旧证据保留 PARTIAL;独立评审核对精确 Mapper statement 与原始输出,完整交付运行当前安装的 lint --require-complete。哈希不等同防伪或业务充分性。
|
|
490
|
+
|
|
491
|
+
### 数据库分层证据
|
|
492
|
+
|
|
493
|
+
按 [数据库合同](../superflow-pipeline/references/document-review-coverage.md#数据库分层合同)
|
|
494
|
+
冻结并继承 `testLayer`、entry.database、生产 statement、mockBoundary 和数据断言。
|
|
495
|
+
只执行冻结层级和断言;DB环境缺失报告PARTIAL/BLOCKED,不能自行用替代引擎或Mock补齐。
|
|
@@ -113,3 +113,45 @@ PASS 的证据路径现在必须指向本地 `superflow.execution-receipt.v1` JS
|
|
|
113
113
|
独立评审必须检查实际 Service 调用的精确 Mapper statement 和所有写入链、运行目标、原始断言及旧通知/新申请隔离;报告的“实现已补齐”必须与源码和运行证据一致。哈希和结构不保证日志真实或断言充分,不能当作防伪签名。该扩展不增加托管协议或状态 owner;纯文档/非行为轻量任务不强加 DB 验收。
|
|
114
114
|
|
|
115
115
|
原始用例事件还必须携带 evidenceKind/sources/build/target 和 command{argv,exitCode},与凭证完全一致。build.command{argv,exitCode,output,sha256} 引用构建原始日志,其中包含 JSON 行 {event:"build",buildId,sourceFingerprint,artifactSha256,argv,exitCode:0};日志与实际构建/运行仍由独立评审核验。最终汇总仅取最后一个中英文一致的“验证结果/Verification Result”,历史记录与代码块示例不用于晋升。
|
|
116
|
+
|
|
117
|
+
## 数据库分层合同
|
|
118
|
+
|
|
119
|
+
本节扩展已有 coverage/receipt v1,不增加 Skill、Hook 或状态 owner。
|
|
120
|
+
语义评审发现持久化、字段展示、CAS、事务或查询语义影响时,必须在相应入口声明
|
|
121
|
+
`database`;纯逻辑任务明确无持久化影响的理由后可免数据库验证。不能靠 SQL 关键词猜风险。
|
|
122
|
+
|
|
123
|
+
- `case.testLayer` 为 `logic|sql-binding|database|http-entry`,与真实入口 `level` 分开。
|
|
124
|
+
logic 可 Mock 隔离逻辑;sql-binding 只证明 SQL 生成/绑定。必要 case 集合必须至少包含
|
|
125
|
+
一个 `database` 或 `http-entry` 且 `evidenceKind=real` 的用例;辅助层不强迫连接数据库。
|
|
126
|
+
- `entry.database={engine,major,schemaSourceRefs,statements:[{sourceRef,id}]}` 冻结实际引擎、
|
|
127
|
+
主版本、schema 来源和精确生产 statement。MySQL 不得被 H2/SQLite 替代。
|
|
128
|
+
schema 与 Mapper XML 引用既有 sources,纳入 receipt 源码指纹;匿名 SQLite 仅验证 harness。
|
|
129
|
+
- 数据库用例冻结 `statements:[{sourceRef,id}]`、
|
|
130
|
+
`mockBoundary={allowed:[外部客户端],forbidden:[必测Service/Mapper]}` 及
|
|
131
|
+
`databaseAssertions:[{id,kind,expected}]`。`kind` 是合同定义的观测类别:
|
|
132
|
+
写入包括 `affectedRows` 和 `unchangedRows`,后者必须冻结非目标记录和旧轮次实际快照;
|
|
133
|
+
其他风险由 Agent 按需求冻结断言,不由脚本推测业务规则。
|
|
134
|
+
- receipt 和原始用例事件回填同一 `testLayer`、`mockBoundary`、
|
|
135
|
+
`database={engine,major,statements,assertions:[{id,kind,expected,actual,result}]}`。
|
|
136
|
+
保留原始命令、构建、入口与源码版本绑定;数据库 assertions 实际值必须等于冻结预期。
|
|
137
|
+
字段写入继续使用 `assertions.persistence` 与同业务 ID 的 before/after/expected,
|
|
138
|
+
不能用 Mock 参数、NULL、字段键或影响行数独自证明写入。
|
|
139
|
+
- `http-entry` 若承担 DB 义务,必须走真实 HTTP → 生产 Service/Mapper → 同类型 DB,
|
|
140
|
+
同时执行返回、持久化和隔离断言;直接 Mapper 回放不能冒充 HTTP 或 browser 验收。
|
|
141
|
+
- 旧非持久化合同保持兼容;旧持久化 PASS 缺新合同保留 PARTIAL。必要 DB 环境不可用时
|
|
142
|
+
记录 PARTIAL/BLOCKED 和原因,不把辅助 Mock/sql-binding 绿灯晋升为完整 PASS。
|
|
143
|
+
历史证据绑定固定入口、源码/构建版本和 DB 引擎时仍有效;当前源码改动需要新证据,
|
|
144
|
+
不得把历史版实际测试误说成没测试,也不能把旧结果用于当前新版本。
|
|
145
|
+
|
|
146
|
+
正例:逻辑与 SQL 绑定辅助用例 + 真实生产 XML/MySQL 数据断言;纯逻辑有明确无持久化影响理由。
|
|
147
|
+
反例:必要集合只有 Mock、HTTP 绕过生产 Mapper、引擎/statement/边界/来源错配、
|
|
148
|
+
漏字段实际 NULL 却填 PASS。文档生成后在 source-contract 与 e2e-environment 两轮独立审查
|
|
149
|
+
这些正反例;结构检查只确认冻结与观测一致,充分性和真实生产链留给独立 Agent。
|
|
150
|
+
|
|
151
|
+
`unchangedRows.expected` 必须是按稳定业务 ID/轮次键索引的非空行快照对象;
|
|
152
|
+
`actual={before:{业务键:行快照},after:{业务键:行快照}}` 保留两次真实查询值,
|
|
153
|
+
before 与 after 均须匹配冻结 expected。布尔成功标志不能替代快照。
|
|
154
|
+
所有 JSON 观测递归保留类型:boolean 不等于 number(如 true 不能证明影响行数 1),
|
|
155
|
+
数组/对象中的字段同样适用;具体业务键与快照字段由文档与独立评审决定。
|
|
156
|
+
|
|
157
|
+
Git 交付路径还会对 tracked 报告依赖(receipt、原始事件、构建、源码、schema/合同)核对标准化 index 对象;仅在工作树修正不能证明待提交快照。未受版本控制的私有证据不强制提交;当前源码/构建适用性仍由独立评审判断。
|
|
@@ -75,3 +75,9 @@ Mark the task `Blocked` when:
|
|
|
75
75
|
`~/.codex/hooks/superflow-test-report-lint.py` enforces this for database/status
|
|
76
76
|
reports that claim pass or partial pass. A report that only says "sync
|
|
77
77
|
succeeded" without consumer-path evidence is blocked.
|
|
78
|
+
|
|
79
|
+
### 数据库分层证据
|
|
80
|
+
|
|
81
|
+
按 [数据库合同](../superflow-pipeline/references/document-review-coverage.md#数据库分层合同)
|
|
82
|
+
冻结并继承 `testLayer`、entry.database、生产 statement、mockBoundary 和数据断言。
|
|
83
|
+
从表、字段、CAS与事务反向发现DB义务并声明entry.database;纯逻辑明确无持久化理由可免DB。
|
|
@@ -183,3 +183,9 @@ and wait for explicit user confirmation.
|
|
|
183
183
|
|
|
184
184
|
|
|
185
185
|
逐用例 PASS 必须提供可重放本地执行凭证;冻结服务/入口、源码写入链与持久化前后值断言。沿用 pipeline/references/document-review-coverage.md 的 execution-receipt.v1 合同,旧证据保留 PARTIAL;独立评审核对精确 Mapper statement 与原始输出,完整交付运行当前安装的 lint --require-complete。哈希不等同防伪或业务充分性。
|
|
186
|
+
|
|
187
|
+
### 数据库分层证据
|
|
188
|
+
|
|
189
|
+
按 [数据库合同](../superflow-pipeline/references/document-review-coverage.md#数据库分层合同)
|
|
190
|
+
冻结并继承 `testLayer`、entry.database、生产 statement、mockBoundary 和数据断言。
|
|
191
|
+
核对原始事件与receipt、源码/构建/入口/引擎版本;旧固定版本证据保留,当前源码变化需新证据。
|
|
@@ -156,3 +156,9 @@ Superpowers own source-level HOW without weakening OpenSpec/SDD contracts.
|
|
|
156
156
|
Do not continue to `$superflow-implement` until the design guard passes. The next
|
|
157
157
|
phase may generate prompts, but this phase must not skip any required SDD
|
|
158
158
|
contract document or replace API/DB/tests with Superpowers prose.
|
|
159
|
+
|
|
160
|
+
### Database layer evidence
|
|
161
|
+
|
|
162
|
+
Freeze and inherit `testLayer`, entry.database, production statements, mockBoundary,
|
|
163
|
+
and data assertions from the [database contract](../superflow-pipeline/references/document-review-coverage.md#database-layer-contract).
|
|
164
|
+
Resolve schema sources, engine major, production Service/Mapper boundaries, affected rows, and non-target/previous-round isolation assertions.
|
|
@@ -489,3 +489,9 @@ technical design before prompt splitting or coding orchestration.
|
|
|
489
489
|
|
|
490
490
|
|
|
491
491
|
Per-case PASS requires retained local execution receipts. Freeze service/entry, source write chains and before/after persistence assertions using pipeline/references/document-review-coverage.md and execution-receipt.v1. Keep legacy evidence PARTIAL. Independent review checks the exact Mapper statement and raw output; full delivery runs the current installation's lint --require-complete. Hashes do not prove authenticity or business sufficiency.
|
|
492
|
+
|
|
493
|
+
### Database layer evidence
|
|
494
|
+
|
|
495
|
+
Freeze and inherit `testLayer`, entry.database, production statements, mockBoundary,
|
|
496
|
+
and data assertions from the [database contract](../superflow-pipeline/references/document-review-coverage.md#database-layer-contract).
|
|
497
|
+
Review generated documents against mock-only required-DB negatives and real production-SQL positives; auxiliary layers need no DB.
|
|
@@ -137,3 +137,9 @@ execution, DB/log checks, hook output, and test-report updates.
|
|
|
137
137
|
|
|
138
138
|
|
|
139
139
|
Per-case PASS requires retained local execution receipts. Freeze service/entry, source write chains and before/after persistence assertions using pipeline/references/document-review-coverage.md and execution-receipt.v1. Keep legacy evidence PARTIAL. Independent review checks the exact Mapper statement and raw output; full delivery runs the current installation's lint --require-complete. Hashes do not prove authenticity or business sufficiency.
|
|
140
|
+
|
|
141
|
+
### Database layer evidence
|
|
142
|
+
|
|
143
|
+
Freeze and inherit `testLayer`, entry.database, production statements, mockBoundary,
|
|
144
|
+
and data assertions from the [database contract](../superflow-pipeline/references/document-review-coverage.md#database-layer-contract).
|
|
145
|
+
Execute frozen layers/assertions; missing DB environments are PARTIAL/BLOCKED. Do not substitute another engine or mocks.
|
|
@@ -122,3 +122,57 @@ Freeze writes in `assertions.persistence:[{id,table,field,expected,allowNull?}]`
|
|
|
122
122
|
Independent review checks the exact Mapper statement called by Service, every write chain, runtime identity, raw assertions and old-event/new-request isolation. Claims that implementation is complete must agree with source and runtime evidence. Hashes prove identity, not authenticity or test sufficiency. No new managed protocol/state owner is introduced; non-behavioral lightweight work does not acquire DB obligations.
|
|
123
123
|
|
|
124
124
|
Raw case events also carry evidenceKind/sources/build/target and command{argv,exitCode}, exactly matching the receipt. build.command{argv,exitCode,output,sha256} retains build output with a JSON line {event:"build",buildId,sourceFingerprint,artifactSha256,argv,exitCode:0}. Independent review still verifies actual build/runtime behavior. Only the latest consistent bilingual Verification Result authorizes completion; historical records and fenced examples do not.
|
|
125
|
+
|
|
126
|
+
## Database layer contract
|
|
127
|
+
|
|
128
|
+
This extends existing coverage/receipt v1, with no new Skill, Hook, or state owner.
|
|
129
|
+
Semantic review must declare entry `database` for persistence, field display, CAS,
|
|
130
|
+
transaction, or query impacts. Pure logic may omit DB validation with an explicit
|
|
131
|
+
no-persistence rationale. Do not infer risks from SQL keywords.
|
|
132
|
+
|
|
133
|
+
- `case.testLayer=logic|sql-binding|database|http-entry` is separate from entry `level`.
|
|
134
|
+
Logic mocks prove isolated logic; SQL binding proves generated/bound SQL only.
|
|
135
|
+
Required cases must include a `database` or `http-entry` case with `evidenceKind=real`;
|
|
136
|
+
auxiliary logic/SQL-binding cases do not need database connections.
|
|
137
|
+
- `entry.database={engine,major,schemaSourceRefs,statements:[{sourceRef,id}]}` freezes
|
|
138
|
+
the real engine, major version, schema sources, and exact production statements.
|
|
139
|
+
H2/SQLite cannot replace MySQL. Schema and Mapper XML use existing sources and
|
|
140
|
+
receipt fingerprints; anonymous SQLite replay validates only the harness.
|
|
141
|
+
- Freeze database-case `statements:[{sourceRef,id}]`,
|
|
142
|
+
`mockBoundary={allowed:[external clients],forbidden:[required Service/Mapper]}`,
|
|
143
|
+
and `databaseAssertions:[{id,kind,expected}]`. The contract defines observation kinds:
|
|
144
|
+
writes include `affectedRows` and `unchangedRows`; the latter freezes actual snapshots
|
|
145
|
+
of non-target records and previous rounds. Agents freeze assertions for other risks;
|
|
146
|
+
scripts do not infer business semantics.
|
|
147
|
+
- Receipt and original case event repeat `testLayer`, `mockBoundary`, and
|
|
148
|
+
`database={engine,major,statements,assertions:[{id,kind,expected,actual,result}]}`.
|
|
149
|
+
Retain raw command/build/entry/source-version bindings. Database actual values must
|
|
150
|
+
match frozen expectations. Field writes retain `assertions.persistence` and
|
|
151
|
+
same-business-ID before/after/expected. Mock arguments, NULL, field keys, or affected
|
|
152
|
+
rows alone cannot establish persistence.
|
|
153
|
+
- An `http-entry` carrying DB obligations must traverse real HTTP → production
|
|
154
|
+
Service/Mapper → same-engine DB and check response, persistence, and isolation.
|
|
155
|
+
Direct Mapper replay cannot claim HTTP or browser acceptance.
|
|
156
|
+
- Legacy nonpersistent contracts stay compatible. Legacy persistent PASS without
|
|
157
|
+
the new contract remains PARTIAL. Missing required DB environments are PARTIAL/BLOCKED
|
|
158
|
+
with reasons; green auxiliary mocks/SQL binding cannot promote full PASS.
|
|
159
|
+
Historical evidence bound to a fixed entry, source/build version, and DB engine
|
|
160
|
+
remains valid for that version. Current source changes require new evidence; never
|
|
161
|
+
reclassify historical real tests as unexecuted or reuse them for a changed version.
|
|
162
|
+
|
|
163
|
+
Positive examples: auxiliary logic/SQL binding plus production XML/MySQL data assertions;
|
|
164
|
+
explicit no-persistence rationale for pure logic. Negative examples: mock-only required
|
|
165
|
+
sets, HTTP bypassing production Mapper, engine/statement/boundary/source mismatch,
|
|
166
|
+
and omitted-field NULL reported PASS. Independently review these positive/negative
|
|
167
|
+
examples after document generation in source-contract and e2e-environment rounds.
|
|
168
|
+
Structure checks establish frozen/observed consistency; independent Agents assess
|
|
169
|
+
sufficiency and the real production chain.
|
|
170
|
+
|
|
171
|
+
`unchangedRows.expected` must be a nonempty row-snapshot object indexed by stable
|
|
172
|
+
business-ID/round keys. `actual={before:{businessKey:rowSnapshot},after:{businessKey:rowSnapshot}}`
|
|
173
|
+
retains both real query observations; both must match frozen expected. A success
|
|
174
|
+
boolean cannot replace snapshots. JSON observations preserve types recursively:
|
|
175
|
+
boolean differs from number (true cannot prove one affected row), including nested
|
|
176
|
+
arrays/objects. Documents and independent review choose business keys and fields.
|
|
177
|
+
|
|
178
|
+
Git delivery compares normalized index objects for tracked report dependencies (receipts, raw events, builds, source, schema/contracts). A working-tree-only repair does not prove the commit snapshot. Private untracked evidence is not forced into Git; independent review still determines source/build applicability.
|
|
@@ -75,3 +75,9 @@ Mark the task `Blocked` when:
|
|
|
75
75
|
`~/.codex/hooks/superflow-test-report-lint.py` enforces this for database/status
|
|
76
76
|
reports that claim pass or partial pass. A report that only says "sync
|
|
77
77
|
succeeded" without consumer-path evidence is blocked.
|
|
78
|
+
|
|
79
|
+
### Database layer evidence
|
|
80
|
+
|
|
81
|
+
Freeze and inherit `testLayer`, entry.database, production statements, mockBoundary,
|
|
82
|
+
and data assertions from the [database contract](../superflow-pipeline/references/document-review-coverage.md#database-layer-contract).
|
|
83
|
+
Discover DB obligations from tables, fields, CAS, and transactions and declare entry.database; explicit no-persistence logic needs no DB.
|
|
@@ -192,3 +192,9 @@ and wait for explicit user confirmation.
|
|
|
192
192
|
|
|
193
193
|
|
|
194
194
|
Per-case PASS requires retained local execution receipts. Freeze service/entry, source write chains and before/after persistence assertions using pipeline/references/document-review-coverage.md and execution-receipt.v1. Keep legacy evidence PARTIAL. Independent review checks the exact Mapper statement and raw output; full delivery runs the current installation's lint --require-complete. Hashes do not prove authenticity or business sufficiency.
|
|
195
|
+
|
|
196
|
+
### Database layer evidence
|
|
197
|
+
|
|
198
|
+
Freeze and inherit `testLayer`, entry.database, production statements, mockBoundary,
|
|
199
|
+
and data assertions from the [database contract](../superflow-pipeline/references/document-review-coverage.md#database-layer-contract).
|
|
200
|
+
Compare original events/receipts and source/build/entry/engine versions; preserve fixed-version historical evidence, require new evidence for changed sources.
|
package/dist/app/cli.js
CHANGED
|
@@ -323,23 +323,23 @@ program
|
|
|
323
323
|
});
|
|
324
324
|
program
|
|
325
325
|
.command("hook-migrate")
|
|
326
|
-
.description(
|
|
327
|
-
.option("--path <path>",
|
|
328
|
-
.option("--scope <scope>",
|
|
329
|
-
.option("--agent <agent>",
|
|
330
|
-
.option("--apply",
|
|
331
|
-
.option("--json",
|
|
326
|
+
.description(helpText.hookMigrateDescription)
|
|
327
|
+
.option("--path <path>", helpText.hookPathOption)
|
|
328
|
+
.option("--scope <scope>", helpText.hookScopeOption, "project")
|
|
329
|
+
.option("--agent <agent>", helpText.agentOption, "both")
|
|
330
|
+
.option("--apply", helpText.hookApplyOption)
|
|
331
|
+
.option("--json", helpText.jsonOption)
|
|
332
332
|
.action(async (options) => {
|
|
333
333
|
const { hookMigrateCommand } = await import("./commands/hook-migrate.js");
|
|
334
334
|
hookMigrateCommand(options);
|
|
335
335
|
});
|
|
336
336
|
program
|
|
337
337
|
.command("hook-audit")
|
|
338
|
-
.description(
|
|
339
|
-
.option("--path <path>",
|
|
340
|
-
.option("--scope <scope>",
|
|
341
|
-
.option("--agent <agent>",
|
|
342
|
-
.option("--json",
|
|
338
|
+
.description(helpText.hookAuditDescription)
|
|
339
|
+
.option("--path <path>", helpText.hookPathOption)
|
|
340
|
+
.option("--scope <scope>", helpText.hookScopeOption, "project")
|
|
341
|
+
.option("--agent <agent>", helpText.agentOption, "both")
|
|
342
|
+
.option("--json", helpText.jsonOption)
|
|
343
343
|
.action(async (options) => {
|
|
344
344
|
const { hookMigrateCommand } = await import("./commands/hook-migrate.js");
|
|
345
345
|
hookMigrateCommand({ ...options, apply: false });
|
package/dist/app/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/app/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/app/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,9 @@ import { resolveRuntimeLanguage } from '../../domains/config/cli-help.js';
|
|
|
9
9
|
import { managedText } from '../../domains/managed-work/i18n.js';
|
|
10
10
|
import { inspectCodexSuperpowers, REQUIRED_CODEX_SUPERPOWER_SKILLS, } from '../../domains/deps.js';
|
|
11
11
|
import { resolveMcpServerPath } from './mcp.js';
|
|
12
|
-
import {
|
|
12
|
+
import { ASSETS_DIR } from '../../platform/assets.js';
|
|
13
|
+
import { auditLegacyScriptAliases, scriptMatchesPackage } from '../../domains/skill/scripts.js';
|
|
14
|
+
import { auditProjectGitHook, auditGlobalHooks, auditProjectHooks } from '../../domains/hook-migration.js';
|
|
13
15
|
const VALID_STATE_FIELDS = new Set([
|
|
14
16
|
'workflow',
|
|
15
17
|
'phase',
|
|
@@ -112,6 +114,19 @@ export async function collectDoctor(options = {}, runtime = {}) {
|
|
|
112
114
|
...(globalAudit.error || globalAudit.autoMigratable > 0 ? { remediation: managedText(language, `运行 superflow update --agent ${agent} --scope global,备份迁移后重启当前会话`, `Run superflow update --agent ${agent} --scope global, then restart this session after backup migration`) } : {}),
|
|
113
115
|
});
|
|
114
116
|
}
|
|
117
|
+
const gitAudit = auditProjectGitHook(projectPath);
|
|
118
|
+
const staleReferences = gitAudit.references.filter((reference) => !reference.current);
|
|
119
|
+
checks.push({
|
|
120
|
+
check: "hooks:git-pre-commit",
|
|
121
|
+
status: gitAudit.error || staleReferences.length ? "fail" : "pass",
|
|
122
|
+
message: gitAudit.error ??
|
|
123
|
+
managedText(language, `Git pre-commit 管理脚本引用 ${gitAudit.references.length} 项,来源不一致 ${staleReferences.length} 项`, `Git pre-commit has ${gitAudit.references.length} managed reference(s), ${staleReferences.length} mismatched source(s)`),
|
|
124
|
+
...(gitAudit.error || staleReferences.length
|
|
125
|
+
? {
|
|
126
|
+
remediation: managedText(language, "运行 superflow update --scope global --agent both;未知或自定义 Git Hook 保留并人工核验,不能仅以文件存在认定接入", "Run superflow update --scope global --agent both; retain and review custom Git hooks, file existence does not establish integration"),
|
|
127
|
+
}
|
|
128
|
+
: {}),
|
|
129
|
+
});
|
|
115
130
|
checks.push(await executableCheck('superflow', language, run));
|
|
116
131
|
checks.push(await executableCheck('openspec', language, run));
|
|
117
132
|
checks.push(...collectOpenSpecProjectChecks(projectPath, language));
|
|
@@ -183,8 +198,27 @@ export async function collectDoctor(options = {}, runtime = {}) {
|
|
|
183
198
|
const scriptPath = path.join(platform.scriptsDir, script);
|
|
184
199
|
checks.push({
|
|
185
200
|
check: `script:${agent}:${currentScope}:${script}`,
|
|
186
|
-
status:
|
|
201
|
+
status: scriptMatchesPackage(path.join(ASSETS_DIR, "scripts"), platform.scriptsDir, script, agent)
|
|
202
|
+
? "pass"
|
|
203
|
+
: "fail",
|
|
187
204
|
message: scriptPath,
|
|
205
|
+
remediation: managedText(language, "脚本需与当前 CLI 包内容一致;运行 superflow update", "Scripts must match the current CLI package; run superflow update"),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
for (const alias of auditLegacyScriptAliases(path.join(ASSETS_DIR, "scripts"), platform.scriptsDir, agent)) {
|
|
209
|
+
checks.push({
|
|
210
|
+
check: `script-alias:${agent}:${currentScope}:${alias.alias}`,
|
|
211
|
+
status: alias.status === "custom"
|
|
212
|
+
? "warn"
|
|
213
|
+
: alias.status === "delegated" && alias.targetCurrent && alias.executable
|
|
214
|
+
? "pass"
|
|
215
|
+
: "fail",
|
|
216
|
+
message: managedText(language, `旧兼容入口 ${alias.alias}: ${alias.status},规范目标一致=${alias.targetCurrent},入口可执行=${alias.executable}`, `Legacy entry ${alias.alias}: ${alias.status}; canonical target current=${alias.targetCurrent}; executable=${alias.executable}`),
|
|
217
|
+
...(alias.status !== "delegated" || !alias.targetCurrent || !alias.executable
|
|
218
|
+
? {
|
|
219
|
+
remediation: managedText(language, "运行 superflow update;来源未知的自定义入口保留并人工核验", "Run superflow update; retain and review unknown/custom entries"),
|
|
220
|
+
}
|
|
221
|
+
: {}),
|
|
188
222
|
});
|
|
189
223
|
}
|
|
190
224
|
const hookScripts = hookScriptsForAgent(agent);
|