@mc-and-his-agents/loom-installer 0.1.22 → 0.1.23

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 (42) hide show
  1. package/package.json +1 -1
  2. package/payload/manifest.json +82 -82
  3. package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +57 -14
  4. package/payload/plugin/loom/skills/shared/scripts/loom_check.py +66 -0
  5. package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +9 -6
  6. package/payload/plugin/loom/skills/shared/scripts/loom_init.py +9 -10
  7. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  8. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +66 -0
  9. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  10. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py +9 -10
  11. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  12. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +66 -0
  13. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  14. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py +9 -10
  15. package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  16. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +66 -0
  17. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  18. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_init.py +9 -10
  19. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  20. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +66 -0
  21. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  22. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py +9 -10
  23. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  24. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +66 -0
  25. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  26. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py +9 -10
  27. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  28. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +66 -0
  29. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  30. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py +9 -10
  31. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  32. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +66 -0
  33. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  34. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py +9 -10
  35. package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  36. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +66 -0
  37. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  38. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_init.py +9 -10
  39. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +57 -14
  40. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +66 -0
  41. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +9 -6
  42. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py +9 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mc-and-his-agents/loom-installer",
3
- "version": "0.1.22",
3
+ "version": "0.1.23",
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": "c47ffde0d9c0adf3c91e9171f6c0ce3c2a8ef2bc",
5
+ "source_commit": "9ba44dcc76daf7e100edafd5943b99c4a69ba710",
6
6
  "source_ref": "main",
7
- "built_at": "2026-04-26T22:56:41+08:00",
7
+ "built_at": "2026-04-26T23:19:03+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/governance_surface.py",
626
- "bytes": 51952,
627
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
626
+ "bytes": 53833,
627
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
628
628
  },
629
629
  {
630
630
  "path": "plugin/loom/skills/shared/scripts/loom_check.py",
631
- "bytes": 275385,
632
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
631
+ "bytes": 278763,
632
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
633
633
  },
634
634
  {
635
635
  "path": "plugin/loom/skills/shared/scripts/loom_flow.py",
636
- "bytes": 290536,
637
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
636
+ "bytes": 290661,
637
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
638
638
  },
639
639
  {
640
640
  "path": "plugin/loom/skills/shared/scripts/loom_init.py",
641
- "bytes": 85228,
642
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
641
+ "bytes": 85225,
642
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
643
643
  },
644
644
  {
645
645
  "path": "plugin/loom/skills/shared/scripts/loom_status.py",
@@ -1208,23 +1208,23 @@
1208
1208
  },
1209
1209
  {
1210
1210
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py",
1211
- "bytes": 51952,
1212
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
1211
+ "bytes": 53833,
1212
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
1213
1213
  },
1214
1214
  {
1215
1215
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
1216
- "bytes": 275385,
1217
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
1216
+ "bytes": 278763,
1217
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
1218
1218
  },
1219
1219
  {
1220
1220
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
1221
- "bytes": 290536,
1222
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
1221
+ "bytes": 290661,
1222
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
1223
1223
  },
1224
1224
  {
1225
1225
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py",
1226
- "bytes": 85228,
1227
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
1226
+ "bytes": 85225,
1227
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
1228
1228
  },
1229
1229
  {
1230
1230
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_status.py",
@@ -1823,23 +1823,23 @@
1823
1823
  },
1824
1824
  {
1825
1825
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py",
1826
- "bytes": 51952,
1827
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
1826
+ "bytes": 53833,
1827
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
1828
1828
  },
1829
1829
  {
1830
1830
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
1831
- "bytes": 275385,
1832
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
1831
+ "bytes": 278763,
1832
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
1833
1833
  },
1834
1834
  {
1835
1835
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
1836
- "bytes": 290536,
1837
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
1836
+ "bytes": 290661,
1837
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
1838
1838
  },
1839
1839
  {
1840
1840
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py",
1841
- "bytes": 85228,
1842
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
1841
+ "bytes": 85225,
1842
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
1843
1843
  },
1844
1844
  {
1845
1845
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_status.py",
@@ -2438,23 +2438,23 @@
2438
2438
  },
2439
2439
  {
2440
2440
  "path": "skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py",
2441
- "bytes": 51952,
2442
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
2441
+ "bytes": 53833,
2442
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
2443
2443
  },
2444
2444
  {
2445
2445
  "path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
2446
- "bytes": 275385,
2447
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
2446
+ "bytes": 278763,
2447
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
2448
2448
  },
2449
2449
  {
2450
2450
  "path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
2451
- "bytes": 290536,
2452
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
2451
+ "bytes": 290661,
2452
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
2453
2453
  },
2454
2454
  {
2455
2455
  "path": "skills/loom-init/.loom-runtime/shared/scripts/loom_init.py",
2456
- "bytes": 85228,
2457
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
2456
+ "bytes": 85225,
2457
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
2458
2458
  },
2459
2459
  {
2460
2460
  "path": "skills/loom-init/.loom-runtime/shared/scripts/loom_status.py",
@@ -3058,23 +3058,23 @@
3058
3058
  },
3059
3059
  {
3060
3060
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py",
3061
- "bytes": 51952,
3062
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
3061
+ "bytes": 53833,
3062
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
3063
3063
  },
3064
3064
  {
3065
3065
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
3066
- "bytes": 275385,
3067
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
3066
+ "bytes": 278763,
3067
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
3068
3068
  },
3069
3069
  {
3070
3070
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
3071
- "bytes": 290536,
3072
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
3071
+ "bytes": 290661,
3072
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
3073
3073
  },
3074
3074
  {
3075
3075
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py",
3076
- "bytes": 85228,
3077
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
3076
+ "bytes": 85225,
3077
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
3078
3078
  },
3079
3079
  {
3080
3080
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_status.py",
@@ -3673,23 +3673,23 @@
3673
3673
  },
3674
3674
  {
3675
3675
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py",
3676
- "bytes": 51952,
3677
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
3676
+ "bytes": 53833,
3677
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
3678
3678
  },
3679
3679
  {
3680
3680
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
3681
- "bytes": 275385,
3682
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
3681
+ "bytes": 278763,
3682
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
3683
3683
  },
3684
3684
  {
3685
3685
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
3686
- "bytes": 290536,
3687
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
3686
+ "bytes": 290661,
3687
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
3688
3688
  },
3689
3689
  {
3690
3690
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py",
3691
- "bytes": 85228,
3692
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
3691
+ "bytes": 85225,
3692
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
3693
3693
  },
3694
3694
  {
3695
3695
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_status.py",
@@ -4288,23 +4288,23 @@
4288
4288
  },
4289
4289
  {
4290
4290
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py",
4291
- "bytes": 51952,
4292
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
4291
+ "bytes": 53833,
4292
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
4293
4293
  },
4294
4294
  {
4295
4295
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
4296
- "bytes": 275385,
4297
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
4296
+ "bytes": 278763,
4297
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
4298
4298
  },
4299
4299
  {
4300
4300
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
4301
- "bytes": 290536,
4302
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
4301
+ "bytes": 290661,
4302
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
4303
4303
  },
4304
4304
  {
4305
4305
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py",
4306
- "bytes": 85228,
4307
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
4306
+ "bytes": 85225,
4307
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
4308
4308
  },
4309
4309
  {
4310
4310
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_status.py",
@@ -4903,23 +4903,23 @@
4903
4903
  },
4904
4904
  {
4905
4905
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py",
4906
- "bytes": 51952,
4907
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
4906
+ "bytes": 53833,
4907
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
4908
4908
  },
4909
4909
  {
4910
4910
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
4911
- "bytes": 275385,
4912
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
4911
+ "bytes": 278763,
4912
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
4913
4913
  },
4914
4914
  {
4915
4915
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
4916
- "bytes": 290536,
4917
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
4916
+ "bytes": 290661,
4917
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
4918
4918
  },
4919
4919
  {
4920
4920
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py",
4921
- "bytes": 85228,
4922
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
4921
+ "bytes": 85225,
4922
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
4923
4923
  },
4924
4924
  {
4925
4925
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_status.py",
@@ -5518,23 +5518,23 @@
5518
5518
  },
5519
5519
  {
5520
5520
  "path": "skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py",
5521
- "bytes": 51952,
5522
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
5521
+ "bytes": 53833,
5522
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
5523
5523
  },
5524
5524
  {
5525
5525
  "path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
5526
- "bytes": 275385,
5527
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
5526
+ "bytes": 278763,
5527
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
5528
5528
  },
5529
5529
  {
5530
5530
  "path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
5531
- "bytes": 290536,
5532
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
5531
+ "bytes": 290661,
5532
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
5533
5533
  },
5534
5534
  {
5535
5535
  "path": "skills/loom-review/.loom-runtime/shared/scripts/loom_init.py",
5536
- "bytes": 85228,
5537
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
5536
+ "bytes": 85225,
5537
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
5538
5538
  },
5539
5539
  {
5540
5540
  "path": "skills/loom-review/.loom-runtime/shared/scripts/loom_status.py",
@@ -6133,23 +6133,23 @@
6133
6133
  },
6134
6134
  {
6135
6135
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py",
6136
- "bytes": 51952,
6137
- "sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
6136
+ "bytes": 53833,
6137
+ "sha256": "d12f21d009a5127a4b0aba70bc23e111a51a490017879ee59d51c22db65b5f0a"
6138
6138
  },
6139
6139
  {
6140
6140
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
6141
- "bytes": 275385,
6142
- "sha256": "6cf4df1afa7dd6772a18f45fdc10c14917ad457dc3fd2f5a48980081d4883daa"
6141
+ "bytes": 278763,
6142
+ "sha256": "3b2257fddc37fdb514953500a38e94ca241a5889a5c6343b975db5a1109bbff4"
6143
6143
  },
6144
6144
  {
6145
6145
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
6146
- "bytes": 290536,
6147
- "sha256": "69c44efb623eb26aadda9141ecb73eea036444c1023b833da7f9cbb709f68428"
6146
+ "bytes": 290661,
6147
+ "sha256": "18c5dc39a4cd2982a40c729807b12c2b15efd41a2962719b5491b06dad83c028"
6148
6148
  },
6149
6149
  {
6150
6150
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py",
6151
- "bytes": 85228,
6152
- "sha256": "f7748a8971611a3c23e5e0bcbb3d49cf0854db12469961c074756f9887bd25a8"
6151
+ "bytes": 85225,
6152
+ "sha256": "fc819d8172a1525c4fb86cbee680110c655101b6d6db7471a4d6c50d5c0bc1fc"
6153
6153
  },
6154
6154
  {
6155
6155
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_status.py",
@@ -893,18 +893,60 @@ def first_match(directory: Path, suffix: str, root: Path) -> str:
893
893
  return ""
894
894
 
895
895
 
896
+ def existing_locator(root: Path, relative: str | None) -> str:
897
+ if not relative:
898
+ return ""
899
+ return relative if (root / relative).exists() else ""
900
+
901
+
902
+ def active_or_first(root: Path, relative: str | None, directory: Path, suffix: str) -> str:
903
+ return existing_locator(root, relative) or (first_match(directory, suffix, root) if directory.exists() else "")
904
+
905
+
906
+ def current_review_locator(root: Path, review_dir: Path, item_id: str) -> str:
907
+ review_path = review_dir / f"{item_id}.json"
908
+ if review_path.exists():
909
+ return relative_locator(review_path, root)
910
+ return first_match(review_dir, ".json", root) if review_dir.exists() else ""
911
+
912
+
913
+ def active_entry_points(root: Path) -> dict[str, str]:
914
+ init_result = root / ".loom/bootstrap/init-result.json"
915
+ try:
916
+ payload = json.loads(init_result.read_text(encoding="utf-8"))
917
+ except (OSError, json.JSONDecodeError):
918
+ return {}
919
+ if not isinstance(payload, dict):
920
+ return {}
921
+ fact_chain = payload.get("fact_chain")
922
+ if not isinstance(fact_chain, dict):
923
+ return {}
924
+ entry_points = fact_chain.get("entry_points")
925
+ if not isinstance(entry_points, dict):
926
+ return {}
927
+ active: dict[str, str] = {}
928
+ for key in ("current_item_id", "work_item", "recovery_entry", "status_surface"):
929
+ value = entry_points.get(key)
930
+ if isinstance(value, str) and value.strip():
931
+ active[key] = value.strip()
932
+ return active
933
+
934
+
896
935
  def detect_carrier_summary(root: Path, *, repository_mode: str, planning_mode: bool) -> dict[str, dict[str, str]]:
936
+ active = active_entry_points(root)
937
+ active_item_id = active.get("current_item_id") or "INIT-0001"
897
938
  item_dir = root / ".loom/work-items"
898
939
  recovery_dir = root / ".loom/progress"
899
940
  review_dir = root / ".loom/reviews"
900
- status_path = root / ".loom/status/current.md"
901
- spec_path = root / ".loom/specs/INIT-0001/spec.md"
902
- plan_path = root / ".loom/specs/INIT-0001/plan.md"
941
+ status_locator = active.get("status_surface") or ".loom/status/current.md"
942
+ status_path = root / status_locator
943
+ spec_path = root / f".loom/specs/{active_item_id}/spec.md"
944
+ plan_path = root / f".loom/specs/{active_item_id}/plan.md"
903
945
 
904
946
  present_locators = {
905
- "work_item": first_match(item_dir, ".md", root) if item_dir.exists() else "",
906
- "recovery": first_match(recovery_dir, ".md", root) if recovery_dir.exists() else "",
907
- "review": first_match(review_dir, ".json", root) if review_dir.exists() else "",
947
+ "work_item": active_or_first(root, active.get("work_item"), item_dir, ".md"),
948
+ "recovery": active_or_first(root, active.get("recovery_entry"), recovery_dir, ".md"),
949
+ "review": current_review_locator(root, review_dir, active_item_id),
908
950
  "status_surface": relative_locator(status_path, root) if status_path.exists() else "",
909
951
  "spec_path": relative_locator(spec_path, root) if spec_path.exists() else "",
910
952
  "plan_path": relative_locator(plan_path, root) if plan_path.exists() else "",
@@ -922,11 +964,11 @@ def detect_carrier_summary(root: Path, *, repository_mode: str, planning_mode: b
922
964
  return summary
923
965
 
924
966
 
925
- def detect_execution_entry(root: Path, loom_state: str, *, bootstrap_mode: bool) -> str:
967
+ def detect_execution_entry(root: Path, loom_state: str, *, bootstrap_mode: bool, active_item_id: str = "INIT-0001") -> str:
926
968
  if bootstrap_mode:
927
- return "python3 .loom/bin/loom_flow.py flow resume --target . --item INIT-0001"
969
+ return f"python3 .loom/bin/loom_flow.py flow resume --target . --item {active_item_id}"
928
970
  if loom_state == "active":
929
- return f"{command_prefix(root, 'loom_flow.py')} flow resume --target . --item INIT-0001"
971
+ return f"{command_prefix(root, 'loom_flow.py')} flow resume --target . --item {active_item_id}"
930
972
  if loom_state == "partial":
931
973
  return f"{command_prefix(root, 'loom_init.py')} route --target <repo> --task \"请接手当前事项并恢复上下文后继续推进\""
932
974
  return "unknown"
@@ -942,16 +984,16 @@ def detect_validation_entry(loom_state: str, *, bootstrap_mode: bool) -> str:
942
984
  return "unknown"
943
985
 
944
986
 
945
- def detect_review_merge_surface(root: Path, loom_state: str, *, bootstrap_mode: bool) -> dict[str, str]:
987
+ def detect_review_merge_surface(root: Path, loom_state: str, *, bootstrap_mode: bool, active_item_id: str = "INIT-0001") -> dict[str, str]:
946
988
  pr_template = ".github/PULL_REQUEST_TEMPLATE.md" if file_exists(root, ".github/PULL_REQUEST_TEMPLATE.md") else "unknown"
947
989
  validation_surface = ".loom/status/current.md" if file_exists(root, ".loom/status/current.md") else "unknown"
948
990
  if bootstrap_mode and validation_surface == "unknown":
949
991
  validation_surface = ".loom/status/current.md"
950
992
 
951
993
  if bootstrap_mode:
952
- merge_surface = "python3 .loom/bin/loom_flow.py checkpoint merge --target . --item INIT-0001"
994
+ merge_surface = f"python3 .loom/bin/loom_flow.py checkpoint merge --target . --item {active_item_id}"
953
995
  elif loom_state == "active":
954
- merge_surface = f"{command_prefix(root, 'loom_flow.py')} checkpoint merge --target . [--item <id>]"
996
+ merge_surface = f"{command_prefix(root, 'loom_flow.py')} checkpoint merge --target . --item {active_item_id}"
955
997
  else:
956
998
  merge_surface = "unknown"
957
999
  return {
@@ -1207,11 +1249,12 @@ def build_governance_surface(
1207
1249
  loom_state = detect_loom_state(root)
1208
1250
  repository_mode = detect_repository_mode(root, loom_state, scenario_override=scenario_override)
1209
1251
  planning_mode = bootstrap_mode and repository_mode == "new" and loom_state != "active"
1252
+ active_item_id = active_entry_points(root).get("current_item_id", "INIT-0001")
1210
1253
  carrier_summary = detect_carrier_summary(root, repository_mode=repository_mode, planning_mode=planning_mode)
1211
1254
  github_control_plane, github_missing = detect_github_control_plane(root)
1212
- execution_entry = detect_execution_entry(root, loom_state, bootstrap_mode=bootstrap_mode)
1255
+ execution_entry = detect_execution_entry(root, loom_state, bootstrap_mode=bootstrap_mode, active_item_id=active_item_id)
1213
1256
  validation_entry = detect_validation_entry(loom_state, bootstrap_mode=bootstrap_mode)
1214
- review_merge_surface = detect_review_merge_surface(root, loom_state, bootstrap_mode=bootstrap_mode)
1257
+ review_merge_surface = detect_review_merge_surface(root, loom_state, bootstrap_mode=bootstrap_mode, active_item_id=active_item_id)
1215
1258
  repo_interface, repo_interface_missing = detect_repo_interface(root)
1216
1259
  repo_interop, repo_interop_missing = detect_repo_interop(root)
1217
1260
  host_binding = detect_host_binding_surface(
@@ -3468,6 +3468,72 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
3468
3468
  elif payload.get("result") != "pass":
3469
3469
  failures.append(Failure("daily-execution-cli", "`work-item update` must pass on a clean temp copy"))
3470
3470
 
3471
+ payload, error = load_command_json(
3472
+ root,
3473
+ [
3474
+ "python3",
3475
+ "tools/loom_init.py",
3476
+ "verify",
3477
+ "--target",
3478
+ str(authoring_target),
3479
+ ],
3480
+ )
3481
+ if error:
3482
+ failures.append(Failure("daily-execution-cli", f"`loom-init verify` active item rollover failed: {error}"))
3483
+ elif payload.get("ok") is not True:
3484
+ failures.append(Failure("daily-execution-cli", "`loom-init verify` must pass after active item rollover"))
3485
+
3486
+ payload, error = load_command_json(
3487
+ root,
3488
+ [
3489
+ "python3",
3490
+ "tools/loom_status.py",
3491
+ "--target",
3492
+ str(authoring_target),
3493
+ "--item",
3494
+ "NEXT-0001",
3495
+ ],
3496
+ )
3497
+ if error:
3498
+ failures.append(Failure("daily-execution-cli", f"`loom-status` active item rollover failed: {error}"))
3499
+ else:
3500
+ current_item = payload.get("item", {}).get("id") if isinstance(payload.get("item"), dict) else None
3501
+ if current_item != "NEXT-0001":
3502
+ failures.append(Failure("daily-execution-cli", "`loom-status` must report the rolled-over active item"))
3503
+ governance_surface = payload.get("governance_surface")
3504
+ if isinstance(governance_surface, dict):
3505
+ carrier_summary = governance_surface.get("carrier_summary")
3506
+ if isinstance(carrier_summary, dict):
3507
+ work_item = carrier_summary.get("work_item")
3508
+ recovery = carrier_summary.get("recovery")
3509
+ if isinstance(work_item, dict) and work_item.get("locator") != ".loom/work-items/NEXT-0001.md":
3510
+ failures.append(Failure("daily-execution-cli", "`loom-status` carrier summary must point to the active Work Item"))
3511
+ if isinstance(recovery, dict) and recovery.get("locator") != ".loom/progress/NEXT-0001.md":
3512
+ failures.append(Failure("daily-execution-cli", "`loom-status` carrier summary must point to the active recovery entry"))
3513
+ execution_entry = str(governance_surface.get("execution_entry", ""))
3514
+ if "--item NEXT-0001" not in execution_entry:
3515
+ failures.append(Failure("daily-execution-cli", "`loom-status` execution entry must resume the active Work Item"))
3516
+
3517
+ payload, error = load_command_json(
3518
+ root,
3519
+ [
3520
+ "python3",
3521
+ "tools/loom_flow.py",
3522
+ "flow",
3523
+ "spec-review",
3524
+ "--target",
3525
+ str(authoring_target),
3526
+ "--item",
3527
+ "NEXT-0001",
3528
+ ],
3529
+ )
3530
+ if error:
3531
+ failures.append(Failure("daily-execution-cli", f"`flow spec-review` active item rollover failed: {error}"))
3532
+ elif payload.get("result") not in {"block", "fallback"}:
3533
+ failures.append(Failure("daily-execution-cli", "`flow spec-review` must not pass when the active item has no spec suite"))
3534
+ elif ".loom/specs/INIT-0001/spec.md" in json.dumps(payload, ensure_ascii=False):
3535
+ failures.append(Failure("daily-execution-cli", "`flow spec-review` must not fall back to the bootstrap spec suite for a rolled-over active item"))
3536
+
3471
3537
  findings_path = authoring_target / ".loom" / "review-findings.json"
3472
3538
  findings_path.parent.mkdir(parents=True, exist_ok=True)
3473
3539
  findings_path.write_text(
@@ -1169,7 +1169,7 @@ def formal_spec_path(context: dict[str, Any]) -> str | None:
1169
1169
  return artifact
1170
1170
 
1171
1171
  fallback = context["target_root"] / ".loom/specs/INIT-0001/spec.md"
1172
- if fallback.exists():
1172
+ if context["item_id"] == "INIT-0001" and fallback.exists():
1173
1173
  return ".loom/specs/INIT-0001/spec.md"
1174
1174
  return None
1175
1175
 
@@ -1182,12 +1182,15 @@ def spec_suite_paths(context: dict[str, Any]) -> dict[str, str]:
1182
1182
  "plan": f".loom/specs/{item_id}/plan.md",
1183
1183
  "implementation_contract": f".loom/specs/{item_id}/implementation-contract.md",
1184
1184
  },
1185
- {
1186
- "spec": ".loom/specs/INIT-0001/spec.md",
1187
- "plan": ".loom/specs/INIT-0001/plan.md",
1188
- "implementation_contract": ".loom/specs/INIT-0001/implementation-contract.md",
1189
- },
1190
1185
  ]
1186
+ if item_id == "INIT-0001":
1187
+ candidates.append(
1188
+ {
1189
+ "spec": ".loom/specs/INIT-0001/spec.md",
1190
+ "plan": ".loom/specs/INIT-0001/plan.md",
1191
+ "implementation_contract": ".loom/specs/INIT-0001/implementation-contract.md",
1192
+ }
1193
+ )
1191
1194
  for suite in candidates:
1192
1195
  if (context["target_root"] / suite["spec"]).exists():
1193
1196
  return suite
@@ -1627,24 +1627,23 @@ def verify_target(target_root: Path, output_path: Path) -> list[str]:
1627
1627
  ):
1628
1628
  if field not in runtime_evidence_report:
1629
1629
  errors.append(f"fact-chain: runtime_evidence is missing `{field}`")
1630
- matching_work_item = None
1631
- for work_item in validated_work_items:
1632
- if work_item.get("id") == current_item_id:
1633
- matching_work_item = work_item
1634
- break
1635
- if matching_work_item is None:
1636
- errors.append(f"init-result is missing the current work item `{current_item_id}`")
1637
- else:
1630
+ bootstrap_work_item = next(
1631
+ (work_item for work_item in validated_work_items if work_item.get("id") == WORK_ITEM_ID),
1632
+ None,
1633
+ )
1634
+ if bootstrap_work_item is None:
1635
+ errors.append(f"init-result is missing the bootstrap work item `{WORK_ITEM_ID}`")
1636
+ elif current_item_id == WORK_ITEM_ID:
1638
1637
  expected_init_fields = {
1639
1638
  "recovery_entry": fact_chain_report["fact_chain"]["entry_points"]["recovery_entry"],
1640
1639
  "validation_entry": fact_chain_report["facts"]["validation_entry"]["value"],
1641
1640
  "workspace_entry": fact_chain_report["facts"]["workspace_entry"]["value"],
1642
1641
  }
1643
1642
  for field, expected_value in expected_init_fields.items():
1644
- actual_value = matching_work_item.get(field)
1643
+ actual_value = bootstrap_work_item.get(field)
1645
1644
  if actual_value != expected_value:
1646
1645
  errors.append(
1647
- f"init-result work item `{current_item_id}` has inconsistent `{field}`: "
1646
+ f"init-result bootstrap work item `{WORK_ITEM_ID}` has inconsistent `{field}`: "
1648
1647
  f"expected `{expected_value}`, got `{actual_value}`"
1649
1648
  )
1650
1649