@mc-and-his-agents/loom-installer 0.1.8 → 0.1.9
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 +62 -62
- package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +11 -6
- package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +75 -32
- package/payload/plugin/loom/skills/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_status.py +4 -18
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +11 -6
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +75 -32
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_status.py +4 -18
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": "177ddf6ce8fc69cbea65bb5377d34cdb9a3b6624",
|
|
6
6
|
"source_ref": "main",
|
|
7
|
-
"built_at": "2026-04-24T14:
|
|
7
|
+
"built_at": "2026-04-24T14:51:38+08:00",
|
|
8
8
|
"runtime": {
|
|
9
9
|
"python_minimum": "3.10",
|
|
10
10
|
"python_recommended": "3.11+"
|
|
@@ -618,8 +618,8 @@
|
|
|
618
618
|
},
|
|
619
619
|
{
|
|
620
620
|
"path": "plugin/loom/skills/shared/scripts/governance_surface.py",
|
|
621
|
-
"bytes":
|
|
622
|
-
"sha256": "
|
|
621
|
+
"bytes": 48077,
|
|
622
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
623
623
|
},
|
|
624
624
|
{
|
|
625
625
|
"path": "plugin/loom/skills/shared/scripts/loom_check.py",
|
|
@@ -628,8 +628,8 @@
|
|
|
628
628
|
},
|
|
629
629
|
{
|
|
630
630
|
"path": "plugin/loom/skills/shared/scripts/loom_flow.py",
|
|
631
|
-
"bytes":
|
|
632
|
-
"sha256": "
|
|
631
|
+
"bytes": 248662,
|
|
632
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
633
633
|
},
|
|
634
634
|
{
|
|
635
635
|
"path": "plugin/loom/skills/shared/scripts/loom_init.py",
|
|
@@ -638,8 +638,8 @@
|
|
|
638
638
|
},
|
|
639
639
|
{
|
|
640
640
|
"path": "plugin/loom/skills/shared/scripts/loom_status.py",
|
|
641
|
-
"bytes":
|
|
642
|
-
"sha256": "
|
|
641
|
+
"bytes": 18941,
|
|
642
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
643
643
|
},
|
|
644
644
|
{
|
|
645
645
|
"path": "plugin/loom/skills/shared/scripts/runtime_paths.py",
|
|
@@ -1198,8 +1198,8 @@
|
|
|
1198
1198
|
},
|
|
1199
1199
|
{
|
|
1200
1200
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1201
|
-
"bytes":
|
|
1202
|
-
"sha256": "
|
|
1201
|
+
"bytes": 48077,
|
|
1202
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
1203
1203
|
},
|
|
1204
1204
|
{
|
|
1205
1205
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -1208,8 +1208,8 @@
|
|
|
1208
1208
|
},
|
|
1209
1209
|
{
|
|
1210
1210
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1211
|
-
"bytes":
|
|
1212
|
-
"sha256": "
|
|
1211
|
+
"bytes": 248662,
|
|
1212
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
1213
1213
|
},
|
|
1214
1214
|
{
|
|
1215
1215
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -1218,8 +1218,8 @@
|
|
|
1218
1218
|
},
|
|
1219
1219
|
{
|
|
1220
1220
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_status.py",
|
|
1221
|
-
"bytes":
|
|
1222
|
-
"sha256": "
|
|
1221
|
+
"bytes": 18941,
|
|
1222
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
1223
1223
|
},
|
|
1224
1224
|
{
|
|
1225
1225
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -1808,8 +1808,8 @@
|
|
|
1808
1808
|
},
|
|
1809
1809
|
{
|
|
1810
1810
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1811
|
-
"bytes":
|
|
1812
|
-
"sha256": "
|
|
1811
|
+
"bytes": 48077,
|
|
1812
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
1813
1813
|
},
|
|
1814
1814
|
{
|
|
1815
1815
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -1818,8 +1818,8 @@
|
|
|
1818
1818
|
},
|
|
1819
1819
|
{
|
|
1820
1820
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1821
|
-
"bytes":
|
|
1822
|
-
"sha256": "
|
|
1821
|
+
"bytes": 248662,
|
|
1822
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
1823
1823
|
},
|
|
1824
1824
|
{
|
|
1825
1825
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -1828,8 +1828,8 @@
|
|
|
1828
1828
|
},
|
|
1829
1829
|
{
|
|
1830
1830
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_status.py",
|
|
1831
|
-
"bytes":
|
|
1832
|
-
"sha256": "
|
|
1831
|
+
"bytes": 18941,
|
|
1832
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
1833
1833
|
},
|
|
1834
1834
|
{
|
|
1835
1835
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -2418,8 +2418,8 @@
|
|
|
2418
2418
|
},
|
|
2419
2419
|
{
|
|
2420
2420
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py",
|
|
2421
|
-
"bytes":
|
|
2422
|
-
"sha256": "
|
|
2421
|
+
"bytes": 48077,
|
|
2422
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
2423
2423
|
},
|
|
2424
2424
|
{
|
|
2425
2425
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -2428,8 +2428,8 @@
|
|
|
2428
2428
|
},
|
|
2429
2429
|
{
|
|
2430
2430
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
|
|
2431
|
-
"bytes":
|
|
2432
|
-
"sha256": "
|
|
2431
|
+
"bytes": 248662,
|
|
2432
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
2433
2433
|
},
|
|
2434
2434
|
{
|
|
2435
2435
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -2438,8 +2438,8 @@
|
|
|
2438
2438
|
},
|
|
2439
2439
|
{
|
|
2440
2440
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_status.py",
|
|
2441
|
-
"bytes":
|
|
2442
|
-
"sha256": "
|
|
2441
|
+
"bytes": 18941,
|
|
2442
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
2443
2443
|
},
|
|
2444
2444
|
{
|
|
2445
2445
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -3033,8 +3033,8 @@
|
|
|
3033
3033
|
},
|
|
3034
3034
|
{
|
|
3035
3035
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3036
|
-
"bytes":
|
|
3037
|
-
"sha256": "
|
|
3036
|
+
"bytes": 48077,
|
|
3037
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
3038
3038
|
},
|
|
3039
3039
|
{
|
|
3040
3040
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -3043,8 +3043,8 @@
|
|
|
3043
3043
|
},
|
|
3044
3044
|
{
|
|
3045
3045
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3046
|
-
"bytes":
|
|
3047
|
-
"sha256": "
|
|
3046
|
+
"bytes": 248662,
|
|
3047
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
3048
3048
|
},
|
|
3049
3049
|
{
|
|
3050
3050
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -3053,8 +3053,8 @@
|
|
|
3053
3053
|
},
|
|
3054
3054
|
{
|
|
3055
3055
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_status.py",
|
|
3056
|
-
"bytes":
|
|
3057
|
-
"sha256": "
|
|
3056
|
+
"bytes": 18941,
|
|
3057
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
3058
3058
|
},
|
|
3059
3059
|
{
|
|
3060
3060
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -3643,8 +3643,8 @@
|
|
|
3643
3643
|
},
|
|
3644
3644
|
{
|
|
3645
3645
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3646
|
-
"bytes":
|
|
3647
|
-
"sha256": "
|
|
3646
|
+
"bytes": 48077,
|
|
3647
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
3648
3648
|
},
|
|
3649
3649
|
{
|
|
3650
3650
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -3653,8 +3653,8 @@
|
|
|
3653
3653
|
},
|
|
3654
3654
|
{
|
|
3655
3655
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3656
|
-
"bytes":
|
|
3657
|
-
"sha256": "
|
|
3656
|
+
"bytes": 248662,
|
|
3657
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
3658
3658
|
},
|
|
3659
3659
|
{
|
|
3660
3660
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -3663,8 +3663,8 @@
|
|
|
3663
3663
|
},
|
|
3664
3664
|
{
|
|
3665
3665
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_status.py",
|
|
3666
|
-
"bytes":
|
|
3667
|
-
"sha256": "
|
|
3666
|
+
"bytes": 18941,
|
|
3667
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
3668
3668
|
},
|
|
3669
3669
|
{
|
|
3670
3670
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -4253,8 +4253,8 @@
|
|
|
4253
4253
|
},
|
|
4254
4254
|
{
|
|
4255
4255
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4256
|
-
"bytes":
|
|
4257
|
-
"sha256": "
|
|
4256
|
+
"bytes": 48077,
|
|
4257
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
4258
4258
|
},
|
|
4259
4259
|
{
|
|
4260
4260
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -4263,8 +4263,8 @@
|
|
|
4263
4263
|
},
|
|
4264
4264
|
{
|
|
4265
4265
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4266
|
-
"bytes":
|
|
4267
|
-
"sha256": "
|
|
4266
|
+
"bytes": 248662,
|
|
4267
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
4268
4268
|
},
|
|
4269
4269
|
{
|
|
4270
4270
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -4273,8 +4273,8 @@
|
|
|
4273
4273
|
},
|
|
4274
4274
|
{
|
|
4275
4275
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_status.py",
|
|
4276
|
-
"bytes":
|
|
4277
|
-
"sha256": "
|
|
4276
|
+
"bytes": 18941,
|
|
4277
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
4278
4278
|
},
|
|
4279
4279
|
{
|
|
4280
4280
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -4863,8 +4863,8 @@
|
|
|
4863
4863
|
},
|
|
4864
4864
|
{
|
|
4865
4865
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4866
|
-
"bytes":
|
|
4867
|
-
"sha256": "
|
|
4866
|
+
"bytes": 48077,
|
|
4867
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
4868
4868
|
},
|
|
4869
4869
|
{
|
|
4870
4870
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -4873,8 +4873,8 @@
|
|
|
4873
4873
|
},
|
|
4874
4874
|
{
|
|
4875
4875
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4876
|
-
"bytes":
|
|
4877
|
-
"sha256": "
|
|
4876
|
+
"bytes": 248662,
|
|
4877
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
4878
4878
|
},
|
|
4879
4879
|
{
|
|
4880
4880
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -4883,8 +4883,8 @@
|
|
|
4883
4883
|
},
|
|
4884
4884
|
{
|
|
4885
4885
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_status.py",
|
|
4886
|
-
"bytes":
|
|
4887
|
-
"sha256": "
|
|
4886
|
+
"bytes": 18941,
|
|
4887
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
4888
4888
|
},
|
|
4889
4889
|
{
|
|
4890
4890
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -5473,8 +5473,8 @@
|
|
|
5473
5473
|
},
|
|
5474
5474
|
{
|
|
5475
5475
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
5476
|
-
"bytes":
|
|
5477
|
-
"sha256": "
|
|
5476
|
+
"bytes": 48077,
|
|
5477
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
5478
5478
|
},
|
|
5479
5479
|
{
|
|
5480
5480
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -5483,8 +5483,8 @@
|
|
|
5483
5483
|
},
|
|
5484
5484
|
{
|
|
5485
5485
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
5486
|
-
"bytes":
|
|
5487
|
-
"sha256": "
|
|
5486
|
+
"bytes": 248662,
|
|
5487
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
5488
5488
|
},
|
|
5489
5489
|
{
|
|
5490
5490
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -5493,8 +5493,8 @@
|
|
|
5493
5493
|
},
|
|
5494
5494
|
{
|
|
5495
5495
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_status.py",
|
|
5496
|
-
"bytes":
|
|
5497
|
-
"sha256": "
|
|
5496
|
+
"bytes": 18941,
|
|
5497
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
5498
5498
|
},
|
|
5499
5499
|
{
|
|
5500
5500
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -6083,8 +6083,8 @@
|
|
|
6083
6083
|
},
|
|
6084
6084
|
{
|
|
6085
6085
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
6086
|
-
"bytes":
|
|
6087
|
-
"sha256": "
|
|
6086
|
+
"bytes": 48077,
|
|
6087
|
+
"sha256": "ecb24c8c58d978cd9207f8a99881e560c6f64f015cffa527bd221a1cf7cf2e24"
|
|
6088
6088
|
},
|
|
6089
6089
|
{
|
|
6090
6090
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
@@ -6093,8 +6093,8 @@
|
|
|
6093
6093
|
},
|
|
6094
6094
|
{
|
|
6095
6095
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
6096
|
-
"bytes":
|
|
6097
|
-
"sha256": "
|
|
6096
|
+
"bytes": 248662,
|
|
6097
|
+
"sha256": "69263e7c763f45a0a4f29a2c43e12e08b2d1fffd2cf3a63dea41aec3d1543597"
|
|
6098
6098
|
},
|
|
6099
6099
|
{
|
|
6100
6100
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -6103,8 +6103,8 @@
|
|
|
6103
6103
|
},
|
|
6104
6104
|
{
|
|
6105
6105
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_status.py",
|
|
6106
|
-
"bytes":
|
|
6107
|
-
"sha256": "
|
|
6106
|
+
"bytes": 18941,
|
|
6107
|
+
"sha256": "b8c74d31898ba4fdd5326abe82d175ec10e0a30cc2ea61810f1ec096052519f6"
|
|
6108
6108
|
},
|
|
6109
6109
|
{
|
|
6110
6110
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/runtime_paths.py",
|
|
@@ -219,6 +219,10 @@ def gh_json(root: Path, args: list[str]) -> tuple[dict[str, Any] | None, list[st
|
|
|
219
219
|
return payload, []
|
|
220
220
|
|
|
221
221
|
|
|
222
|
+
def gh_rest_json(root: Path, path: str) -> tuple[dict[str, Any] | None, list[str]]:
|
|
223
|
+
return gh_json(root, ["api", path])
|
|
224
|
+
|
|
225
|
+
|
|
222
226
|
def detect_loom_state(root: Path) -> str:
|
|
223
227
|
active_requirements = (
|
|
224
228
|
root / ".loom/bootstrap/init-result.json",
|
|
@@ -866,16 +870,17 @@ def detect_github_control_plane(root: Path) -> tuple[dict[str, Any], list[str]]:
|
|
|
866
870
|
missing_inputs.append("cannot resolve GitHub repository from git origin")
|
|
867
871
|
return surface, missing_inputs
|
|
868
872
|
|
|
869
|
-
repo_payload, repo_errors =
|
|
873
|
+
repo_payload, repo_errors = gh_rest_json(root, f"repos/{owner}/{repo}")
|
|
870
874
|
if repo_errors or repo_payload is None:
|
|
871
875
|
missing_inputs.extend(f"github control plane: {message}" for message in repo_errors)
|
|
872
876
|
return surface, missing_inputs
|
|
873
877
|
|
|
874
|
-
|
|
875
|
-
if isinstance(
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
878
|
+
full_name = repo_payload.get("full_name")
|
|
879
|
+
if isinstance(full_name, str) and full_name:
|
|
880
|
+
surface["repository"] = full_name
|
|
881
|
+
branch_name = repo_payload.get("default_branch")
|
|
882
|
+
if isinstance(branch_name, str) and branch_name:
|
|
883
|
+
surface["default_branch"] = branch_name
|
|
879
884
|
if surface["default_branch"] == "unknown":
|
|
880
885
|
missing_inputs.append("github control plane: default branch is unavailable")
|
|
881
886
|
return surface, missing_inputs
|
|
@@ -782,6 +782,63 @@ def gh_json(root: Path, args: list[str]) -> tuple[dict[str, Any] | None, list[st
|
|
|
782
782
|
return payload, []
|
|
783
783
|
|
|
784
784
|
|
|
785
|
+
def gh_rest_json(root: Path, path: str) -> tuple[dict[str, Any] | None, list[str]]:
|
|
786
|
+
return gh_json(root, ["api", path])
|
|
787
|
+
|
|
788
|
+
|
|
789
|
+
def github_issue_state(value: Any) -> str:
|
|
790
|
+
return str(value or "unknown").upper()
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
def github_pr_state(payload: dict[str, Any]) -> str:
|
|
794
|
+
if payload.get("merged_at"):
|
|
795
|
+
return "MERGED"
|
|
796
|
+
return str(payload.get("state") or "unknown").upper()
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
def normalize_rest_issue(payload: dict[str, Any]) -> dict[str, Any]:
|
|
800
|
+
return {
|
|
801
|
+
"id": payload.get("node_id"),
|
|
802
|
+
"databaseId": payload.get("id"),
|
|
803
|
+
"number": payload.get("number"),
|
|
804
|
+
"state": github_issue_state(payload.get("state")),
|
|
805
|
+
"title": payload.get("title"),
|
|
806
|
+
"url": payload.get("html_url"),
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
|
|
810
|
+
def normalize_rest_pr(payload: dict[str, Any]) -> dict[str, Any]:
|
|
811
|
+
head = payload.get("head") if isinstance(payload.get("head"), dict) else {}
|
|
812
|
+
base = payload.get("base") if isinstance(payload.get("base"), dict) else {}
|
|
813
|
+
merge_commit_sha = payload.get("merge_commit_sha")
|
|
814
|
+
return {
|
|
815
|
+
"number": payload.get("number"),
|
|
816
|
+
"state": github_pr_state(payload),
|
|
817
|
+
"title": payload.get("title"),
|
|
818
|
+
"url": payload.get("html_url"),
|
|
819
|
+
"isDraft": bool(payload.get("draft")),
|
|
820
|
+
"mergedAt": payload.get("merged_at"),
|
|
821
|
+
"mergeCommit": {"oid": merge_commit_sha} if isinstance(merge_commit_sha, str) and merge_commit_sha else None,
|
|
822
|
+
"mergeStateStatus": str(payload.get("mergeable_state")).upper() if payload.get("mergeable_state") else None,
|
|
823
|
+
"headRefName": head.get("ref"),
|
|
824
|
+
"baseRefName": base.get("ref"),
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
def github_issue_payload(root: Path, owner: str, repo_name: str, issue_number: int) -> tuple[dict[str, Any] | None, list[str]]:
|
|
829
|
+
payload, errors = gh_rest_json(root, f"repos/{owner}/{repo_name}/issues/{issue_number}")
|
|
830
|
+
if errors or payload is None:
|
|
831
|
+
return None, errors
|
|
832
|
+
return normalize_rest_issue(payload), []
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
def github_pr_payload(root: Path, owner: str, repo_name: str, pr_number: int) -> tuple[dict[str, Any] | None, list[str]]:
|
|
836
|
+
payload, errors = gh_rest_json(root, f"repos/{owner}/{repo_name}/pulls/{pr_number}")
|
|
837
|
+
if errors or payload is None:
|
|
838
|
+
return None, errors
|
|
839
|
+
return normalize_rest_pr(payload), []
|
|
840
|
+
|
|
841
|
+
|
|
785
842
|
def gh_json_list(root: Path, args: list[str], key: str) -> tuple[list[dict[str, Any]], list[str]]:
|
|
786
843
|
payload, errors = gh_json(root, args)
|
|
787
844
|
if errors or payload is None:
|
|
@@ -3515,6 +3572,7 @@ def find_project_item(items: list[dict[str, Any]], number: int, kind: str) -> di
|
|
|
3515
3572
|
|
|
3516
3573
|
|
|
3517
3574
|
def project_item_for_issue(root: Path, issue_id: str, project_number: int) -> tuple[dict[str, Any] | None, list[str]]:
|
|
3575
|
+
# GraphQL-only for now: GitHub ProjectV2 item field values are not covered by the REST budget-hardening pass.
|
|
3518
3576
|
query = """
|
|
3519
3577
|
query($id: ID!) {
|
|
3520
3578
|
node(id: $id) {
|
|
@@ -3606,6 +3664,7 @@ def set_project_item_done(root: Path, project_id: str, item_id: str, status_fiel
|
|
|
3606
3664
|
|
|
3607
3665
|
|
|
3608
3666
|
def issue_tree_payload(root: Path, owner: str, repo_name: str, issue_number: int) -> tuple[dict[str, Any] | None, list[str]]:
|
|
3667
|
+
# GraphQL-only for now: native parent/sub-issue tree shape is outside the high-frequency REST replacement scope.
|
|
3609
3668
|
query = """
|
|
3610
3669
|
query($owner:String!, $name:String!, $number:Int!) {
|
|
3611
3670
|
repository(owner:$owner, name:$name) {
|
|
@@ -3710,33 +3769,31 @@ def reconciliation_audit_payload(
|
|
|
3710
3769
|
issue_id: str | None = None
|
|
3711
3770
|
parent_payload: dict[str, Any] | None = None
|
|
3712
3771
|
if issue_number is not None:
|
|
3713
|
-
issue_payload, issue_errors =
|
|
3772
|
+
issue_payload, issue_errors = github_issue_payload(target_root, owner, repo_name, issue_number)
|
|
3714
3773
|
if issue_errors:
|
|
3715
3774
|
missing_inputs.extend(f"issue: {message}" for message in issue_errors)
|
|
3716
3775
|
elif issue_payload is not None:
|
|
3717
3776
|
raw_issue_id = issue_payload.get("id")
|
|
3718
3777
|
if isinstance(raw_issue_id, str) and raw_issue_id:
|
|
3719
3778
|
issue_id = raw_issue_id
|
|
3720
|
-
|
|
3721
|
-
if
|
|
3722
|
-
|
|
3779
|
+
issue_tree, issue_tree_errors = issue_tree_payload(target_root, owner, repo_name, issue_number)
|
|
3780
|
+
if issue_tree_errors:
|
|
3781
|
+
issue_payload["sub_issue_tree"] = {
|
|
3782
|
+
"status": "unavailable",
|
|
3783
|
+
"reason": "GraphQL-only parent/sub-issue tree could not be read.",
|
|
3784
|
+
"errors": issue_tree_errors,
|
|
3785
|
+
}
|
|
3786
|
+
elif issue_tree is not None:
|
|
3787
|
+
issue_payload = {**issue_payload, **issue_tree}
|
|
3788
|
+
parent = issue_payload.get("parent")
|
|
3789
|
+
if isinstance(parent, dict):
|
|
3790
|
+
parent_payload = parent
|
|
3723
3791
|
|
|
3724
3792
|
pr_payload: dict[str, Any] | None = None
|
|
3725
3793
|
merge_commit_sha: str | None = None
|
|
3726
3794
|
merge_commit_in_main = False
|
|
3727
3795
|
if pr_number is not None:
|
|
3728
|
-
pr_payload, pr_errors =
|
|
3729
|
-
target_root,
|
|
3730
|
-
[
|
|
3731
|
-
"pr",
|
|
3732
|
-
"view",
|
|
3733
|
-
str(pr_number),
|
|
3734
|
-
"--repo",
|
|
3735
|
-
f"{owner}/{repo_name}",
|
|
3736
|
-
"--json",
|
|
3737
|
-
"number,state,isDraft,mergedAt,mergeCommit,url,title",
|
|
3738
|
-
],
|
|
3739
|
-
)
|
|
3796
|
+
pr_payload, pr_errors = github_pr_payload(target_root, owner, repo_name, pr_number)
|
|
3740
3797
|
if pr_errors:
|
|
3741
3798
|
missing_inputs.extend(f"pr: {message}" for message in pr_errors)
|
|
3742
3799
|
elif pr_payload is not None:
|
|
@@ -4153,10 +4210,7 @@ def closeout_payload(
|
|
|
4153
4210
|
issue_payload: dict[str, Any] | None = None
|
|
4154
4211
|
issue_id: str | None = None
|
|
4155
4212
|
if issue_number is not None:
|
|
4156
|
-
issue_payload, issue_errors =
|
|
4157
|
-
target_root,
|
|
4158
|
-
["issue", "view", str(issue_number), "--repo", f"{owner}/{repo_name}", "--json", "id,number,state,title,url"],
|
|
4159
|
-
)
|
|
4213
|
+
issue_payload, issue_errors = github_issue_payload(target_root, owner, repo_name, issue_number)
|
|
4160
4214
|
if issue_errors:
|
|
4161
4215
|
missing_inputs.extend(f"issue: {message}" for message in issue_errors)
|
|
4162
4216
|
elif issue_payload is not None:
|
|
@@ -4167,18 +4221,7 @@ def closeout_payload(
|
|
|
4167
4221
|
pr_payload: dict[str, Any] | None = None
|
|
4168
4222
|
merge_commit_sha: str | None = None
|
|
4169
4223
|
if pr_number is not None:
|
|
4170
|
-
pr_payload, pr_errors =
|
|
4171
|
-
target_root,
|
|
4172
|
-
[
|
|
4173
|
-
"pr",
|
|
4174
|
-
"view",
|
|
4175
|
-
str(pr_number),
|
|
4176
|
-
"--repo",
|
|
4177
|
-
f"{owner}/{repo_name}",
|
|
4178
|
-
"--json",
|
|
4179
|
-
"number,state,isDraft,mergedAt,mergeCommit,url",
|
|
4180
|
-
],
|
|
4181
|
-
)
|
|
4224
|
+
pr_payload, pr_errors = github_pr_payload(target_root, owner, repo_name, pr_number)
|
|
4182
4225
|
if pr_errors:
|
|
4183
4226
|
missing_inputs.extend(f"pr: {message}" for message in pr_errors)
|
|
4184
4227
|
elif pr_payload is not None:
|
|
@@ -12,7 +12,8 @@ from loom_flow import (
|
|
|
12
12
|
closeout_payload,
|
|
13
13
|
detect_github_repo,
|
|
14
14
|
emit,
|
|
15
|
-
|
|
15
|
+
github_issue_payload,
|
|
16
|
+
github_pr_payload,
|
|
16
17
|
implementation_review_status_payload,
|
|
17
18
|
load_context,
|
|
18
19
|
runtime_state_payload,
|
|
@@ -59,29 +60,14 @@ def github_status_payload(
|
|
|
59
60
|
errors.append("GitHub repository could not be detected from origin")
|
|
60
61
|
return payload, errors
|
|
61
62
|
|
|
62
|
-
repo_slug = f"{owner}/{repo_name}"
|
|
63
63
|
if issue_number is not None:
|
|
64
|
-
issue_payload, issue_errors =
|
|
65
|
-
root,
|
|
66
|
-
["issue", "view", str(issue_number), "--repo", repo_slug, "--json", "number,state,title,url"],
|
|
67
|
-
)
|
|
64
|
+
issue_payload, issue_errors = github_issue_payload(root, owner, repo_name, issue_number)
|
|
68
65
|
if issue_errors:
|
|
69
66
|
errors.extend([f"issue #{issue_number}: {message}" for message in issue_errors])
|
|
70
67
|
else:
|
|
71
68
|
payload["issue"] = issue_payload
|
|
72
69
|
if pr_number is not None:
|
|
73
|
-
pr_payload, pr_errors =
|
|
74
|
-
root,
|
|
75
|
-
[
|
|
76
|
-
"pr",
|
|
77
|
-
"view",
|
|
78
|
-
str(pr_number),
|
|
79
|
-
"--repo",
|
|
80
|
-
repo_slug,
|
|
81
|
-
"--json",
|
|
82
|
-
"number,state,title,url,isDraft,mergeStateStatus,headRefName,baseRefName",
|
|
83
|
-
],
|
|
84
|
-
)
|
|
70
|
+
pr_payload, pr_errors = github_pr_payload(root, owner, repo_name, pr_number)
|
|
85
71
|
if pr_errors:
|
|
86
72
|
errors.extend([f"pr #{pr_number}: {message}" for message in pr_errors])
|
|
87
73
|
else:
|
|
@@ -219,6 +219,10 @@ def gh_json(root: Path, args: list[str]) -> tuple[dict[str, Any] | None, list[st
|
|
|
219
219
|
return payload, []
|
|
220
220
|
|
|
221
221
|
|
|
222
|
+
def gh_rest_json(root: Path, path: str) -> tuple[dict[str, Any] | None, list[str]]:
|
|
223
|
+
return gh_json(root, ["api", path])
|
|
224
|
+
|
|
225
|
+
|
|
222
226
|
def detect_loom_state(root: Path) -> str:
|
|
223
227
|
active_requirements = (
|
|
224
228
|
root / ".loom/bootstrap/init-result.json",
|
|
@@ -866,16 +870,17 @@ def detect_github_control_plane(root: Path) -> tuple[dict[str, Any], list[str]]:
|
|
|
866
870
|
missing_inputs.append("cannot resolve GitHub repository from git origin")
|
|
867
871
|
return surface, missing_inputs
|
|
868
872
|
|
|
869
|
-
repo_payload, repo_errors =
|
|
873
|
+
repo_payload, repo_errors = gh_rest_json(root, f"repos/{owner}/{repo}")
|
|
870
874
|
if repo_errors or repo_payload is None:
|
|
871
875
|
missing_inputs.extend(f"github control plane: {message}" for message in repo_errors)
|
|
872
876
|
return surface, missing_inputs
|
|
873
877
|
|
|
874
|
-
|
|
875
|
-
if isinstance(
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
878
|
+
full_name = repo_payload.get("full_name")
|
|
879
|
+
if isinstance(full_name, str) and full_name:
|
|
880
|
+
surface["repository"] = full_name
|
|
881
|
+
branch_name = repo_payload.get("default_branch")
|
|
882
|
+
if isinstance(branch_name, str) and branch_name:
|
|
883
|
+
surface["default_branch"] = branch_name
|
|
879
884
|
if surface["default_branch"] == "unknown":
|
|
880
885
|
missing_inputs.append("github control plane: default branch is unavailable")
|
|
881
886
|
return surface, missing_inputs
|