@ccoalm/ccl-skills 0.10.0 → 0.11.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.
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +4 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +178 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +127 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md +2 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/SKILL.md +11 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/async-lifecycle-and-performance.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/source-map.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/delivery-lifecycle.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dispatch-owner-skills.md +9 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/problem-resolution-and-learning.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/tag-and-prod-pipeline-gate.md +9 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +9 -9
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +7 -23
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/rule-consolidation.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +27 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/contract-anchors.tsv +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +35 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/review_ledger_binding.py +476 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +81 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_review_ledger_binding.sh +336 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +41 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_extraction_review_state.sh +116 -9
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate_extraction_review_state.py +123 -32
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +9 -8
- package/dist/assets/release.json +47 -37
- package/package.json +1 -1
|
@@ -35,6 +35,12 @@ KNOWN_REVIEW_STATES = EXTERNAL_REVIEW_STATES | {"self_reviewed"}
|
|
|
35
35
|
# future budget change lands in exactly one place.
|
|
36
36
|
WRAPPER_CHALLENGE_BUDGET = 1
|
|
37
37
|
WRAPPER_AUTONOMOUS_ROUNDS = WRAPPER_CHALLENGE_BUDGET + 1
|
|
38
|
+
# A fix that edits the reviewed owner package ends its chain by construction, so
|
|
39
|
+
# the post-fix candidate is challenged in ONE succeeding chain rather than inside
|
|
40
|
+
# the ended one. The lane therefore spans at most two chains: the wrapper-budget
|
|
41
|
+
# chain plus a single succession challenge bound to the landing candidate.
|
|
42
|
+
LANE_MAX_CHAINS = 2
|
|
43
|
+
LANE_MAX_ROUNDS = WRAPPER_AUTONOMOUS_ROUNDS + 1
|
|
38
44
|
DISPOSITIONS = {
|
|
39
45
|
"fixed",
|
|
40
46
|
"source_refuted",
|
|
@@ -304,8 +310,10 @@ def validate_controller_receipts(
|
|
|
304
310
|
payload: dict[str, Any], ledger_dir: Path
|
|
305
311
|
) -> tuple[list[dict[str, Any]], list[str], dict[str, list[str]], str, str]:
|
|
306
312
|
refs = payload["controller_receipts"]
|
|
307
|
-
if not isinstance(refs, list) or not 1 <= len(refs) <=
|
|
308
|
-
fail(
|
|
313
|
+
if not isinstance(refs, list) or not 1 <= len(refs) <= LANE_MAX_ROUNDS:
|
|
314
|
+
fail(
|
|
315
|
+
f"controller_receipts must contain one to {LANE_MAX_ROUNDS} ordered Agent rounds"
|
|
316
|
+
)
|
|
309
317
|
if payload["autonomous_round"] != len(refs) or type(payload["autonomous_round"]) is not int:
|
|
310
318
|
fail("autonomous_round must equal the ordered controller receipt count")
|
|
311
319
|
|
|
@@ -313,16 +321,20 @@ def validate_controller_receipts(
|
|
|
313
321
|
receipt_hashes: list[str] = []
|
|
314
322
|
finding_hashes: dict[str, list[str]] = {}
|
|
315
323
|
chain_id: str | None = None
|
|
324
|
+
final_chain_id: str | None = None
|
|
316
325
|
scope_hash: str | None = None
|
|
326
|
+
candidates: list[str] = []
|
|
327
|
+
succession_index: int | None = None
|
|
317
328
|
ledger_candidate = sha256(
|
|
318
329
|
payload["candidate_sha256"], "ledger.candidate_sha256"
|
|
319
330
|
)
|
|
320
331
|
for expected_index, value in enumerate(refs, start=1):
|
|
321
|
-
# A caller supplying more receipts than the
|
|
332
|
+
# A caller supplying more receipts than the lane can mint would
|
|
322
333
|
# otherwise claim a negative remaining count and reach completion
|
|
323
|
-
# validation as a ready-state budget bypass.
|
|
324
|
-
|
|
325
|
-
|
|
334
|
+
# validation as a ready-state budget bypass. The wrapper bound still
|
|
335
|
+
# governs each chain; the lane bound governs their sum.
|
|
336
|
+
if expected_index > LANE_MAX_ROUNDS:
|
|
337
|
+
fail("controller chain exceeds the lane budget")
|
|
326
338
|
ref = exact_object(
|
|
327
339
|
value, {"sequence", "file", "sha256"}, f"controller_receipts[{expected_index - 1}]"
|
|
328
340
|
)
|
|
@@ -339,7 +351,28 @@ def validate_controller_receipts(
|
|
|
339
351
|
receipt = decode_json(raw, label=f"controller receipt {expected_index}")
|
|
340
352
|
if receipt.get("schema_version") != 3 or type(receipt.get("schema_version")) is not int:
|
|
341
353
|
fail(f"controller receipt {expected_index} schema_version must be 3")
|
|
342
|
-
|
|
354
|
+
# A succession round opens a second chain, so its own chain arithmetic
|
|
355
|
+
# restarts at one while its lane position keeps counting. Classify first;
|
|
356
|
+
# every expectation below reads the chain position, not the lane index.
|
|
357
|
+
predecessor_chain = receipt.get("predecessor_chain_id")
|
|
358
|
+
is_succession = predecessor_chain is not None
|
|
359
|
+
if is_succession:
|
|
360
|
+
if expected_index != len(refs):
|
|
361
|
+
fail("a succession round must be the lane's final round")
|
|
362
|
+
if expected_index != WRAPPER_AUTONOMOUS_ROUNDS + 1:
|
|
363
|
+
fail("a succession round may only follow a spent wrapper chain")
|
|
364
|
+
succession_index = expected_index
|
|
365
|
+
chain_position = 1
|
|
366
|
+
else:
|
|
367
|
+
# Only a succession round may sit past the wrapper chain. Without this
|
|
368
|
+
# the caller claims a negative remaining count and reaches completion
|
|
369
|
+
# validation as a ready-state budget bypass.
|
|
370
|
+
if expected_index > WRAPPER_AUTONOMOUS_ROUNDS:
|
|
371
|
+
fail("controller chain exceeds the wrapper budget")
|
|
372
|
+
chain_position = expected_index
|
|
373
|
+
expected_mode = (
|
|
374
|
+
"challenge" if is_succession else "review" if expected_index == 1 else "challenge"
|
|
375
|
+
)
|
|
343
376
|
if receipt.get("mode") != expected_mode:
|
|
344
377
|
fail(f"controller receipt {expected_index} must have mode {expected_mode}")
|
|
345
378
|
if receipt.get("status") not in {"passed", "findings"}:
|
|
@@ -349,15 +382,24 @@ def validate_controller_receipts(
|
|
|
349
382
|
current_chain = bounded_text(
|
|
350
383
|
receipt.get("review_chain_id"), f"controller receipt {expected_index}.review_chain_id", 120
|
|
351
384
|
)
|
|
352
|
-
if
|
|
385
|
+
if is_succession:
|
|
386
|
+
if current_chain == chain_id:
|
|
387
|
+
fail(
|
|
388
|
+
f"controller receipt {expected_index} succeeds its own chain"
|
|
389
|
+
)
|
|
390
|
+
final_chain_id = current_chain
|
|
391
|
+
elif chain_id is None:
|
|
353
392
|
chain_id = current_chain
|
|
393
|
+
final_chain_id = current_chain
|
|
354
394
|
elif current_chain != chain_id:
|
|
355
395
|
fail(f"controller receipt {expected_index} review_chain_id changed")
|
|
356
|
-
if receipt.get("autonomous_review_index") !=
|
|
396
|
+
if receipt.get("autonomous_review_index") != chain_position or type(
|
|
357
397
|
receipt.get("autonomous_review_index")
|
|
358
398
|
) is not int:
|
|
359
399
|
fail(f"controller receipt {expected_index} autonomous_review_index is not contiguous")
|
|
360
|
-
expected_challenge_index =
|
|
400
|
+
expected_challenge_index = (
|
|
401
|
+
1 if is_succession else 0 if expected_index == 1 else expected_index - 1
|
|
402
|
+
)
|
|
361
403
|
if receipt.get("challenge_index") != expected_challenge_index or type(
|
|
362
404
|
receipt.get("challenge_index")
|
|
363
405
|
) is not int:
|
|
@@ -368,7 +410,7 @@ def validate_controller_receipts(
|
|
|
368
410
|
receipt.get("autonomous_review_budget")
|
|
369
411
|
) is not int:
|
|
370
412
|
fail(f"controller receipt {expected_index} autonomous_review_budget must be {WRAPPER_AUTONOMOUS_ROUNDS}")
|
|
371
|
-
expected_remaining = WRAPPER_AUTONOMOUS_ROUNDS -
|
|
413
|
+
expected_remaining = WRAPPER_AUTONOMOUS_ROUNDS - chain_position
|
|
372
414
|
if receipt.get("autonomous_reviews_remaining") != expected_remaining or type(
|
|
373
415
|
receipt.get("autonomous_reviews_remaining")
|
|
374
416
|
) is not int:
|
|
@@ -376,7 +418,8 @@ def validate_controller_receipts(
|
|
|
376
418
|
if receipt.get("autonomous_review_allowed") is not (expected_remaining > 0):
|
|
377
419
|
fail(f"controller receipt {expected_index} autonomous_review_allowed is invalid")
|
|
378
420
|
prior = receipt.get("prior_review_result_sha256")
|
|
379
|
-
if
|
|
421
|
+
expected_prior = [] if is_succession else receipt_hashes
|
|
422
|
+
if prior != expected_prior:
|
|
380
423
|
fail(f"controller receipt {expected_index} prior_review_result_sha256 is not the complete ordered prefix")
|
|
381
424
|
candidate = sha256(
|
|
382
425
|
receipt.get("candidate_sha256"), f"controller receipt {expected_index}.candidate_sha256"
|
|
@@ -386,13 +429,10 @@ def validate_controller_receipts(
|
|
|
386
429
|
)
|
|
387
430
|
if packet != candidate:
|
|
388
431
|
fail(f"controller receipt {expected_index} packet_sha256 must equal candidate_sha256")
|
|
389
|
-
#
|
|
390
|
-
#
|
|
391
|
-
#
|
|
392
|
-
|
|
393
|
-
fail(
|
|
394
|
-
f"controller receipt {expected_index} does not bind the ledger candidate"
|
|
395
|
-
)
|
|
432
|
+
# Which candidate a round must bind depends on its phase, and the phase
|
|
433
|
+
# split is only known once every round is loaded, so this is settled
|
|
434
|
+
# after the loop rather than here.
|
|
435
|
+
candidates.append(candidate)
|
|
396
436
|
current_scope_hash = validate_scope(receipt, f"controller receipt {expected_index}")
|
|
397
437
|
if scope_hash is None:
|
|
398
438
|
scope_hash = current_scope_hash
|
|
@@ -425,7 +465,7 @@ def validate_controller_receipts(
|
|
|
425
465
|
fail(f"controller receipt {expected_index} has unknown controller review_state {state}")
|
|
426
466
|
expected_state = (
|
|
427
467
|
"post_review_budget"
|
|
428
|
-
if receipt["status"] == "findings" and
|
|
468
|
+
if receipt["status"] == "findings" and chain_position == WRAPPER_AUTONOMOUS_ROUNDS
|
|
429
469
|
else "findings_pending"
|
|
430
470
|
if receipt["status"] == "findings"
|
|
431
471
|
else "reviewed"
|
|
@@ -439,9 +479,38 @@ def validate_controller_receipts(
|
|
|
439
479
|
receipt_hashes.append(receipt_hash)
|
|
440
480
|
finding_hashes[receipt_hash] = current_findings
|
|
441
481
|
|
|
442
|
-
if chain_id is None or scope_hash is None:
|
|
482
|
+
if chain_id is None or scope_hash is None or final_chain_id is None:
|
|
443
483
|
fail("controller receipt chain is empty")
|
|
444
|
-
|
|
484
|
+
|
|
485
|
+
# Phase binding. Without a succession every counted round must have inspected
|
|
486
|
+
# the exact final candidate. With one, the wrapper chain reviewed the candidate
|
|
487
|
+
# the fix batch then moved, and the succession round is the only round that can
|
|
488
|
+
# bind what actually lands — which is the whole point of running it.
|
|
489
|
+
if succession_index is None:
|
|
490
|
+
for position, value in enumerate(candidates, start=1):
|
|
491
|
+
if value != ledger_candidate:
|
|
492
|
+
fail(f"controller receipt {position} does not bind the ledger candidate")
|
|
493
|
+
else:
|
|
494
|
+
succession = receipts[-1]
|
|
495
|
+
succeeded_candidate = sha256(
|
|
496
|
+
succession.get("predecessor_candidate_sha256"),
|
|
497
|
+
"succession receipt.predecessor_candidate_sha256",
|
|
498
|
+
)
|
|
499
|
+
if candidates[-1] != ledger_candidate:
|
|
500
|
+
fail("the succession round does not bind the ledger candidate")
|
|
501
|
+
if succeeded_candidate == ledger_candidate:
|
|
502
|
+
fail("a succession round must bind a candidate the wrapper chain never saw")
|
|
503
|
+
for position, value in enumerate(candidates[:-1], start=1):
|
|
504
|
+
if value != succeeded_candidate:
|
|
505
|
+
fail(f"controller receipt {position} does not bind the succeeded candidate")
|
|
506
|
+
if succession.get("predecessor_chain_id") != chain_id:
|
|
507
|
+
fail("the succession round does not name the chain it succeeds")
|
|
508
|
+
if sha256(
|
|
509
|
+
succession.get("predecessor_result_sha256"),
|
|
510
|
+
"succession receipt.predecessor_result_sha256",
|
|
511
|
+
) != receipt_hashes[-2]:
|
|
512
|
+
fail("the succession round does not bind the succeeded chain's terminal receipt")
|
|
513
|
+
return receipts, receipt_hashes, finding_hashes, final_chain_id, scope_hash
|
|
445
514
|
|
|
446
515
|
|
|
447
516
|
def validate_completion_receipt(
|
|
@@ -485,18 +554,24 @@ def validate_completion_receipt(
|
|
|
485
554
|
receipt.get("autonomous_review_budget")
|
|
486
555
|
) is not int:
|
|
487
556
|
fail(f"completion receipt autonomous_review_budget must be {WRAPPER_AUTONOMOUS_ROUNDS}")
|
|
488
|
-
|
|
557
|
+
# The completion checkpoint binds the final external round, so its chain
|
|
558
|
+
# arithmetic is that round's — which is the succeeding chain's when a fix
|
|
559
|
+
# batch ended the wrapper chain, not the lane's round count.
|
|
560
|
+
final_index = final.get("autonomous_review_index")
|
|
561
|
+
if receipt.get("autonomous_review_index") != final_index or type(
|
|
489
562
|
receipt.get("autonomous_review_index")
|
|
490
563
|
) is not int:
|
|
491
564
|
fail("completion receipt autonomous_review_index does not match the final round")
|
|
492
|
-
expected_remaining = WRAPPER_AUTONOMOUS_ROUNDS -
|
|
565
|
+
expected_remaining = WRAPPER_AUTONOMOUS_ROUNDS - final_index
|
|
493
566
|
if receipt.get("autonomous_reviews_remaining") != expected_remaining or type(
|
|
494
567
|
receipt.get("autonomous_reviews_remaining")
|
|
495
568
|
) is not int:
|
|
496
569
|
fail("completion receipt autonomous_reviews_remaining does not match the final round")
|
|
497
570
|
if receipt.get("autonomous_review_allowed") is not False:
|
|
498
571
|
fail("completion receipt must disable further autonomous review")
|
|
499
|
-
if receipt.get("prior_review_result_sha256") !=
|
|
572
|
+
if receipt.get("prior_review_result_sha256") != final.get(
|
|
573
|
+
"prior_review_result_sha256"
|
|
574
|
+
):
|
|
500
575
|
fail("completion receipt prior_review_result_sha256 does not match the final external receipt")
|
|
501
576
|
if receipt.get("completion_review_result_sha256") != receipt_hashes[-1]:
|
|
502
577
|
fail("completion receipt completion_review_result_sha256 does not identify the final external receipt")
|
|
@@ -950,13 +1025,29 @@ def validate(payload: dict[str, Any], ledger_dir: Path) -> tuple[str, int, int]:
|
|
|
950
1025
|
fail("ready_for_human_decision requires no unresolved finding occurrence and no unreviewed delta")
|
|
951
1026
|
elif closeout == "continuation_authorization_required":
|
|
952
1027
|
final = receipts[-1]
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
)
|
|
959
|
-
|
|
1028
|
+
# The lane is spent either at the wrapper chain's last round, or — when a
|
|
1029
|
+
# fix batch moved the candidate — at the succession round that reviewed it.
|
|
1030
|
+
# Only the closeout knows the lane is spent: the controller sizes
|
|
1031
|
+
# human_decision_required from its own chain, where the succession round
|
|
1032
|
+
# is round one of two.
|
|
1033
|
+
succeeded = final.get("predecessor_chain_id") is not None
|
|
1034
|
+
if succeeded:
|
|
1035
|
+
spent = (
|
|
1036
|
+
len(receipts) == LANE_MAX_ROUNDS and final.get("status") == "findings"
|
|
1037
|
+
)
|
|
1038
|
+
else:
|
|
1039
|
+
spent = (
|
|
1040
|
+
len(receipts) == WRAPPER_AUTONOMOUS_ROUNDS
|
|
1041
|
+
and final.get("status") == "findings"
|
|
1042
|
+
and final.get("review_state") == "post_review_budget"
|
|
1043
|
+
and final.get("human_decision_required") is True
|
|
1044
|
+
)
|
|
1045
|
+
if not spent:
|
|
1046
|
+
fail(
|
|
1047
|
+
"continuation_authorization_required requires final-round "
|
|
1048
|
+
f"(round {WRAPPER_AUTONOMOUS_ROUNDS}) findings in post_review_budget, "
|
|
1049
|
+
f"or a succession round (round {LANE_MAX_ROUNDS}) carrying findings"
|
|
1050
|
+
)
|
|
960
1051
|
elif closeout == "baseline_race" and not delta:
|
|
961
1052
|
fail("baseline_race requires a non-empty unreviewed_delta")
|
|
962
1053
|
|
|
@@ -15,7 +15,7 @@ Bitable ownership:
|
|
|
15
15
|
|
|
16
16
|
- Ambiguous "写测试用例" / "write test cases" requests mean `testing-strategy` first when the user wants test code, E2E/browser/device tests, CI coverage, mocks, or verification evidence. Use this skill only when the deliverable is a structured TC artifact, Feishu/Bitable sync, or source-to-TC generation workflow.
|
|
17
17
|
- Use `testing-strategy` to decide which test layers (unit / integration / E2E / scenario) are needed *after* the use cases are written.
|
|
18
|
-
-
|
|
18
|
+
- Test-code implementation, once test cases are approved, must go to the owning stack skill: `go-microservice-dev` / `python-service-dev` / `nodejs-service-dev` / `web-react-dev` / `miniapp-product-dev` / `app-cross-platform-dev`.
|
|
19
19
|
- Use `product-rd-workflow` when the test case work is part of a broader feature delivery plan.
|
|
20
20
|
- Use `llm-inference-integration` when test cases cover LLM / agent / RAG / inference behavior.
|
|
21
21
|
- Use `skill-extraction-workflow` to feed lessons from test case generation or Feishu Bitable setup back into this skill after each delivery cycle.
|
|
@@ -9,14 +9,15 @@ Use this skill when the task is about test scope, test design, verification evid
|
|
|
9
9
|
|
|
10
10
|
## Skill Routing
|
|
11
11
|
|
|
12
|
-
- Use this skill for test strategy, test pyramid decisions, unit/integration/e2e/scenario boundaries, fixtures, mocks/fakes, regression coverage, and verification evidence.
|
|
13
|
-
- Use `go-microservice-dev` for Go-specific implementation details
|
|
14
|
-
- Use `python-service-dev` for Python-specific pytest, async test, fixture, fake client, ruff, mypy/pyright, packaging, or migration-test implementation details
|
|
15
|
-
-
|
|
16
|
-
- Use `
|
|
17
|
-
- Use `
|
|
18
|
-
- Use `
|
|
19
|
-
- Use `
|
|
12
|
+
- Use this skill for test strategy, test pyramid decisions, unit/integration/e2e/scenario boundaries, fixtures, mocks/fakes, regression coverage, and verification evidence. Stack pointers below apply after that choice.
|
|
13
|
+
- Use `go-microservice-dev` for Go-specific implementation details.
|
|
14
|
+
- Use `python-service-dev` for Python-specific pytest, async test, fixture, fake client, ruff, mypy/pyright, packaging, or migration-test implementation details.
|
|
15
|
+
- Node runner, mock/fixture, fake timers, stream and cancellation assertions, child-process lifecycle, and packaged-artifact verification must use `nodejs-service-dev`.
|
|
16
|
+
- Use `app-cross-platform-dev` for Flutter unit/widget/integration tests, Android unit/Compose/instrumented tests, iOS unit/UI tests, mobile device smoke, and app release verification.
|
|
17
|
+
- Use `miniapp-product-dev` for WeChat/Alipay/Douyin/Baidu mini-program build, developer-tool preview, real-device smoke, host capability verification, review submission, and release checks.
|
|
18
|
+
- Use `web-react-dev` for React unit/component/API-client/browser/E2E implementation, browser automation, accessibility checks, and build/deploy smoke.
|
|
19
|
+
- Use `terminal-cli-dev` for the terminal interface contract, PTY/ANSI/keyboard rendering, and full-screen text UI testing.
|
|
20
|
+
- Use `llm-inference-integration` for LLM/agent/RAG evals, replay sets, prompt/model regression checks, shadow runs, and inference-specific observability.
|
|
20
21
|
- Use `defect-diagnosis` first when a test is failing, flaky, or used to reproduce a bug.
|
|
21
22
|
- Use `product-rd-workflow` first when testing is part of an end-to-end product delivery plan.
|
|
22
23
|
- Use `product-ui-ux-design` for visual hierarchy, interaction, state, accessibility, and design acceptance criteria; use this skill for automated proof and test coverage.
|
package/dist/assets/release.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": 1,
|
|
3
3
|
"npmPackage": "@ccoalm/ccl-skills",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"sourceCommit": "
|
|
4
|
+
"version": "0.11.0",
|
|
5
|
+
"sourceCommit": "3269aa4739c5336f005292e70cb82cdd4ffb76c7",
|
|
6
6
|
"sourceState": "clean",
|
|
7
7
|
"files": [
|
|
8
8
|
{
|
|
@@ -282,7 +282,7 @@
|
|
|
282
282
|
},
|
|
283
283
|
{
|
|
284
284
|
"path": "marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md",
|
|
285
|
-
"sha256": "
|
|
285
|
+
"sha256": "c63a16c569e2ae55784204a36458cab1e19351b76d7b94da1cae1ee370412449",
|
|
286
286
|
"mode": 420
|
|
287
287
|
},
|
|
288
288
|
{
|
|
@@ -372,7 +372,7 @@
|
|
|
372
372
|
},
|
|
373
373
|
{
|
|
374
374
|
"path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "887d408540b9e195301c856df37c6883916ae9287ede623f7fd43cc31fac99e9",
|
|
376
376
|
"mode": 493
|
|
377
377
|
},
|
|
378
378
|
{
|
|
@@ -477,7 +477,7 @@
|
|
|
477
477
|
},
|
|
478
478
|
{
|
|
479
479
|
"path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh",
|
|
480
|
-
"sha256": "
|
|
480
|
+
"sha256": "51ea90cd42ce9661f84c1a0f5daee4f2a17072b5f0cdfa5d3c0e27a0ec2af235",
|
|
481
481
|
"mode": 493
|
|
482
482
|
},
|
|
483
483
|
{
|
|
@@ -497,7 +497,7 @@
|
|
|
497
497
|
},
|
|
498
498
|
{
|
|
499
499
|
"path": "marketplace/plugins/ccl-skills/skills/code-review/SKILL.md",
|
|
500
|
-
"sha256": "
|
|
500
|
+
"sha256": "f960b78a381e166bb848a80efb8834f7904cd1103d9aee176205375f4b02a81b",
|
|
501
501
|
"mode": 420
|
|
502
502
|
},
|
|
503
503
|
{
|
|
@@ -517,7 +517,7 @@
|
|
|
517
517
|
},
|
|
518
518
|
{
|
|
519
519
|
"path": "marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md",
|
|
520
|
-
"sha256": "
|
|
520
|
+
"sha256": "caad451eb1abf3255451c28a76c686a417d117a26b8c00e0725998d99a330c65",
|
|
521
521
|
"mode": 420
|
|
522
522
|
},
|
|
523
523
|
{
|
|
@@ -822,7 +822,7 @@
|
|
|
822
822
|
},
|
|
823
823
|
{
|
|
824
824
|
"path": "marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md",
|
|
825
|
-
"sha256": "
|
|
825
|
+
"sha256": "e769f91d708b635b1987bfa43343ed0c31734ae66997f2643e00194cb7bea81c",
|
|
826
826
|
"mode": 420
|
|
827
827
|
},
|
|
828
828
|
{
|
|
@@ -947,7 +947,7 @@
|
|
|
947
947
|
},
|
|
948
948
|
{
|
|
949
949
|
"path": "marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md",
|
|
950
|
-
"sha256": "
|
|
950
|
+
"sha256": "274bbf04b4849403fb75de56b90da8ce2daa1f4674e210ed157bfe23b12fef0d",
|
|
951
951
|
"mode": 420
|
|
952
952
|
},
|
|
953
953
|
{
|
|
@@ -1057,7 +1057,7 @@
|
|
|
1057
1057
|
},
|
|
1058
1058
|
{
|
|
1059
1059
|
"path": "marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/async-lifecycle-and-performance.md",
|
|
1060
|
-
"sha256": "
|
|
1060
|
+
"sha256": "693c3b6ee26d0eacc63c97888b6141735a63412538363d49874d24076f28360a",
|
|
1061
1061
|
"mode": 420
|
|
1062
1062
|
},
|
|
1063
1063
|
{
|
|
@@ -1067,7 +1067,7 @@
|
|
|
1067
1067
|
},
|
|
1068
1068
|
{
|
|
1069
1069
|
"path": "marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/source-map.md",
|
|
1070
|
-
"sha256": "
|
|
1070
|
+
"sha256": "0fcb80b552e98eb94ba9525c8a6ceb01bd36bb82a542da02f5a3908d2c8a9897",
|
|
1071
1071
|
"mode": 420
|
|
1072
1072
|
},
|
|
1073
1073
|
{
|
|
@@ -1077,7 +1077,7 @@
|
|
|
1077
1077
|
},
|
|
1078
1078
|
{
|
|
1079
1079
|
"path": "marketplace/plugins/ccl-skills/skills/nodejs-service-dev/SKILL.md",
|
|
1080
|
-
"sha256": "
|
|
1080
|
+
"sha256": "96206c6babadafb509e37339e95ad8d4bf96e70acf837ab8ac9cbd02a7e2a62f",
|
|
1081
1081
|
"mode": 420
|
|
1082
1082
|
},
|
|
1083
1083
|
{
|
|
@@ -1332,7 +1332,7 @@
|
|
|
1332
1332
|
},
|
|
1333
1333
|
{
|
|
1334
1334
|
"path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/delivery-lifecycle.md",
|
|
1335
|
-
"sha256": "
|
|
1335
|
+
"sha256": "17b5f7eee4049894cb855de31878abfda1196a20278a0ccd5c03c87ecf4d720c",
|
|
1336
1336
|
"mode": 420
|
|
1337
1337
|
},
|
|
1338
1338
|
{
|
|
@@ -1352,7 +1352,7 @@
|
|
|
1352
1352
|
},
|
|
1353
1353
|
{
|
|
1354
1354
|
"path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dispatch-owner-skills.md",
|
|
1355
|
-
"sha256": "
|
|
1355
|
+
"sha256": "647e06fe20fc87d041b11721d18cb011760a37d85d28eddf68a797a280915a5c",
|
|
1356
1356
|
"mode": 420
|
|
1357
1357
|
},
|
|
1358
1358
|
{
|
|
@@ -1402,7 +1402,7 @@
|
|
|
1402
1402
|
},
|
|
1403
1403
|
{
|
|
1404
1404
|
"path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/problem-resolution-and-learning.md",
|
|
1405
|
-
"sha256": "
|
|
1405
|
+
"sha256": "2f9d3d6d4d734822ac4a0dacb1048ca1675636194b55108362e32cbadceb48e8",
|
|
1406
1406
|
"mode": 420
|
|
1407
1407
|
},
|
|
1408
1408
|
{
|
|
@@ -1472,7 +1472,7 @@
|
|
|
1472
1472
|
},
|
|
1473
1473
|
{
|
|
1474
1474
|
"path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md",
|
|
1475
|
-
"sha256": "
|
|
1475
|
+
"sha256": "3569609af15adace2db554945a3fd2a2926b45802e26df05da1132da3b8cd9ca",
|
|
1476
1476
|
"mode": 420
|
|
1477
1477
|
},
|
|
1478
1478
|
{
|
|
@@ -1847,7 +1847,7 @@
|
|
|
1847
1847
|
},
|
|
1848
1848
|
{
|
|
1849
1849
|
"path": "marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md",
|
|
1850
|
-
"sha256": "
|
|
1850
|
+
"sha256": "13549ba3bf78a7014af32be7abac40860d905e06d389b92281938b97dbc481cd",
|
|
1851
1851
|
"mode": 420
|
|
1852
1852
|
},
|
|
1853
1853
|
{
|
|
@@ -1882,7 +1882,7 @@
|
|
|
1882
1882
|
},
|
|
1883
1883
|
{
|
|
1884
1884
|
"path": "marketplace/plugins/ccl-skills/skills/release-coordination/references/tag-and-prod-pipeline-gate.md",
|
|
1885
|
-
"sha256": "
|
|
1885
|
+
"sha256": "dc295da66df9cd4d123ee6b425bbd191380b94925a02adfd28abee41785b49c1",
|
|
1886
1886
|
"mode": 420
|
|
1887
1887
|
},
|
|
1888
1888
|
{
|
|
@@ -2017,7 +2017,7 @@
|
|
|
2017
2017
|
},
|
|
2018
2018
|
{
|
|
2019
2019
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md",
|
|
2020
|
-
"sha256": "
|
|
2020
|
+
"sha256": "b567749aee88e60a46a1ba7dfb687fe7e22e0898b2fae69f4638d2c07e2a6cca",
|
|
2021
2021
|
"mode": 420
|
|
2022
2022
|
},
|
|
2023
2023
|
{
|
|
@@ -2037,7 +2037,7 @@
|
|
|
2037
2037
|
},
|
|
2038
2038
|
{
|
|
2039
2039
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md",
|
|
2040
|
-
"sha256": "
|
|
2040
|
+
"sha256": "a956c52fdf268c2f75edcc7de66f882be222fdd5bad07b68c1242ad05d79637d",
|
|
2041
2041
|
"mode": 420
|
|
2042
2042
|
},
|
|
2043
2043
|
{
|
|
@@ -2047,7 +2047,7 @@
|
|
|
2047
2047
|
},
|
|
2048
2048
|
{
|
|
2049
2049
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md",
|
|
2050
|
-
"sha256": "
|
|
2050
|
+
"sha256": "63d62923d961f34765c1ebb832c73764ebd979f981a0f2c086a6f815a6c2b6b8",
|
|
2051
2051
|
"mode": 420
|
|
2052
2052
|
},
|
|
2053
2053
|
{
|
|
@@ -2112,7 +2112,7 @@
|
|
|
2112
2112
|
},
|
|
2113
2113
|
{
|
|
2114
2114
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/rule-consolidation.md",
|
|
2115
|
-
"sha256": "
|
|
2115
|
+
"sha256": "d2455dfb4f3213db76244a21e004ad0f934279c773d733bae9303a90990f285f",
|
|
2116
2116
|
"mode": 420
|
|
2117
2117
|
},
|
|
2118
2118
|
{
|
|
@@ -2122,12 +2122,12 @@
|
|
|
2122
2122
|
},
|
|
2123
2123
|
{
|
|
2124
2124
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md",
|
|
2125
|
-
"sha256": "
|
|
2125
|
+
"sha256": "244e155d641b0495a254f765dc8d9d548e0f0bf2f1f3e60916fcbebea2b44ece",
|
|
2126
2126
|
"mode": 420
|
|
2127
2127
|
},
|
|
2128
2128
|
{
|
|
2129
2129
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md",
|
|
2130
|
-
"sha256": "
|
|
2130
|
+
"sha256": "ae4021df2377a407eaa615b267822651750a0d8f775a67db672e360150c1b96c",
|
|
2131
2131
|
"mode": 420
|
|
2132
2132
|
},
|
|
2133
2133
|
{
|
|
@@ -2147,7 +2147,7 @@
|
|
|
2147
2147
|
},
|
|
2148
2148
|
{
|
|
2149
2149
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md",
|
|
2150
|
-
"sha256": "
|
|
2150
|
+
"sha256": "58f85c05e3a08c49836113778ba7a8dba86c5dbf4b2716e20c38f86632481c52",
|
|
2151
2151
|
"mode": 420
|
|
2152
2152
|
},
|
|
2153
2153
|
{
|
|
@@ -2157,7 +2157,7 @@
|
|
|
2157
2157
|
},
|
|
2158
2158
|
{
|
|
2159
2159
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh",
|
|
2160
|
-
"sha256": "
|
|
2160
|
+
"sha256": "9c3bb27f2cf8cffabfec633b33ee58a392fd7a4b464420bc6a3f02822380e94d",
|
|
2161
2161
|
"mode": 493
|
|
2162
2162
|
},
|
|
2163
2163
|
{
|
|
@@ -2192,7 +2192,7 @@
|
|
|
2192
2192
|
},
|
|
2193
2193
|
{
|
|
2194
2194
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/contract-anchors.tsv",
|
|
2195
|
-
"sha256": "
|
|
2195
|
+
"sha256": "10cdd03d67185c1b1730a34248edb6c311e6ee8b82b8ecc0f7923e8f8f368b59",
|
|
2196
2196
|
"mode": 420
|
|
2197
2197
|
},
|
|
2198
2198
|
{
|
|
@@ -2237,7 +2237,7 @@
|
|
|
2237
2237
|
},
|
|
2238
2238
|
{
|
|
2239
2239
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb",
|
|
2240
|
-
"sha256": "
|
|
2240
|
+
"sha256": "9430395d38d36863e6ec5e4a2087e558c4f2214dc90feebdaa70e8d0d92a29f8",
|
|
2241
2241
|
"mode": 493
|
|
2242
2242
|
},
|
|
2243
2243
|
{
|
|
@@ -2250,6 +2250,11 @@
|
|
|
2250
2250
|
"sha256": "db009982ac485aaebf708c4bff9b33fc65e2fef6264769ec1e42870f75bc8677",
|
|
2251
2251
|
"mode": 493
|
|
2252
2252
|
},
|
|
2253
|
+
{
|
|
2254
|
+
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/review_ledger_binding.py",
|
|
2255
|
+
"sha256": "20068bbd9b54f32460d14963391e11d8e9ecf08997bf8ece3c758effeb950f40",
|
|
2256
|
+
"mode": 493
|
|
2257
|
+
},
|
|
2253
2258
|
{
|
|
2254
2259
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/shared_git_surface_gate.py",
|
|
2255
2260
|
"sha256": "954841f113ace5cdd1a1d29e189ed9d8d68e07fe170236962b044978e472e0fc",
|
|
@@ -2287,7 +2292,7 @@
|
|
|
2287
2292
|
},
|
|
2288
2293
|
{
|
|
2289
2294
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh",
|
|
2290
|
-
"sha256": "
|
|
2295
|
+
"sha256": "82eb576dd1a0280bdd7cbe742f5903a5b1919f8b0bdd8da53489b47f0468e09c",
|
|
2291
2296
|
"mode": 493
|
|
2292
2297
|
},
|
|
2293
2298
|
{
|
|
@@ -2307,7 +2312,7 @@
|
|
|
2307
2312
|
},
|
|
2308
2313
|
{
|
|
2309
2314
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh",
|
|
2310
|
-
"sha256": "
|
|
2315
|
+
"sha256": "2463130c6af00c0611f1197628b3eb760e141b7db3fb8db8b88bb27e3da7fd62",
|
|
2311
2316
|
"mode": 493
|
|
2312
2317
|
},
|
|
2313
2318
|
{
|
|
@@ -2475,6 +2480,11 @@
|
|
|
2475
2480
|
"sha256": "79159a98cf1ca73054d45b2c6f5d8707641477ba930d87a9c3486e419cbcac9b",
|
|
2476
2481
|
"mode": 493
|
|
2477
2482
|
},
|
|
2483
|
+
{
|
|
2484
|
+
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_review_ledger_binding.sh",
|
|
2485
|
+
"sha256": "ce08eca4a5ecd1c578216eaed67cf9af0d02629e2c9cfea54c2a27bfaf8809ae",
|
|
2486
|
+
"mode": 493
|
|
2487
|
+
},
|
|
2478
2488
|
{
|
|
2479
2489
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_bank_integrity.sh",
|
|
2480
2490
|
"sha256": "7f5068806aeac86d636e3cece64b205e0593c6dbecf0c9f54605eed3126dc49b",
|
|
@@ -2482,7 +2492,7 @@
|
|
|
2482
2492
|
},
|
|
2483
2493
|
{
|
|
2484
2494
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh",
|
|
2485
|
-
"sha256": "
|
|
2495
|
+
"sha256": "a940e6625055d2991b71d3e73fd452b1057ddf6f0cf5115e7174b30abfac5225",
|
|
2486
2496
|
"mode": 493
|
|
2487
2497
|
},
|
|
2488
2498
|
{
|
|
@@ -2502,7 +2512,7 @@
|
|
|
2502
2512
|
},
|
|
2503
2513
|
{
|
|
2504
2514
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_extraction_review_state.sh",
|
|
2505
|
-
"sha256": "
|
|
2515
|
+
"sha256": "8bce4771a225860356aa3301aee09dc064a0491a20da6273a3c3aa9719d48297",
|
|
2506
2516
|
"mode": 493
|
|
2507
2517
|
},
|
|
2508
2518
|
{
|
|
@@ -2522,7 +2532,7 @@
|
|
|
2522
2532
|
},
|
|
2523
2533
|
{
|
|
2524
2534
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate_extraction_review_state.py",
|
|
2525
|
-
"sha256": "
|
|
2535
|
+
"sha256": "234a501a93f2b820081d8aea7bf3a3750bd865455b1217d641e5960931412ae7",
|
|
2526
2536
|
"mode": 493
|
|
2527
2537
|
},
|
|
2528
2538
|
{
|
|
@@ -2532,7 +2542,7 @@
|
|
|
2532
2542
|
},
|
|
2533
2543
|
{
|
|
2534
2544
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md",
|
|
2535
|
-
"sha256": "
|
|
2545
|
+
"sha256": "83c6d8bb60a0edafc1c80ca02109f7210ec090e5c9b5eda813672b14779b7cc4",
|
|
2536
2546
|
"mode": 420
|
|
2537
2547
|
},
|
|
2538
2548
|
{
|
|
@@ -2672,7 +2682,7 @@
|
|
|
2672
2682
|
},
|
|
2673
2683
|
{
|
|
2674
2684
|
"path": "marketplace/plugins/ccl-skills/skills/test-artifact-management/SKILL.md",
|
|
2675
|
-
"sha256": "
|
|
2685
|
+
"sha256": "9d40a4f2bb66128964295f60b96a425c62a0629076f730e09621850cab7c6289",
|
|
2676
2686
|
"mode": 420
|
|
2677
2687
|
},
|
|
2678
2688
|
{
|
|
@@ -2817,7 +2827,7 @@
|
|
|
2817
2827
|
},
|
|
2818
2828
|
{
|
|
2819
2829
|
"path": "marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md",
|
|
2820
|
-
"sha256": "
|
|
2830
|
+
"sha256": "3527e55b44e74ec4c6a0f402068f0d954b1760715ff4b449f53034086118288a",
|
|
2821
2831
|
"mode": 420
|
|
2822
2832
|
},
|
|
2823
2833
|
{
|
|
@@ -3368,5 +3378,5 @@
|
|
|
3368
3378
|
"mode": 420
|
|
3369
3379
|
}
|
|
3370
3380
|
],
|
|
3371
|
-
"snapshotHash": "
|
|
3381
|
+
"snapshotHash": "4797cf3d30cf1336e439094f37df74198438083e314e2fb1db66dbfbd3eac0fc"
|
|
3372
3382
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ccoalm/ccl-skills",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Reusable workflows that help coding agents plan, build, test, review, and release software — for Claude Code, Codex, and OpenCode",
|
|
5
5
|
"keywords": ["skills", "agent-skills", "claude", "claude-code", "codex", "opencode", "agent", "ai", "ai-agents", "cli", "anthropic", "developer-tools"],
|
|
6
6
|
"type": "module",
|