@mc-and-his-agents/loom-installer 0.1.29 → 0.1.31
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 +102 -102
- package/payload/plugin/loom/skills/shared/scripts/fact_chain_support.py +46 -5
- package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +9 -5
- package/payload/plugin/loom/skills/shared/scripts/loom_check.py +95 -9
- package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +381 -34
- package/payload/plugin/loom/skills/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_init.py +8 -1
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/fact_chain_support.py +46 -5
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +9 -5
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +95 -9
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +381 -34
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py +8 -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": "db9b37726bda7d232589b79bad5c20596dd0571f",
|
|
6
6
|
"source_ref": "main",
|
|
7
|
-
"built_at": "2026-04-
|
|
7
|
+
"built_at": "2026-04-27T14:09:35+08:00",
|
|
8
8
|
"runtime": {
|
|
9
9
|
"python_minimum": "3.10",
|
|
10
10
|
"python_recommended": "3.11+"
|
|
@@ -623,28 +623,28 @@
|
|
|
623
623
|
},
|
|
624
624
|
{
|
|
625
625
|
"path": "plugin/loom/skills/shared/scripts/fact_chain_support.py",
|
|
626
|
-
"bytes":
|
|
627
|
-
"sha256": "
|
|
626
|
+
"bytes": 21694,
|
|
627
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
628
628
|
},
|
|
629
629
|
{
|
|
630
630
|
"path": "plugin/loom/skills/shared/scripts/governance_surface.py",
|
|
631
|
-
"bytes":
|
|
632
|
-
"sha256": "
|
|
631
|
+
"bytes": 56201,
|
|
632
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
633
633
|
},
|
|
634
634
|
{
|
|
635
635
|
"path": "plugin/loom/skills/shared/scripts/loom_check.py",
|
|
636
|
-
"bytes":
|
|
637
|
-
"sha256": "
|
|
636
|
+
"bytes": 322929,
|
|
637
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
638
638
|
},
|
|
639
639
|
{
|
|
640
640
|
"path": "plugin/loom/skills/shared/scripts/loom_flow.py",
|
|
641
|
-
"bytes":
|
|
642
|
-
"sha256": "
|
|
641
|
+
"bytes": 311901,
|
|
642
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
643
643
|
},
|
|
644
644
|
{
|
|
645
645
|
"path": "plugin/loom/skills/shared/scripts/loom_init.py",
|
|
646
|
-
"bytes":
|
|
647
|
-
"sha256": "
|
|
646
|
+
"bytes": 85625,
|
|
647
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
648
648
|
},
|
|
649
649
|
{
|
|
650
650
|
"path": "plugin/loom/skills/shared/scripts/loom_status.py",
|
|
@@ -1213,28 +1213,28 @@
|
|
|
1213
1213
|
},
|
|
1214
1214
|
{
|
|
1215
1215
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
1216
|
-
"bytes":
|
|
1217
|
-
"sha256": "
|
|
1216
|
+
"bytes": 21694,
|
|
1217
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
1218
1218
|
},
|
|
1219
1219
|
{
|
|
1220
1220
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1221
|
-
"bytes":
|
|
1222
|
-
"sha256": "
|
|
1221
|
+
"bytes": 56201,
|
|
1222
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
1223
1223
|
},
|
|
1224
1224
|
{
|
|
1225
1225
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
|
|
1226
|
-
"bytes":
|
|
1227
|
-
"sha256": "
|
|
1226
|
+
"bytes": 322929,
|
|
1227
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
1228
1228
|
},
|
|
1229
1229
|
{
|
|
1230
1230
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1231
|
-
"bytes":
|
|
1232
|
-
"sha256": "
|
|
1231
|
+
"bytes": 311901,
|
|
1232
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
1233
1233
|
},
|
|
1234
1234
|
{
|
|
1235
1235
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py",
|
|
1236
|
-
"bytes":
|
|
1237
|
-
"sha256": "
|
|
1236
|
+
"bytes": 85625,
|
|
1237
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
1238
1238
|
},
|
|
1239
1239
|
{
|
|
1240
1240
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -1833,28 +1833,28 @@
|
|
|
1833
1833
|
},
|
|
1834
1834
|
{
|
|
1835
1835
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
1836
|
-
"bytes":
|
|
1837
|
-
"sha256": "
|
|
1836
|
+
"bytes": 21694,
|
|
1837
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
1838
1838
|
},
|
|
1839
1839
|
{
|
|
1840
1840
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1841
|
-
"bytes":
|
|
1842
|
-
"sha256": "
|
|
1841
|
+
"bytes": 56201,
|
|
1842
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
1843
1843
|
},
|
|
1844
1844
|
{
|
|
1845
1845
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
|
|
1846
|
-
"bytes":
|
|
1847
|
-
"sha256": "
|
|
1846
|
+
"bytes": 322929,
|
|
1847
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
1848
1848
|
},
|
|
1849
1849
|
{
|
|
1850
1850
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1851
|
-
"bytes":
|
|
1852
|
-
"sha256": "
|
|
1851
|
+
"bytes": 311901,
|
|
1852
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
1853
1853
|
},
|
|
1854
1854
|
{
|
|
1855
1855
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py",
|
|
1856
|
-
"bytes":
|
|
1857
|
-
"sha256": "
|
|
1856
|
+
"bytes": 85625,
|
|
1857
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
1858
1858
|
},
|
|
1859
1859
|
{
|
|
1860
1860
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -2453,28 +2453,28 @@
|
|
|
2453
2453
|
},
|
|
2454
2454
|
{
|
|
2455
2455
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
2456
|
-
"bytes":
|
|
2457
|
-
"sha256": "
|
|
2456
|
+
"bytes": 21694,
|
|
2457
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
2458
2458
|
},
|
|
2459
2459
|
{
|
|
2460
2460
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py",
|
|
2461
|
-
"bytes":
|
|
2462
|
-
"sha256": "
|
|
2461
|
+
"bytes": 56201,
|
|
2462
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
2463
2463
|
},
|
|
2464
2464
|
{
|
|
2465
2465
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
|
|
2466
|
-
"bytes":
|
|
2467
|
-
"sha256": "
|
|
2466
|
+
"bytes": 322929,
|
|
2467
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
2468
2468
|
},
|
|
2469
2469
|
{
|
|
2470
2470
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
|
|
2471
|
-
"bytes":
|
|
2472
|
-
"sha256": "
|
|
2471
|
+
"bytes": 311901,
|
|
2472
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
2473
2473
|
},
|
|
2474
2474
|
{
|
|
2475
2475
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_init.py",
|
|
2476
|
-
"bytes":
|
|
2477
|
-
"sha256": "
|
|
2476
|
+
"bytes": 85625,
|
|
2477
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
2478
2478
|
},
|
|
2479
2479
|
{
|
|
2480
2480
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -3078,28 +3078,28 @@
|
|
|
3078
3078
|
},
|
|
3079
3079
|
{
|
|
3080
3080
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
3081
|
-
"bytes":
|
|
3082
|
-
"sha256": "
|
|
3081
|
+
"bytes": 21694,
|
|
3082
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
3083
3083
|
},
|
|
3084
3084
|
{
|
|
3085
3085
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3086
|
-
"bytes":
|
|
3087
|
-
"sha256": "
|
|
3086
|
+
"bytes": 56201,
|
|
3087
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
3088
3088
|
},
|
|
3089
3089
|
{
|
|
3090
3090
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
|
|
3091
|
-
"bytes":
|
|
3092
|
-
"sha256": "
|
|
3091
|
+
"bytes": 322929,
|
|
3092
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
3093
3093
|
},
|
|
3094
3094
|
{
|
|
3095
3095
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3096
|
-
"bytes":
|
|
3097
|
-
"sha256": "
|
|
3096
|
+
"bytes": 311901,
|
|
3097
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
3098
3098
|
},
|
|
3099
3099
|
{
|
|
3100
3100
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py",
|
|
3101
|
-
"bytes":
|
|
3102
|
-
"sha256": "
|
|
3101
|
+
"bytes": 85625,
|
|
3102
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
3103
3103
|
},
|
|
3104
3104
|
{
|
|
3105
3105
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -3698,28 +3698,28 @@
|
|
|
3698
3698
|
},
|
|
3699
3699
|
{
|
|
3700
3700
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
3701
|
-
"bytes":
|
|
3702
|
-
"sha256": "
|
|
3701
|
+
"bytes": 21694,
|
|
3702
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
3703
3703
|
},
|
|
3704
3704
|
{
|
|
3705
3705
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3706
|
-
"bytes":
|
|
3707
|
-
"sha256": "
|
|
3706
|
+
"bytes": 56201,
|
|
3707
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
3708
3708
|
},
|
|
3709
3709
|
{
|
|
3710
3710
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
3711
|
-
"bytes":
|
|
3712
|
-
"sha256": "
|
|
3711
|
+
"bytes": 322929,
|
|
3712
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
3713
3713
|
},
|
|
3714
3714
|
{
|
|
3715
3715
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3716
|
-
"bytes":
|
|
3717
|
-
"sha256": "
|
|
3716
|
+
"bytes": 311901,
|
|
3717
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
3718
3718
|
},
|
|
3719
3719
|
{
|
|
3720
3720
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
3721
|
-
"bytes":
|
|
3722
|
-
"sha256": "
|
|
3721
|
+
"bytes": 85625,
|
|
3722
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
3723
3723
|
},
|
|
3724
3724
|
{
|
|
3725
3725
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -4318,28 +4318,28 @@
|
|
|
4318
4318
|
},
|
|
4319
4319
|
{
|
|
4320
4320
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
4321
|
-
"bytes":
|
|
4322
|
-
"sha256": "
|
|
4321
|
+
"bytes": 21694,
|
|
4322
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
4323
4323
|
},
|
|
4324
4324
|
{
|
|
4325
4325
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4326
|
-
"bytes":
|
|
4327
|
-
"sha256": "
|
|
4326
|
+
"bytes": 56201,
|
|
4327
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
4328
4328
|
},
|
|
4329
4329
|
{
|
|
4330
4330
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
|
|
4331
|
-
"bytes":
|
|
4332
|
-
"sha256": "
|
|
4331
|
+
"bytes": 322929,
|
|
4332
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
4333
4333
|
},
|
|
4334
4334
|
{
|
|
4335
4335
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4336
|
-
"bytes":
|
|
4337
|
-
"sha256": "
|
|
4336
|
+
"bytes": 311901,
|
|
4337
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
4338
4338
|
},
|
|
4339
4339
|
{
|
|
4340
4340
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py",
|
|
4341
|
-
"bytes":
|
|
4342
|
-
"sha256": "
|
|
4341
|
+
"bytes": 85625,
|
|
4342
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
4343
4343
|
},
|
|
4344
4344
|
{
|
|
4345
4345
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -4938,28 +4938,28 @@
|
|
|
4938
4938
|
},
|
|
4939
4939
|
{
|
|
4940
4940
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
4941
|
-
"bytes":
|
|
4942
|
-
"sha256": "
|
|
4941
|
+
"bytes": 21694,
|
|
4942
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
4943
4943
|
},
|
|
4944
4944
|
{
|
|
4945
4945
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4946
|
-
"bytes":
|
|
4947
|
-
"sha256": "
|
|
4946
|
+
"bytes": 56201,
|
|
4947
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
4948
4948
|
},
|
|
4949
4949
|
{
|
|
4950
4950
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
|
|
4951
|
-
"bytes":
|
|
4952
|
-
"sha256": "
|
|
4951
|
+
"bytes": 322929,
|
|
4952
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
4953
4953
|
},
|
|
4954
4954
|
{
|
|
4955
4955
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4956
|
-
"bytes":
|
|
4957
|
-
"sha256": "
|
|
4956
|
+
"bytes": 311901,
|
|
4957
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
4958
4958
|
},
|
|
4959
4959
|
{
|
|
4960
4960
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py",
|
|
4961
|
-
"bytes":
|
|
4962
|
-
"sha256": "
|
|
4961
|
+
"bytes": 85625,
|
|
4962
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
4963
4963
|
},
|
|
4964
4964
|
{
|
|
4965
4965
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -5558,28 +5558,28 @@
|
|
|
5558
5558
|
},
|
|
5559
5559
|
{
|
|
5560
5560
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
5561
|
-
"bytes":
|
|
5562
|
-
"sha256": "
|
|
5561
|
+
"bytes": 21694,
|
|
5562
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
5563
5563
|
},
|
|
5564
5564
|
{
|
|
5565
5565
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
5566
|
-
"bytes":
|
|
5567
|
-
"sha256": "
|
|
5566
|
+
"bytes": 56201,
|
|
5567
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
5568
5568
|
},
|
|
5569
5569
|
{
|
|
5570
5570
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
5571
|
-
"bytes":
|
|
5572
|
-
"sha256": "
|
|
5571
|
+
"bytes": 322929,
|
|
5572
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
5573
5573
|
},
|
|
5574
5574
|
{
|
|
5575
5575
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
5576
|
-
"bytes":
|
|
5577
|
-
"sha256": "
|
|
5576
|
+
"bytes": 311901,
|
|
5577
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
5578
5578
|
},
|
|
5579
5579
|
{
|
|
5580
5580
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
5581
|
-
"bytes":
|
|
5582
|
-
"sha256": "
|
|
5581
|
+
"bytes": 85625,
|
|
5582
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
5583
5583
|
},
|
|
5584
5584
|
{
|
|
5585
5585
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -6178,28 +6178,28 @@
|
|
|
6178
6178
|
},
|
|
6179
6179
|
{
|
|
6180
6180
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/fact_chain_support.py",
|
|
6181
|
-
"bytes":
|
|
6182
|
-
"sha256": "
|
|
6181
|
+
"bytes": 21694,
|
|
6182
|
+
"sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
|
|
6183
6183
|
},
|
|
6184
6184
|
{
|
|
6185
6185
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
6186
|
-
"bytes":
|
|
6187
|
-
"sha256": "
|
|
6186
|
+
"bytes": 56201,
|
|
6187
|
+
"sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
|
|
6188
6188
|
},
|
|
6189
6189
|
{
|
|
6190
6190
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
6191
|
-
"bytes":
|
|
6192
|
-
"sha256": "
|
|
6191
|
+
"bytes": 322929,
|
|
6192
|
+
"sha256": "9a8b31917b244172681a542256994d97de9a7b54869e7e9e7bf5747e8759ae69"
|
|
6193
6193
|
},
|
|
6194
6194
|
{
|
|
6195
6195
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
6196
|
-
"bytes":
|
|
6197
|
-
"sha256": "
|
|
6196
|
+
"bytes": 311901,
|
|
6197
|
+
"sha256": "9376481f98f539c0b6aaf72df42e647f320a0e6050e14cd2e1cf0c37240b79cd"
|
|
6198
6198
|
},
|
|
6199
6199
|
{
|
|
6200
6200
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
6201
|
-
"bytes":
|
|
6202
|
-
"sha256": "
|
|
6201
|
+
"bytes": 85625,
|
|
6202
|
+
"sha256": "059440a394dd4e92356addeab830f536497e0180d85e0be053e56442594410af"
|
|
6203
6203
|
},
|
|
6204
6204
|
{
|
|
6205
6205
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_status.py",
|
|
@@ -183,7 +183,25 @@ def parse_list_section(sections: dict[str, list[str]], section_name: str, relati
|
|
|
183
183
|
|
|
184
184
|
|
|
185
185
|
def _relative(path: Path, root: Path) -> str:
|
|
186
|
-
return str(path.relative_to(root))
|
|
186
|
+
return str(path.resolve().relative_to(root.resolve()))
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def resolve_repo_relative_path(target_root: Path, relative: str, *, label: str) -> tuple[Path | None, list[str]]:
|
|
190
|
+
"""Resolve a repository locator while rejecting absolute paths and path escapes."""
|
|
191
|
+
if not isinstance(relative, str) or not relative.strip():
|
|
192
|
+
return None, [f"{label} must be a non-empty repo-relative path"]
|
|
193
|
+
locator = relative.strip()
|
|
194
|
+
candidate_raw = Path(locator)
|
|
195
|
+
if candidate_raw.is_absolute():
|
|
196
|
+
return None, [f"{label} must be repo-relative, got absolute path: {locator}"]
|
|
197
|
+
if ".." in candidate_raw.parts:
|
|
198
|
+
return None, [f"{label} must stay inside the target repository: {locator}"]
|
|
199
|
+
candidate = (target_root / candidate_raw).resolve()
|
|
200
|
+
try:
|
|
201
|
+
candidate.relative_to(target_root.resolve())
|
|
202
|
+
except ValueError:
|
|
203
|
+
return None, [f"{label} must stay inside the target repository: {locator}"]
|
|
204
|
+
return candidate, []
|
|
187
205
|
|
|
188
206
|
|
|
189
207
|
def parse_work_item(path: Path, root: Path) -> tuple[dict[str, object], list[str]]:
|
|
@@ -301,7 +319,10 @@ def inspect_fact_chain(
|
|
|
301
319
|
output_relative: str = ".loom/bootstrap/init-result.json",
|
|
302
320
|
) -> tuple[dict[str, object], list[str]]:
|
|
303
321
|
errors: list[str] = []
|
|
304
|
-
output_path = target_root
|
|
322
|
+
output_path, output_errors = resolve_repo_relative_path(target_root, output_relative, label="init-result locator")
|
|
323
|
+
if output_errors:
|
|
324
|
+
return {}, output_errors
|
|
325
|
+
assert output_path is not None
|
|
305
326
|
if not output_path.exists():
|
|
306
327
|
return {}, [f"missing init-result: {output_relative}"]
|
|
307
328
|
|
|
@@ -346,9 +367,29 @@ def inspect_fact_chain(
|
|
|
346
367
|
if errors:
|
|
347
368
|
return {}, errors
|
|
348
369
|
|
|
349
|
-
work_item_path =
|
|
350
|
-
|
|
351
|
-
|
|
370
|
+
work_item_path, work_item_path_errors = resolve_repo_relative_path(
|
|
371
|
+
target_root,
|
|
372
|
+
str(work_item_ref),
|
|
373
|
+
label="init-result.fact_chain.entry_points.work_item",
|
|
374
|
+
)
|
|
375
|
+
recovery_path, recovery_path_errors = resolve_repo_relative_path(
|
|
376
|
+
target_root,
|
|
377
|
+
str(recovery_ref),
|
|
378
|
+
label="init-result.fact_chain.entry_points.recovery_entry",
|
|
379
|
+
)
|
|
380
|
+
status_path, status_path_errors = resolve_repo_relative_path(
|
|
381
|
+
target_root,
|
|
382
|
+
str(status_ref),
|
|
383
|
+
label="init-result.fact_chain.entry_points.status_surface",
|
|
384
|
+
)
|
|
385
|
+
errors.extend(work_item_path_errors)
|
|
386
|
+
errors.extend(recovery_path_errors)
|
|
387
|
+
errors.extend(status_path_errors)
|
|
388
|
+
if errors:
|
|
389
|
+
return {}, errors
|
|
390
|
+
assert work_item_path is not None
|
|
391
|
+
assert recovery_path is not None
|
|
392
|
+
assert status_path is not None
|
|
352
393
|
for label, path in (
|
|
353
394
|
("work_item", work_item_path),
|
|
354
395
|
("recovery_entry", recovery_path),
|
|
@@ -468,10 +468,9 @@ def relative_locator_from_value(root: Path, raw_locator: object) -> str | None:
|
|
|
468
468
|
return None
|
|
469
469
|
locator_path = Path(locator)
|
|
470
470
|
if locator_path.is_absolute():
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
return str(locator_path)
|
|
471
|
+
return None
|
|
472
|
+
if ".." in locator_path.parts:
|
|
473
|
+
return None
|
|
475
474
|
return str(locator_path)
|
|
476
475
|
|
|
477
476
|
|
|
@@ -479,7 +478,12 @@ def resolve_locator(root: Path, raw_locator: object) -> tuple[str | None, Path |
|
|
|
479
478
|
locator = relative_locator_from_value(root, raw_locator)
|
|
480
479
|
if locator is None:
|
|
481
480
|
return None, None
|
|
482
|
-
|
|
481
|
+
target = (root / locator).resolve()
|
|
482
|
+
try:
|
|
483
|
+
target.relative_to(root.resolve())
|
|
484
|
+
except ValueError:
|
|
485
|
+
return None, None
|
|
486
|
+
return locator, target
|
|
483
487
|
|
|
484
488
|
|
|
485
489
|
def locator_status_entry(
|
|
@@ -272,6 +272,7 @@ def check_required_paths(root: Path, category: str, paths: tuple[str, ...]) -> l
|
|
|
272
272
|
def iter_markdown_files(root: Path) -> list[Path]:
|
|
273
273
|
skipped_parts = {
|
|
274
274
|
".git",
|
|
275
|
+
".worktrees",
|
|
275
276
|
"node_modules",
|
|
276
277
|
"dist",
|
|
277
278
|
"payload",
|
|
@@ -2533,6 +2534,11 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
2533
2534
|
],
|
|
2534
2535
|
{"pass"},
|
|
2535
2536
|
),
|
|
2537
|
+
(
|
|
2538
|
+
"adopt-verify",
|
|
2539
|
+
["python3", "tools/loom_flow.py", "adopt", "verify", "--target", "examples/new-project", "--item", "INIT-0001"],
|
|
2540
|
+
{"pass"},
|
|
2541
|
+
),
|
|
2536
2542
|
(
|
|
2537
2543
|
"governance-profile-status",
|
|
2538
2544
|
["python3", "tools/loom_flow.py", "governance-profile", "status", "--target", "examples/new-project"],
|
|
@@ -2797,6 +2803,21 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
2797
2803
|
context="`runtime-parity validate`",
|
|
2798
2804
|
payload=payload,
|
|
2799
2805
|
)
|
|
2806
|
+
if label == "adopt-verify":
|
|
2807
|
+
if payload.get("command") != "adopt" or payload.get("operation") != "verify":
|
|
2808
|
+
failures.append(Failure("daily-execution-cli", "`adopt verify` must report command/operation"))
|
|
2809
|
+
if payload.get("schema_version") != "loom-adoption-verify/v1":
|
|
2810
|
+
failures.append(Failure("daily-execution-cli", "`adopt verify` must report schema v1"))
|
|
2811
|
+
roundtrip = payload.get("producer_consumer_roundtrip")
|
|
2812
|
+
if not isinstance(roundtrip, dict):
|
|
2813
|
+
failures.append(Failure("daily-execution-cli", "`adopt verify` must include producer_consumer_roundtrip"))
|
|
2814
|
+
else:
|
|
2815
|
+
consumer = roundtrip.get("consumer")
|
|
2816
|
+
bypass = roundtrip.get("bypass_check")
|
|
2817
|
+
if not isinstance(consumer, dict) or consumer.get("result") != "pass":
|
|
2818
|
+
failures.append(Failure("daily-execution-cli", "`adopt verify` generated body must pass consumer validation"))
|
|
2819
|
+
if not isinstance(bypass, dict) or bypass.get("result") != "pass":
|
|
2820
|
+
failures.append(Failure("daily-execution-cli", "`adopt verify` must prove required section deletion blocks"))
|
|
2800
2821
|
if label in {"governance-profile-status", "governance-profile-upgrade-plan"}:
|
|
2801
2822
|
if payload.get("command") != "governance-profile":
|
|
2802
2823
|
failures.append(Failure("daily-execution-cli", f"`{label}` must report `command: governance-profile`"))
|
|
@@ -6337,6 +6358,66 @@ def check_adversarial_adoption_fixture(root: Path) -> list[Failure]:
|
|
|
6337
6358
|
elif payload.get("result") != expected:
|
|
6338
6359
|
failures.append(Failure("adversarial-adoption", f"`{label}` baseline must return `{expected}`"))
|
|
6339
6360
|
|
|
6361
|
+
path_escape_payload, error = load_command_json(
|
|
6362
|
+
root,
|
|
6363
|
+
["python3", "tools/loom_flow.py", "fact-chain", "--target", str(baseline), "--output", "../outside-init-result.json"],
|
|
6364
|
+
)
|
|
6365
|
+
if error:
|
|
6366
|
+
failures.append(Failure("adversarial-adoption", f"path escape fact-chain sample failed: {error}"))
|
|
6367
|
+
elif path_escape_payload.get("result") != "block":
|
|
6368
|
+
failures.append(Failure("adversarial-adoption", "fact-chain must block init-result locators that escape the target root"))
|
|
6369
|
+
|
|
6370
|
+
escape_work_item_payload, error = load_command_json(
|
|
6371
|
+
root,
|
|
6372
|
+
[
|
|
6373
|
+
"python3",
|
|
6374
|
+
"tools/loom_flow.py",
|
|
6375
|
+
"work-item",
|
|
6376
|
+
"create",
|
|
6377
|
+
"--target",
|
|
6378
|
+
str(baseline),
|
|
6379
|
+
"--item",
|
|
6380
|
+
"ESCAPE-0001",
|
|
6381
|
+
"--goal",
|
|
6382
|
+
"Reject path escape",
|
|
6383
|
+
"--scope",
|
|
6384
|
+
"Exercise repo-relative locator hardening",
|
|
6385
|
+
"--execution-path",
|
|
6386
|
+
"execution/support",
|
|
6387
|
+
"--workspace-entry",
|
|
6388
|
+
".",
|
|
6389
|
+
"--validation-entry",
|
|
6390
|
+
"python3 .loom/bin/loom_init.py verify --target .",
|
|
6391
|
+
"--closing-condition",
|
|
6392
|
+
"Unsafe locators are blocked.",
|
|
6393
|
+
"--recovery-entry",
|
|
6394
|
+
"../escape.md",
|
|
6395
|
+
"--init-recovery",
|
|
6396
|
+
],
|
|
6397
|
+
)
|
|
6398
|
+
if error:
|
|
6399
|
+
failures.append(Failure("adversarial-adoption", f"path escape work-item sample failed: {error}"))
|
|
6400
|
+
elif escape_work_item_payload.get("result") != "block":
|
|
6401
|
+
failures.append(Failure("adversarial-adoption", "work-item create must block recovery locators that escape the target root"))
|
|
6402
|
+
|
|
6403
|
+
shadow_escape_target = base / "shadow-locator-escape"
|
|
6404
|
+
shutil.copytree(baseline, shadow_escape_target)
|
|
6405
|
+
interop_path = shadow_escape_target / ".loom/companion/interop.json"
|
|
6406
|
+
interop_payload = load_json_file(interop_path)
|
|
6407
|
+
shadow_surfaces = interop_payload.get("shadow_surfaces") if isinstance(interop_payload, dict) else None
|
|
6408
|
+
review_surface = shadow_surfaces.get("review") if isinstance(shadow_surfaces, dict) else None
|
|
6409
|
+
if isinstance(review_surface, dict):
|
|
6410
|
+
review_surface["loom_locator"] = "/tmp/outside-shadow-evidence.json"
|
|
6411
|
+
write_json(interop_path, interop_payload)
|
|
6412
|
+
shadow_escape_payload, error = load_command_json(
|
|
6413
|
+
root,
|
|
6414
|
+
["python3", "tools/loom_flow.py", "shadow-parity", "--target", str(shadow_escape_target), "--surface", "review", "--blocking"],
|
|
6415
|
+
)
|
|
6416
|
+
if error:
|
|
6417
|
+
failures.append(Failure("adversarial-adoption", f"path escape shadow-parity sample failed: {error}"))
|
|
6418
|
+
elif shadow_escape_payload.get("result") != "block":
|
|
6419
|
+
failures.append(Failure("adversarial-adoption", "shadow-parity blocking mode must reject absolute shadow locators"))
|
|
6420
|
+
|
|
6340
6421
|
poisoned_payload, error = load_command_json(
|
|
6341
6422
|
root,
|
|
6342
6423
|
["python3", str(baseline / ".loom/bin/loom_init.py"), "runtime-state", "--target", str(baseline)],
|
|
@@ -6482,15 +6563,20 @@ def check_node_installer(root: Path) -> list[Failure]:
|
|
|
6482
6563
|
["npm", "test"],
|
|
6483
6564
|
["npm", "pack", "--dry-run"],
|
|
6484
6565
|
)
|
|
6485
|
-
|
|
6486
|
-
|
|
6487
|
-
|
|
6488
|
-
|
|
6489
|
-
|
|
6490
|
-
|
|
6491
|
-
|
|
6492
|
-
|
|
6493
|
-
|
|
6566
|
+
with tempfile.TemporaryDirectory(prefix="loom-check-npm-cache-") as cache_dir:
|
|
6567
|
+
npm_env = {
|
|
6568
|
+
"npm_config_cache": cache_dir,
|
|
6569
|
+
"NPM_CONFIG_CACHE": cache_dir,
|
|
6570
|
+
}
|
|
6571
|
+
for args in commands:
|
|
6572
|
+
try:
|
|
6573
|
+
result = run_command(root, args, cwd=package_root, env=npm_env, timeout_seconds=300)
|
|
6574
|
+
except subprocess.TimeoutExpired:
|
|
6575
|
+
failures.append(Failure(category, f"`{' '.join(args)}` timed out"))
|
|
6576
|
+
continue
|
|
6577
|
+
if result.returncode != 0:
|
|
6578
|
+
detail = result.stderr.strip() or result.stdout.strip() or "command failed without output"
|
|
6579
|
+
failures.append(Failure(category, f"`{' '.join(args)}` failed: {detail}"))
|
|
6494
6580
|
return failures
|
|
6495
6581
|
|
|
6496
6582
|
|