@dzhechkov/harness-core 0.8.43 → 0.8.45
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 +74 -34
- package/README.md +57 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lesson-payoff.d.ts.map +1 -1
- package/dist/lesson-payoff.js +3 -1
- package/dist/lesson-payoff.js.map +1 -1
- package/dist/memory-index-check.d.ts.map +1 -1
- package/dist/memory-index-check.js +17 -4
- package/dist/memory-index-check.js.map +1 -1
- package/dist/pack-artifact.d.ts +24 -0
- package/dist/pack-artifact.d.ts.map +1 -0
- package/dist/pack-artifact.js +99 -0
- package/dist/pack-artifact.js.map +1 -0
- package/dist/profile.d.ts.map +1 -1
- package/dist/profile.js +6 -0
- package/dist/profile.js.map +1 -1
- package/dist/publish-sibling-drift.d.ts +6 -2
- package/dist/publish-sibling-drift.d.ts.map +1 -1
- package/dist/publish-sibling-drift.js +10 -1
- package/dist/publish-sibling-drift.js.map +1 -1
- package/dist/publish.d.ts +1 -2
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +9 -53
- package/dist/publish.js.map +1 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +3 -2
- package/dist/setup.js.map +1 -1
- package/dist/stamped-path.d.ts +15 -0
- package/dist/stamped-path.d.ts.map +1 -0
- package/dist/stamped-path.js +32 -0
- package/dist/stamped-path.js.map +1 -0
- package/package.json +12 -12
- package/sbom.json +133 -33
- package/src/index.ts +4 -1
- package/src/lesson-payoff.ts +3 -1
- package/src/memory-index-check.ts +17 -4
- package/src/pack-artifact.ts +109 -0
- package/src/profile.ts +5 -0
- package/src/publish-sibling-drift.ts +16 -3
- package/src/publish.ts +9 -50
- package/src/setup.ts +3 -2
- package/src/stamped-path.ts +41 -0
package/sbom.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"hashes": [
|
|
26
26
|
{
|
|
27
27
|
"alg": "SHA-256",
|
|
28
|
-
"content": "
|
|
28
|
+
"content": "9471b66311d4ec18259af1bb47442ba2ca145b14c62f326bdf2ba7934728c604"
|
|
29
29
|
}
|
|
30
30
|
]
|
|
31
31
|
},
|
|
@@ -2915,7 +2915,7 @@
|
|
|
2915
2915
|
"hashes": [
|
|
2916
2916
|
{
|
|
2917
2917
|
"alg": "SHA-256",
|
|
2918
|
-
"content": "
|
|
2918
|
+
"content": "57180412f3b4c03a8361ba69f1ea44402a38ddb5733039f0c34cadad80e1d8f8"
|
|
2919
2919
|
}
|
|
2920
2920
|
]
|
|
2921
2921
|
},
|
|
@@ -2925,7 +2925,7 @@
|
|
|
2925
2925
|
"hashes": [
|
|
2926
2926
|
{
|
|
2927
2927
|
"alg": "SHA-256",
|
|
2928
|
-
"content": "
|
|
2928
|
+
"content": "4e82b1bfc3ceb7ff85424cceb6c5d9fec85153942fa6c05a6139e8ac7cf5f77f"
|
|
2929
2929
|
}
|
|
2930
2930
|
]
|
|
2931
2931
|
},
|
|
@@ -2935,7 +2935,7 @@
|
|
|
2935
2935
|
"hashes": [
|
|
2936
2936
|
{
|
|
2937
2937
|
"alg": "SHA-256",
|
|
2938
|
-
"content": "
|
|
2938
|
+
"content": "72c2dd7205ee3c83d1afa46e6de761d27b6df9faf67dc5a521cb53c8a6827cf2"
|
|
2939
2939
|
}
|
|
2940
2940
|
]
|
|
2941
2941
|
},
|
|
@@ -2945,7 +2945,7 @@
|
|
|
2945
2945
|
"hashes": [
|
|
2946
2946
|
{
|
|
2947
2947
|
"alg": "SHA-256",
|
|
2948
|
-
"content": "
|
|
2948
|
+
"content": "93f882ebf5e4c8fe7d01167bf532fc151ab94a346d8fc32e23488c532c36f9bc"
|
|
2949
2949
|
}
|
|
2950
2950
|
]
|
|
2951
2951
|
},
|
|
@@ -3405,7 +3405,7 @@
|
|
|
3405
3405
|
"hashes": [
|
|
3406
3406
|
{
|
|
3407
3407
|
"alg": "SHA-256",
|
|
3408
|
-
"content": "
|
|
3408
|
+
"content": "e8dcc3bd0e0b7dca766b9ed8e77c3b33d349349b809ee625890f327aa62ebc77"
|
|
3409
3409
|
}
|
|
3410
3410
|
]
|
|
3411
3411
|
},
|
|
@@ -3415,7 +3415,7 @@
|
|
|
3415
3415
|
"hashes": [
|
|
3416
3416
|
{
|
|
3417
3417
|
"alg": "SHA-256",
|
|
3418
|
-
"content": "
|
|
3418
|
+
"content": "d1ab2c60cc400cf9be5e2d6352eae67d9a3142808fd741ca6103a83b35afb655"
|
|
3419
3419
|
}
|
|
3420
3420
|
]
|
|
3421
3421
|
},
|
|
@@ -3425,7 +3425,7 @@
|
|
|
3425
3425
|
"hashes": [
|
|
3426
3426
|
{
|
|
3427
3427
|
"alg": "SHA-256",
|
|
3428
|
-
"content": "
|
|
3428
|
+
"content": "dd03c47fb197c268f28a39bd65ce0c571ae7ffb546edef88d1dc460654f174cc"
|
|
3429
3429
|
}
|
|
3430
3430
|
]
|
|
3431
3431
|
},
|
|
@@ -3845,7 +3845,7 @@
|
|
|
3845
3845
|
"hashes": [
|
|
3846
3846
|
{
|
|
3847
3847
|
"alg": "SHA-256",
|
|
3848
|
-
"content": "
|
|
3848
|
+
"content": "788ec70ba0443c3d3f8e1599548f54013d4d6ae864ccac1b3406d84d55e443df"
|
|
3849
3849
|
}
|
|
3850
3850
|
]
|
|
3851
3851
|
},
|
|
@@ -3855,7 +3855,7 @@
|
|
|
3855
3855
|
"hashes": [
|
|
3856
3856
|
{
|
|
3857
3857
|
"alg": "SHA-256",
|
|
3858
|
-
"content": "
|
|
3858
|
+
"content": "43ba71733350f5f91ea98ed3b94baa61fe3b454543d687524e51d8cb135d7022"
|
|
3859
3859
|
}
|
|
3860
3860
|
]
|
|
3861
3861
|
},
|
|
@@ -3865,7 +3865,7 @@
|
|
|
3865
3865
|
"hashes": [
|
|
3866
3866
|
{
|
|
3867
3867
|
"alg": "SHA-256",
|
|
3868
|
-
"content": "
|
|
3868
|
+
"content": "66f08674ced70cfcd60bdf14fd3dded0052535b608edb31a5be165dc10ccc777"
|
|
3869
3869
|
}
|
|
3870
3870
|
]
|
|
3871
3871
|
},
|
|
@@ -4149,6 +4149,46 @@
|
|
|
4149
4149
|
}
|
|
4150
4150
|
]
|
|
4151
4151
|
},
|
|
4152
|
+
{
|
|
4153
|
+
"type": "file",
|
|
4154
|
+
"name": "dist/pack-artifact.d.ts",
|
|
4155
|
+
"hashes": [
|
|
4156
|
+
{
|
|
4157
|
+
"alg": "SHA-256",
|
|
4158
|
+
"content": "ac53c92fe8be66aa73580b13e273321e229eeb9c2f7c3ce82acd4d0cebcfaae4"
|
|
4159
|
+
}
|
|
4160
|
+
]
|
|
4161
|
+
},
|
|
4162
|
+
{
|
|
4163
|
+
"type": "file",
|
|
4164
|
+
"name": "dist/pack-artifact.d.ts.map",
|
|
4165
|
+
"hashes": [
|
|
4166
|
+
{
|
|
4167
|
+
"alg": "SHA-256",
|
|
4168
|
+
"content": "fc5ec05405710ec6cb543121d9c6f14ba9c5c11e5edc918e15622c9efc24bfe8"
|
|
4169
|
+
}
|
|
4170
|
+
]
|
|
4171
|
+
},
|
|
4172
|
+
{
|
|
4173
|
+
"type": "file",
|
|
4174
|
+
"name": "dist/pack-artifact.js",
|
|
4175
|
+
"hashes": [
|
|
4176
|
+
{
|
|
4177
|
+
"alg": "SHA-256",
|
|
4178
|
+
"content": "6ad53e00466d96653f88ab0ec69f9a2d63552023bf5b851ce37918f44466ba8f"
|
|
4179
|
+
}
|
|
4180
|
+
]
|
|
4181
|
+
},
|
|
4182
|
+
{
|
|
4183
|
+
"type": "file",
|
|
4184
|
+
"name": "dist/pack-artifact.js.map",
|
|
4185
|
+
"hashes": [
|
|
4186
|
+
{
|
|
4187
|
+
"alg": "SHA-256",
|
|
4188
|
+
"content": "3b1537b2de837841488829eaf12ee76fc405dbe12716a5b6677b2339ac5276cb"
|
|
4189
|
+
}
|
|
4190
|
+
]
|
|
4191
|
+
},
|
|
4152
4192
|
{
|
|
4153
4193
|
"type": "file",
|
|
4154
4194
|
"name": "dist/pack-inventory.d.ts",
|
|
@@ -4485,7 +4525,7 @@
|
|
|
4485
4525
|
"hashes": [
|
|
4486
4526
|
{
|
|
4487
4527
|
"alg": "SHA-256",
|
|
4488
|
-
"content": "
|
|
4528
|
+
"content": "fe20c556f01f1845f344886135d13357d5aea9f7260cf86d4758e82927053851"
|
|
4489
4529
|
}
|
|
4490
4530
|
]
|
|
4491
4531
|
},
|
|
@@ -4495,7 +4535,7 @@
|
|
|
4495
4535
|
"hashes": [
|
|
4496
4536
|
{
|
|
4497
4537
|
"alg": "SHA-256",
|
|
4498
|
-
"content": "
|
|
4538
|
+
"content": "2a21b1817b07e27719c559bd37d78e87659bf1249ffdb7499efba1999d49c7c2"
|
|
4499
4539
|
}
|
|
4500
4540
|
]
|
|
4501
4541
|
},
|
|
@@ -4505,7 +4545,7 @@
|
|
|
4505
4545
|
"hashes": [
|
|
4506
4546
|
{
|
|
4507
4547
|
"alg": "SHA-256",
|
|
4508
|
-
"content": "
|
|
4548
|
+
"content": "1ee080ccc4b13bd8a1961d31284bc686860ca704e29c3b0b687a3106ccdc13c7"
|
|
4509
4549
|
}
|
|
4510
4550
|
]
|
|
4511
4551
|
},
|
|
@@ -4635,7 +4675,7 @@
|
|
|
4635
4675
|
"hashes": [
|
|
4636
4676
|
{
|
|
4637
4677
|
"alg": "SHA-256",
|
|
4638
|
-
"content": "
|
|
4678
|
+
"content": "612d932b140a0bc367a772fb6122275b509ff26a6359534f1cf3ce79539def1b"
|
|
4639
4679
|
}
|
|
4640
4680
|
]
|
|
4641
4681
|
},
|
|
@@ -4645,7 +4685,7 @@
|
|
|
4645
4685
|
"hashes": [
|
|
4646
4686
|
{
|
|
4647
4687
|
"alg": "SHA-256",
|
|
4648
|
-
"content": "
|
|
4688
|
+
"content": "120250c23f016ef260bd764b35ddca919da595b953fcaf7960ae228c4bdc65d2"
|
|
4649
4689
|
}
|
|
4650
4690
|
]
|
|
4651
4691
|
},
|
|
@@ -4655,7 +4695,7 @@
|
|
|
4655
4695
|
"hashes": [
|
|
4656
4696
|
{
|
|
4657
4697
|
"alg": "SHA-256",
|
|
4658
|
-
"content": "
|
|
4698
|
+
"content": "da830c806d680362a0668623dd653add234ea9968511366b178c3b1657318d05"
|
|
4659
4699
|
}
|
|
4660
4700
|
]
|
|
4661
4701
|
},
|
|
@@ -4665,7 +4705,7 @@
|
|
|
4665
4705
|
"hashes": [
|
|
4666
4706
|
{
|
|
4667
4707
|
"alg": "SHA-256",
|
|
4668
|
-
"content": "
|
|
4708
|
+
"content": "e08511c5f7024e8d76472a68ed930b613fffc5a859788a3cbb20cf469a638fa0"
|
|
4669
4709
|
}
|
|
4670
4710
|
]
|
|
4671
4711
|
},
|
|
@@ -4755,7 +4795,7 @@
|
|
|
4755
4795
|
"hashes": [
|
|
4756
4796
|
{
|
|
4757
4797
|
"alg": "SHA-256",
|
|
4758
|
-
"content": "
|
|
4798
|
+
"content": "5384d5e5b0be1dc5f41c376233a1182065edd26622ecf5608a8f73f7f04c9f81"
|
|
4759
4799
|
}
|
|
4760
4800
|
]
|
|
4761
4801
|
},
|
|
@@ -4765,7 +4805,7 @@
|
|
|
4765
4805
|
"hashes": [
|
|
4766
4806
|
{
|
|
4767
4807
|
"alg": "SHA-256",
|
|
4768
|
-
"content": "
|
|
4808
|
+
"content": "cee754875a0f78ef1b65457f07eb33a0045469596e22f6f3f3eef4ff989401c0"
|
|
4769
4809
|
}
|
|
4770
4810
|
]
|
|
4771
4811
|
},
|
|
@@ -4775,7 +4815,7 @@
|
|
|
4775
4815
|
"hashes": [
|
|
4776
4816
|
{
|
|
4777
4817
|
"alg": "SHA-256",
|
|
4778
|
-
"content": "
|
|
4818
|
+
"content": "e6fe3953003c79e5ce5065053c401d322fb186f40603bf7312beb5c2fb994969"
|
|
4779
4819
|
}
|
|
4780
4820
|
]
|
|
4781
4821
|
},
|
|
@@ -4785,7 +4825,7 @@
|
|
|
4785
4825
|
"hashes": [
|
|
4786
4826
|
{
|
|
4787
4827
|
"alg": "SHA-256",
|
|
4788
|
-
"content": "
|
|
4828
|
+
"content": "275fd7d74bd1345ffe8fa55ffced2272985662904dc7774f6b343b06730322b0"
|
|
4789
4829
|
}
|
|
4790
4830
|
]
|
|
4791
4831
|
},
|
|
@@ -6045,7 +6085,7 @@
|
|
|
6045
6085
|
"hashes": [
|
|
6046
6086
|
{
|
|
6047
6087
|
"alg": "SHA-256",
|
|
6048
|
-
"content": "
|
|
6088
|
+
"content": "3ecf9110097001cba535095de5a78cd9ca2703cfed15d921f368673b08ef6374"
|
|
6049
6089
|
}
|
|
6050
6090
|
]
|
|
6051
6091
|
},
|
|
@@ -6055,7 +6095,7 @@
|
|
|
6055
6095
|
"hashes": [
|
|
6056
6096
|
{
|
|
6057
6097
|
"alg": "SHA-256",
|
|
6058
|
-
"content": "
|
|
6098
|
+
"content": "ffab1105dd844f20d5f8a6c385901f9bb6c714148a2f61a4e51afab0254021b2"
|
|
6059
6099
|
}
|
|
6060
6100
|
]
|
|
6061
6101
|
},
|
|
@@ -6065,7 +6105,7 @@
|
|
|
6065
6105
|
"hashes": [
|
|
6066
6106
|
{
|
|
6067
6107
|
"alg": "SHA-256",
|
|
6068
|
-
"content": "
|
|
6108
|
+
"content": "363fa3f4e716a6e450a49f9f11b9c871baad68b30c825f3cdd4b27f471731572"
|
|
6069
6109
|
}
|
|
6070
6110
|
]
|
|
6071
6111
|
},
|
|
@@ -6509,6 +6549,46 @@
|
|
|
6509
6549
|
}
|
|
6510
6550
|
]
|
|
6511
6551
|
},
|
|
6552
|
+
{
|
|
6553
|
+
"type": "file",
|
|
6554
|
+
"name": "dist/stamped-path.d.ts",
|
|
6555
|
+
"hashes": [
|
|
6556
|
+
{
|
|
6557
|
+
"alg": "SHA-256",
|
|
6558
|
+
"content": "2bab16b2083b6771343aaf6e674661cd8b7e00851933caa7abb0b5129757851f"
|
|
6559
|
+
}
|
|
6560
|
+
]
|
|
6561
|
+
},
|
|
6562
|
+
{
|
|
6563
|
+
"type": "file",
|
|
6564
|
+
"name": "dist/stamped-path.d.ts.map",
|
|
6565
|
+
"hashes": [
|
|
6566
|
+
{
|
|
6567
|
+
"alg": "SHA-256",
|
|
6568
|
+
"content": "0cae7683e286b6028c3fa170386609ec8b84f4a2b71ad159f0285fc1402bd6a3"
|
|
6569
|
+
}
|
|
6570
|
+
]
|
|
6571
|
+
},
|
|
6572
|
+
{
|
|
6573
|
+
"type": "file",
|
|
6574
|
+
"name": "dist/stamped-path.js",
|
|
6575
|
+
"hashes": [
|
|
6576
|
+
{
|
|
6577
|
+
"alg": "SHA-256",
|
|
6578
|
+
"content": "95f90efd72d5068247b778cc2b740562b263ba3ae9bd8793811d9b58d02524c4"
|
|
6579
|
+
}
|
|
6580
|
+
]
|
|
6581
|
+
},
|
|
6582
|
+
{
|
|
6583
|
+
"type": "file",
|
|
6584
|
+
"name": "dist/stamped-path.js.map",
|
|
6585
|
+
"hashes": [
|
|
6586
|
+
{
|
|
6587
|
+
"alg": "SHA-256",
|
|
6588
|
+
"content": "862c33d8a76abc76ef47987b1ec499ef46d73af109205c1cb0be3aeb75fe6350"
|
|
6589
|
+
}
|
|
6590
|
+
]
|
|
6591
|
+
},
|
|
6512
6592
|
{
|
|
6513
6593
|
"type": "file",
|
|
6514
6594
|
"name": "dist/statusline.d.ts",
|
|
@@ -7639,7 +7719,7 @@
|
|
|
7639
7719
|
},
|
|
7640
7720
|
{
|
|
7641
7721
|
"name": "dz:canonical-json-sha256-v2",
|
|
7642
|
-
"value": "
|
|
7722
|
+
"value": "501025e7e79122425b01afd14c2a37c59e7fb642d3606b1096f34d1530392995"
|
|
7643
7723
|
}
|
|
7644
7724
|
]
|
|
7645
7725
|
},
|
|
@@ -8379,7 +8459,7 @@
|
|
|
8379
8459
|
"hashes": [
|
|
8380
8460
|
{
|
|
8381
8461
|
"alg": "SHA-256",
|
|
8382
|
-
"content": "
|
|
8462
|
+
"content": "e4bc19a0dbb761a9155022398ed3223091366c95fb850b79f56d6722cbe57f26"
|
|
8383
8463
|
}
|
|
8384
8464
|
]
|
|
8385
8465
|
},
|
|
@@ -8499,7 +8579,7 @@
|
|
|
8499
8579
|
"hashes": [
|
|
8500
8580
|
{
|
|
8501
8581
|
"alg": "SHA-256",
|
|
8502
|
-
"content": "
|
|
8582
|
+
"content": "a3754701f00eba282d95ed944cdf0e88b2018bdd0713a305e220759f0f0b1202"
|
|
8503
8583
|
}
|
|
8504
8584
|
]
|
|
8505
8585
|
},
|
|
@@ -8609,7 +8689,7 @@
|
|
|
8609
8689
|
"hashes": [
|
|
8610
8690
|
{
|
|
8611
8691
|
"alg": "SHA-256",
|
|
8612
|
-
"content": "
|
|
8692
|
+
"content": "78baea4b55d0d19180040761050837a9f28bdd60112062a7d359ebfd78beed14"
|
|
8613
8693
|
}
|
|
8614
8694
|
]
|
|
8615
8695
|
},
|
|
@@ -8683,6 +8763,16 @@
|
|
|
8683
8763
|
}
|
|
8684
8764
|
]
|
|
8685
8765
|
},
|
|
8766
|
+
{
|
|
8767
|
+
"type": "file",
|
|
8768
|
+
"name": "src/pack-artifact.ts",
|
|
8769
|
+
"hashes": [
|
|
8770
|
+
{
|
|
8771
|
+
"alg": "SHA-256",
|
|
8772
|
+
"content": "7c7679225a5d5057ecd71f195d8dbda105a9082bc3ce257a5eddd9e47b7dadd1"
|
|
8773
|
+
}
|
|
8774
|
+
]
|
|
8775
|
+
},
|
|
8686
8776
|
{
|
|
8687
8777
|
"type": "file",
|
|
8688
8778
|
"name": "src/pack-inventory.ts",
|
|
@@ -8769,7 +8859,7 @@
|
|
|
8769
8859
|
"hashes": [
|
|
8770
8860
|
{
|
|
8771
8861
|
"alg": "SHA-256",
|
|
8772
|
-
"content": "
|
|
8862
|
+
"content": "9d5a7418da2864535d5661cb6f3c2d7b8fc3e8cc98ef4e063370d841a7494abc"
|
|
8773
8863
|
}
|
|
8774
8864
|
]
|
|
8775
8865
|
},
|
|
@@ -8809,7 +8899,7 @@
|
|
|
8809
8899
|
"hashes": [
|
|
8810
8900
|
{
|
|
8811
8901
|
"alg": "SHA-256",
|
|
8812
|
-
"content": "
|
|
8902
|
+
"content": "3d1805546b964d8bce68cc94cdf1d9dd5e7e6a558f112e73fe1faf0f1c445fd4"
|
|
8813
8903
|
}
|
|
8814
8904
|
]
|
|
8815
8905
|
},
|
|
@@ -8839,7 +8929,7 @@
|
|
|
8839
8929
|
"hashes": [
|
|
8840
8930
|
{
|
|
8841
8931
|
"alg": "SHA-256",
|
|
8842
|
-
"content": "
|
|
8932
|
+
"content": "b0248fad94dc412820b0feae2d3cfd5796efac4d759a875c9063693bcd2c2a78"
|
|
8843
8933
|
}
|
|
8844
8934
|
]
|
|
8845
8935
|
},
|
|
@@ -9159,7 +9249,7 @@
|
|
|
9159
9249
|
"hashes": [
|
|
9160
9250
|
{
|
|
9161
9251
|
"alg": "SHA-256",
|
|
9162
|
-
"content": "
|
|
9252
|
+
"content": "9041565e0c4f79a66edd8fed57e5e75029d1bd0c9b276fc86cbd2718b2fec6d8"
|
|
9163
9253
|
}
|
|
9164
9254
|
]
|
|
9165
9255
|
},
|
|
@@ -9283,6 +9373,16 @@
|
|
|
9283
9373
|
}
|
|
9284
9374
|
]
|
|
9285
9375
|
},
|
|
9376
|
+
{
|
|
9377
|
+
"type": "file",
|
|
9378
|
+
"name": "src/stamped-path.ts",
|
|
9379
|
+
"hashes": [
|
|
9380
|
+
{
|
|
9381
|
+
"alg": "SHA-256",
|
|
9382
|
+
"content": "bfb3729e414745a2d40694a244baedc56c4c2eaa6f42287e77b968d211bc54ed"
|
|
9383
|
+
}
|
|
9384
|
+
]
|
|
9385
|
+
},
|
|
9286
9386
|
{
|
|
9287
9387
|
"type": "file",
|
|
9288
9388
|
"name": "src/statusline.ts",
|
package/src/index.ts
CHANGED
|
@@ -137,6 +137,7 @@ export { planLedgerBackfill, LEDGER_FILL_SOURCE, AMBIGUOUS, resolveLedgerRunId }
|
|
|
137
137
|
export { projectSkillsOneRoot, projectSkillsProbeCommand } from './project-skills-root.js';
|
|
138
138
|
export { isRepoBoundary } from './repo-boundary.js';
|
|
139
139
|
export type { RepoBoundaryIo } from './repo-boundary.js';
|
|
140
|
+
export { uniqueStampedPath, writeUniqueStampedFile } from './stamped-path.js';
|
|
140
141
|
export type { LedgerBackfillPlan, LedgerBackfillRow, RunCostFacts } from './ledger-backfill.js';
|
|
141
142
|
export type { SweepResult, DriftedSkill, SyncResult, SyncCanonicalOptions, CanonicalDefect, CanonicalDefectKind } from './skill-drift.js';
|
|
142
143
|
export { benchmarkSkill, benchmarkSkills, compareSkills } from './benchmark.js';
|
|
@@ -779,6 +780,8 @@ export type {
|
|
|
779
780
|
ChainDefectAges,
|
|
780
781
|
ChainedJournal,
|
|
781
782
|
} from './event-chain.js';
|
|
783
|
+
export { packArtifact, readWorkspaceVersions, UnknownWorkspaceSpecError } from './pack-artifact.js';
|
|
784
|
+
export type { PackArtifactResult, ExecLike } from './pack-artifact.js';
|
|
782
785
|
export { decideProvenance, environmentCanMintProvenance, publishArgv, matchesPublishFilter, discoverPackages, publishPackages, bumpPatch, compareVersions, findUnpackagedSkills, findUnpublishedWorkspaceFloors, rewriteWorkspaceSpecs, orderByDependencies, syncReadmeVersion, isChangelogEntryLine, changelogRegion, planReadmeVersionSync } from './publish.js';
|
|
783
786
|
export type { ReadmeVersionSyncPlan, ReadmeSyncRewrite } from './publish.js';
|
|
784
787
|
export { RELEASE_LINE_RE, parseReleaseLine, findReleaseLine, rewriteReleaseLine, shortPackageName } from './release-line.js';
|
|
@@ -825,7 +828,7 @@ export type {
|
|
|
825
828
|
} from './release.js';
|
|
826
829
|
export { formatPublishError } from './publish.js';
|
|
827
830
|
// Sibling-drift + packed-install-smoke gates (feature publish-sibling-drift-gate, ADR-001).
|
|
828
|
-
export { detectSiblingDrift, parseNpmPackInventory } from './publish-sibling-drift.js';
|
|
831
|
+
export { detectSiblingDrift, parseNpmPackInventory, formatDriftFiles } from './publish-sibling-drift.js';
|
|
829
832
|
export type {
|
|
830
833
|
SiblingDriftStatus,
|
|
831
834
|
InventorySource,
|
package/src/lesson-payoff.ts
CHANGED
|
@@ -38,6 +38,7 @@ import { join } from 'node:path';
|
|
|
38
38
|
|
|
39
39
|
import { LessonBandit, type ArmStats, type SerializedBanditState } from './lesson-bandit.js';
|
|
40
40
|
import { withProjectLockSync } from './named-lock.js';
|
|
41
|
+
import { uniqueStampedPath } from './stamped-path.js';
|
|
41
42
|
import { readMemoryLearningConfig, type MemoryLearningConfig } from './patterns.js';
|
|
42
43
|
|
|
43
44
|
// ── Paths and constants ─────────────────────────────────────────────────────────────────────────
|
|
@@ -383,7 +384,8 @@ function mutateBanditState(
|
|
|
383
384
|
// Preserve the evidence before overwriting it — never delete, never "repair". This is the
|
|
384
385
|
// ONE place a corrupt file is touched, and it is under the lock.
|
|
385
386
|
const target = banditStatePath(projectRoot);
|
|
386
|
-
|
|
387
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
388
|
+
try { renameSync(target, uniqueStampedPath(`${target}.corrupt-`, stamp, existsSync)); } catch { /* best-effort */ }
|
|
387
389
|
logBanditEvent(projectRoot, { event: 'bandit-error', ts: new Date().toISOString(), op, reason });
|
|
388
390
|
}
|
|
389
391
|
const bandit = LessonBandit.deserialize(state.bandit);
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { stemToken, stems } from './stem.js';
|
|
2
3
|
|
|
3
4
|
export const MEMORY_INDEX_MAX_BYTES = 24_000;
|
|
4
5
|
export const MEMORY_INDEX_MAX_LINE_CHARS = 200;
|
|
5
6
|
// Hook support is a lexical heuristic, not proof that a hook's meaning is preserved.
|
|
7
|
+
// Shared conservative stems fold находку/находка → находк and подписью/подпись → подпис;
|
|
8
|
+
// проверил ≠ проверка (verb/noun) and teacher ≠ teach remain distinct, without prefix matching.
|
|
6
9
|
// Calibration history on the real index (108 judged lines): 2026-09-23 the coder measured a live
|
|
7
10
|
// minimum of 0 at L83/L85/L114 and 15 lines under 0.5 — 14 were Russian hooks over English files
|
|
8
11
|
// or other word forms (knowledge present), one (L76) linked the WRONG file. The lead rewrote those
|
|
9
|
-
// hooks with words from their files; 2026-09-24 the live minimum is 0.5 exactly (
|
|
10
|
-
// boundary
|
|
12
|
+
// hooks with words from their files; 2026-09-24 the live minimum is 0.5 exactly (QE F2 on 23.09 counted
|
|
13
|
+
// 5 lines at the boundary on the then-index; re-measured 24.09 on the current index: 4 under the substring rule). The threshold stays the contract's 0.5; a hook at the boundary passes
|
|
11
14
|
// (`support < min` fails), so the margin there is thin by construction.
|
|
15
|
+
// Stem era (feature memory-index-hook-stems, 2026-09-24, lead on the host): with stem-to-stem support the
|
|
16
|
+
// live index first showed ONE new finding — L46, support 2/6, a hook whose words the substring rule had
|
|
17
|
+
// matched INSIDE other words (после/двух/ночь) — an honest downgrade, fixed in the memory file, not here;
|
|
18
|
+
// after that: 0 findings, minimum 0.5 on exactly 2 lines (L18, L69 — measured with minHookSupport raised
|
|
19
|
+
// just above 0.5 and counting `support 0.5` findings; the earlier "5" was a stale copy, QE F1), threshold unchanged.
|
|
12
20
|
export const MEMORY_INDEX_MIN_HOOK_SUPPORT = 0.5;
|
|
13
21
|
|
|
14
22
|
export type FindingKind = 'over-size' | 'long-line' | 'broken-link' | 'unindexed-file' | 'unsupported-hook' | 'duplicate-link';
|
|
@@ -35,6 +43,7 @@ export function checkMemoryIndex(input: {
|
|
|
35
43
|
const lines = indexText === '' ? [] : indexText.split(/\r?\n/u);
|
|
36
44
|
if (lines.at(-1) === '') lines.pop();
|
|
37
45
|
const indexed = new Map<string, number>();
|
|
46
|
+
const stemsByFile = new Map<string, Set<string>>();
|
|
38
47
|
for (const [offset, text] of lines.entries()) {
|
|
39
48
|
const line = offset + 1;
|
|
40
49
|
// String length measures UTF-16 code units, not bytes or Unicode code points.
|
|
@@ -58,8 +67,12 @@ export function checkMemoryIndex(input: {
|
|
|
58
67
|
const tokens = (match[3]!.split(';', 1)[0]!.match(/[\p{L}\p{N}]{4,}/gu) ?? []).map(token => token.toLowerCase());
|
|
59
68
|
// Fewer than three tokens are too short for this heuristic to judge.
|
|
60
69
|
if (tokens.length < 3) continue;
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
let contentStems = stemsByFile.get(file);
|
|
71
|
+
if (contentStems === undefined) {
|
|
72
|
+
contentStems = new Set(stems(content));
|
|
73
|
+
stemsByFile.set(file, contentStems);
|
|
74
|
+
}
|
|
75
|
+
const missing = tokens.filter(token => !contentStems.has(stemToken(token)));
|
|
63
76
|
const supported = tokens.length - missing.length;
|
|
64
77
|
const support = supported / tokens.length;
|
|
65
78
|
if (support < minHookSupport) {
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/** One staged artifact for signing, publication and sibling drift. Linux/macOS tar. */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { packedTarballName } from './packed-install-smoke.js';
|
|
6
|
+
|
|
7
|
+
export type ExecLike = (command: string, options: { cwd: string; stdio: 'pipe'; encoding: 'utf-8'; maxBuffer: number }) => string;
|
|
8
|
+
export interface PackArtifactResult {
|
|
9
|
+
readonly tgzPath: string;
|
|
10
|
+
readonly sha256: string;
|
|
11
|
+
readonly files: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class UnknownWorkspaceSpecError extends Error {
|
|
15
|
+
constructor(dependency: string, spec: string) {
|
|
16
|
+
super(`Unknown workspace dependency spec for ${dependency}: ${spec}; supply a version and use workspace:*, workspace:^ or workspace:~`);
|
|
17
|
+
this.name = 'UnknownWorkspaceSpecError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function rewriteWorkspaceSpecs(
|
|
22
|
+
pkgJsonText: string,
|
|
23
|
+
siblingVersions: ReadonlyMap<string, string>,
|
|
24
|
+
): string {
|
|
25
|
+
const pkg = JSON.parse(pkgJsonText) as Record<string, unknown>;
|
|
26
|
+
const fields = ['dependencies', 'peerDependencies', 'optionalDependencies', 'devDependencies'] as const;
|
|
27
|
+
for (const field of fields) {
|
|
28
|
+
const candidate = pkg[field];
|
|
29
|
+
if (candidate === null || typeof candidate !== 'object' || Array.isArray(candidate)) continue;
|
|
30
|
+
const table = candidate as Record<string, unknown>;
|
|
31
|
+
for (const [dep, spec] of Object.entries(table)) {
|
|
32
|
+
if (typeof spec !== 'string') continue;
|
|
33
|
+
const match = /^workspace:([*^~])$/.exec(spec);
|
|
34
|
+
const version = siblingVersions.get(dep);
|
|
35
|
+
if (match === null) {
|
|
36
|
+
if (spec.startsWith('workspace:') || spec.startsWith('catalog:')) {
|
|
37
|
+
throw new UnknownWorkspaceSpecError(dep, spec);
|
|
38
|
+
}
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (version === undefined) continue;
|
|
42
|
+
const marker = match[1]!;
|
|
43
|
+
table[dep] = marker === '*' ? version : `${marker}${version}`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return JSON.stringify(pkg, null, 2) + '\n';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Current pins, read afresh so a later sign sees a sibling's new version. */
|
|
50
|
+
export function readWorkspaceVersions(repoRoot: string): ReadonlyMap<string, string> {
|
|
51
|
+
const scope = join(repoRoot, 'packages', '@dzhechkov');
|
|
52
|
+
const versions = new Map<string, string>();
|
|
53
|
+
if (!existsSync(scope)) return versions;
|
|
54
|
+
for (const entry of readdirSync(scope).sort()) {
|
|
55
|
+
const manifest = join(scope, entry, 'package.json');
|
|
56
|
+
if (!existsSync(manifest)) continue;
|
|
57
|
+
const pkg = JSON.parse(readFileSync(manifest, 'utf8')) as { name?: unknown; version?: unknown };
|
|
58
|
+
if (typeof pkg.name === 'string' && typeof pkg.version === 'string') versions.set(pkg.name, pkg.version);
|
|
59
|
+
}
|
|
60
|
+
return versions;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// POSIX shell argument quoting: paths may contain spaces, quotes, dollars or backticks.
|
|
64
|
+
|
|
65
|
+
export function packArtifact(opts: {
|
|
66
|
+
pkgDir: string;
|
|
67
|
+
destDir: string;
|
|
68
|
+
exec: ExecLike;
|
|
69
|
+
pinVersions: ReadonlyMap<string, string>;
|
|
70
|
+
}): PackArtifactResult {
|
|
71
|
+
const pkgDir = resolve(opts.pkgDir);
|
|
72
|
+
const destDir = resolve(opts.destDir);
|
|
73
|
+
const manifestPath = join(pkgDir, 'package.json');
|
|
74
|
+
const original = readFileSync(manifestPath);
|
|
75
|
+
try {
|
|
76
|
+
const staged = JSON.parse(rewriteWorkspaceSpecs(original.toString('utf8'), opts.pinVersions)) as Record<string, unknown>;
|
|
77
|
+
// The public rewrite helper historically leaves a known shorthand without a pin unchanged.
|
|
78
|
+
// An artifact must never ship that unresolved value, even when its caller supplied an incomplete map.
|
|
79
|
+
for (const field of ['dependencies', 'peerDependencies', 'optionalDependencies', 'devDependencies']) {
|
|
80
|
+
const table = staged[field];
|
|
81
|
+
if (table === null || typeof table !== 'object' || Array.isArray(table)) continue;
|
|
82
|
+
for (const [dependency, value] of Object.entries(table)) {
|
|
83
|
+
if (typeof value === 'string' && /^workspace:[*^~]$/.test(value)) {
|
|
84
|
+
throw new UnknownWorkspaceSpecError(dependency, value);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const scripts = staged['scripts'];
|
|
89
|
+
if (scripts !== null && typeof scripts === 'object' && !Array.isArray(scripts)) {
|
|
90
|
+
delete (scripts as Record<string, unknown>)['prepublishOnly'];
|
|
91
|
+
}
|
|
92
|
+
const name = staged['name'];
|
|
93
|
+
const version = staged['version'];
|
|
94
|
+
if (typeof name !== 'string' || typeof version !== 'string') throw new Error(`Missing package name/version in ${manifestPath}`);
|
|
95
|
+
mkdirSync(destDir, { recursive: true });
|
|
96
|
+
writeFileSync(manifestPath, JSON.stringify(staged, null, 2) + '\n');
|
|
97
|
+
const execOptions = { cwd: pkgDir, stdio: 'pipe' as const, encoding: 'utf-8' as const, maxBuffer: 64 * 1024 * 1024 };
|
|
98
|
+
// The command shape is a CONTRACT: publish's test fake admits exactly this template — double-quoted
|
|
99
|
+
// via JSON.stringify, verbatim from the publish.ts template it replaced (publish-confirm-seam.test.ts).
|
|
100
|
+
opts.exec(`npm pack . --pack-destination ${JSON.stringify(destDir)}`, execOptions);
|
|
101
|
+
const tgzPath = join(destDir, packedTarballName(name, version));
|
|
102
|
+
const listing = opts.exec(`tar -tzf ${JSON.stringify(tgzPath)}`, execOptions);
|
|
103
|
+
const files = listing.split(/\r?\n/).filter(p => p !== '' && !p.endsWith('/')).map(p => p.replace(/^package\//, '')).sort();
|
|
104
|
+
const sha256 = createHash('sha256').update(readFileSync(tgzPath)).digest('hex');
|
|
105
|
+
return { tgzPath, sha256, files };
|
|
106
|
+
} finally {
|
|
107
|
+
writeFileSync(manifestPath, original);
|
|
108
|
+
}
|
|
109
|
+
}
|
package/src/profile.ts
CHANGED
|
@@ -512,7 +512,12 @@ export function syncProfileBlock(profile: OperatorProfile, home?: string, now?:
|
|
|
512
512
|
let backup: string | null = null;
|
|
513
513
|
if (existing !== null) {
|
|
514
514
|
const stamp = (now ?? new Date()).toISOString().replace(/[:.]/g, '-');
|
|
515
|
+
// Two syncs inside one millisecond (a fast CI runner) share a stamp: MEASURED 2026-09-24 on
|
|
516
|
+
// package-story-gates (73ac1a32) — the second backup overwrote the first and the test that
|
|
517
|
+
// promises "backups accumulate rather than overwriting" read 1 file. A taken name gets a
|
|
518
|
+
// counter suffix; a backup is never written over an existing one.
|
|
515
519
|
backup = `${target}.dz-profile-backup-${stamp}`;
|
|
520
|
+
for (let n = 1; existsSync(backup); n += 1) backup = `${target}.dz-profile-backup-${stamp}-${n}`;
|
|
516
521
|
writeFileSync(backup, existing, { mode: 0o600 });
|
|
517
522
|
chmodSync(backup, 0o600); // writeFileSync's mode applies only at creation
|
|
518
523
|
}
|