@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 CHANGED
@@ -109,7 +109,7 @@
109
109
  },
110
110
  {
111
111
  "path": "package.json",
112
- "sha256": "09d9074650a09fe7715324b47211685755777381c8219cdecb0bfbc4d562bd0f"
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": "7bce49a744170a3193edf4b2238bcc5a6f1b0efa29333760a52e4fd145739d18"
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": "3477f63db3f531e3c2970b85d784f22d268695030764319457a543b2e9d49758"
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": "31801798e099c5e43e60de29c3487a586fe6b906b2135ea1060861567d36fdfb"
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": "652c90abf50636dd97e499fe3d23f77b780a0f77d7dd989f4b7ab900ae3a467b"
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": "8ff509273436f10432bed8d34568d88d3bcbf6d85c9e7e290310ab771b9785b0"
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": "e723a1fe9cd392196aae4f0c421915b6487f78ee213cfa1eab3f1b66106ec243"
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": "DsIFOeT4ntNvUrhbFwpDHt7FDAAAq0dlLrVkPqSmxOmk8sER5xd7d2L7OvMEeaFFzfobe6IYFNtJlv5ISvtiCA=="
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",
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": "09d9074650a09fe7715324b47211685755777381c8219cdecb0bfbc4d562bd0f"
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": "7bce49a744170a3193edf4b2238bcc5a6f1b0efa29333760a52e4fd145739d18"
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": "3477f63db3f531e3c2970b85d784f22d268695030764319457a543b2e9d49758"
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": "31801798e099c5e43e60de29c3487a586fe6b906b2135ea1060861567d36fdfb"
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": "652c90abf50636dd97e499fe3d23f77b780a0f77d7dd989f4b7ab900ae3a467b"
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": "8ff509273436f10432bed8d34568d88d3bcbf6d85c9e7e290310ab771b9785b0"
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": "e723a1fe9cd392196aae4f0c421915b6487f78ee213cfa1eab3f1b66106ec243"
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
- for (const raw of body.split('\n')) {
147
- const line = raw.trim();
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 (/^capability/i.test(capability)) continue; // header row
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], {