@mc-and-his-agents/loom-installer 0.1.36 → 0.1.38

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.
Files changed (52) hide show
  1. package/package.json +1 -1
  2. package/payload/manifest.json +102 -102
  3. package/payload/plugin/loom/skills/shared/scripts/fact_chain_support.py +2 -2
  4. package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +21 -9
  5. package/payload/plugin/loom/skills/shared/scripts/loom_check.py +140 -0
  6. package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +34 -8
  7. package/payload/plugin/loom/skills/shared/scripts/runtime_state.py +36 -5
  8. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  9. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  10. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +140 -0
  11. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  12. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/runtime_state.py +36 -5
  13. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  14. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  15. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +140 -0
  16. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  17. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/runtime_state.py +36 -5
  18. package/payload/skills/loom-init/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  19. package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  20. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +140 -0
  21. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  22. package/payload/skills/loom-init/.loom-runtime/shared/scripts/runtime_state.py +36 -5
  23. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  24. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  25. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +140 -0
  26. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  27. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/runtime_state.py +36 -5
  28. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  29. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  30. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +140 -0
  31. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  32. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/runtime_state.py +36 -5
  33. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  34. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  35. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +140 -0
  36. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  37. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/runtime_state.py +36 -5
  38. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  39. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  40. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +140 -0
  41. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  42. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/runtime_state.py +36 -5
  43. package/payload/skills/loom-review/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  44. package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  45. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +140 -0
  46. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  47. package/payload/skills/loom-review/.loom-runtime/shared/scripts/runtime_state.py +36 -5
  48. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/fact_chain_support.py +2 -2
  49. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +21 -9
  50. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +140 -0
  51. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +34 -8
  52. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/runtime_state.py +36 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mc-and-his-agents/loom-installer",
3
- "version": "0.1.36",
3
+ "version": "0.1.38",
4
4
  "description": "Node installer for Loom plugin and single-skill installation surfaces.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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": "45233afafc4bcef359eff4253af58a2d9fb17fb3",
5
+ "source_commit": "83ff7a17b9fe7f92d88fb55f332e45b2c47e63ed",
6
6
  "source_ref": "main",
7
- "built_at": "2026-04-27T15:31:01+08:00",
7
+ "built_at": "2026-04-27T16:19:20+08:00",
8
8
  "runtime": {
9
9
  "python_minimum": "3.10",
10
10
  "python_recommended": "3.11+"
@@ -623,23 +623,23 @@
623
623
  },
624
624
  {
625
625
  "path": "plugin/loom/skills/shared/scripts/fact_chain_support.py",
626
- "bytes": 21694,
627
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
626
+ "bytes": 21748,
627
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
628
628
  },
629
629
  {
630
630
  "path": "plugin/loom/skills/shared/scripts/governance_surface.py",
631
- "bytes": 56201,
632
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
631
+ "bytes": 56993,
632
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
633
633
  },
634
634
  {
635
635
  "path": "plugin/loom/skills/shared/scripts/loom_check.py",
636
- "bytes": 332360,
637
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
636
+ "bytes": 340505,
637
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
638
638
  },
639
639
  {
640
640
  "path": "plugin/loom/skills/shared/scripts/loom_flow.py",
641
- "bytes": 333236,
642
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
641
+ "bytes": 334363,
642
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
662
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
661
+ "bytes": 21030,
662
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
663
663
  },
664
664
  {
665
665
  "path": "plugin/loom/skills/upgrade-contract.json",
@@ -1213,23 +1213,23 @@
1213
1213
  },
1214
1214
  {
1215
1215
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/fact_chain_support.py",
1216
- "bytes": 21694,
1217
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
1216
+ "bytes": 21748,
1217
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
1218
1218
  },
1219
1219
  {
1220
1220
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py",
1221
- "bytes": 56201,
1222
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
1221
+ "bytes": 56993,
1222
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
1223
1223
  },
1224
1224
  {
1225
1225
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
1226
- "bytes": 332360,
1227
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
1226
+ "bytes": 340505,
1227
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
1228
1228
  },
1229
1229
  {
1230
1230
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
1231
- "bytes": 333236,
1232
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
1231
+ "bytes": 334363,
1232
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
1252
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
1251
+ "bytes": 21030,
1252
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
1253
1253
  },
1254
1254
  {
1255
1255
  "path": "skills/loom-adopt/.loom-runtime/upgrade-contract.json",
@@ -1833,23 +1833,23 @@
1833
1833
  },
1834
1834
  {
1835
1835
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/fact_chain_support.py",
1836
- "bytes": 21694,
1837
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
1836
+ "bytes": 21748,
1837
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
1838
1838
  },
1839
1839
  {
1840
1840
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py",
1841
- "bytes": 56201,
1842
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
1841
+ "bytes": 56993,
1842
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
1843
1843
  },
1844
1844
  {
1845
1845
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
1846
- "bytes": 332360,
1847
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
1846
+ "bytes": 340505,
1847
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
1848
1848
  },
1849
1849
  {
1850
1850
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
1851
- "bytes": 333236,
1852
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
1851
+ "bytes": 334363,
1852
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
1872
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
1871
+ "bytes": 21030,
1872
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
1873
1873
  },
1874
1874
  {
1875
1875
  "path": "skills/loom-handoff/.loom-runtime/upgrade-contract.json",
@@ -2453,23 +2453,23 @@
2453
2453
  },
2454
2454
  {
2455
2455
  "path": "skills/loom-init/.loom-runtime/shared/scripts/fact_chain_support.py",
2456
- "bytes": 21694,
2457
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
2456
+ "bytes": 21748,
2457
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
2458
2458
  },
2459
2459
  {
2460
2460
  "path": "skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py",
2461
- "bytes": 56201,
2462
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
2461
+ "bytes": 56993,
2462
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
2463
2463
  },
2464
2464
  {
2465
2465
  "path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
2466
- "bytes": 332360,
2467
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
2466
+ "bytes": 340505,
2467
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
2468
2468
  },
2469
2469
  {
2470
2470
  "path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
2471
- "bytes": 333236,
2472
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
2471
+ "bytes": 334363,
2472
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
2492
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
2491
+ "bytes": 21030,
2492
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
2493
2493
  },
2494
2494
  {
2495
2495
  "path": "skills/loom-init/.loom-runtime/upgrade-contract.json",
@@ -3078,23 +3078,23 @@
3078
3078
  },
3079
3079
  {
3080
3080
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/fact_chain_support.py",
3081
- "bytes": 21694,
3082
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
3081
+ "bytes": 21748,
3082
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
3083
3083
  },
3084
3084
  {
3085
3085
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py",
3086
- "bytes": 56201,
3087
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
3086
+ "bytes": 56993,
3087
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
3088
3088
  },
3089
3089
  {
3090
3090
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
3091
- "bytes": 332360,
3092
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
3091
+ "bytes": 340505,
3092
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
3093
3093
  },
3094
3094
  {
3095
3095
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
3096
- "bytes": 333236,
3097
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
3096
+ "bytes": 334363,
3097
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
3117
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
3116
+ "bytes": 21030,
3117
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
3118
3118
  },
3119
3119
  {
3120
3120
  "path": "skills/loom-merge-ready/.loom-runtime/upgrade-contract.json",
@@ -3698,23 +3698,23 @@
3698
3698
  },
3699
3699
  {
3700
3700
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/fact_chain_support.py",
3701
- "bytes": 21694,
3702
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
3701
+ "bytes": 21748,
3702
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
3703
3703
  },
3704
3704
  {
3705
3705
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py",
3706
- "bytes": 56201,
3707
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
3706
+ "bytes": 56993,
3707
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
3708
3708
  },
3709
3709
  {
3710
3710
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
3711
- "bytes": 332360,
3712
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
3711
+ "bytes": 340505,
3712
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
3713
3713
  },
3714
3714
  {
3715
3715
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
3716
- "bytes": 333236,
3717
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
3716
+ "bytes": 334363,
3717
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
3737
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
3736
+ "bytes": 21030,
3737
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
3738
3738
  },
3739
3739
  {
3740
3740
  "path": "skills/loom-pre-review/.loom-runtime/upgrade-contract.json",
@@ -4318,23 +4318,23 @@
4318
4318
  },
4319
4319
  {
4320
4320
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/fact_chain_support.py",
4321
- "bytes": 21694,
4322
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
4321
+ "bytes": 21748,
4322
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
4323
4323
  },
4324
4324
  {
4325
4325
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py",
4326
- "bytes": 56201,
4327
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
4326
+ "bytes": 56993,
4327
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
4328
4328
  },
4329
4329
  {
4330
4330
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
4331
- "bytes": 332360,
4332
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
4331
+ "bytes": 340505,
4332
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
4333
4333
  },
4334
4334
  {
4335
4335
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
4336
- "bytes": 333236,
4337
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
4336
+ "bytes": 334363,
4337
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
4357
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
4356
+ "bytes": 21030,
4357
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
4358
4358
  },
4359
4359
  {
4360
4360
  "path": "skills/loom-resume/.loom-runtime/upgrade-contract.json",
@@ -4938,23 +4938,23 @@
4938
4938
  },
4939
4939
  {
4940
4940
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/fact_chain_support.py",
4941
- "bytes": 21694,
4942
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
4941
+ "bytes": 21748,
4942
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
4943
4943
  },
4944
4944
  {
4945
4945
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py",
4946
- "bytes": 56201,
4947
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
4946
+ "bytes": 56993,
4947
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
4948
4948
  },
4949
4949
  {
4950
4950
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
4951
- "bytes": 332360,
4952
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
4951
+ "bytes": 340505,
4952
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
4953
4953
  },
4954
4954
  {
4955
4955
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
4956
- "bytes": 333236,
4957
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
4956
+ "bytes": 334363,
4957
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
4977
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
4976
+ "bytes": 21030,
4977
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
4978
4978
  },
4979
4979
  {
4980
4980
  "path": "skills/loom-retire/.loom-runtime/upgrade-contract.json",
@@ -5558,23 +5558,23 @@
5558
5558
  },
5559
5559
  {
5560
5560
  "path": "skills/loom-review/.loom-runtime/shared/scripts/fact_chain_support.py",
5561
- "bytes": 21694,
5562
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
5561
+ "bytes": 21748,
5562
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
5563
5563
  },
5564
5564
  {
5565
5565
  "path": "skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py",
5566
- "bytes": 56201,
5567
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
5566
+ "bytes": 56993,
5567
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
5568
5568
  },
5569
5569
  {
5570
5570
  "path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
5571
- "bytes": 332360,
5572
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
5571
+ "bytes": 340505,
5572
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
5573
5573
  },
5574
5574
  {
5575
5575
  "path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
5576
- "bytes": 333236,
5577
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
5576
+ "bytes": 334363,
5577
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
5597
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
5596
+ "bytes": 21030,
5597
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
5598
5598
  },
5599
5599
  {
5600
5600
  "path": "skills/loom-review/.loom-runtime/upgrade-contract.json",
@@ -6178,23 +6178,23 @@
6178
6178
  },
6179
6179
  {
6180
6180
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/fact_chain_support.py",
6181
- "bytes": 21694,
6182
- "sha256": "406352215e9ff1c582d750761b911bd227c99b3cc29d3710143554ced7f9e080"
6181
+ "bytes": 21748,
6182
+ "sha256": "e5c52cda01f1107cafcd00bf2d37feaa167f1acd5152fc8f41f28ee3255a7d52"
6183
6183
  },
6184
6184
  {
6185
6185
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py",
6186
- "bytes": 56201,
6187
- "sha256": "82109bad507ea760c7df3a401b648b34c35da03f8f85eb40481834e44b29ed0f"
6186
+ "bytes": 56993,
6187
+ "sha256": "c8be9d24fe9afad7ffce1d1e7eb7394ce28ae7f3eeb5243a9b7bc9a854e9871f"
6188
6188
  },
6189
6189
  {
6190
6190
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
6191
- "bytes": 332360,
6192
- "sha256": "a9dd05951078041b280b03791dfb5f55d1da9cf038e76801bae8533dda1b2c97"
6191
+ "bytes": 340505,
6192
+ "sha256": "50a031d3cda589e4f020639d0305370281ce6d3e644e14aaa8c9ba090773d15f"
6193
6193
  },
6194
6194
  {
6195
6195
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
6196
- "bytes": 333236,
6197
- "sha256": "bf786adc12a26073ab1bc613bff32ee28bf6fde360ec0b32f1005476e7ab4fd7"
6196
+ "bytes": 334363,
6197
+ "sha256": "e9b376551600383e95e4f707557bb957edf51cd9ee2263587b8b6109088b737c"
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": 19697,
6217
- "sha256": "5c5e096dbea072ab8e4f305ac06ee5d983e0bade519f6bea7fd119a92de52f09"
6216
+ "bytes": 21030,
6217
+ "sha256": "3375830ede9bec65083d9ee6cfac5f5a7e3bd781ef90c78a087c39d37f2cfab2"
6218
6218
  },
6219
6219
  {
6220
6220
  "path": "skills/loom-spec-review/.loom-runtime/upgrade-contract.json",
@@ -195,12 +195,12 @@ def resolve_repo_relative_path(target_root: Path, relative: str, *, label: str)
195
195
  if candidate_raw.is_absolute():
196
196
  return None, [f"{label} must be repo-relative, got absolute path: {locator}"]
197
197
  if ".." in candidate_raw.parts:
198
- return None, [f"{label} must stay inside the target repository: {locator}"]
198
+ return None, [f"{label} must stay within the target root and inside the target repository: {locator}"]
199
199
  candidate = (target_root / candidate_raw).resolve()
200
200
  try:
201
201
  candidate.relative_to(target_root.resolve())
202
202
  except ValueError:
203
- return None, [f"{label} must stay inside the target repository: {locator}"]
203
+ return None, [f"{label} must stay within the target root and inside the target repository: {locator}"]
204
204
  return candidate, []
205
205
 
206
206
 
@@ -8,6 +8,7 @@ import re
8
8
  import subprocess
9
9
  from pathlib import Path
10
10
  from typing import Any
11
+ from urllib.parse import quote
11
12
 
12
13
  from runtime_paths import installed_skill_script
13
14
 
@@ -357,7 +358,7 @@ def detect_github_repo(root: Path) -> tuple[str | None, str | None]:
357
358
  remote = git_remote_origin(root)
358
359
  if not remote:
359
360
  return None, None
360
- match = re.search(r"github\.com[:/](?P<owner>[^/]+)/(?P<repo>[^/.]+)(?:\.git)?$", remote)
361
+ match = re.search(r"github\.com[:/](?P<owner>[^/]+)/(?P<repo>[^/]+?)(?:\.git)?$", remote)
361
362
  if not match:
362
363
  return None, None
363
364
  return match.group("owner"), match.group("repo")
@@ -474,6 +475,16 @@ def relative_locator_from_value(root: Path, raw_locator: object) -> str | None:
474
475
  return str(locator_path)
475
476
 
476
477
 
478
+ def locator_boundary_error(raw_locator: object, *, label: str) -> str:
479
+ if not isinstance(raw_locator, str) or not raw_locator.strip():
480
+ return f"{label} must be a non-empty string"
481
+ locator = raw_locator.strip()
482
+ locator_path = Path(locator)
483
+ if locator_path.is_absolute() or ".." in locator_path.parts:
484
+ return f"{label} must stay inside the repository and within the repository root: {locator}"
485
+ return f"{label} must stay inside the repository and within the repository root: {locator}"
486
+
487
+
477
488
  def resolve_locator(root: Path, raw_locator: object) -> tuple[str | None, Path | None]:
478
489
  locator = relative_locator_from_value(root, raw_locator)
479
490
  if locator is None:
@@ -494,7 +505,7 @@ def locator_status_entry(
494
505
  ) -> tuple[dict[str, str], str | None]:
495
506
  locator, target = resolve_locator(root, raw_locator)
496
507
  if locator is None or target is None:
497
- return carrier_entry("missing", "unknown", source), f"{source} is missing a valid locator"
508
+ return carrier_entry("missing", "unknown", source), locator_boundary_error(raw_locator, label=source)
498
509
  if not target.exists():
499
510
  return carrier_entry("missing", locator, source), f"{source} points to missing path `{locator}`"
500
511
  return carrier_entry("present", locator, source), None
@@ -520,7 +531,7 @@ def validate_repo_specific_requirement(
520
531
  missing_inputs.append(f"{prefix} enforcement must be `blocking` or `advisory`")
521
532
  locator, target = resolve_locator(root, entry.get("locator"))
522
533
  if locator is None or target is None:
523
- missing_inputs.append(f"{prefix} locator must be a non-empty string")
534
+ missing_inputs.append(locator_boundary_error(entry.get("locator"), label=f"{prefix} locator"))
524
535
  elif not target.exists():
525
536
  missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
526
537
  return missing_inputs
@@ -542,7 +553,7 @@ def validate_specialized_gate(
542
553
  missing_inputs.append(f"{prefix} missing `{field}`")
543
554
  locator, target = resolve_locator(root, entry.get("locator"))
544
555
  if locator is None or target is None:
545
- missing_inputs.append(f"{prefix} locator must be a non-empty string")
556
+ missing_inputs.append(locator_boundary_error(entry.get("locator"), label=f"{prefix} locator"))
546
557
  elif not target.exists():
547
558
  missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
548
559
  gate_type = entry.get("gate_type")
@@ -582,7 +593,7 @@ def validate_metadata_contract(
582
593
  for locator_field in ("applicability_locator", "authority_locator"):
583
594
  locator, target = resolve_locator(root, field.get(locator_field))
584
595
  if locator is None or target is None:
585
- missing_inputs.append(f"{field_prefix} `{locator_field}` must be a non-empty string")
596
+ missing_inputs.append(locator_boundary_error(field.get(locator_field), label=f"{field_prefix} `{locator_field}`"))
586
597
  elif not target.exists():
587
598
  missing_inputs.append(f"{field_prefix} `{locator_field}` points to missing path `{locator}`")
588
599
  return missing_inputs
@@ -616,7 +627,7 @@ def validate_context_schema(
616
627
  missing_inputs.append(f"{field_prefix} `required` must be a boolean")
617
628
  locator, target = resolve_locator(root, field.get("mapping_rule_locator"))
618
629
  if locator is None or target is None:
619
- missing_inputs.append(f"{field_prefix} `mapping_rule_locator` must be a non-empty string")
630
+ missing_inputs.append(locator_boundary_error(field.get("mapping_rule_locator"), label=f"{field_prefix} `mapping_rule_locator`"))
620
631
  elif not target.exists():
621
632
  missing_inputs.append(f"{field_prefix} `mapping_rule_locator` points to missing path `{locator}`")
622
633
  return missing_inputs
@@ -648,7 +659,7 @@ def validate_repo_interop_collection_entry(
648
659
  )
649
660
  locator, target = resolve_locator(root, entry.get("locator"))
650
661
  if locator is None or target is None:
651
- missing_inputs.append(f"{prefix} locator must be a non-empty string")
662
+ missing_inputs.append(locator_boundary_error(entry.get("locator"), label=f"{prefix} locator"))
652
663
  elif not target.exists():
653
664
  missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
654
665
  return missing_inputs
@@ -670,7 +681,7 @@ def validate_shadow_surface(
670
681
  for locator_field in ("loom_locator", "repo_locator"):
671
682
  locator, target = resolve_locator(root, entry.get(locator_field))
672
683
  if locator is None or target is None:
673
- missing_inputs.append(f"{prefix} `{locator_field}` must be a non-empty string")
684
+ missing_inputs.append(locator_boundary_error(entry.get(locator_field), label=f"{prefix} `{locator_field}`"))
674
685
  elif not target.exists():
675
686
  missing_inputs.append(f"{prefix} `{locator_field}` points to missing path `{locator}`")
676
687
  return missing_inputs
@@ -1089,7 +1100,8 @@ def detect_github_control_plane(root: Path) -> tuple[dict[str, Any], list[str]]:
1089
1100
  missing_inputs.append("github control plane: default branch is unavailable")
1090
1101
  return surface, missing_inputs
1091
1102
 
1092
- branch_payload, branch_errors = gh_json(root, ["api", f"repos/{owner}/{repo}/branches/{surface['default_branch']}"])
1103
+ encoded_branch = quote(str(surface["default_branch"]), safe="")
1104
+ branch_payload, branch_errors = gh_json(root, ["api", f"repos/{owner}/{repo}/branches/{encoded_branch}"])
1093
1105
  if branch_errors or branch_payload is None:
1094
1106
  missing_inputs.extend(f"github control plane: {message}" for message in branch_errors)
1095
1107
  return surface, missing_inputs