@mc-and-his-agents/loom-installer 0.1.41 → 0.1.43
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/package.json +1 -1
- package/payload/manifest.json +82 -82
- package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +12 -8
- package/payload/plugin/loom/skills/shared/scripts/loom_check.py +168 -0
- package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +58 -26
- package/payload/plugin/loom/skills/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/runtime_state.py +9 -1
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +12 -8
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +168 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +58 -26
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/runtime_state.py +9 -1
package/package.json
CHANGED
package/payload/manifest.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"schema_version": "loom-installer-payload/v1",
|
|
3
3
|
"loom_version": "0.4.0",
|
|
4
4
|
"source_repository": "https://github.com/MC-and-his-Agents/Loom",
|
|
5
|
-
"source_commit": "
|
|
5
|
+
"source_commit": "8c3ba44e07d467f15fee186221344f2bef12ed42",
|
|
6
6
|
"source_ref": "main",
|
|
7
|
-
"built_at": "2026-04-
|
|
7
|
+
"built_at": "2026-04-27T22:10:31+08:00",
|
|
8
8
|
"runtime": {
|
|
9
9
|
"python_minimum": "3.10",
|
|
10
10
|
"python_recommended": "3.11+"
|
|
@@ -628,18 +628,18 @@
|
|
|
628
628
|
},
|
|
629
629
|
{
|
|
630
630
|
"path": "plugin/loom/skills/shared/scripts/governance_surface.py",
|
|
631
|
-
"bytes":
|
|
632
|
-
"sha256": "
|
|
631
|
+
"bytes": 57136,
|
|
632
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
633
633
|
},
|
|
634
634
|
{
|
|
635
635
|
"path": "plugin/loom/skills/shared/scripts/loom_check.py",
|
|
636
|
-
"bytes":
|
|
637
|
-
"sha256": "
|
|
636
|
+
"bytes": 356924,
|
|
637
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
638
638
|
},
|
|
639
639
|
{
|
|
640
640
|
"path": "plugin/loom/skills/shared/scripts/loom_flow.py",
|
|
641
|
-
"bytes":
|
|
642
|
-
"sha256": "
|
|
641
|
+
"bytes": 340366,
|
|
642
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
643
643
|
},
|
|
644
644
|
{
|
|
645
645
|
"path": "plugin/loom/skills/shared/scripts/loom_init.py",
|
|
@@ -658,8 +658,8 @@
|
|
|
658
658
|
},
|
|
659
659
|
{
|
|
660
660
|
"path": "plugin/loom/skills/shared/scripts/runtime_state.py",
|
|
661
|
-
"bytes":
|
|
662
|
-
"sha256": "
|
|
661
|
+
"bytes": 21212,
|
|
662
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
663
663
|
},
|
|
664
664
|
{
|
|
665
665
|
"path": "plugin/loom/skills/upgrade-contract.json",
|
|
@@ -1218,18 +1218,18 @@
|
|
|
1218
1218
|
},
|
|
1219
1219
|
{
|
|
1220
1220
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1221
|
-
"bytes":
|
|
1222
|
-
"sha256": "
|
|
1221
|
+
"bytes": 57136,
|
|
1222
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
1223
1223
|
},
|
|
1224
1224
|
{
|
|
1225
1225
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
|
|
1226
|
-
"bytes":
|
|
1227
|
-
"sha256": "
|
|
1226
|
+
"bytes": 356924,
|
|
1227
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
1228
1228
|
},
|
|
1229
1229
|
{
|
|
1230
1230
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1231
|
-
"bytes":
|
|
1232
|
-
"sha256": "
|
|
1231
|
+
"bytes": 340366,
|
|
1232
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
1233
1233
|
},
|
|
1234
1234
|
{
|
|
1235
1235
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -1248,8 +1248,8 @@
|
|
|
1248
1248
|
},
|
|
1249
1249
|
{
|
|
1250
1250
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/runtime_state.py",
|
|
1251
|
-
"bytes":
|
|
1252
|
-
"sha256": "
|
|
1251
|
+
"bytes": 21212,
|
|
1252
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
1253
1253
|
},
|
|
1254
1254
|
{
|
|
1255
1255
|
"path": "skills/loom-adopt/.loom-runtime/upgrade-contract.json",
|
|
@@ -1838,18 +1838,18 @@
|
|
|
1838
1838
|
},
|
|
1839
1839
|
{
|
|
1840
1840
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1841
|
-
"bytes":
|
|
1842
|
-
"sha256": "
|
|
1841
|
+
"bytes": 57136,
|
|
1842
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
1843
1843
|
},
|
|
1844
1844
|
{
|
|
1845
1845
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
|
|
1846
|
-
"bytes":
|
|
1847
|
-
"sha256": "
|
|
1846
|
+
"bytes": 356924,
|
|
1847
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
1848
1848
|
},
|
|
1849
1849
|
{
|
|
1850
1850
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1851
|
-
"bytes":
|
|
1852
|
-
"sha256": "
|
|
1851
|
+
"bytes": 340366,
|
|
1852
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
1853
1853
|
},
|
|
1854
1854
|
{
|
|
1855
1855
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -1868,8 +1868,8 @@
|
|
|
1868
1868
|
},
|
|
1869
1869
|
{
|
|
1870
1870
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/runtime_state.py",
|
|
1871
|
-
"bytes":
|
|
1872
|
-
"sha256": "
|
|
1871
|
+
"bytes": 21212,
|
|
1872
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
1873
1873
|
},
|
|
1874
1874
|
{
|
|
1875
1875
|
"path": "skills/loom-handoff/.loom-runtime/upgrade-contract.json",
|
|
@@ -2458,18 +2458,18 @@
|
|
|
2458
2458
|
},
|
|
2459
2459
|
{
|
|
2460
2460
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py",
|
|
2461
|
-
"bytes":
|
|
2462
|
-
"sha256": "
|
|
2461
|
+
"bytes": 57136,
|
|
2462
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
2463
2463
|
},
|
|
2464
2464
|
{
|
|
2465
2465
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
|
|
2466
|
-
"bytes":
|
|
2467
|
-
"sha256": "
|
|
2466
|
+
"bytes": 356924,
|
|
2467
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
2468
2468
|
},
|
|
2469
2469
|
{
|
|
2470
2470
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
|
|
2471
|
-
"bytes":
|
|
2472
|
-
"sha256": "
|
|
2471
|
+
"bytes": 340366,
|
|
2472
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
2473
2473
|
},
|
|
2474
2474
|
{
|
|
2475
2475
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -2488,8 +2488,8 @@
|
|
|
2488
2488
|
},
|
|
2489
2489
|
{
|
|
2490
2490
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/runtime_state.py",
|
|
2491
|
-
"bytes":
|
|
2492
|
-
"sha256": "
|
|
2491
|
+
"bytes": 21212,
|
|
2492
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
2493
2493
|
},
|
|
2494
2494
|
{
|
|
2495
2495
|
"path": "skills/loom-init/.loom-runtime/upgrade-contract.json",
|
|
@@ -3083,18 +3083,18 @@
|
|
|
3083
3083
|
},
|
|
3084
3084
|
{
|
|
3085
3085
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3086
|
-
"bytes":
|
|
3087
|
-
"sha256": "
|
|
3086
|
+
"bytes": 57136,
|
|
3087
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
3088
3088
|
},
|
|
3089
3089
|
{
|
|
3090
3090
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
|
|
3091
|
-
"bytes":
|
|
3092
|
-
"sha256": "
|
|
3091
|
+
"bytes": 356924,
|
|
3092
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
3093
3093
|
},
|
|
3094
3094
|
{
|
|
3095
3095
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3096
|
-
"bytes":
|
|
3097
|
-
"sha256": "
|
|
3096
|
+
"bytes": 340366,
|
|
3097
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
3098
3098
|
},
|
|
3099
3099
|
{
|
|
3100
3100
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -3113,8 +3113,8 @@
|
|
|
3113
3113
|
},
|
|
3114
3114
|
{
|
|
3115
3115
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/runtime_state.py",
|
|
3116
|
-
"bytes":
|
|
3117
|
-
"sha256": "
|
|
3116
|
+
"bytes": 21212,
|
|
3117
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
3118
3118
|
},
|
|
3119
3119
|
{
|
|
3120
3120
|
"path": "skills/loom-merge-ready/.loom-runtime/upgrade-contract.json",
|
|
@@ -3703,18 +3703,18 @@
|
|
|
3703
3703
|
},
|
|
3704
3704
|
{
|
|
3705
3705
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3706
|
-
"bytes":
|
|
3707
|
-
"sha256": "
|
|
3706
|
+
"bytes": 57136,
|
|
3707
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
3708
3708
|
},
|
|
3709
3709
|
{
|
|
3710
3710
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
3711
|
-
"bytes":
|
|
3712
|
-
"sha256": "
|
|
3711
|
+
"bytes": 356924,
|
|
3712
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
3713
3713
|
},
|
|
3714
3714
|
{
|
|
3715
3715
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3716
|
-
"bytes":
|
|
3717
|
-
"sha256": "
|
|
3716
|
+
"bytes": 340366,
|
|
3717
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
3718
3718
|
},
|
|
3719
3719
|
{
|
|
3720
3720
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -3733,8 +3733,8 @@
|
|
|
3733
3733
|
},
|
|
3734
3734
|
{
|
|
3735
3735
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/runtime_state.py",
|
|
3736
|
-
"bytes":
|
|
3737
|
-
"sha256": "
|
|
3736
|
+
"bytes": 21212,
|
|
3737
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
3738
3738
|
},
|
|
3739
3739
|
{
|
|
3740
3740
|
"path": "skills/loom-pre-review/.loom-runtime/upgrade-contract.json",
|
|
@@ -4323,18 +4323,18 @@
|
|
|
4323
4323
|
},
|
|
4324
4324
|
{
|
|
4325
4325
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4326
|
-
"bytes":
|
|
4327
|
-
"sha256": "
|
|
4326
|
+
"bytes": 57136,
|
|
4327
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
4328
4328
|
},
|
|
4329
4329
|
{
|
|
4330
4330
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
|
|
4331
|
-
"bytes":
|
|
4332
|
-
"sha256": "
|
|
4331
|
+
"bytes": 356924,
|
|
4332
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
4333
4333
|
},
|
|
4334
4334
|
{
|
|
4335
4335
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4336
|
-
"bytes":
|
|
4337
|
-
"sha256": "
|
|
4336
|
+
"bytes": 340366,
|
|
4337
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
4338
4338
|
},
|
|
4339
4339
|
{
|
|
4340
4340
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -4353,8 +4353,8 @@
|
|
|
4353
4353
|
},
|
|
4354
4354
|
{
|
|
4355
4355
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/runtime_state.py",
|
|
4356
|
-
"bytes":
|
|
4357
|
-
"sha256": "
|
|
4356
|
+
"bytes": 21212,
|
|
4357
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
4358
4358
|
},
|
|
4359
4359
|
{
|
|
4360
4360
|
"path": "skills/loom-resume/.loom-runtime/upgrade-contract.json",
|
|
@@ -4943,18 +4943,18 @@
|
|
|
4943
4943
|
},
|
|
4944
4944
|
{
|
|
4945
4945
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4946
|
-
"bytes":
|
|
4947
|
-
"sha256": "
|
|
4946
|
+
"bytes": 57136,
|
|
4947
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
4948
4948
|
},
|
|
4949
4949
|
{
|
|
4950
4950
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
|
|
4951
|
-
"bytes":
|
|
4952
|
-
"sha256": "
|
|
4951
|
+
"bytes": 356924,
|
|
4952
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
4953
4953
|
},
|
|
4954
4954
|
{
|
|
4955
4955
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4956
|
-
"bytes":
|
|
4957
|
-
"sha256": "
|
|
4956
|
+
"bytes": 340366,
|
|
4957
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
4958
4958
|
},
|
|
4959
4959
|
{
|
|
4960
4960
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -4973,8 +4973,8 @@
|
|
|
4973
4973
|
},
|
|
4974
4974
|
{
|
|
4975
4975
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/runtime_state.py",
|
|
4976
|
-
"bytes":
|
|
4977
|
-
"sha256": "
|
|
4976
|
+
"bytes": 21212,
|
|
4977
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
4978
4978
|
},
|
|
4979
4979
|
{
|
|
4980
4980
|
"path": "skills/loom-retire/.loom-runtime/upgrade-contract.json",
|
|
@@ -5563,18 +5563,18 @@
|
|
|
5563
5563
|
},
|
|
5564
5564
|
{
|
|
5565
5565
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
5566
|
-
"bytes":
|
|
5567
|
-
"sha256": "
|
|
5566
|
+
"bytes": 57136,
|
|
5567
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
5568
5568
|
},
|
|
5569
5569
|
{
|
|
5570
5570
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
5571
|
-
"bytes":
|
|
5572
|
-
"sha256": "
|
|
5571
|
+
"bytes": 356924,
|
|
5572
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
5573
5573
|
},
|
|
5574
5574
|
{
|
|
5575
5575
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
5576
|
-
"bytes":
|
|
5577
|
-
"sha256": "
|
|
5576
|
+
"bytes": 340366,
|
|
5577
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
5578
5578
|
},
|
|
5579
5579
|
{
|
|
5580
5580
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -5593,8 +5593,8 @@
|
|
|
5593
5593
|
},
|
|
5594
5594
|
{
|
|
5595
5595
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/runtime_state.py",
|
|
5596
|
-
"bytes":
|
|
5597
|
-
"sha256": "
|
|
5596
|
+
"bytes": 21212,
|
|
5597
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
5598
5598
|
},
|
|
5599
5599
|
{
|
|
5600
5600
|
"path": "skills/loom-review/.loom-runtime/upgrade-contract.json",
|
|
@@ -6183,18 +6183,18 @@
|
|
|
6183
6183
|
},
|
|
6184
6184
|
{
|
|
6185
6185
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
6186
|
-
"bytes":
|
|
6187
|
-
"sha256": "
|
|
6186
|
+
"bytes": 57136,
|
|
6187
|
+
"sha256": "02e6f66afcfad5b117ea9a801c7153466f24c6d5721da1546f286aa046c548f1"
|
|
6188
6188
|
},
|
|
6189
6189
|
{
|
|
6190
6190
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
6191
|
-
"bytes":
|
|
6192
|
-
"sha256": "
|
|
6191
|
+
"bytes": 356924,
|
|
6192
|
+
"sha256": "71f0b9a7d55526b119af75b06c9787d875c27e19bbea70853ebc3df11f43eee7"
|
|
6193
6193
|
},
|
|
6194
6194
|
{
|
|
6195
6195
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
6196
|
-
"bytes":
|
|
6197
|
-
"sha256": "
|
|
6196
|
+
"bytes": 340366,
|
|
6197
|
+
"sha256": "334a8df4ef8400125b6e7c311d386ac98c15f34c5be91befb9499215ee4ba0c4"
|
|
6198
6198
|
},
|
|
6199
6199
|
{
|
|
6200
6200
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -6213,8 +6213,8 @@
|
|
|
6213
6213
|
},
|
|
6214
6214
|
{
|
|
6215
6215
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/runtime_state.py",
|
|
6216
|
-
"bytes":
|
|
6217
|
-
"sha256": "
|
|
6216
|
+
"bytes": 21212,
|
|
6217
|
+
"sha256": "e4de653a5206269faa731808a0f44667a7db811053b8488e8b61a6393917815b"
|
|
6218
6218
|
},
|
|
6219
6219
|
{
|
|
6220
6220
|
"path": "skills/loom-spec-review/.loom-runtime/upgrade-contract.json",
|
|
@@ -320,9 +320,9 @@ def file_exists(root: Path, relative: str) -> bool:
|
|
|
320
320
|
|
|
321
321
|
def relative_locator(path: Path, root: Path) -> str:
|
|
322
322
|
try:
|
|
323
|
-
return
|
|
324
|
-
except ValueError:
|
|
325
|
-
return
|
|
323
|
+
return path.resolve().relative_to(root.resolve()).as_posix()
|
|
324
|
+
except (OSError, ValueError):
|
|
325
|
+
return ""
|
|
326
326
|
|
|
327
327
|
|
|
328
328
|
def safe_read_json(path: Path) -> dict[str, Any] | None:
|
|
@@ -961,19 +961,24 @@ def first_match(directory: Path, suffix: str, root: Path) -> str:
|
|
|
961
961
|
|
|
962
962
|
|
|
963
963
|
def existing_locator(root: Path, relative: str | None) -> str:
|
|
964
|
-
|
|
964
|
+
locator, target = resolve_locator(root, relative)
|
|
965
|
+
if locator is None or target is None:
|
|
965
966
|
return ""
|
|
966
|
-
return
|
|
967
|
+
return locator if target.exists() else ""
|
|
967
968
|
|
|
968
969
|
|
|
969
970
|
def active_or_first(root: Path, relative: str | None, directory: Path, suffix: str) -> str:
|
|
970
|
-
|
|
971
|
+
if relative is not None and str(relative).strip():
|
|
972
|
+
return existing_locator(root, relative)
|
|
973
|
+
return first_match(directory, suffix, root) if directory.exists() else ""
|
|
971
974
|
|
|
972
975
|
|
|
973
976
|
def current_review_locator(root: Path, review_dir: Path, item_id: str) -> str:
|
|
974
977
|
review_path = review_dir / f"{item_id}.json"
|
|
975
978
|
if review_path.exists():
|
|
976
979
|
return relative_locator(review_path, root)
|
|
980
|
+
if item_id:
|
|
981
|
+
return ""
|
|
977
982
|
return first_match(review_dir, ".json", root) if review_dir.exists() else ""
|
|
978
983
|
|
|
979
984
|
|
|
@@ -1006,7 +1011,6 @@ def detect_carrier_summary(root: Path, *, repository_mode: str, planning_mode: b
|
|
|
1006
1011
|
recovery_dir = root / ".loom/progress"
|
|
1007
1012
|
review_dir = root / ".loom/reviews"
|
|
1008
1013
|
status_locator = active.get("status_surface") or ".loom/status/current.md"
|
|
1009
|
-
status_path = root / status_locator
|
|
1010
1014
|
spec_path = root / f".loom/specs/{active_item_id}/spec.md"
|
|
1011
1015
|
plan_path = root / f".loom/specs/{active_item_id}/plan.md"
|
|
1012
1016
|
|
|
@@ -1014,7 +1018,7 @@ def detect_carrier_summary(root: Path, *, repository_mode: str, planning_mode: b
|
|
|
1014
1018
|
"work_item": active_or_first(root, active.get("work_item"), item_dir, ".md"),
|
|
1015
1019
|
"recovery": active_or_first(root, active.get("recovery_entry"), recovery_dir, ".md"),
|
|
1016
1020
|
"review": current_review_locator(root, review_dir, active_item_id),
|
|
1017
|
-
"status_surface":
|
|
1021
|
+
"status_surface": existing_locator(root, status_locator),
|
|
1018
1022
|
"spec_path": relative_locator(spec_path, root) if spec_path.exists() else "",
|
|
1019
1023
|
"plan_path": relative_locator(plan_path, root) if plan_path.exists() else "",
|
|
1020
1024
|
}
|
|
@@ -3995,6 +3995,31 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
3995
3995
|
elif payload.get("result") != "block":
|
|
3996
3996
|
failures.append(Failure("daily-execution-cli", "`installed runtime-state` must block on scene/carrier conflict"))
|
|
3997
3997
|
|
|
3998
|
+
source_repo = tmp_root / "source"
|
|
3999
|
+
sibling_prefix_install = tmp_root / "source-evil" / "skills"
|
|
4000
|
+
source_repo.mkdir(parents=True, exist_ok=True)
|
|
4001
|
+
shutil.copytree(root / "skills", sibling_prefix_install)
|
|
4002
|
+
payload, error = load_command_json(
|
|
4003
|
+
root,
|
|
4004
|
+
[
|
|
4005
|
+
"python3",
|
|
4006
|
+
str(sibling_prefix_install / "shared" / "scripts" / "loom_flow.py"),
|
|
4007
|
+
"runtime-state",
|
|
4008
|
+
"--target",
|
|
4009
|
+
str(target_root),
|
|
4010
|
+
],
|
|
4011
|
+
env={"LOOM_SOURCE_REPO_ROOT": str(source_repo)},
|
|
4012
|
+
)
|
|
4013
|
+
if error:
|
|
4014
|
+
failures.append(Failure("daily-execution-cli", f"`repo-local runtime-state` sibling-prefix escape failed unexpectedly: {error}"))
|
|
4015
|
+
elif payload.get("result") != "block":
|
|
4016
|
+
failures.append(Failure("daily-execution-cli", "`repo-local runtime-state` must block sibling-prefix install roots outside the source repo"))
|
|
4017
|
+
else:
|
|
4018
|
+
runtime_state = payload.get("runtime_state")
|
|
4019
|
+
missing_inputs = runtime_state.get("missing_inputs") if isinstance(runtime_state, dict) else []
|
|
4020
|
+
if not any("install root must stay inside the source repository" in str(item) for item in missing_inputs):
|
|
4021
|
+
failures.append(Failure("daily-execution-cli", "`repo-local runtime-state` sibling-prefix escape must expose the source-repo containment error"))
|
|
4022
|
+
|
|
3998
4023
|
payload, error = load_command_json(
|
|
3999
4024
|
root,
|
|
4000
4025
|
["python3", ".loom/bin/loom_init.py", "runtime-state", "--target", "."],
|
|
@@ -4056,6 +4081,35 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
4056
4081
|
elif payload.get("result") != "block":
|
|
4057
4082
|
failures.append(Failure("daily-execution-cli", "`bootstrapped runtime-state` must block when runtime provenance hashes drift"))
|
|
4058
4083
|
|
|
4084
|
+
with tempfile.TemporaryDirectory(prefix="loom-check-governance-surface-boundary-") as tmp:
|
|
4085
|
+
tmp_root = Path(tmp)
|
|
4086
|
+
outside = tmp_root / "outside.md"
|
|
4087
|
+
outside.write_text("# outside\n", encoding="utf-8")
|
|
4088
|
+
for label, unsafe_locator in (
|
|
4089
|
+
("parent escape", "../outside.md"),
|
|
4090
|
+
("absolute locator", str(outside)),
|
|
4091
|
+
):
|
|
4092
|
+
poisoned_target = tmp_root / f"governance-{label.replace(' ', '-')}"
|
|
4093
|
+
shutil.copytree(example_target, poisoned_target)
|
|
4094
|
+
init_result_path = poisoned_target / ".loom/bootstrap/init-result.json"
|
|
4095
|
+
init_result = load_json_file(init_result_path)
|
|
4096
|
+
if isinstance(init_result, dict):
|
|
4097
|
+
entry_points = init_result.get("fact_chain", {}).get("entry_points")
|
|
4098
|
+
if isinstance(entry_points, dict):
|
|
4099
|
+
entry_points["work_item"] = unsafe_locator
|
|
4100
|
+
entry_points["recovery_entry"] = unsafe_locator
|
|
4101
|
+
entry_points["status_surface"] = unsafe_locator
|
|
4102
|
+
init_result_path.write_text(json.dumps(init_result, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
|
4103
|
+
governance_surface = build_governance_surface(poisoned_target)
|
|
4104
|
+
carrier_summary = governance_surface.get("carrier_summary") if isinstance(governance_surface, dict) else None
|
|
4105
|
+
if not isinstance(carrier_summary, dict):
|
|
4106
|
+
failures.append(Failure("daily-execution-cli", f"`governance surface` {label} fixture must expose carrier summary"))
|
|
4107
|
+
continue
|
|
4108
|
+
for carrier in ("work_item", "recovery", "status_surface"):
|
|
4109
|
+
entry = carrier_summary.get(carrier)
|
|
4110
|
+
if isinstance(entry, dict) and entry.get("status") == "present":
|
|
4111
|
+
failures.append(Failure("daily-execution-cli", f"`governance surface` must not report unsafe {label} `{carrier}` fact-chain locators as present"))
|
|
4112
|
+
|
|
4059
4113
|
if shutil.which("git") is not None:
|
|
4060
4114
|
with tempfile.TemporaryDirectory(prefix="loom-check-installed-pre-merge-") as tmp:
|
|
4061
4115
|
tmp_root = Path(tmp)
|
|
@@ -6861,6 +6915,120 @@ def check_adversarial_adoption_fixture(root: Path) -> list[Failure]:
|
|
|
6861
6915
|
elif after_payload.get("refresh_needed"):
|
|
6862
6916
|
failures.append(Failure("adversarial-adoption", "carrier refresh --write must clear runtime provenance drift"))
|
|
6863
6917
|
|
|
6918
|
+
outside_comment = base / "outside-comment.md"
|
|
6919
|
+
outside_comment.write_text("sensitive local text\n", encoding="utf-8")
|
|
6920
|
+
comment_escape_payload, error = load_command_json(
|
|
6921
|
+
root,
|
|
6922
|
+
[
|
|
6923
|
+
"python3",
|
|
6924
|
+
"tools/loom_flow.py",
|
|
6925
|
+
"reconciliation",
|
|
6926
|
+
"sync",
|
|
6927
|
+
"--target",
|
|
6928
|
+
str(baseline),
|
|
6929
|
+
"--comment-file",
|
|
6930
|
+
str(outside_comment),
|
|
6931
|
+
"--dry-run",
|
|
6932
|
+
],
|
|
6933
|
+
)
|
|
6934
|
+
if error:
|
|
6935
|
+
failures.append(Failure("adversarial-adoption", f"reconciliation comment-file boundary sample failed: {error}"))
|
|
6936
|
+
elif comment_escape_payload.get("result") != "block":
|
|
6937
|
+
failures.append(Failure("adversarial-adoption", "reconciliation --comment-file must block absolute paths outside the target root"))
|
|
6938
|
+
else:
|
|
6939
|
+
missing_inputs = comment_escape_payload.get("missing_inputs")
|
|
6940
|
+
if not isinstance(missing_inputs, list) or not any(
|
|
6941
|
+
"reconciliation comment file" in str(item) and "must be repo-relative" in str(item)
|
|
6942
|
+
for item in missing_inputs
|
|
6943
|
+
):
|
|
6944
|
+
failures.append(Failure("adversarial-adoption", "reconciliation --comment-file boundary block must report the comment file locator boundary error"))
|
|
6945
|
+
|
|
6946
|
+
original_pr_payload = loom_flow_module.github_pr_payload
|
|
6947
|
+
original_issue_payload = loom_flow_module.github_issue_payload
|
|
6948
|
+
original_reconciliation_audit = loom_flow_module.reconciliation_audit_payload
|
|
6949
|
+
original_contains = loom_flow_module.contains_merged_commit
|
|
6950
|
+
seen_target_branches: list[str] = []
|
|
6951
|
+
try:
|
|
6952
|
+
loom_flow_module.github_pr_payload = lambda *_args, **_kwargs: (
|
|
6953
|
+
{
|
|
6954
|
+
"state": "MERGED",
|
|
6955
|
+
"baseRefName": "release/main",
|
|
6956
|
+
"mergeCommit": {"oid": "abc123"},
|
|
6957
|
+
},
|
|
6958
|
+
[],
|
|
6959
|
+
)
|
|
6960
|
+
loom_flow_module.github_issue_payload = lambda *_args, **_kwargs: (
|
|
6961
|
+
{"state": "CLOSED", "id": "issue-id"},
|
|
6962
|
+
[],
|
|
6963
|
+
)
|
|
6964
|
+
loom_flow_module.reconciliation_audit_payload = lambda **_kwargs: (
|
|
6965
|
+
{
|
|
6966
|
+
"result": "pass",
|
|
6967
|
+
"findings": [],
|
|
6968
|
+
"missing_inputs": [],
|
|
6969
|
+
"fallback_to": None,
|
|
6970
|
+
},
|
|
6971
|
+
[],
|
|
6972
|
+
)
|
|
6973
|
+
|
|
6974
|
+
def fake_contains(_root: Path, _merge_commit_sha: str, target_branch: str = "main") -> bool:
|
|
6975
|
+
seen_target_branches.append(target_branch)
|
|
6976
|
+
return target_branch == "release/main"
|
|
6977
|
+
|
|
6978
|
+
loom_flow_module.contains_merged_commit = fake_contains
|
|
6979
|
+
closeout_target_branch_payload, closeout_errors = loom_flow_module.closeout_payload(
|
|
6980
|
+
target_root=baseline,
|
|
6981
|
+
phase_number=None,
|
|
6982
|
+
fr_number=None,
|
|
6983
|
+
issue_number=1,
|
|
6984
|
+
pr_number=2,
|
|
6985
|
+
project_number=None,
|
|
6986
|
+
branch_name=None,
|
|
6987
|
+
owner="owner",
|
|
6988
|
+
repo_name="repo",
|
|
6989
|
+
skip_gate=True,
|
|
6990
|
+
)
|
|
6991
|
+
if closeout_errors:
|
|
6992
|
+
failures.append(Failure("adversarial-adoption", f"closeout target branch fixture failed: {closeout_errors}"))
|
|
6993
|
+
elif closeout_target_branch_payload.get("result") != "pass":
|
|
6994
|
+
failures.append(Failure("adversarial-adoption", "closeout must pass when the merge commit is contained in the PR base branch"))
|
|
6995
|
+
if seen_target_branches != ["release/main"]:
|
|
6996
|
+
failures.append(Failure("adversarial-adoption", "closeout must check merge commit containment against the PR base branch, including slash branches"))
|
|
6997
|
+
|
|
6998
|
+
seen_target_branches.clear()
|
|
6999
|
+
loom_flow_module.github_pr_payload = lambda *_args, **_kwargs: (
|
|
7000
|
+
{
|
|
7001
|
+
"state": "MERGED",
|
|
7002
|
+
"mergeCommit": {"oid": "abc123"},
|
|
7003
|
+
},
|
|
7004
|
+
[],
|
|
7005
|
+
)
|
|
7006
|
+
closeout_missing_base_payload, closeout_errors = loom_flow_module.closeout_payload(
|
|
7007
|
+
target_root=baseline,
|
|
7008
|
+
phase_number=None,
|
|
7009
|
+
fr_number=None,
|
|
7010
|
+
issue_number=1,
|
|
7011
|
+
pr_number=2,
|
|
7012
|
+
project_number=None,
|
|
7013
|
+
branch_name=None,
|
|
7014
|
+
owner="owner",
|
|
7015
|
+
repo_name="repo",
|
|
7016
|
+
skip_gate=True,
|
|
7017
|
+
)
|
|
7018
|
+
if closeout_errors:
|
|
7019
|
+
failures.append(Failure("adversarial-adoption", f"closeout missing baseRefName fixture failed: {closeout_errors}"))
|
|
7020
|
+
else:
|
|
7021
|
+
missing_inputs = closeout_missing_base_payload.get("missing_inputs")
|
|
7022
|
+
if closeout_missing_base_payload.get("result") != "block" or "pr baseRefName is missing" not in missing_inputs:
|
|
7023
|
+
failures.append(Failure("adversarial-adoption", "closeout must block when PR baseRefName is missing instead of falling back to main"))
|
|
7024
|
+
if seen_target_branches:
|
|
7025
|
+
failures.append(Failure("adversarial-adoption", "closeout must not check origin/main when PR baseRefName is missing"))
|
|
7026
|
+
finally:
|
|
7027
|
+
loom_flow_module.github_pr_payload = original_pr_payload
|
|
7028
|
+
loom_flow_module.github_issue_payload = original_issue_payload
|
|
7029
|
+
loom_flow_module.reconciliation_audit_payload = original_reconciliation_audit
|
|
7030
|
+
loom_flow_module.contains_merged_commit = original_contains
|
|
7031
|
+
|
|
6864
7032
|
rollover_target = base / "active-rollover"
|
|
6865
7033
|
shutil.copytree(baseline, rollover_target)
|
|
6866
7034
|
payload, error = load_command_json(
|