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