agents-inc 0.159.0 → 0.160.0

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 (116) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/{chunk-2Q65K6E3.js → chunk-5K33RJ7Z.js} +10 -10
  3. package/dist/{chunk-BQJVHD6Y.js → chunk-6CP3CLDE.js} +3 -8
  4. package/dist/chunk-6CP3CLDE.js.map +1 -0
  5. package/dist/{chunk-4VMLCWLD.js → chunk-7JQPIMKD.js} +2 -2
  6. package/dist/{chunk-5YOSLSQJ.js → chunk-C5P7RUDR.js} +3 -3
  7. package/dist/{chunk-G7TYOPON.js → chunk-CICB4AKA.js} +3 -3
  8. package/dist/{chunk-FBRLHNUT.js → chunk-CWQLRKWB.js} +3 -3
  9. package/dist/{chunk-JV4P7BL4.js → chunk-DEWI5HDF.js} +3 -3
  10. package/dist/{chunk-Z6G24ROK.js → chunk-EPBUWEW4.js} +4 -4
  11. package/dist/{chunk-IO2DPRDS.js → chunk-GWPKIXBM.js} +2 -2
  12. package/dist/{chunk-BNHD2GIB.js → chunk-IJ7GWQUR.js} +4 -4
  13. package/dist/{chunk-4RYWFQK7.js → chunk-IWUFZ6NR.js} +2 -2
  14. package/dist/{chunk-F35G42TF.js → chunk-J7Q5VYR7.js} +11 -11
  15. package/dist/{chunk-MPLWPWL4.js → chunk-JQDN7KAZ.js} +2 -2
  16. package/dist/{chunk-LSSGS2QS.js → chunk-K6MQV6SK.js} +3 -3
  17. package/dist/{chunk-YVQSDBTK.js → chunk-KCN5N3PB.js} +4 -4
  18. package/dist/{chunk-WVKGO3Y5.js → chunk-LJ6V54NR.js} +3 -3
  19. package/dist/{chunk-VCUXNKOY.js → chunk-LX7UXZBN.js} +5 -5
  20. package/dist/{chunk-VZRO7RYT.js → chunk-OI2H6M5I.js} +1 -103
  21. package/dist/chunk-OI2H6M5I.js.map +1 -0
  22. package/dist/{chunk-Z6KROWH4.js → chunk-OJR3ASZI.js} +5 -5
  23. package/dist/{chunk-V625APR6.js → chunk-OUG6TCQ4.js} +205 -335
  24. package/dist/chunk-OUG6TCQ4.js.map +1 -0
  25. package/dist/{chunk-62XKTOUI.js → chunk-PIUCYRLP.js} +5 -15
  26. package/dist/chunk-PIUCYRLP.js.map +1 -0
  27. package/dist/{chunk-WVBJRFFM.js → chunk-PWPKZNCV.js} +3 -3
  28. package/dist/{chunk-SKDTGHCD.js → chunk-Q2HB5SWU.js} +2 -2
  29. package/dist/{chunk-YAHTF4NO.js → chunk-RJ3JYZJ7.js} +8 -8
  30. package/dist/chunk-RJ3JYZJ7.js.map +1 -0
  31. package/dist/{chunk-LVA6XJGR.js → chunk-SLB2SFTX.js} +3 -27
  32. package/dist/chunk-SLB2SFTX.js.map +1 -0
  33. package/dist/{chunk-NS5COBTT.js → chunk-VH6P7UGF.js} +3 -3
  34. package/dist/{chunk-42PQKBVU.js → chunk-VI4X5DN5.js} +4 -4
  35. package/dist/{chunk-THLQS2AW.js → chunk-XDNGMXOZ.js} +4 -4
  36. package/dist/{chunk-GPZQCLZJ.js → chunk-XSULY25W.js} +5 -5
  37. package/dist/{chunk-7Z4N4JWQ.js → chunk-XX657S4U.js} +1 -103
  38. package/dist/chunk-XX657S4U.js.map +1 -0
  39. package/dist/commands/build/marketplace.js +6 -6
  40. package/dist/commands/build/plugins.js +6 -6
  41. package/dist/commands/compile.js +9 -9
  42. package/dist/commands/doctor.js +9 -9
  43. package/dist/commands/edit.js +28 -28
  44. package/dist/commands/eject.js +9 -9
  45. package/dist/commands/init.js +28 -28
  46. package/dist/commands/list.js +7 -7
  47. package/dist/commands/new/marketplace.js +6 -7
  48. package/dist/commands/new/marketplace.js.map +1 -1
  49. package/dist/commands/search.js +9 -9
  50. package/dist/commands/share.js +7 -7
  51. package/dist/commands/uninstall.js +9 -9
  52. package/dist/commands/update.js +5 -5
  53. package/dist/components/wizard/category-grid.js +2 -2
  54. package/dist/components/wizard/domain-selection.js +6 -6
  55. package/dist/components/wizard/run-wizard-session.js +19 -19
  56. package/dist/components/wizard/skill-agent-summary.js +5 -5
  57. package/dist/components/wizard/source-grid.js +2 -2
  58. package/dist/components/wizard/stack-selection.js +5 -5
  59. package/dist/components/wizard/step-agents.js +6 -6
  60. package/dist/components/wizard/step-build.js +6 -6
  61. package/dist/components/wizard/step-confirm.js +8 -8
  62. package/dist/components/wizard/step-sources.js +6 -6
  63. package/dist/components/wizard/step-stack.js +6 -6
  64. package/dist/components/wizard/summary-panel.js +7 -7
  65. package/dist/components/wizard/wizard-layout.js +8 -8
  66. package/dist/components/wizard/wizard.js +18 -18
  67. package/dist/config-exports.js +1 -1
  68. package/dist/hooks/init.js +28 -28
  69. package/dist/load-agent-defs-KWHG7P7G.js +13 -0
  70. package/dist/recompile-project-agents-5FTDDHX7.js +17 -0
  71. package/dist/{source-loader-CC6ZWKTI.js → source-loader-CDYH2NIM.js} +4 -4
  72. package/dist/src/agents/_templates/methodologies/anti-over-engineering.liquid +14 -0
  73. package/dist/src/agents/_templates/methodologies/context-management.liquid +7 -154
  74. package/dist/src/agents/_templates/methodologies/investigation-requirements.liquid +12 -0
  75. package/dist/src/agents/_templates/methodologies/success-criteria.liquid +10 -0
  76. package/dist/stores/wizard-store.js +4 -4
  77. package/package.json +1 -1
  78. package/src/agents/_templates/methodologies/anti-over-engineering.liquid +14 -0
  79. package/src/agents/_templates/methodologies/context-management.liquid +7 -154
  80. package/src/agents/_templates/methodologies/investigation-requirements.liquid +12 -0
  81. package/src/agents/_templates/methodologies/success-criteria.liquid +10 -0
  82. package/dist/chunk-62XKTOUI.js.map +0 -1
  83. package/dist/chunk-7Z4N4JWQ.js.map +0 -1
  84. package/dist/chunk-BQJVHD6Y.js.map +0 -1
  85. package/dist/chunk-LVA6XJGR.js.map +0 -1
  86. package/dist/chunk-V625APR6.js.map +0 -1
  87. package/dist/chunk-VZRO7RYT.js.map +0 -1
  88. package/dist/chunk-YAHTF4NO.js.map +0 -1
  89. package/dist/load-agent-defs-2H42B2OO.js +0 -13
  90. package/dist/recompile-project-agents-QIAMBCM4.js +0 -17
  91. /package/dist/{chunk-2Q65K6E3.js.map → chunk-5K33RJ7Z.js.map} +0 -0
  92. /package/dist/{chunk-4VMLCWLD.js.map → chunk-7JQPIMKD.js.map} +0 -0
  93. /package/dist/{chunk-5YOSLSQJ.js.map → chunk-C5P7RUDR.js.map} +0 -0
  94. /package/dist/{chunk-G7TYOPON.js.map → chunk-CICB4AKA.js.map} +0 -0
  95. /package/dist/{chunk-FBRLHNUT.js.map → chunk-CWQLRKWB.js.map} +0 -0
  96. /package/dist/{chunk-JV4P7BL4.js.map → chunk-DEWI5HDF.js.map} +0 -0
  97. /package/dist/{chunk-Z6G24ROK.js.map → chunk-EPBUWEW4.js.map} +0 -0
  98. /package/dist/{chunk-IO2DPRDS.js.map → chunk-GWPKIXBM.js.map} +0 -0
  99. /package/dist/{chunk-BNHD2GIB.js.map → chunk-IJ7GWQUR.js.map} +0 -0
  100. /package/dist/{chunk-4RYWFQK7.js.map → chunk-IWUFZ6NR.js.map} +0 -0
  101. /package/dist/{chunk-F35G42TF.js.map → chunk-J7Q5VYR7.js.map} +0 -0
  102. /package/dist/{chunk-MPLWPWL4.js.map → chunk-JQDN7KAZ.js.map} +0 -0
  103. /package/dist/{chunk-LSSGS2QS.js.map → chunk-K6MQV6SK.js.map} +0 -0
  104. /package/dist/{chunk-YVQSDBTK.js.map → chunk-KCN5N3PB.js.map} +0 -0
  105. /package/dist/{chunk-WVKGO3Y5.js.map → chunk-LJ6V54NR.js.map} +0 -0
  106. /package/dist/{chunk-VCUXNKOY.js.map → chunk-LX7UXZBN.js.map} +0 -0
  107. /package/dist/{chunk-Z6KROWH4.js.map → chunk-OJR3ASZI.js.map} +0 -0
  108. /package/dist/{chunk-WVBJRFFM.js.map → chunk-PWPKZNCV.js.map} +0 -0
  109. /package/dist/{chunk-SKDTGHCD.js.map → chunk-Q2HB5SWU.js.map} +0 -0
  110. /package/dist/{chunk-NS5COBTT.js.map → chunk-VH6P7UGF.js.map} +0 -0
  111. /package/dist/{chunk-42PQKBVU.js.map → chunk-VI4X5DN5.js.map} +0 -0
  112. /package/dist/{chunk-THLQS2AW.js.map → chunk-XDNGMXOZ.js.map} +0 -0
  113. /package/dist/{chunk-GPZQCLZJ.js.map → chunk-XSULY25W.js.map} +0 -0
  114. /package/dist/{load-agent-defs-2H42B2OO.js.map → load-agent-defs-KWHG7P7G.js.map} +0 -0
  115. /package/dist/{recompile-project-agents-QIAMBCM4.js.map → recompile-project-agents-5FTDDHX7.js.map} +0 -0
  116. /package/dist/{source-loader-CC6ZWKTI.js.map → source-loader-CDYH2NIM.js.map} +0 -0
@@ -12,7 +12,7 @@ import {
12
12
  typedFromEntries,
13
13
  typedKeys,
14
14
  typedValues
15
- } from "./chunk-7Z4N4JWQ.js";
15
+ } from "./chunk-XX657S4U.js";
16
16
  import {
17
17
  AUTHOR_HANDLE_PATTERN,
18
18
  CACHE_HASH_LENGTH,
@@ -62,7 +62,7 @@ import {
62
62
  defaultCategories,
63
63
  defaultRules,
64
64
  defaultStacks
65
- } from "./chunk-VZRO7RYT.js";
65
+ } from "./chunk-OI2H6M5I.js";
66
66
 
67
67
  // src/cli/lib/loading/source-loader.ts
68
68
  import os12 from "os";
@@ -1420,7 +1420,6 @@ var categoryDefinitionSchema = z2.object({
1420
1420
  description: z2.string(),
1421
1421
  domain: z2.string().exactOptional(),
1422
1422
  exclusive: z2.boolean(),
1423
- required: z2.boolean(),
1424
1423
  order: z2.number(),
1425
1424
  icon: z2.string().exactOptional()
1426
1425
  });
@@ -2587,7 +2586,6 @@ var BUILT_IN_MATRIX2 = {
2587
2586
  description: "UI framework (React, Vue, Angular, SolidJS)",
2588
2587
  domain: "web",
2589
2588
  exclusive: true,
2590
- required: true,
2591
2589
  order: 1
2592
2590
  },
2593
2591
  "web-meta-framework": {
@@ -2596,7 +2594,6 @@ var BUILT_IN_MATRIX2 = {
2596
2594
  description: "Full-stack meta-framework (Next.js, Remix, Nuxt, SvelteKit)",
2597
2595
  domain: "web",
2598
2596
  exclusive: true,
2599
- required: false,
2600
2597
  order: 2
2601
2598
  },
2602
2599
  "web-routing": {
@@ -2605,7 +2602,6 @@ var BUILT_IN_MATRIX2 = {
2605
2602
  description: "Client-side routing (TanStack Router)",
2606
2603
  domain: "web",
2607
2604
  exclusive: true,
2608
- required: false,
2609
2605
  order: 3
2610
2606
  },
2611
2607
  "web-styling": {
@@ -2614,7 +2610,6 @@ var BUILT_IN_MATRIX2 = {
2614
2610
  description: "CSS approach (SCSS Modules, Tailwind, CVA)",
2615
2611
  domain: "web",
2616
2612
  exclusive: false,
2617
- required: true,
2618
2613
  order: 4
2619
2614
  },
2620
2615
  "web-client-state": {
@@ -2623,7 +2618,6 @@ var BUILT_IN_MATRIX2 = {
2623
2618
  description: "UI state, forms, local data (Zustand, Redux, MobX)",
2624
2619
  domain: "web",
2625
2620
  exclusive: true,
2626
- required: false,
2627
2621
  order: 5
2628
2622
  },
2629
2623
  "web-server-state": {
@@ -2632,7 +2626,6 @@ var BUILT_IN_MATRIX2 = {
2632
2626
  description: "API data caching (React Query, SWR)",
2633
2627
  domain: "web",
2634
2628
  exclusive: true,
2635
- required: false,
2636
2629
  order: 6
2637
2630
  },
2638
2631
  "web-graphql-client": {
@@ -2641,7 +2634,6 @@ var BUILT_IN_MATRIX2 = {
2641
2634
  description: "GraphQL client library (Apollo Client, urql)",
2642
2635
  domain: "web",
2643
2636
  exclusive: true,
2644
- required: false,
2645
2637
  order: 7
2646
2638
  },
2647
2639
  "web-rpc": {
@@ -2650,7 +2642,6 @@ var BUILT_IN_MATRIX2 = {
2650
2642
  description: "End-to-end type-safe RPC (tRPC)",
2651
2643
  domain: "web",
2652
2644
  exclusive: false,
2653
- required: false,
2654
2645
  order: 8
2655
2646
  },
2656
2647
  "web-forms": {
@@ -2659,7 +2650,6 @@ var BUILT_IN_MATRIX2 = {
2659
2650
  description: "Schema validation (Zod)",
2660
2651
  domain: "web",
2661
2652
  exclusive: false,
2662
- required: false,
2663
2653
  order: 9
2664
2654
  },
2665
2655
  "web-form-library": {
@@ -2668,7 +2658,6 @@ var BUILT_IN_MATRIX2 = {
2668
2658
  description: "Form state and submission (React Hook Form, TanStack Form, VeeValidate)",
2669
2659
  domain: "web",
2670
2660
  exclusive: true,
2671
- required: false,
2672
2661
  order: 10
2673
2662
  },
2674
2663
  "web-testing": {
@@ -2677,7 +2666,6 @@ var BUILT_IN_MATRIX2 = {
2677
2666
  description: "Unit, component, and visual testing",
2678
2667
  domain: "web",
2679
2668
  exclusive: false,
2680
- required: false,
2681
2669
  order: 11
2682
2670
  },
2683
2671
  "web-e2e": {
@@ -2686,7 +2674,6 @@ var BUILT_IN_MATRIX2 = {
2686
2674
  description: "End-to-end browser testing (Playwright, Cypress)",
2687
2675
  domain: "web",
2688
2676
  exclusive: true,
2689
- required: false,
2690
2677
  order: 12
2691
2678
  },
2692
2679
  "web-ui-kit": {
@@ -2695,7 +2682,6 @@ var BUILT_IN_MATRIX2 = {
2695
2682
  description: "Pre-styled component kit (shadcn/ui, MUI, Mantine, Vuetify)",
2696
2683
  domain: "web",
2697
2684
  exclusive: true,
2698
- required: false,
2699
2685
  order: 13
2700
2686
  },
2701
2687
  "web-ui-components": {
@@ -2704,7 +2690,6 @@ var BUILT_IN_MATRIX2 = {
2704
2690
  description: "Headless primitives (Radix UI, Base UI, Headless UI, TanStack Table)",
2705
2691
  domain: "web",
2706
2692
  exclusive: false,
2707
- required: false,
2708
2693
  order: 14
2709
2694
  },
2710
2695
  "web-tooling": {
@@ -2713,7 +2698,6 @@ var BUILT_IN_MATRIX2 = {
2713
2698
  description: "Frontend build tools and bundlers (Vite, Webpack)",
2714
2699
  domain: "web",
2715
2700
  exclusive: false,
2716
- required: false,
2717
2701
  order: 15
2718
2702
  },
2719
2703
  "web-docs": {
@@ -2722,7 +2706,6 @@ var BUILT_IN_MATRIX2 = {
2722
2706
  description: "Documentation site generator (Docusaurus, VitePress)",
2723
2707
  domain: "web",
2724
2708
  exclusive: true,
2725
- required: false,
2726
2709
  order: 16
2727
2710
  },
2728
2711
  "web-mocking": {
@@ -2731,7 +2714,6 @@ var BUILT_IN_MATRIX2 = {
2731
2714
  description: "Mock Service Worker for development and testing",
2732
2715
  domain: "web",
2733
2716
  exclusive: false,
2734
- required: false,
2735
2717
  order: 17
2736
2718
  },
2737
2719
  "web-error-handling": {
@@ -2740,7 +2722,6 @@ var BUILT_IN_MATRIX2 = {
2740
2722
  description: "Error boundaries, result types, and error patterns",
2741
2723
  domain: "web",
2742
2724
  exclusive: false,
2743
- required: false,
2744
2725
  order: 18
2745
2726
  },
2746
2727
  "web-i18n": {
@@ -2749,7 +2730,6 @@ var BUILT_IN_MATRIX2 = {
2749
2730
  description: "i18n libraries (next-intl, react-intl, vue-i18n)",
2750
2731
  domain: "web",
2751
2732
  exclusive: true,
2752
- required: false,
2753
2733
  order: 19
2754
2734
  },
2755
2735
  "web-file-upload": {
@@ -2758,7 +2738,6 @@ var BUILT_IN_MATRIX2 = {
2758
2738
  description: "File upload patterns and handling",
2759
2739
  domain: "web",
2760
2740
  exclusive: false,
2761
- required: false,
2762
2741
  order: 20
2763
2742
  },
2764
2743
  "web-files": {
@@ -2767,7 +2746,6 @@ var BUILT_IN_MATRIX2 = {
2767
2746
  description: "Image handling and file processing",
2768
2747
  domain: "web",
2769
2748
  exclusive: false,
2770
- required: false,
2771
2749
  order: 21
2772
2750
  },
2773
2751
  "web-utilities": {
@@ -2776,7 +2754,6 @@ var BUILT_IN_MATRIX2 = {
2776
2754
  description: "Utility libraries (date-fns, native JS patterns)",
2777
2755
  domain: "web",
2778
2756
  exclusive: false,
2779
- required: false,
2780
2757
  order: 22
2781
2758
  },
2782
2759
  "web-realtime": {
@@ -2785,7 +2762,6 @@ var BUILT_IN_MATRIX2 = {
2785
2762
  description: "Bidirectional realtime (WebSockets, Socket.IO)",
2786
2763
  domain: "web",
2787
2764
  exclusive: true,
2788
- required: false,
2789
2765
  order: 23
2790
2766
  },
2791
2767
  "web-streaming": {
@@ -2794,7 +2770,6 @@ var BUILT_IN_MATRIX2 = {
2794
2770
  description: "Server-sent events and HTTP streaming",
2795
2771
  domain: "web",
2796
2772
  exclusive: false,
2797
- required: false,
2798
2773
  order: 24
2799
2774
  },
2800
2775
  "web-animation": {
@@ -2803,7 +2778,6 @@ var BUILT_IN_MATRIX2 = {
2803
2778
  description: "Animation libraries and CSS animations",
2804
2779
  domain: "web",
2805
2780
  exclusive: false,
2806
- required: false,
2807
2781
  order: 25
2808
2782
  },
2809
2783
  "web-pwa": {
@@ -2812,7 +2786,6 @@ var BUILT_IN_MATRIX2 = {
2812
2786
  description: "Service workers, offline-first patterns, and PWA features",
2813
2787
  domain: "web",
2814
2788
  exclusive: false,
2815
- required: false,
2816
2789
  order: 26
2817
2790
  },
2818
2791
  "web-accessibility": {
@@ -2821,7 +2794,6 @@ var BUILT_IN_MATRIX2 = {
2821
2794
  description: "WCAG compliance, ARIA, and keyboard navigation",
2822
2795
  domain: "web",
2823
2796
  exclusive: false,
2824
- required: false,
2825
2797
  order: 27
2826
2798
  },
2827
2799
  "web-performance": {
@@ -2830,7 +2802,6 @@ var BUILT_IN_MATRIX2 = {
2830
2802
  description: "Bundle optimization, render performance, and code splitting",
2831
2803
  domain: "web",
2832
2804
  exclusive: false,
2833
- required: false,
2834
2805
  order: 28
2835
2806
  },
2836
2807
  "web-3d": {
@@ -2839,7 +2810,6 @@ var BUILT_IN_MATRIX2 = {
2839
2810
  description: "3D rendering (React Three Fiber)",
2840
2811
  domain: "web",
2841
2812
  exclusive: false,
2842
- required: false,
2843
2813
  order: 29
2844
2814
  },
2845
2815
  "web-dataviz": {
@@ -2848,7 +2818,6 @@ var BUILT_IN_MATRIX2 = {
2848
2818
  description: "Charts and data visualization (D3, Recharts)",
2849
2819
  domain: "web",
2850
2820
  exclusive: false,
2851
- required: false,
2852
2821
  order: 30
2853
2822
  },
2854
2823
  "web-dnd": {
@@ -2857,7 +2826,6 @@ var BUILT_IN_MATRIX2 = {
2857
2826
  description: "Drag-and-drop interactions (dnd-kit)",
2858
2827
  domain: "web",
2859
2828
  exclusive: false,
2860
- required: false,
2861
2829
  order: 31
2862
2830
  },
2863
2831
  "web-editor": {
@@ -2866,7 +2834,6 @@ var BUILT_IN_MATRIX2 = {
2866
2834
  description: "Rich text editing (Lexical, Tiptap)",
2867
2835
  domain: "web",
2868
2836
  exclusive: true,
2869
- required: false,
2870
2837
  order: 32
2871
2838
  },
2872
2839
  "web-maps": {
@@ -2875,7 +2842,6 @@ var BUILT_IN_MATRIX2 = {
2875
2842
  description: "Interactive maps (Leaflet, Mapbox)",
2876
2843
  domain: "web",
2877
2844
  exclusive: true,
2878
- required: false,
2879
2845
  order: 33
2880
2846
  },
2881
2847
  "api-api": {
@@ -2884,7 +2850,6 @@ var BUILT_IN_MATRIX2 = {
2884
2850
  description: "Backend framework (Hono, Express, Fastify)",
2885
2851
  domain: "api",
2886
2852
  exclusive: true,
2887
- required: true,
2888
2853
  order: 1
2889
2854
  },
2890
2855
  "api-sql-engine": {
@@ -2893,7 +2858,6 @@ var BUILT_IN_MATRIX2 = {
2893
2858
  description: "Primary SQL engine (PostgreSQL, MySQL, CockroachDB)",
2894
2859
  domain: "api",
2895
2860
  exclusive: true,
2896
- required: false,
2897
2861
  order: 2
2898
2862
  },
2899
2863
  "api-orm": {
@@ -2902,7 +2866,6 @@ var BUILT_IN_MATRIX2 = {
2902
2866
  description: "Database access layer (Drizzle, Prisma, TypeORM)",
2903
2867
  domain: "api",
2904
2868
  exclusive: true,
2905
- required: false,
2906
2869
  order: 3
2907
2870
  },
2908
2871
  "api-document": {
@@ -2911,7 +2874,6 @@ var BUILT_IN_MATRIX2 = {
2911
2874
  description: "Primary non-SQL store (MongoDB, Mongoose, Gel, SurrealDB)",
2912
2875
  domain: "api",
2913
2876
  exclusive: true,
2914
- required: false,
2915
2877
  order: 4
2916
2878
  },
2917
2879
  "api-kv": {
@@ -2920,7 +2882,6 @@ var BUILT_IN_MATRIX2 = {
2920
2882
  description: "Redis-class key-value provider (Redis, Upstash)",
2921
2883
  domain: "api",
2922
2884
  exclusive: true,
2923
- required: false,
2924
2885
  order: 5
2925
2886
  },
2926
2887
  "api-db-host": {
@@ -2929,7 +2890,6 @@ var BUILT_IN_MATRIX2 = {
2929
2890
  description: "Managed database host (Neon, PlanetScale, Turso)",
2930
2891
  domain: "api",
2931
2892
  exclusive: true,
2932
- required: false,
2933
2893
  order: 6
2934
2894
  },
2935
2895
  "api-auth": {
@@ -2938,7 +2898,6 @@ var BUILT_IN_MATRIX2 = {
2938
2898
  description: "Auth solution (Better Auth, Auth.js)",
2939
2899
  domain: "api",
2940
2900
  exclusive: true,
2941
- required: false,
2942
2901
  order: 8
2943
2902
  },
2944
2903
  "api-observability": {
@@ -2947,7 +2906,6 @@ var BUILT_IN_MATRIX2 = {
2947
2906
  description: "Logging, monitoring, error tracking",
2948
2907
  domain: "api",
2949
2908
  exclusive: false,
2950
- required: false,
2951
2909
  order: 9
2952
2910
  },
2953
2911
  "api-analytics": {
@@ -2956,7 +2914,6 @@ var BUILT_IN_MATRIX2 = {
2956
2914
  description: "Product analytics and tracking",
2957
2915
  domain: "api",
2958
2916
  exclusive: false,
2959
- required: false,
2960
2917
  order: 10
2961
2918
  },
2962
2919
  "api-email": {
@@ -2965,7 +2922,6 @@ var BUILT_IN_MATRIX2 = {
2965
2922
  description: "Transactional email (Resend, Sendgrid)",
2966
2923
  domain: "api",
2967
2924
  exclusive: false,
2968
- required: false,
2969
2925
  order: 11
2970
2926
  },
2971
2927
  "ai-provider": {
@@ -2974,7 +2930,6 @@ var BUILT_IN_MATRIX2 = {
2974
2930
  description: "AI model provider SDKs (Anthropic, OpenAI, Google, etc.)",
2975
2931
  domain: "ai",
2976
2932
  exclusive: false,
2977
- required: false,
2978
2933
  order: 1
2979
2934
  },
2980
2935
  "ai-orchestration": {
@@ -2983,7 +2938,6 @@ var BUILT_IN_MATRIX2 = {
2983
2938
  description: "Multi-model AI workflow frameworks (LangChain, LlamaIndex, Vercel AI)",
2984
2939
  domain: "ai",
2985
2940
  exclusive: false,
2986
- required: false,
2987
2941
  order: 2
2988
2942
  },
2989
2943
  "ai-observability": {
@@ -2992,7 +2946,6 @@ var BUILT_IN_MATRIX2 = {
2992
2946
  description: "LLM monitoring, evaluation, and tracing (Langfuse, Promptfoo)",
2993
2947
  domain: "ai",
2994
2948
  exclusive: false,
2995
- required: false,
2996
2949
  order: 3
2997
2950
  },
2998
2951
  "ai-infrastructure": {
@@ -3001,7 +2954,6 @@ var BUILT_IN_MATRIX2 = {
3001
2954
  description: "Model hosting, serving, and inference gateways",
3002
2955
  domain: "ai",
3003
2956
  exclusive: false,
3004
- required: false,
3005
2957
  order: 4
3006
2958
  },
3007
2959
  "ai-patterns": {
@@ -3010,7 +2962,6 @@ var BUILT_IN_MATRIX2 = {
3010
2962
  description: "Cross-cutting AI usage patterns (tool use, prompting)",
3011
2963
  domain: "ai",
3012
2964
  exclusive: false,
3013
- required: false,
3014
2965
  order: 5
3015
2966
  },
3016
2967
  "api-baas": {
@@ -3019,7 +2970,6 @@ var BUILT_IN_MATRIX2 = {
3019
2970
  description: "Full backend platform \u2014 auth, database, storage, functions (Supabase, Firebase)",
3020
2971
  domain: "api",
3021
2972
  exclusive: true,
3022
- required: false,
3023
2973
  order: 7
3024
2974
  },
3025
2975
  "api-performance": {
@@ -3028,7 +2978,6 @@ var BUILT_IN_MATRIX2 = {
3028
2978
  description: "API performance patterns and optimization",
3029
2979
  domain: "api",
3030
2980
  exclusive: false,
3031
- required: false,
3032
2981
  order: 12
3033
2982
  },
3034
2983
  "api-cms": {
@@ -3037,7 +2986,6 @@ var BUILT_IN_MATRIX2 = {
3037
2986
  description: "CMS platforms (Payload, Sanity, Strapi)",
3038
2987
  domain: "api",
3039
2988
  exclusive: true,
3040
- required: false,
3041
2989
  order: 13
3042
2990
  },
3043
2991
  "api-commerce": {
@@ -3046,7 +2994,6 @@ var BUILT_IN_MATRIX2 = {
3046
2994
  description: "Commerce platforms (Stripe)",
3047
2995
  domain: "api",
3048
2996
  exclusive: false,
3049
- required: false,
3050
2997
  order: 14
3051
2998
  },
3052
2999
  "api-search": {
@@ -3055,7 +3002,6 @@ var BUILT_IN_MATRIX2 = {
3055
3002
  description: "Search engines (Elasticsearch, Meilisearch)",
3056
3003
  domain: "api",
3057
3004
  exclusive: true,
3058
- required: false,
3059
3005
  order: 15
3060
3006
  },
3061
3007
  "api-vector-db": {
@@ -3064,7 +3010,6 @@ var BUILT_IN_MATRIX2 = {
3064
3010
  description: "Vector databases (Pinecone, Qdrant, Chroma, Weaviate)",
3065
3011
  domain: "api",
3066
3012
  exclusive: true,
3067
- required: false,
3068
3013
  order: 16
3069
3014
  },
3070
3015
  "api-caching": {
@@ -3073,7 +3018,6 @@ var BUILT_IN_MATRIX2 = {
3073
3018
  description: "API caching strategies and patterns",
3074
3019
  domain: "api",
3075
3020
  exclusive: false,
3076
- required: false,
3077
3021
  order: 17
3078
3022
  },
3079
3023
  "api-graphql": {
@@ -3082,7 +3026,6 @@ var BUILT_IN_MATRIX2 = {
3082
3026
  description: "GraphQL servers (Apollo Server, Mercurius, Yoga)",
3083
3027
  domain: "api",
3084
3028
  exclusive: true,
3085
- required: false,
3086
3029
  order: 18
3087
3030
  },
3088
3031
  "api-messaging": {
@@ -3091,7 +3034,6 @@ var BUILT_IN_MATRIX2 = {
3091
3034
  description: "Webhooks and event-driven messaging",
3092
3035
  domain: "api",
3093
3036
  exclusive: false,
3094
- required: false,
3095
3037
  order: 19
3096
3038
  },
3097
3039
  "api-queue": {
@@ -3100,7 +3042,6 @@ var BUILT_IN_MATRIX2 = {
3100
3042
  description: "Background job queues (BullMQ)",
3101
3043
  domain: "api",
3102
3044
  exclusive: false,
3103
- required: false,
3104
3045
  order: 20
3105
3046
  },
3106
3047
  "api-specs": {
@@ -3109,7 +3050,6 @@ var BUILT_IN_MATRIX2 = {
3109
3050
  description: "API specification formats (OpenAPI)",
3110
3051
  domain: "api",
3111
3052
  exclusive: false,
3112
- required: false,
3113
3053
  order: 21
3114
3054
  },
3115
3055
  "mobile-framework": {
@@ -3118,7 +3058,6 @@ var BUILT_IN_MATRIX2 = {
3118
3058
  description: "Native mobile framework (React Native, Expo)",
3119
3059
  domain: "mobile",
3120
3060
  exclusive: false,
3121
- required: true,
3122
3061
  order: 1
3123
3062
  },
3124
3063
  "mobile-animation": {
@@ -3127,7 +3066,6 @@ var BUILT_IN_MATRIX2 = {
3127
3066
  description: "Native animation and gestures (Reanimated, Gesture Handler, Skia)",
3128
3067
  domain: "mobile",
3129
3068
  exclusive: false,
3130
- required: false,
3131
3069
  order: 6
3132
3070
  },
3133
3071
  "mobile-background": {
@@ -3136,7 +3074,6 @@ var BUILT_IN_MATRIX2 = {
3136
3074
  description: "Background task scheduling and execution",
3137
3075
  domain: "mobile",
3138
3076
  exclusive: false,
3139
- required: false,
3140
3077
  order: 12
3141
3078
  },
3142
3079
  "mobile-camera": {
@@ -3145,7 +3082,6 @@ var BUILT_IN_MATRIX2 = {
3145
3082
  description: "Camera integration (Vision Camera)",
3146
3083
  domain: "mobile",
3147
3084
  exclusive: false,
3148
- required: false,
3149
3085
  order: 10
3150
3086
  },
3151
3087
  "mobile-deep-linking": {
@@ -3154,7 +3090,6 @@ var BUILT_IN_MATRIX2 = {
3154
3090
  description: "Deep links and universal/app links",
3155
3091
  domain: "mobile",
3156
3092
  exclusive: false,
3157
- required: false,
3158
3093
  order: 9
3159
3094
  },
3160
3095
  "mobile-deployment": {
@@ -3163,7 +3098,6 @@ var BUILT_IN_MATRIX2 = {
3163
3098
  description: "App builds and store releases (EAS)",
3164
3099
  domain: "mobile",
3165
3100
  exclusive: false,
3166
- required: false,
3167
3101
  order: 15
3168
3102
  },
3169
3103
  "mobile-hardware": {
@@ -3172,7 +3106,6 @@ var BUILT_IN_MATRIX2 = {
3172
3106
  description: "Device hardware access (BLE, NFC)",
3173
3107
  domain: "mobile",
3174
3108
  exclusive: false,
3175
- required: false,
3176
3109
  order: 11
3177
3110
  },
3178
3111
  "mobile-navigation": {
@@ -3181,7 +3114,6 @@ var BUILT_IN_MATRIX2 = {
3181
3114
  description: "Screen navigation (Expo Router, React Navigation)",
3182
3115
  domain: "mobile",
3183
3116
  exclusive: true,
3184
- required: false,
3185
3117
  order: 2
3186
3118
  },
3187
3119
  "mobile-notifications": {
@@ -3190,7 +3122,6 @@ var BUILT_IN_MATRIX2 = {
3190
3122
  description: "Push and local notifications",
3191
3123
  domain: "mobile",
3192
3124
  exclusive: false,
3193
- required: false,
3194
3125
  order: 8
3195
3126
  },
3196
3127
  "mobile-performance": {
@@ -3199,7 +3130,6 @@ var BUILT_IN_MATRIX2 = {
3199
3130
  description: "React Native performance optimization",
3200
3131
  domain: "mobile",
3201
3132
  exclusive: false,
3202
- required: false,
3203
3133
  order: 13
3204
3134
  },
3205
3135
  "mobile-security": {
@@ -3208,7 +3138,6 @@ var BUILT_IN_MATRIX2 = {
3208
3138
  description: "Mobile app security patterns (React Native)",
3209
3139
  domain: "mobile",
3210
3140
  exclusive: false,
3211
- required: false,
3212
3141
  order: 14
3213
3142
  },
3214
3143
  "mobile-storage": {
@@ -3217,7 +3146,6 @@ var BUILT_IN_MATRIX2 = {
3217
3146
  description: "On-device storage and offline databases (MMKV, SQLite, WatermelonDB)",
3218
3147
  domain: "mobile",
3219
3148
  exclusive: false,
3220
- required: false,
3221
3149
  order: 4
3222
3150
  },
3223
3151
  "mobile-styling": {
@@ -3226,7 +3154,6 @@ var BUILT_IN_MATRIX2 = {
3226
3154
  description: "Native styling (NativeWind, Unistyles)",
3227
3155
  domain: "mobile",
3228
3156
  exclusive: true,
3229
- required: false,
3230
3157
  order: 3
3231
3158
  },
3232
3159
  "mobile-testing": {
@@ -3235,7 +3162,6 @@ var BUILT_IN_MATRIX2 = {
3235
3162
  description: "Mobile E2E testing (Detox, Maestro)",
3236
3163
  domain: "mobile",
3237
3164
  exclusive: false,
3238
- required: false,
3239
3165
  order: 7
3240
3166
  },
3241
3167
  "mobile-ui-components": {
@@ -3244,7 +3170,6 @@ var BUILT_IN_MATRIX2 = {
3244
3170
  description: "Native UI component libraries (React Native Paper, Tamagui)",
3245
3171
  domain: "mobile",
3246
3172
  exclusive: true,
3247
- required: false,
3248
3173
  order: 5
3249
3174
  },
3250
3175
  "shared-monorepo": {
@@ -3253,7 +3178,6 @@ var BUILT_IN_MATRIX2 = {
3253
3178
  description: "Workspace management (pnpm workspaces)",
3254
3179
  domain: "shared",
3255
3180
  exclusive: false,
3256
- required: false,
3257
3181
  order: 1
3258
3182
  },
3259
3183
  "shared-task-runner": {
@@ -3262,7 +3186,6 @@ var BUILT_IN_MATRIX2 = {
3262
3186
  description: "Monorepo task orchestration (Turborepo, Nx)",
3263
3187
  domain: "shared",
3264
3188
  exclusive: true,
3265
- required: false,
3266
3189
  order: 2
3267
3190
  },
3268
3191
  "shared-lint": {
@@ -3271,7 +3194,6 @@ var BUILT_IN_MATRIX2 = {
3271
3194
  description: "Linting and formatting (Biome, ESLint & Prettier)",
3272
3195
  domain: "shared",
3273
3196
  exclusive: true,
3274
- required: false,
3275
3197
  order: 3
3276
3198
  },
3277
3199
  "shared-tooling": {
@@ -3280,7 +3202,6 @@ var BUILT_IN_MATRIX2 = {
3280
3202
  description: "TypeScript config, git hooks, changesets, stack detection",
3281
3203
  domain: "shared",
3282
3204
  exclusive: false,
3283
- required: false,
3284
3205
  order: 4
3285
3206
  },
3286
3207
  "shared-security": {
@@ -3289,7 +3210,6 @@ var BUILT_IN_MATRIX2 = {
3289
3210
  description: "Authentication security patterns and best practices",
3290
3211
  domain: "shared",
3291
3212
  exclusive: false,
3292
- required: false,
3293
3213
  order: 5
3294
3214
  },
3295
3215
  "meta-reviewing": {
@@ -3298,7 +3218,6 @@ var BUILT_IN_MATRIX2 = {
3298
3218
  description: "Code review patterns and methodology",
3299
3219
  domain: "meta",
3300
3220
  exclusive: false,
3301
- required: false,
3302
3221
  order: 1
3303
3222
  },
3304
3223
  "meta-methodology": {
@@ -3307,7 +3226,6 @@ var BUILT_IN_MATRIX2 = {
3307
3226
  description: "Research and investigation methodology",
3308
3227
  domain: "meta",
3309
3228
  exclusive: false,
3310
- required: false,
3311
3229
  order: 2
3312
3230
  },
3313
3231
  "meta-design": {
@@ -3316,7 +3234,6 @@ var BUILT_IN_MATRIX2 = {
3316
3234
  description: "Software design patterns and paradigms",
3317
3235
  domain: "meta",
3318
3236
  exclusive: false,
3319
- required: false,
3320
3237
  order: 3
3321
3238
  },
3322
3239
  "meta-planning": {
@@ -3325,7 +3242,6 @@ var BUILT_IN_MATRIX2 = {
3325
3242
  description: "Specification planning frameworks per domain",
3326
3243
  domain: "meta",
3327
3244
  exclusive: false,
3328
- required: false,
3329
3245
  order: 4
3330
3246
  },
3331
3247
  "infra-ci-cd": {
@@ -3334,7 +3250,6 @@ var BUILT_IN_MATRIX2 = {
3334
3250
  description: "Continuous integration and deployment pipelines",
3335
3251
  domain: "infra",
3336
3252
  exclusive: false,
3337
- required: false,
3338
3253
  order: 1
3339
3254
  },
3340
3255
  "infra-platform": {
@@ -3343,7 +3258,6 @@ var BUILT_IN_MATRIX2 = {
3343
3258
  description: "Edge compute and deployment platforms",
3344
3259
  domain: "infra",
3345
3260
  exclusive: false,
3346
- required: false,
3347
3261
  order: 2
3348
3262
  },
3349
3263
  "infra-config": {
@@ -3352,7 +3266,6 @@ var BUILT_IN_MATRIX2 = {
3352
3266
  description: "Environment and infrastructure configuration",
3353
3267
  domain: "infra",
3354
3268
  exclusive: false,
3355
- required: false,
3356
3269
  order: 3
3357
3270
  },
3358
3271
  "infra-containers": {
@@ -3361,7 +3274,6 @@ var BUILT_IN_MATRIX2 = {
3361
3274
  description: "Containers (Docker, Kubernetes)",
3362
3275
  domain: "infra",
3363
3276
  exclusive: false,
3364
- required: false,
3365
3277
  order: 5
3366
3278
  },
3367
3279
  "infra-iac": {
@@ -3370,7 +3282,6 @@ var BUILT_IN_MATRIX2 = {
3370
3282
  description: "Infrastructure as code (Pulumi, SST, Terraform)",
3371
3283
  domain: "infra",
3372
3284
  exclusive: true,
3373
- required: false,
3374
3285
  order: 4
3375
3286
  },
3376
3287
  "cli-framework": {
@@ -3379,7 +3290,6 @@ var BUILT_IN_MATRIX2 = {
3379
3290
  description: "CLI application framework (Commander, oclif)",
3380
3291
  domain: "cli",
3381
3292
  exclusive: true,
3382
- required: true,
3383
3293
  order: 1
3384
3294
  },
3385
3295
  "cli-prompts": {
@@ -3388,7 +3298,6 @@ var BUILT_IN_MATRIX2 = {
3388
3298
  description: "Interactive CLI prompts (Clack)",
3389
3299
  domain: "cli",
3390
3300
  exclusive: false,
3391
- required: false,
3392
3301
  order: 2
3393
3302
  },
3394
3303
  "desktop-framework": {
@@ -3397,7 +3306,6 @@ var BUILT_IN_MATRIX2 = {
3397
3306
  description: "Desktop application framework (Tauri, Electron)",
3398
3307
  domain: "desktop",
3399
3308
  exclusive: true,
3400
- required: true,
3401
3309
  order: 1
3402
3310
  },
3403
3311
  "desktop-backend": {
@@ -3406,7 +3314,6 @@ var BUILT_IN_MATRIX2 = {
3406
3314
  description: "Desktop backend integration (Tauri)",
3407
3315
  domain: "desktop",
3408
3316
  exclusive: false,
3409
- required: false,
3410
3317
  order: 3
3411
3318
  },
3412
3319
  "desktop-ipc": {
@@ -3415,7 +3322,6 @@ var BUILT_IN_MATRIX2 = {
3415
3322
  description: "Inter-process communication (Electron)",
3416
3323
  domain: "desktop",
3417
3324
  exclusive: false,
3418
- required: false,
3419
3325
  order: 2
3420
3326
  },
3421
3327
  "desktop-mobile": {
@@ -3424,7 +3330,6 @@ var BUILT_IN_MATRIX2 = {
3424
3330
  description: "Desktop-to-mobile platform support (Tauri)",
3425
3331
  domain: "desktop",
3426
3332
  exclusive: false,
3427
- required: false,
3428
3333
  order: 12
3429
3334
  },
3430
3335
  "desktop-multiwindow": {
@@ -3433,7 +3338,6 @@ var BUILT_IN_MATRIX2 = {
3433
3338
  description: "Multi-window management (Electron, Tauri)",
3434
3339
  domain: "desktop",
3435
3340
  exclusive: false,
3436
- required: false,
3437
3341
  order: 5
3438
3342
  },
3439
3343
  "desktop-packaging": {
@@ -3442,7 +3346,6 @@ var BUILT_IN_MATRIX2 = {
3442
3346
  description: "App packaging and distribution (Electron Forge, Tauri)",
3443
3347
  domain: "desktop",
3444
3348
  exclusive: true,
3445
- required: false,
3446
3349
  order: 9
3447
3350
  },
3448
3351
  "desktop-plugins": {
@@ -3451,7 +3354,6 @@ var BUILT_IN_MATRIX2 = {
3451
3354
  description: "Desktop plugin systems (Tauri)",
3452
3355
  domain: "desktop",
3453
3356
  exclusive: false,
3454
- required: false,
3455
3357
  order: 11
3456
3358
  },
3457
3359
  "desktop-security": {
@@ -3460,7 +3362,6 @@ var BUILT_IN_MATRIX2 = {
3460
3362
  description: "Desktop app security hardening (Electron, Tauri)",
3461
3363
  domain: "desktop",
3462
3364
  exclusive: false,
3463
- required: false,
3464
3365
  order: 7
3465
3366
  },
3466
3367
  "desktop-storage": {
@@ -3469,7 +3370,6 @@ var BUILT_IN_MATRIX2 = {
3469
3370
  description: "Desktop data persistence (Electron)",
3470
3371
  domain: "desktop",
3471
3372
  exclusive: false,
3472
- required: false,
3473
3373
  order: 6
3474
3374
  },
3475
3375
  "desktop-testing": {
@@ -3478,7 +3378,6 @@ var BUILT_IN_MATRIX2 = {
3478
3378
  description: "Desktop app testing (Electron)",
3479
3379
  domain: "desktop",
3480
3380
  exclusive: false,
3481
- required: false,
3482
3381
  order: 8
3483
3382
  },
3484
3383
  "desktop-ui": {
@@ -3487,7 +3386,6 @@ var BUILT_IN_MATRIX2 = {
3487
3386
  description: "Desktop UI patterns (Electron)",
3488
3387
  domain: "desktop",
3489
3388
  exclusive: false,
3490
- required: false,
3491
3389
  order: 4
3492
3390
  },
3493
3391
  "desktop-updates": {
@@ -3496,7 +3394,6 @@ var BUILT_IN_MATRIX2 = {
3496
3394
  description: "Application auto-updates (electron-updater)",
3497
3395
  domain: "desktop",
3498
3396
  exclusive: false,
3499
- required: false,
3500
3397
  order: 10
3501
3398
  }
3502
3399
  },
@@ -11997,7 +11894,6 @@ var categoryDefinitionSchema2 = z4.object({
11997
11894
  // one cannot be placed in the UI, so the read model drops it rather than failing the whole boot.
11998
11895
  domain: domainIdSchema.exactOptional(),
11999
11896
  exclusive: z4.boolean(),
12000
- required: z4.boolean(),
12001
11897
  order: z4.number()
12002
11898
  });
12003
11899
  var skillRelationSchema = z4.object({
@@ -12118,7 +12014,6 @@ var toCatalogCategory = (category, skills) => ({
12118
12014
  description: category.description,
12119
12015
  domainId: category.domain,
12120
12016
  exclusive: category.exclusive,
12121
- required: category.required,
12122
12017
  skills: skills.map((skill) => toCatalogSkill(skill, category.domain)).sort((a, b) => a.displayName.localeCompare(b.displayName))
12123
12018
  });
12124
12019
  var toCatalogDomain = (id, categories) => ({
@@ -12981,7 +12876,6 @@ var matrixCategorySchema = z7.object({
12981
12876
  // UI, so a consumer drops it rather than failing the whole catalogue.
12982
12877
  domain: z7.string().exactOptional(),
12983
12878
  exclusive: z7.boolean(),
12984
- required: z7.boolean(),
12985
12879
  order: z7.number()
12986
12880
  });
12987
12881
  var skillRelationSchema2 = z7.object({
@@ -15629,198 +15523,30 @@ async function deleteEjectedWorkingCopy(migration, projectDir) {
15629
15523
  await deleteLocalSkill(installBaseDir(projectDir, migration.oldScope), migration.id);
15630
15524
  }
15631
15525
 
15632
- // src/cli/lib/plugins/plugin-settings.ts
15633
- import path17 from "path";
15634
- import { z as z10 } from "zod";
15635
- var pluginSettingsSchema = z10.object({
15636
- // The one genuine optional here: a settings.json with no plugin enabled omits the
15637
- // key entirely, and `getEnabledPluginKeys` says so in its own diagnostic rather than
15638
- // defaulting it away. `lastUpdated` and `gitCommitSha` used to sit beside the fields
15639
- // below on the same footing and were decoration — declared, never read, and stripped
15640
- // by `z.object` either way.
15641
- enabledPlugins: z10.record(z10.string(), z10.unknown()).exactOptional()
15642
- }).passthrough();
15643
- var installationFields = {
15644
- installPath: z10.string(),
15645
- version: z10.string(),
15646
- installedAt: z10.string()
15647
- };
15648
- var pluginInstallationSchema = z10.discriminatedUnion("scope", [
15649
- z10.object({ scope: z10.literal("project"), projectPath: z10.string(), ...installationFields }),
15650
- z10.object({ scope: z10.literal("user"), ...installationFields }),
15651
- z10.object({ scope: z10.literal("local"), ...installationFields })
15652
- ]);
15653
- var installedPluginsSchema = z10.object({
15654
- version: z10.number(),
15655
- plugins: z10.record(z10.string(), z10.array(pluginInstallationSchema))
15656
- }).passthrough();
15657
- var SETTINGS_FILE = STANDARD_FILES.SETTINGS_JSON;
15658
- var INSTALLED_PLUGINS_FILE = "installed_plugins.json";
15659
- function getInstalledPluginsRegistryPath(pluginsDir) {
15660
- return path17.join(pluginsDir, INSTALLED_PLUGINS_FILE);
15661
- }
15662
- async function listRegisteredPluginInstalls(pluginsDir) {
15663
- const registryPath = getInstalledPluginsRegistryPath(pluginsDir);
15664
- const content = await readFileSafe(registryPath, MAX_CONFIG_FILE_SIZE);
15665
- const raw = JSON.parse(content);
15666
- const result = installedPluginsSchema.safeParse(raw);
15667
- if (!result.success) {
15668
- throw new Error(
15669
- `Invalid ${INSTALLED_PLUGINS_FILE}: ${formatZodErrors(result.error).join("; ")}`
15670
- );
15671
- }
15672
- return typedEntries(result.data.plugins).flatMap(([pluginKey, installations]) => {
15673
- const uniquePaths = [...new Set(installations.map((i) => i.installPath))];
15674
- return uniquePaths.map((installPath) => ({ pluginKey, installPath }));
15675
- });
15676
- }
15677
- async function getEnabledPluginKeys(projectDir) {
15678
- const settingsPath = path17.join(projectDir, CLAUDE_DIR, SETTINGS_FILE);
15679
- if (!await fileExists(settingsPath)) {
15680
- verbose(`No settings.json found at '${settingsPath}'`);
15681
- return [];
15682
- }
15683
- try {
15684
- const content = await readFileSafe(settingsPath, MAX_CONFIG_FILE_SIZE);
15685
- const raw = JSON.parse(content);
15686
- const result = pluginSettingsSchema.safeParse(raw);
15687
- if (!result.success) {
15688
- verbose(`Invalid settings.json structure: ${getErrorMessage(result.error)}`);
15689
- return [];
15690
- }
15691
- const settings = result.data;
15692
- if (!settings.enabledPlugins) {
15693
- verbose(`No enabledPlugins found in '${settingsPath}'`);
15694
- return [];
15695
- }
15696
- const enabledKeys = typedEntries(settings.enabledPlugins).filter(([, enabled]) => enabled === true).map(([key]) => key);
15697
- verbose(`Found ${enabledKeys.length} enabled plugins in settings.json`);
15698
- return enabledKeys;
15699
- } catch (error) {
15700
- verbose(`Failed to read settings.json: ${getErrorMessage(error)}`);
15701
- return [];
15702
- }
15703
- }
15704
- function pickInstallation(installations, projectDir) {
15705
- return installations.find((i) => i.scope === "project" && i.projectPath === projectDir) ?? installations.find((i) => i.scope === "user");
15706
- }
15707
- async function resolvePluginInstallPaths(pluginKeys, projectDir) {
15708
- if (pluginKeys.length === 0) {
15709
- return [];
15710
- }
15711
- const registryPath = getInstalledPluginsRegistryPath(getUserPluginsDir());
15712
- if (!await fileExists(registryPath)) {
15713
- verbose(`Plugin registry not found at '${registryPath}'`);
15714
- return [];
15715
- }
15716
- try {
15717
- const content = await readFileSafe(registryPath, MAX_CONFIG_FILE_SIZE);
15718
- const raw = JSON.parse(content);
15719
- const result = installedPluginsSchema.safeParse(raw);
15720
- if (!result.success) {
15721
- verbose(`Invalid plugin registry structure: ${getErrorMessage(result.error)}`);
15722
- return [];
15723
- }
15724
- const registry = result.data;
15725
- return pluginKeys.flatMap((pluginKey) => {
15726
- const installations = registry.plugins[pluginKey];
15727
- if (!installations || installations.length === 0) {
15728
- verbose(`Plugin '${pluginKey}' not found in registry`);
15729
- return [];
15730
- }
15731
- const picked = pickInstallation(installations, projectDir);
15732
- if (!picked) {
15733
- verbose(`No matching installation found for '${pluginKey}'`);
15734
- return [];
15735
- }
15736
- const scopeSuffix = picked.scope === "user" ? " (user scope)" : "";
15737
- verbose(`Resolved '${pluginKey}' to '${picked.installPath}'${scopeSuffix}`);
15738
- return [{ pluginKey, installPath: picked.installPath }];
15739
- });
15740
- } catch (error) {
15741
- verbose(`Failed to read plugin registry: ${getErrorMessage(error)}`);
15742
- return [];
15743
- }
15744
- }
15745
- async function getVerifiedPluginInstallPaths(projectDir) {
15746
- const enabledKeys = await getEnabledPluginKeys(projectDir);
15747
- const resolvedPaths = await resolvePluginInstallPaths(enabledKeys, projectDir);
15748
- const checks = await Promise.all(
15749
- resolvedPaths.map(async ({ pluginKey, installPath }) => {
15750
- const pluginJsonPath = getPluginManifestPath(installPath);
15751
- const manifestExists = await fileExists(pluginJsonPath);
15752
- if (!manifestExists) {
15753
- verbose(`Plugin '${pluginKey}' manifest does not exist at: '${pluginJsonPath}'`);
15754
- }
15755
- return { pluginKey, installPath, manifestExists };
15756
- })
15757
- );
15758
- const verified = checks.filter((c) => c.manifestExists).map(({ pluginKey, installPath }) => ({ pluginKey, installPath }));
15759
- verbose(`Verified ${verified.length} plugin install paths`);
15760
- return verified;
15761
- }
15762
-
15763
- // src/cli/lib/plugins/plugin-discovery.ts
15764
- async function discoverAllPluginSkills(projectDir) {
15765
- const allSkills2 = {};
15766
- try {
15767
- const pluginPaths = await getVerifiedPluginInstallPaths(projectDir);
15768
- if (pluginPaths.length === 0) {
15769
- verbose(`No enabled plugins found in settings.json`);
15770
- return allSkills2;
15771
- }
15772
- const perPluginSkills = await Promise.all(
15773
- pluginPaths.map(async ({ pluginKey, installPath }) => {
15774
- verbose(`Discovering skills from plugin: '${pluginKey}'`);
15775
- try {
15776
- return await loadPluginSkills(installPath);
15777
- } catch (error) {
15778
- verbose(`Failed to load skills from '${pluginKey}': ${getErrorMessage(error)}`);
15779
- return {};
15780
- }
15781
- })
15782
- );
15783
- for (const pluginSkills of perPluginSkills) {
15784
- for (const [id, skill] of typedEntries(pluginSkills)) {
15785
- if (skill) {
15786
- allSkills2[id] = skill;
15787
- }
15788
- }
15789
- }
15790
- } catch (error) {
15791
- verbose(`Plugin discovery failed: ${getErrorMessage(error)}`);
15792
- }
15793
- return allSkills2;
15794
- }
15795
- async function listPluginNames(projectDir) {
15796
- try {
15797
- const pluginPaths = await getVerifiedPluginInstallPaths(projectDir);
15798
- return pluginPaths.map(({ pluginKey }) => pluginKey);
15799
- } catch (error) {
15800
- verbose(`Failed to list plugin names: ${getErrorMessage(error)}`);
15801
- return [];
15802
- }
15803
- }
15804
-
15805
15526
  // src/cli/lib/plugins/plugin-info.ts
15806
15527
  var AGENT_FILE_EXTENSION = ".md";
15807
15528
  async function getInstallationInfo() {
15808
15529
  const installation = await detectInstallation();
15809
15530
  if (!installation) return null;
15810
- const scopes = installedScopes(installation);
15811
- const skillCount = await countInstalledSkills(installation, scopes);
15812
- const agentDirCounts = await countCompiledAgentsPerScope(installation, scopes);
15813
15531
  const loaded = await loadProjectConfig(installation.projectDir);
15814
- const name = loaded?.config.name || DEFAULT_PLUGIN_NAME;
15532
+ const agentDirCounts = await countCompiledAgentsPerScope(
15533
+ installation,
15534
+ installedScopes(installation)
15535
+ );
15815
15536
  return {
15816
15537
  mode: installation.mode,
15817
- name,
15818
- skillCount,
15538
+ name: loaded?.config.name || DEFAULT_PLUGIN_NAME,
15539
+ skillCount: countManagedSkills(loaded),
15819
15540
  agentCount: sumCounts(agentDirCounts),
15820
15541
  configPath: installation.configPath,
15821
15542
  agentDirs: agentDirCounts.filter(hasEntries).map((scopeCount) => scopeCount.dir)
15822
15543
  };
15823
15544
  }
15545
+ function countManagedSkills(loaded) {
15546
+ if (!loaded) return 0;
15547
+ const managed = loaded.config.skills.filter((skill) => !skill.excluded);
15548
+ return new Set(managed.map((skill) => skill.id)).size;
15549
+ }
15824
15550
  function installedScopes(installation) {
15825
15551
  return isHomeDirectory(installation.projectDir) ? ["project"] : ["global", "project"];
15826
15552
  }
@@ -15830,20 +15556,6 @@ function hasEntries(scopeCount) {
15830
15556
  function sumCounts(scopeCounts) {
15831
15557
  return scopeCounts.reduce((total, scopeCount) => total + scopeCount.count, 0);
15832
15558
  }
15833
- async function sumOverScopes(scopes, count) {
15834
- const counts = await Promise.all(scopes.map(count));
15835
- return counts.reduce((total, current) => total + current, 0);
15836
- }
15837
- async function countInstalledSkills(installation, scopes) {
15838
- if (installation.mode === "plugin") return countPluginSkills(installation.projectDir, scopes);
15839
- return sumOverScopes(
15840
- scopes,
15841
- (scope) => countDirEntries(
15842
- resolveInstallPaths(installation.projectDir, scope).skillsDir,
15843
- (entry) => entry.isDirectory()
15844
- )
15845
- );
15846
- }
15847
15559
  async function countCompiledAgentsPerScope(installation, scopes) {
15848
15560
  return Promise.all(
15849
15561
  scopes.map(async (scope) => {
@@ -15863,19 +15575,6 @@ async function countDirEntries(dir, pred) {
15863
15575
  return 0;
15864
15576
  }
15865
15577
  }
15866
- async function countPluginSkills(projectDir, scopes) {
15867
- try {
15868
- const skillsPerScope = await Promise.all(
15869
- scopes.map((scope) => discoverAllPluginSkills(installBaseDir(projectDir, scope)))
15870
- );
15871
- return countDistinctSkillIds(skillsPerScope);
15872
- } catch {
15873
- return 0;
15874
- }
15875
- }
15876
- function countDistinctSkillIds(skillsPerScope) {
15877
- return new Set(skillsPerScope.flatMap(typedKeys)).size;
15878
- }
15879
15578
  function formatInstallationDisplay(info) {
15880
15579
  const agentDirLines = info.agentDirs.map((dir) => `
15881
15580
  Agents: ${dir}`).join("");
@@ -15887,7 +15586,7 @@ function formatInstallationDisplay(info) {
15887
15586
  }
15888
15587
 
15889
15588
  // src/cli/lib/plugins/plugin-validator.ts
15890
- import path18 from "path";
15589
+ import path17 from "path";
15891
15590
  import fg2 from "fast-glob";
15892
15591
 
15893
15592
  // src/cli/lib/validation-result.ts
@@ -15919,15 +15618,15 @@ async function validatePluginStructure(pluginPath) {
15919
15618
  if (!await directoryExists(pluginPath)) {
15920
15619
  return invalidResult(`Plugin directory does not exist: ${pluginPath}`);
15921
15620
  }
15922
- const pluginDir = path18.join(pluginPath, PLUGIN_DIR);
15621
+ const pluginDir = path17.join(pluginPath, PLUGIN_DIR);
15923
15622
  if (!await directoryExists(pluginDir)) {
15924
15623
  errors.push(`Missing ${PLUGIN_DIR}/ directory`);
15925
15624
  }
15926
- const manifestPath = path18.join(pluginDir, PLUGIN_MANIFEST);
15625
+ const manifestPath = path17.join(pluginDir, PLUGIN_MANIFEST);
15927
15626
  if (!await fileExists(manifestPath)) {
15928
15627
  errors.push(`Missing ${PLUGIN_DIR}/${PLUGIN_MANIFEST}`);
15929
15628
  }
15930
- const readmePath = path18.join(pluginPath, STANDARD_FILES.README_MD);
15629
+ const readmePath = path17.join(pluginPath, STANDARD_FILES.README_MD);
15931
15630
  if (!await fileExists(readmePath)) {
15932
15631
  warnings.push("Missing README.md (recommended for documentation)");
15933
15632
  }
@@ -15971,15 +15670,15 @@ async function validatePluginManifest(manifestPath) {
15971
15670
  if (!manifest.description) {
15972
15671
  warnings.push("Missing description field (recommended for discoverability)");
15973
15672
  }
15974
- const pluginDir = path18.dirname(path18.dirname(manifestPath));
15673
+ const pluginDir = path17.dirname(path17.dirname(manifestPath));
15975
15674
  if (manifest.skills && typeof manifest.skills === "string") {
15976
- const skillsPath = path18.join(pluginDir, manifest.skills);
15675
+ const skillsPath = path17.join(pluginDir, manifest.skills);
15977
15676
  if (!await directoryExists(skillsPath)) {
15978
15677
  errors.push(`Skills path does not exist: ${manifest.skills}`);
15979
15678
  }
15980
15679
  }
15981
15680
  if (manifest.agents && typeof manifest.agents === "string") {
15982
- const agentsPath = path18.join(pluginDir, manifest.agents);
15681
+ const agentsPath = path17.join(pluginDir, manifest.agents);
15983
15682
  if (!await directoryExists(agentsPath)) {
15984
15683
  errors.push(`Agents path does not exist: ${manifest.agents}`);
15985
15684
  }
@@ -16046,7 +15745,7 @@ function prefixResult(result, prefix) {
16046
15745
  };
16047
15746
  }
16048
15747
  async function validatePluginSkillFiles(pluginPath, skillsRelPath) {
16049
- const skillsDir = path18.join(pluginPath, skillsRelPath);
15748
+ const skillsDir = path17.join(pluginPath, skillsRelPath);
16050
15749
  if (!await directoryExists(skillsDir)) return validResult();
16051
15750
  const files = await fg2(`**/${STANDARD_FILES.SKILL_MD}`, { cwd: skillsDir, absolute: true });
16052
15751
  if (files.length === 0) {
@@ -16058,13 +15757,13 @@ async function validatePluginSkillFiles(pluginPath, skillsRelPath) {
16058
15757
  }
16059
15758
  const results = await Promise.all(
16060
15759
  files.map(
16061
- async (f) => prefixResult(await validateSkillFrontmatter(f), path18.relative(pluginPath, f))
15760
+ async (f) => prefixResult(await validateSkillFrontmatter(f), path17.relative(pluginPath, f))
16062
15761
  )
16063
15762
  );
16064
15763
  return mergeValidationResults(results);
16065
15764
  }
16066
15765
  async function validatePluginAgentFiles(pluginPath, agentsRelPath) {
16067
- const agentsDir = path18.join(pluginPath, agentsRelPath);
15766
+ const agentsDir = path17.join(pluginPath, agentsRelPath);
16068
15767
  if (!await directoryExists(agentsDir)) return validResult();
16069
15768
  const files = await fg2("*.md", { cwd: agentsDir, absolute: true });
16070
15769
  if (files.length === 0) {
@@ -16076,7 +15775,7 @@ async function validatePluginAgentFiles(pluginPath, agentsRelPath) {
16076
15775
  }
16077
15776
  const results = await Promise.all(
16078
15777
  files.map(
16079
- async (f) => prefixResult(await validateAgentFrontmatter(f), path18.relative(pluginPath, f))
15778
+ async (f) => prefixResult(await validateAgentFrontmatter(f), path17.relative(pluginPath, f))
16080
15779
  )
16081
15780
  );
16082
15781
  return mergeValidationResults(results);
@@ -16118,7 +15817,7 @@ async function validateAllPlugins(pluginsDir) {
16118
15817
  const dirChecks = await Promise.all(
16119
15818
  allDirs.map(async (dirName) => ({
16120
15819
  dirName,
16121
- isPlugin: await directoryExists(path18.join(pluginsDir, dirName, PLUGIN_DIR))
15820
+ isPlugin: await directoryExists(path17.join(pluginsDir, dirName, PLUGIN_DIR))
16122
15821
  }))
16123
15822
  );
16124
15823
  const pluginDirs = dirChecks.filter((c) => c.isPlugin).map((c) => c.dirName);
@@ -16137,7 +15836,7 @@ async function validateAllPlugins(pluginsDir) {
16137
15836
  };
16138
15837
  }
16139
15838
  for (const pluginName of pluginDirs) {
16140
- const pluginPath = path18.join(pluginsDir, pluginName);
15839
+ const pluginPath = path17.join(pluginsDir, pluginName);
16141
15840
  const result = await validatePlugin(pluginPath);
16142
15841
  results.push({ name: pluginName, result });
16143
15842
  }
@@ -16155,6 +15854,179 @@ async function validateAllPlugins(pluginsDir) {
16155
15854
  };
16156
15855
  }
16157
15856
 
15857
+ // src/cli/lib/plugins/plugin-settings.ts
15858
+ import path18 from "path";
15859
+ import { z as z10 } from "zod";
15860
+ var pluginSettingsSchema = z10.object({
15861
+ // The one genuine optional here: a settings.json with no plugin enabled omits the
15862
+ // key entirely, and `getEnabledPluginKeys` says so in its own diagnostic rather than
15863
+ // defaulting it away. `lastUpdated` and `gitCommitSha` used to sit beside the fields
15864
+ // below on the same footing and were decoration — declared, never read, and stripped
15865
+ // by `z.object` either way.
15866
+ enabledPlugins: z10.record(z10.string(), z10.unknown()).exactOptional()
15867
+ }).passthrough();
15868
+ var installationFields = {
15869
+ installPath: z10.string(),
15870
+ version: z10.string(),
15871
+ installedAt: z10.string()
15872
+ };
15873
+ var pluginInstallationSchema = z10.discriminatedUnion("scope", [
15874
+ z10.object({ scope: z10.literal("project"), projectPath: z10.string(), ...installationFields }),
15875
+ z10.object({ scope: z10.literal("user"), ...installationFields }),
15876
+ z10.object({ scope: z10.literal("local"), ...installationFields })
15877
+ ]);
15878
+ var installedPluginsSchema = z10.object({
15879
+ version: z10.number(),
15880
+ plugins: z10.record(z10.string(), z10.array(pluginInstallationSchema))
15881
+ }).passthrough();
15882
+ var SETTINGS_FILE = STANDARD_FILES.SETTINGS_JSON;
15883
+ var INSTALLED_PLUGINS_FILE = "installed_plugins.json";
15884
+ function getInstalledPluginsRegistryPath(pluginsDir) {
15885
+ return path18.join(pluginsDir, INSTALLED_PLUGINS_FILE);
15886
+ }
15887
+ async function listRegisteredPluginInstalls(pluginsDir) {
15888
+ const registryPath = getInstalledPluginsRegistryPath(pluginsDir);
15889
+ const content = await readFileSafe(registryPath, MAX_CONFIG_FILE_SIZE);
15890
+ const raw = JSON.parse(content);
15891
+ const result = installedPluginsSchema.safeParse(raw);
15892
+ if (!result.success) {
15893
+ throw new Error(
15894
+ `Invalid ${INSTALLED_PLUGINS_FILE}: ${formatZodErrors(result.error).join("; ")}`
15895
+ );
15896
+ }
15897
+ return typedEntries(result.data.plugins).flatMap(([pluginKey, installations]) => {
15898
+ const uniquePaths = [...new Set(installations.map((i) => i.installPath))];
15899
+ return uniquePaths.map((installPath) => ({ pluginKey, installPath }));
15900
+ });
15901
+ }
15902
+ async function getEnabledPluginKeys(projectDir) {
15903
+ const settingsPath = path18.join(projectDir, CLAUDE_DIR, SETTINGS_FILE);
15904
+ if (!await fileExists(settingsPath)) {
15905
+ verbose(`No settings.json found at '${settingsPath}'`);
15906
+ return [];
15907
+ }
15908
+ try {
15909
+ const content = await readFileSafe(settingsPath, MAX_CONFIG_FILE_SIZE);
15910
+ const raw = JSON.parse(content);
15911
+ const result = pluginSettingsSchema.safeParse(raw);
15912
+ if (!result.success) {
15913
+ verbose(`Invalid settings.json structure: ${getErrorMessage(result.error)}`);
15914
+ return [];
15915
+ }
15916
+ const settings = result.data;
15917
+ if (!settings.enabledPlugins) {
15918
+ verbose(`No enabledPlugins found in '${settingsPath}'`);
15919
+ return [];
15920
+ }
15921
+ const enabledKeys = typedEntries(settings.enabledPlugins).filter(([, enabled]) => enabled === true).map(([key]) => key);
15922
+ verbose(`Found ${enabledKeys.length} enabled plugins in settings.json`);
15923
+ return enabledKeys;
15924
+ } catch (error) {
15925
+ verbose(`Failed to read settings.json: ${getErrorMessage(error)}`);
15926
+ return [];
15927
+ }
15928
+ }
15929
+ function pickInstallation(installations, projectDir) {
15930
+ return installations.find((i) => i.scope === "project" && i.projectPath === projectDir) ?? installations.find((i) => i.scope === "user");
15931
+ }
15932
+ async function resolvePluginInstallPaths(pluginKeys, projectDir) {
15933
+ if (pluginKeys.length === 0) {
15934
+ return [];
15935
+ }
15936
+ const registryPath = getInstalledPluginsRegistryPath(getUserPluginsDir());
15937
+ if (!await fileExists(registryPath)) {
15938
+ verbose(`Plugin registry not found at '${registryPath}'`);
15939
+ return [];
15940
+ }
15941
+ try {
15942
+ const content = await readFileSafe(registryPath, MAX_CONFIG_FILE_SIZE);
15943
+ const raw = JSON.parse(content);
15944
+ const result = installedPluginsSchema.safeParse(raw);
15945
+ if (!result.success) {
15946
+ verbose(`Invalid plugin registry structure: ${getErrorMessage(result.error)}`);
15947
+ return [];
15948
+ }
15949
+ const registry = result.data;
15950
+ return pluginKeys.flatMap((pluginKey) => {
15951
+ const installations = registry.plugins[pluginKey];
15952
+ if (!installations || installations.length === 0) {
15953
+ verbose(`Plugin '${pluginKey}' not found in registry`);
15954
+ return [];
15955
+ }
15956
+ const picked = pickInstallation(installations, projectDir);
15957
+ if (!picked) {
15958
+ verbose(`No matching installation found for '${pluginKey}'`);
15959
+ return [];
15960
+ }
15961
+ const scopeSuffix = picked.scope === "user" ? " (user scope)" : "";
15962
+ verbose(`Resolved '${pluginKey}' to '${picked.installPath}'${scopeSuffix}`);
15963
+ return [{ pluginKey, installPath: picked.installPath }];
15964
+ });
15965
+ } catch (error) {
15966
+ verbose(`Failed to read plugin registry: ${getErrorMessage(error)}`);
15967
+ return [];
15968
+ }
15969
+ }
15970
+ async function getVerifiedPluginInstallPaths(projectDir) {
15971
+ const enabledKeys = await getEnabledPluginKeys(projectDir);
15972
+ const resolvedPaths = await resolvePluginInstallPaths(enabledKeys, projectDir);
15973
+ const checks = await Promise.all(
15974
+ resolvedPaths.map(async ({ pluginKey, installPath }) => {
15975
+ const pluginJsonPath = getPluginManifestPath(installPath);
15976
+ const manifestExists = await fileExists(pluginJsonPath);
15977
+ if (!manifestExists) {
15978
+ verbose(`Plugin '${pluginKey}' manifest does not exist at: '${pluginJsonPath}'`);
15979
+ }
15980
+ return { pluginKey, installPath, manifestExists };
15981
+ })
15982
+ );
15983
+ const verified = checks.filter((c) => c.manifestExists).map(({ pluginKey, installPath }) => ({ pluginKey, installPath }));
15984
+ verbose(`Verified ${verified.length} plugin install paths`);
15985
+ return verified;
15986
+ }
15987
+
15988
+ // src/cli/lib/plugins/plugin-discovery.ts
15989
+ async function discoverAllPluginSkills(projectDir) {
15990
+ const allSkills2 = {};
15991
+ try {
15992
+ const pluginPaths = await getVerifiedPluginInstallPaths(projectDir);
15993
+ if (pluginPaths.length === 0) {
15994
+ verbose(`No enabled plugins found in settings.json`);
15995
+ return allSkills2;
15996
+ }
15997
+ const perPluginSkills = await Promise.all(
15998
+ pluginPaths.map(async ({ pluginKey, installPath }) => {
15999
+ verbose(`Discovering skills from plugin: '${pluginKey}'`);
16000
+ try {
16001
+ return await loadPluginSkills(installPath);
16002
+ } catch (error) {
16003
+ verbose(`Failed to load skills from '${pluginKey}': ${getErrorMessage(error)}`);
16004
+ return {};
16005
+ }
16006
+ })
16007
+ );
16008
+ for (const pluginSkills of perPluginSkills) {
16009
+ for (const [id, skill] of typedEntries(pluginSkills)) {
16010
+ if (skill) {
16011
+ allSkills2[id] = skill;
16012
+ }
16013
+ }
16014
+ }
16015
+ } catch (error) {
16016
+ verbose(`Plugin discovery failed: ${getErrorMessage(error)}`);
16017
+ }
16018
+ return allSkills2;
16019
+ }
16020
+ async function listPluginNames(projectDir) {
16021
+ try {
16022
+ const pluginPaths = await getVerifiedPluginInstallPaths(projectDir);
16023
+ return pluginPaths.map(({ pluginKey }) => pluginKey);
16024
+ } catch (error) {
16025
+ verbose(`Failed to list plugin names: ${getErrorMessage(error)}`);
16026
+ return [];
16027
+ }
16028
+ }
16029
+
16158
16030
  // src/cli/lib/skills/skill-plugin-compiler.ts
16159
16031
  function sanitizeSkillName(name) {
16160
16032
  return name.replace(/\+/g, "-");
@@ -16602,7 +16474,6 @@ function synthesizeCategory(category, domain) {
16602
16474
  description: `Auto-generated category for ${category}`,
16603
16475
  domain,
16604
16476
  exclusive: false,
16605
- required: false,
16606
16477
  order: AUTO_SYNTH_ORDER
16607
16478
  };
16608
16479
  }
@@ -19007,7 +18878,6 @@ function mergeLocalSkillsIntoMatrix(matrix2, localResult) {
19007
18878
  description: `Local skill category`,
19008
18879
  domain: metadata.domain,
19009
18880
  exclusive: false,
19010
- required: false,
19011
18881
  order: 0
19012
18882
  };
19013
18883
  verbose(`Added local category: ${category} (domain: ${metadata.domain})`);
@@ -19189,17 +19059,17 @@ export {
19189
19059
  getPluginAgentsDir,
19190
19060
  getPluginManifestPath,
19191
19061
  readPluginManifest,
19192
- getInstalledPluginsRegistryPath,
19193
- listRegisteredPluginInstalls,
19194
- getVerifiedPluginInstallPaths,
19195
- discoverAllPluginSkills,
19196
- listPluginNames,
19197
19062
  getInstallationInfo,
19198
19063
  formatInstallationDisplay,
19199
19064
  validateSkillFrontmatter,
19200
19065
  validateAgentFrontmatter,
19201
19066
  validatePlugin,
19202
19067
  validateAllPlugins,
19068
+ getInstalledPluginsRegistryPath,
19069
+ listRegisteredPluginInstalls,
19070
+ getVerifiedPluginInstallPaths,
19071
+ discoverAllPluginSkills,
19072
+ listPluginNames,
19203
19073
  compileSkillPlugin,
19204
19074
  compileAllSkillPlugins,
19205
19075
  printCompilationSummary,
@@ -19238,4 +19108,4 @@ export {
19238
19108
  detectMigrations,
19239
19109
  executeMigration
19240
19110
  };
19241
- //# sourceMappingURL=chunk-V625APR6.js.map
19111
+ //# sourceMappingURL=chunk-OUG6TCQ4.js.map