@dzhechkov/p-replicator 1.13.3 → 1.13.4
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/.dz-manifest.json +24 -8
- package/bin/cli.js +0 -0
- package/package.json +11 -11
- package/sbom.json +47 -7
- package/scripts/check-pipeline-gaps.sh +0 -0
- package/templates/.claude/hooks/check-external-deps.cjs +18 -3
- package/tests/dz-availability.js +34 -0
- package/tests/e2e/packed-insights-writer.test.js +5 -1
- package/tests/npm-cli-resolver.js +366 -0
- package/tests/npm-resolver-cases.json +128 -0
- package/tests/snapshot/baseline.json +2 -2
- package/tests/unit/check-external-deps.test.js +26 -2
- package/tests/unit/detection-ladder-contract.test.js +20 -10
- package/tests/unit/insights-writer.test.js +5 -1
- package/tests/unit/npm-cli-resolver.test.js +314 -0
- package/LICENSE +0 -21
package/.dz-manifest.json
CHANGED
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
"path": "package.json",
|
|
112
|
-
"sha256": "
|
|
112
|
+
"sha256": "085a7e742af097d9df173fee66eecba5cc2b4f5482b600b2de51f742cc38c8f4"
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
"path": "scripts/check-pipeline-gaps.sh",
|
|
@@ -245,7 +245,7 @@
|
|
|
245
245
|
},
|
|
246
246
|
{
|
|
247
247
|
"path": "templates/.claude/hooks/check-external-deps.cjs",
|
|
248
|
-
"sha256": "
|
|
248
|
+
"sha256": "d671353b2e73e0790206cf963ee85f1ff6b97d56d975b9eb3ad59a14d7239e2a"
|
|
249
249
|
},
|
|
250
250
|
{
|
|
251
251
|
"path": "templates/.claude/hooks/check-file-ownership.cjs",
|
|
@@ -819,6 +819,10 @@
|
|
|
819
819
|
"path": "templates/.claude/skills/sparc-prd-mini/templates/prd.md",
|
|
820
820
|
"sha256": "7b4497bc76bb421fae7a07ecb46af01e021412180a394a5487a3c3c42dc004b6"
|
|
821
821
|
},
|
|
822
|
+
{
|
|
823
|
+
"path": "tests/dz-availability.js",
|
|
824
|
+
"sha256": "22203df26f3a90f015730c4b667b07b35e40730cb0e310b4e8087cbfab31b3ce"
|
|
825
|
+
},
|
|
822
826
|
{
|
|
823
827
|
"path": "tests/e2e/feature-contour.test.js",
|
|
824
828
|
"sha256": "a6e7c00e86fae150b834234efe34c2837da63b6794117a1bffd5c0de13505fe1"
|
|
@@ -829,7 +833,7 @@
|
|
|
829
833
|
},
|
|
830
834
|
{
|
|
831
835
|
"path": "tests/e2e/packed-insights-writer.test.js",
|
|
832
|
-
"sha256": "
|
|
836
|
+
"sha256": "b84eb4d3b79544b8c0dad51dd043ce01dd94931246fc153283f9ab6d1c50e8cc"
|
|
833
837
|
},
|
|
834
838
|
{
|
|
835
839
|
"path": "tests/fixtures/feature-contour/docs/features/demo-gate/01_specification.md",
|
|
@@ -871,9 +875,17 @@
|
|
|
871
875
|
"path": "tests/fixtures/prep-traceability-fixture/docs/features/order-refund/02_pseudocode.md",
|
|
872
876
|
"sha256": "848b3afb83e2d4151c1774900b33983b824e88c03e651085c4a9a1952ba78e64"
|
|
873
877
|
},
|
|
878
|
+
{
|
|
879
|
+
"path": "tests/npm-cli-resolver.js",
|
|
880
|
+
"sha256": "272e8aab19d4b0dbe3fa2bf3c0d544afd1c811f6a04cc445d480233e11c63840"
|
|
881
|
+
},
|
|
882
|
+
{
|
|
883
|
+
"path": "tests/npm-resolver-cases.json",
|
|
884
|
+
"sha256": "df67c832c5bde9f550d88fda48ed27600f4654aa7c3fdaadc79adbbbe6af141b"
|
|
885
|
+
},
|
|
874
886
|
{
|
|
875
887
|
"path": "tests/snapshot/baseline.json",
|
|
876
|
-
"sha256": "
|
|
888
|
+
"sha256": "0c73149a79dc3b4c051f49500ea2f3fb2dc172df127636fe95ab217e8a6f5291"
|
|
877
889
|
},
|
|
878
890
|
{
|
|
879
891
|
"path": "tests/snapshot/templates.test.js",
|
|
@@ -925,7 +937,7 @@
|
|
|
925
937
|
},
|
|
926
938
|
{
|
|
927
939
|
"path": "tests/unit/check-external-deps.test.js",
|
|
928
|
-
"sha256": "
|
|
940
|
+
"sha256": "e5177f2726a8a13c2c0a56d5bf010d0ee0160f2324cf7b2293c4d44c40fdc4aa"
|
|
929
941
|
},
|
|
930
942
|
{
|
|
931
943
|
"path": "tests/unit/check-file-ownership.test.js",
|
|
@@ -993,7 +1005,7 @@
|
|
|
993
1005
|
},
|
|
994
1006
|
{
|
|
995
1007
|
"path": "tests/unit/detection-ladder-contract.test.js",
|
|
996
|
-
"sha256": "
|
|
1008
|
+
"sha256": "0612c27c88051c717da0e37b7f525b75195a85cf7a88f0da9d65d7ebbc3501b6"
|
|
997
1009
|
},
|
|
998
1010
|
{
|
|
999
1011
|
"path": "tests/unit/detection-ladder-registry.test.js",
|
|
@@ -1061,7 +1073,7 @@
|
|
|
1061
1073
|
},
|
|
1062
1074
|
{
|
|
1063
1075
|
"path": "tests/unit/insights-writer.test.js",
|
|
1064
|
-
"sha256": "
|
|
1076
|
+
"sha256": "e17cd3de5fd6173ebf262b5c5d354ee764343a02a7a22f9f2f16511b220d067c"
|
|
1065
1077
|
},
|
|
1066
1078
|
{
|
|
1067
1079
|
"path": "tests/unit/look-phase-contract.test.js",
|
|
@@ -1075,6 +1087,10 @@
|
|
|
1075
1087
|
"path": "tests/unit/negative-conclusion-gate.test.js",
|
|
1076
1088
|
"sha256": "6c6a470d22d12ff46301c4ae61ba7a2563c4ff8a3a2d5b3a84c81c6b8c11b067"
|
|
1077
1089
|
},
|
|
1090
|
+
{
|
|
1091
|
+
"path": "tests/unit/npm-cli-resolver.test.js",
|
|
1092
|
+
"sha256": "9c5ee626d9b92c69e9720b1fca032a14592c2767f903b064be1b7f1f78772b76"
|
|
1093
|
+
},
|
|
1078
1094
|
{
|
|
1079
1095
|
"path": "tests/unit/optional-doc-idiom.test.js",
|
|
1080
1096
|
"sha256": "f25338f5928e9d1cba82cdc88506d46256f2b567d7524f159512cb8e06b21f06"
|
|
@@ -1145,5 +1161,5 @@
|
|
|
1145
1161
|
}
|
|
1146
1162
|
]
|
|
1147
1163
|
},
|
|
1148
|
-
"signature": "
|
|
1164
|
+
"signature": "J0VkQYAOLDLKzrfxrzONRp5DSlPGs2h9TP0G0lT+gGzTu5pTBl/R6lknXbQkWjX4c0Nz7cygEl22nBvuhHHMCw=="
|
|
1149
1165
|
}
|
package/bin/cli.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/p-replicator",
|
|
3
|
-
"version": "1.13.
|
|
3
|
+
"version": "1.13.4",
|
|
4
4
|
"description": "P-Replicator — Claude Code toolkit for AI-assisted product development (Vibe Coding). Full /replicate pipeline, 10 modular skills (880K+ chars), /harvest knowledge extraction, swarm agents, quality gates, security patterns, cross-project learning.",
|
|
5
5
|
"main": "src/cli.js",
|
|
6
6
|
"bin": {
|
|
@@ -19,6 +19,15 @@
|
|
|
19
19
|
".dz-manifest.json",
|
|
20
20
|
"sbom.json"
|
|
21
21
|
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"test": "node --test tests/unit/honest-failure-rules.test.js tests/unit/generator-swarm-contract.test.js tests/unit/check-swarm-receipts.test.js tests/unit/check-embed-contract.test.js tests/unit/check-model-cost.test.js tests/unit/check-canon.test.js tests/unit/check-file-ownership.test.js tests/unit/check-source-version.test.js tests/unit/check-handoff-manifest.test.js tests/unit/check-external-deps.test.js tests/unit/check-metric-source.test.js tests/unit/negative-conclusion-gate.test.js tests/unit/check-webhook-contract.test.js tests/unit/check-job-contract.test.js tests/unit/detection-ladder-contract.test.js tests/unit/detection-ladder-registry.test.js tests/unit/npm-cli-resolver.test.js tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/insights-dz-delegation.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/doctor-insight-flow.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/check-look-trace.test.js tests/unit/check-look-origin.test.js tests/unit/quote-provenance.test.js tests/unit/guard-honest-input-meta.test.js tests/unit/look-phase-contract.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js tests/unit/check-review-contract.test.js tests/unit/absence-is-not-emptiness.test.js tests/unit/guard-forms.test.js tests/unit/generated-guard-templates.test.js tests/unit/shipped-suite-context.test.js tests/unit/assess-scripts.test.js tests/unit/insights-docs-tell-the-truth.test.js tests/unit/insights-writer.test.js tests/unit/check-pipeline-gaps.test.js tests/unit/traceability-machine-ids.test.js tests/unit/traceability-completion-gate.test.js tests/unit/traceability-negative-fixture.test.js tests/e2e/lifecycle.test.js tests/e2e/feature-contour.test.js tests/e2e/packed-insights-writer.test.js tests/snapshot/templates.test.js tests/unit/optional-doc-idiom.test.js tests/unit/verdict-vocabulary.test.js tests/unit/check-dangling-refs.test.js test/mutation-registry-freshness.test.js",
|
|
24
|
+
"test:unit": "node --test tests/unit/honest-failure-rules.test.js tests/unit/generator-swarm-contract.test.js tests/unit/check-swarm-receipts.test.js tests/unit/check-embed-contract.test.js tests/unit/check-model-cost.test.js tests/unit/check-canon.test.js tests/unit/check-file-ownership.test.js tests/unit/check-source-version.test.js tests/unit/check-handoff-manifest.test.js tests/unit/check-external-deps.test.js tests/unit/check-metric-source.test.js tests/unit/negative-conclusion-gate.test.js tests/unit/check-webhook-contract.test.js tests/unit/check-job-contract.test.js tests/unit/detection-ladder-contract.test.js tests/unit/detection-ladder-registry.test.js tests/unit/npm-cli-resolver.test.js tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/insights-dz-delegation.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/doctor-insight-flow.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/check-look-trace.test.js tests/unit/check-look-origin.test.js tests/unit/quote-provenance.test.js tests/unit/guard-honest-input-meta.test.js tests/unit/look-phase-contract.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js tests/unit/check-review-contract.test.js tests/unit/absence-is-not-emptiness.test.js tests/unit/guard-forms.test.js tests/unit/generated-guard-templates.test.js tests/unit/shipped-suite-context.test.js tests/unit/assess-scripts.test.js tests/unit/insights-docs-tell-the-truth.test.js tests/unit/insights-writer.test.js tests/unit/check-pipeline-gaps.test.js tests/unit/traceability-machine-ids.test.js tests/unit/traceability-completion-gate.test.js tests/unit/traceability-negative-fixture.test.js tests/unit/optional-doc-idiom.test.js tests/unit/verdict-vocabulary.test.js tests/unit/check-dangling-refs.test.js",
|
|
25
|
+
"test:e2e": "node --test tests/e2e/lifecycle.test.js tests/e2e/packed-insights-writer.test.js",
|
|
26
|
+
"test:snapshot": "node --test tests/snapshot/templates.test.js",
|
|
27
|
+
"test:doctor": "node bin/cli.js doctor",
|
|
28
|
+
"snapshot:baseline": "node tests/snapshot/update-baseline.js",
|
|
29
|
+
"test:browser": "node --test tests/unit/capture-source-path.test.js"
|
|
30
|
+
},
|
|
22
31
|
"keywords": [
|
|
23
32
|
"claude",
|
|
24
33
|
"claude-code",
|
|
@@ -71,14 +80,5 @@
|
|
|
71
80
|
},
|
|
72
81
|
"publishConfig": {
|
|
73
82
|
"access": "public"
|
|
74
|
-
},
|
|
75
|
-
"scripts": {
|
|
76
|
-
"test": "node --test tests/unit/honest-failure-rules.test.js tests/unit/generator-swarm-contract.test.js tests/unit/check-swarm-receipts.test.js tests/unit/check-embed-contract.test.js tests/unit/check-model-cost.test.js tests/unit/check-canon.test.js tests/unit/check-file-ownership.test.js tests/unit/check-source-version.test.js tests/unit/check-handoff-manifest.test.js tests/unit/check-external-deps.test.js tests/unit/check-metric-source.test.js tests/unit/negative-conclusion-gate.test.js tests/unit/check-webhook-contract.test.js tests/unit/check-job-contract.test.js tests/unit/detection-ladder-contract.test.js tests/unit/detection-ladder-registry.test.js tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/insights-dz-delegation.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/doctor-insight-flow.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/check-look-trace.test.js tests/unit/check-look-origin.test.js tests/unit/quote-provenance.test.js tests/unit/guard-honest-input-meta.test.js tests/unit/look-phase-contract.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js tests/unit/check-review-contract.test.js tests/unit/absence-is-not-emptiness.test.js tests/unit/guard-forms.test.js tests/unit/generated-guard-templates.test.js tests/unit/shipped-suite-context.test.js tests/unit/assess-scripts.test.js tests/unit/insights-docs-tell-the-truth.test.js tests/unit/insights-writer.test.js tests/unit/check-pipeline-gaps.test.js tests/unit/traceability-machine-ids.test.js tests/unit/traceability-completion-gate.test.js tests/unit/traceability-negative-fixture.test.js tests/e2e/lifecycle.test.js tests/e2e/feature-contour.test.js tests/e2e/packed-insights-writer.test.js tests/snapshot/templates.test.js tests/unit/optional-doc-idiom.test.js tests/unit/verdict-vocabulary.test.js tests/unit/check-dangling-refs.test.js test/mutation-registry-freshness.test.js",
|
|
77
|
-
"test:unit": "node --test tests/unit/honest-failure-rules.test.js tests/unit/generator-swarm-contract.test.js tests/unit/check-swarm-receipts.test.js tests/unit/check-embed-contract.test.js tests/unit/check-model-cost.test.js tests/unit/check-canon.test.js tests/unit/check-file-ownership.test.js tests/unit/check-source-version.test.js tests/unit/check-handoff-manifest.test.js tests/unit/check-external-deps.test.js tests/unit/check-metric-source.test.js tests/unit/negative-conclusion-gate.test.js tests/unit/check-webhook-contract.test.js tests/unit/check-job-contract.test.js tests/unit/detection-ladder-contract.test.js tests/unit/detection-ladder-registry.test.js tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/insights-dz-delegation.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/doctor-insight-flow.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/check-look-trace.test.js tests/unit/check-look-origin.test.js tests/unit/quote-provenance.test.js tests/unit/guard-honest-input-meta.test.js tests/unit/look-phase-contract.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js tests/unit/check-review-contract.test.js tests/unit/absence-is-not-emptiness.test.js tests/unit/guard-forms.test.js tests/unit/generated-guard-templates.test.js tests/unit/shipped-suite-context.test.js tests/unit/assess-scripts.test.js tests/unit/insights-docs-tell-the-truth.test.js tests/unit/insights-writer.test.js tests/unit/check-pipeline-gaps.test.js tests/unit/traceability-machine-ids.test.js tests/unit/traceability-completion-gate.test.js tests/unit/traceability-negative-fixture.test.js tests/unit/optional-doc-idiom.test.js tests/unit/verdict-vocabulary.test.js tests/unit/check-dangling-refs.test.js",
|
|
78
|
-
"test:e2e": "node --test tests/e2e/lifecycle.test.js tests/e2e/packed-insights-writer.test.js",
|
|
79
|
-
"test:snapshot": "node --test tests/snapshot/templates.test.js",
|
|
80
|
-
"test:doctor": "node bin/cli.js doctor",
|
|
81
|
-
"snapshot:baseline": "node tests/snapshot/update-baseline.js",
|
|
82
|
-
"test:browser": "node --test tests/unit/capture-source-path.test.js"
|
|
83
83
|
}
|
|
84
|
-
}
|
|
84
|
+
}
|
package/sbom.json
CHANGED
|
@@ -279,7 +279,7 @@
|
|
|
279
279
|
},
|
|
280
280
|
{
|
|
281
281
|
"name": "dz:canonical-json-sha256-v2",
|
|
282
|
-
"value": "
|
|
282
|
+
"value": "085a7e742af097d9df173fee66eecba5cc2b4f5482b600b2de51f742cc38c8f4"
|
|
283
283
|
}
|
|
284
284
|
]
|
|
285
285
|
},
|
|
@@ -619,7 +619,7 @@
|
|
|
619
619
|
"hashes": [
|
|
620
620
|
{
|
|
621
621
|
"alg": "SHA-256",
|
|
622
|
-
"content": "
|
|
622
|
+
"content": "d671353b2e73e0790206cf963ee85f1ff6b97d56d975b9eb3ad59a14d7239e2a"
|
|
623
623
|
}
|
|
624
624
|
]
|
|
625
625
|
},
|
|
@@ -2053,6 +2053,16 @@
|
|
|
2053
2053
|
}
|
|
2054
2054
|
]
|
|
2055
2055
|
},
|
|
2056
|
+
{
|
|
2057
|
+
"type": "file",
|
|
2058
|
+
"name": "tests/dz-availability.js",
|
|
2059
|
+
"hashes": [
|
|
2060
|
+
{
|
|
2061
|
+
"alg": "SHA-256",
|
|
2062
|
+
"content": "22203df26f3a90f015730c4b667b07b35e40730cb0e310b4e8087cbfab31b3ce"
|
|
2063
|
+
}
|
|
2064
|
+
]
|
|
2065
|
+
},
|
|
2056
2066
|
{
|
|
2057
2067
|
"type": "file",
|
|
2058
2068
|
"name": "tests/e2e/feature-contour.test.js",
|
|
@@ -2079,7 +2089,7 @@
|
|
|
2079
2089
|
"hashes": [
|
|
2080
2090
|
{
|
|
2081
2091
|
"alg": "SHA-256",
|
|
2082
|
-
"content": "
|
|
2092
|
+
"content": "b84eb4d3b79544b8c0dad51dd043ce01dd94931246fc153283f9ab6d1c50e8cc"
|
|
2083
2093
|
}
|
|
2084
2094
|
]
|
|
2085
2095
|
},
|
|
@@ -2183,13 +2193,33 @@
|
|
|
2183
2193
|
}
|
|
2184
2194
|
]
|
|
2185
2195
|
},
|
|
2196
|
+
{
|
|
2197
|
+
"type": "file",
|
|
2198
|
+
"name": "tests/npm-cli-resolver.js",
|
|
2199
|
+
"hashes": [
|
|
2200
|
+
{
|
|
2201
|
+
"alg": "SHA-256",
|
|
2202
|
+
"content": "272e8aab19d4b0dbe3fa2bf3c0d544afd1c811f6a04cc445d480233e11c63840"
|
|
2203
|
+
}
|
|
2204
|
+
]
|
|
2205
|
+
},
|
|
2206
|
+
{
|
|
2207
|
+
"type": "file",
|
|
2208
|
+
"name": "tests/npm-resolver-cases.json",
|
|
2209
|
+
"hashes": [
|
|
2210
|
+
{
|
|
2211
|
+
"alg": "SHA-256",
|
|
2212
|
+
"content": "df67c832c5bde9f550d88fda48ed27600f4654aa7c3fdaadc79adbbbe6af141b"
|
|
2213
|
+
}
|
|
2214
|
+
]
|
|
2215
|
+
},
|
|
2186
2216
|
{
|
|
2187
2217
|
"type": "file",
|
|
2188
2218
|
"name": "tests/snapshot/baseline.json",
|
|
2189
2219
|
"hashes": [
|
|
2190
2220
|
{
|
|
2191
2221
|
"alg": "SHA-256",
|
|
2192
|
-
"content": "
|
|
2222
|
+
"content": "0c73149a79dc3b4c051f49500ea2f3fb2dc172df127636fe95ab217e8a6f5291"
|
|
2193
2223
|
}
|
|
2194
2224
|
]
|
|
2195
2225
|
},
|
|
@@ -2319,7 +2349,7 @@
|
|
|
2319
2349
|
"hashes": [
|
|
2320
2350
|
{
|
|
2321
2351
|
"alg": "SHA-256",
|
|
2322
|
-
"content": "
|
|
2352
|
+
"content": "e5177f2726a8a13c2c0a56d5bf010d0ee0160f2324cf7b2293c4d44c40fdc4aa"
|
|
2323
2353
|
}
|
|
2324
2354
|
]
|
|
2325
2355
|
},
|
|
@@ -2489,7 +2519,7 @@
|
|
|
2489
2519
|
"hashes": [
|
|
2490
2520
|
{
|
|
2491
2521
|
"alg": "SHA-256",
|
|
2492
|
-
"content": "
|
|
2522
|
+
"content": "0612c27c88051c717da0e37b7f525b75195a85cf7a88f0da9d65d7ebbc3501b6"
|
|
2493
2523
|
}
|
|
2494
2524
|
]
|
|
2495
2525
|
},
|
|
@@ -2659,7 +2689,7 @@
|
|
|
2659
2689
|
"hashes": [
|
|
2660
2690
|
{
|
|
2661
2691
|
"alg": "SHA-256",
|
|
2662
|
-
"content": "
|
|
2692
|
+
"content": "e17cd3de5fd6173ebf262b5c5d354ee764343a02a7a22f9f2f16511b220d067c"
|
|
2663
2693
|
}
|
|
2664
2694
|
]
|
|
2665
2695
|
},
|
|
@@ -2693,6 +2723,16 @@
|
|
|
2693
2723
|
}
|
|
2694
2724
|
]
|
|
2695
2725
|
},
|
|
2726
|
+
{
|
|
2727
|
+
"type": "file",
|
|
2728
|
+
"name": "tests/unit/npm-cli-resolver.test.js",
|
|
2729
|
+
"hashes": [
|
|
2730
|
+
{
|
|
2731
|
+
"alg": "SHA-256",
|
|
2732
|
+
"content": "9c5ee626d9b92c69e9720b1fca032a14592c2767f903b064be1b7f1f78772b76"
|
|
2733
|
+
}
|
|
2734
|
+
]
|
|
2735
|
+
},
|
|
2696
2736
|
{
|
|
2697
2737
|
"type": "file",
|
|
2698
2738
|
"name": "tests/unit/optional-doc-idiom.test.js",
|
|
File without changes
|
|
@@ -139,12 +139,26 @@ function section(text) {
|
|
|
139
139
|
* an untouched template look like a filled-in inventory, which is the same substitution as an
|
|
140
140
|
* absent section, one level in.
|
|
141
141
|
*/
|
|
142
|
+
/**
|
|
143
|
+
* A markdown separator row: every cell is dashes with optional colons (`|---|:--:|`). The row
|
|
144
|
+
* directly ABOVE it is the table header — in ANY language. MEASURED 2026-09-02 (backlog b8a7669d):
|
|
145
|
+
* recognising the header by the English word `capability` alone turned the Russian header
|
|
146
|
+
* «| Возможность | Провайдер | … |» into a data row «без вердикта», and that false finding fired
|
|
147
|
+
* first and masked the real one. Position is the markdown fact; the word was a guess.
|
|
148
|
+
*/
|
|
149
|
+
function isSeparatorRow(line) {
|
|
150
|
+
if (!line || !line.startsWith('|')) return false;
|
|
151
|
+
const cells = line.split('|').slice(1, -1).map((c) => c.trim());
|
|
152
|
+
return cells.length > 0 && cells.every((c) => /^:?-+:?$/.test(c));
|
|
153
|
+
}
|
|
154
|
+
|
|
142
155
|
function rows(body) {
|
|
143
156
|
const out = [];
|
|
144
157
|
let templates = 0;
|
|
145
158
|
let fenced = false;
|
|
146
|
-
|
|
147
|
-
|
|
159
|
+
const lines = body.split('\n').map((raw) => raw.trim());
|
|
160
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
161
|
+
const line = lines[i];
|
|
148
162
|
if (/^(```|~~~)/.test(line)) { fenced = !fenced; continue; }
|
|
149
163
|
if (fenced) continue;
|
|
150
164
|
if (!line.startsWith('|')) continue;
|
|
@@ -152,7 +166,8 @@ function rows(body) {
|
|
|
152
166
|
if (cells.length < 7) continue; // '' + 5 columns + ''
|
|
153
167
|
const capability = cells[1];
|
|
154
168
|
if (!capability || /^:?-+:?$/.test(capability)) continue;
|
|
155
|
-
if (
|
|
169
|
+
if (isSeparatorRow(lines[i + 1])) continue; // header row, by POSITION (any language)
|
|
170
|
+
if (/^capability/i.test(capability)) continue; // header of a table WITHOUT a separator row (belt)
|
|
156
171
|
if (/^\[.*\]$/.test(capability) || capability === '...') { templates += 1; continue; }
|
|
157
172
|
out.push({
|
|
158
173
|
capability,
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Backlog 1b4857a6. Several cases here need a REAL `dz` on PATH — they delete or read the `.dz`
|
|
5
|
+
* state that only dz creates. The insight writer already reports the two ways that can go wrong
|
|
6
|
+
* with DIFFERENT words: `absent` is ENOENT on the spawn (no dz anywhere), `failed` is dz running
|
|
7
|
+
* and erroring. Conflating them is what made these cases green on a developer machine, where a
|
|
8
|
+
* global dz happens to be installed, and red on a CI runner, where nothing installs one:
|
|
9
|
+
* MEASURED 2026-09-19 (runs 35433442559, 35434913155, 35444026540) — `'absent' !== 'ok'`.
|
|
10
|
+
*
|
|
11
|
+
* So a MISSING TOOL is an audible skip and a BROKEN TOOL stays red. The skip is printed as well as
|
|
12
|
+
* registered, because a silent skip is how a test stops proving anything without anyone noticing —
|
|
13
|
+
* the same contract `announceNpmSkip` keeps in `tests/npm-cli-resolver.js`.
|
|
14
|
+
*
|
|
15
|
+
* Deliberately self-contained: `tests/` is published with this package (see `files` in
|
|
16
|
+
* package.json), so nothing here may reach outside it.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param {{skip:(reason:string)=>void}} t — the node:test context
|
|
21
|
+
* @param {string} teachState — the writer's `teach.state`
|
|
22
|
+
* @param {string} caseNote — what this case needs dz FOR, in one clause
|
|
23
|
+
* @returns {boolean} true when the case must stop (dz is absent and the skip is registered)
|
|
24
|
+
*/
|
|
25
|
+
function skipWhenDzAbsent(t, teachState, caseNote) {
|
|
26
|
+
if (teachState !== 'absent') return false;
|
|
27
|
+
const reason = `SKIPPED — this case needs a real \`dz\` on PATH (${caseNote}); the writer `
|
|
28
|
+
+ 'reported teach.state=absent, which is ENOENT on the spawn — no dz was found, not dz failing.';
|
|
29
|
+
process.stdout.write(`${reason}\n`);
|
|
30
|
+
t.skip(reason);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { skipWhenDzAbsent };
|
|
@@ -7,6 +7,7 @@ const crypto = require('node:crypto');
|
|
|
7
7
|
const fs = require('node:fs');
|
|
8
8
|
const os = require('node:os');
|
|
9
9
|
const path = require('node:path');
|
|
10
|
+
const { skipWhenDzAbsent } = require('../dz-availability.js');
|
|
10
11
|
|
|
11
12
|
const PKG = path.resolve(__dirname, '..', '..');
|
|
12
13
|
const NPM = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
@@ -220,12 +221,15 @@ describe('PR-022 exact packed artifact', () => {
|
|
|
220
221
|
} finally { fs.rmSync(consumer, { recursive: true, force: true }); }
|
|
221
222
|
});
|
|
222
223
|
|
|
223
|
-
test('P17 - deleting .dz retains the packed Markdown record and local delivery', () => {
|
|
224
|
+
test('P17 - deleting .dz retains the packed Markdown record and local delivery', (t) => {
|
|
224
225
|
const { consumer } = installConsumer();
|
|
225
226
|
try {
|
|
226
227
|
const record = insight({ title: LOCAL_PACKED });
|
|
227
228
|
const written = parseReceipt(runPackedWriter(consumer, record, { path: process.env.PATH }));
|
|
228
229
|
assert.equal(written.status, 'created');
|
|
230
|
+
// Backlog 1b4857a6: a MISSING dz is an audible skip, a BROKEN dz stays red. The rule and
|
|
231
|
+
// its reasoning live once, in tests/dz-availability.js.
|
|
232
|
+
if (skipWhenDzAbsent(t, written.teach.state, 'it deletes the .dz state that only dz creates')) return;
|
|
229
233
|
assert.equal(written.teach.state, 'ok');
|
|
230
234
|
|
|
231
235
|
const query = run('dz', ['recall', '--all', '--json', '--project', consumer], {
|