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.
- package/CHANGELOG.md +13 -0
- package/dist/{chunk-2Q65K6E3.js → chunk-5K33RJ7Z.js} +10 -10
- package/dist/{chunk-BQJVHD6Y.js → chunk-6CP3CLDE.js} +3 -8
- package/dist/chunk-6CP3CLDE.js.map +1 -0
- package/dist/{chunk-4VMLCWLD.js → chunk-7JQPIMKD.js} +2 -2
- package/dist/{chunk-5YOSLSQJ.js → chunk-C5P7RUDR.js} +3 -3
- package/dist/{chunk-G7TYOPON.js → chunk-CICB4AKA.js} +3 -3
- package/dist/{chunk-FBRLHNUT.js → chunk-CWQLRKWB.js} +3 -3
- package/dist/{chunk-JV4P7BL4.js → chunk-DEWI5HDF.js} +3 -3
- package/dist/{chunk-Z6G24ROK.js → chunk-EPBUWEW4.js} +4 -4
- package/dist/{chunk-IO2DPRDS.js → chunk-GWPKIXBM.js} +2 -2
- package/dist/{chunk-BNHD2GIB.js → chunk-IJ7GWQUR.js} +4 -4
- package/dist/{chunk-4RYWFQK7.js → chunk-IWUFZ6NR.js} +2 -2
- package/dist/{chunk-F35G42TF.js → chunk-J7Q5VYR7.js} +11 -11
- package/dist/{chunk-MPLWPWL4.js → chunk-JQDN7KAZ.js} +2 -2
- package/dist/{chunk-LSSGS2QS.js → chunk-K6MQV6SK.js} +3 -3
- package/dist/{chunk-YVQSDBTK.js → chunk-KCN5N3PB.js} +4 -4
- package/dist/{chunk-WVKGO3Y5.js → chunk-LJ6V54NR.js} +3 -3
- package/dist/{chunk-VCUXNKOY.js → chunk-LX7UXZBN.js} +5 -5
- package/dist/{chunk-VZRO7RYT.js → chunk-OI2H6M5I.js} +1 -103
- package/dist/chunk-OI2H6M5I.js.map +1 -0
- package/dist/{chunk-Z6KROWH4.js → chunk-OJR3ASZI.js} +5 -5
- package/dist/{chunk-V625APR6.js → chunk-OUG6TCQ4.js} +205 -335
- package/dist/chunk-OUG6TCQ4.js.map +1 -0
- package/dist/{chunk-62XKTOUI.js → chunk-PIUCYRLP.js} +5 -15
- package/dist/chunk-PIUCYRLP.js.map +1 -0
- package/dist/{chunk-WVBJRFFM.js → chunk-PWPKZNCV.js} +3 -3
- package/dist/{chunk-SKDTGHCD.js → chunk-Q2HB5SWU.js} +2 -2
- package/dist/{chunk-YAHTF4NO.js → chunk-RJ3JYZJ7.js} +8 -8
- package/dist/chunk-RJ3JYZJ7.js.map +1 -0
- package/dist/{chunk-LVA6XJGR.js → chunk-SLB2SFTX.js} +3 -27
- package/dist/chunk-SLB2SFTX.js.map +1 -0
- package/dist/{chunk-NS5COBTT.js → chunk-VH6P7UGF.js} +3 -3
- package/dist/{chunk-42PQKBVU.js → chunk-VI4X5DN5.js} +4 -4
- package/dist/{chunk-THLQS2AW.js → chunk-XDNGMXOZ.js} +4 -4
- package/dist/{chunk-GPZQCLZJ.js → chunk-XSULY25W.js} +5 -5
- package/dist/{chunk-7Z4N4JWQ.js → chunk-XX657S4U.js} +1 -103
- package/dist/chunk-XX657S4U.js.map +1 -0
- package/dist/commands/build/marketplace.js +6 -6
- package/dist/commands/build/plugins.js +6 -6
- package/dist/commands/compile.js +9 -9
- package/dist/commands/doctor.js +9 -9
- package/dist/commands/edit.js +28 -28
- package/dist/commands/eject.js +9 -9
- package/dist/commands/init.js +28 -28
- package/dist/commands/list.js +7 -7
- package/dist/commands/new/marketplace.js +6 -7
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +9 -9
- package/dist/commands/share.js +7 -7
- package/dist/commands/uninstall.js +9 -9
- package/dist/commands/update.js +5 -5
- package/dist/components/wizard/category-grid.js +2 -2
- package/dist/components/wizard/domain-selection.js +6 -6
- package/dist/components/wizard/run-wizard-session.js +19 -19
- package/dist/components/wizard/skill-agent-summary.js +5 -5
- package/dist/components/wizard/source-grid.js +2 -2
- package/dist/components/wizard/stack-selection.js +5 -5
- package/dist/components/wizard/step-agents.js +6 -6
- package/dist/components/wizard/step-build.js +6 -6
- package/dist/components/wizard/step-confirm.js +8 -8
- package/dist/components/wizard/step-sources.js +6 -6
- package/dist/components/wizard/step-stack.js +6 -6
- package/dist/components/wizard/summary-panel.js +7 -7
- package/dist/components/wizard/wizard-layout.js +8 -8
- package/dist/components/wizard/wizard.js +18 -18
- package/dist/config-exports.js +1 -1
- package/dist/hooks/init.js +28 -28
- package/dist/load-agent-defs-KWHG7P7G.js +13 -0
- package/dist/recompile-project-agents-5FTDDHX7.js +17 -0
- package/dist/{source-loader-CC6ZWKTI.js → source-loader-CDYH2NIM.js} +4 -4
- package/dist/src/agents/_templates/methodologies/anti-over-engineering.liquid +14 -0
- package/dist/src/agents/_templates/methodologies/context-management.liquid +7 -154
- package/dist/src/agents/_templates/methodologies/investigation-requirements.liquid +12 -0
- package/dist/src/agents/_templates/methodologies/success-criteria.liquid +10 -0
- package/dist/stores/wizard-store.js +4 -4
- package/package.json +1 -1
- package/src/agents/_templates/methodologies/anti-over-engineering.liquid +14 -0
- package/src/agents/_templates/methodologies/context-management.liquid +7 -154
- package/src/agents/_templates/methodologies/investigation-requirements.liquid +12 -0
- package/src/agents/_templates/methodologies/success-criteria.liquid +10 -0
- package/dist/chunk-62XKTOUI.js.map +0 -1
- package/dist/chunk-7Z4N4JWQ.js.map +0 -1
- package/dist/chunk-BQJVHD6Y.js.map +0 -1
- package/dist/chunk-LVA6XJGR.js.map +0 -1
- package/dist/chunk-V625APR6.js.map +0 -1
- package/dist/chunk-VZRO7RYT.js.map +0 -1
- package/dist/chunk-YAHTF4NO.js.map +0 -1
- package/dist/load-agent-defs-2H42B2OO.js +0 -13
- package/dist/recompile-project-agents-QIAMBCM4.js +0 -17
- /package/dist/{chunk-2Q65K6E3.js.map → chunk-5K33RJ7Z.js.map} +0 -0
- /package/dist/{chunk-4VMLCWLD.js.map → chunk-7JQPIMKD.js.map} +0 -0
- /package/dist/{chunk-5YOSLSQJ.js.map → chunk-C5P7RUDR.js.map} +0 -0
- /package/dist/{chunk-G7TYOPON.js.map → chunk-CICB4AKA.js.map} +0 -0
- /package/dist/{chunk-FBRLHNUT.js.map → chunk-CWQLRKWB.js.map} +0 -0
- /package/dist/{chunk-JV4P7BL4.js.map → chunk-DEWI5HDF.js.map} +0 -0
- /package/dist/{chunk-Z6G24ROK.js.map → chunk-EPBUWEW4.js.map} +0 -0
- /package/dist/{chunk-IO2DPRDS.js.map → chunk-GWPKIXBM.js.map} +0 -0
- /package/dist/{chunk-BNHD2GIB.js.map → chunk-IJ7GWQUR.js.map} +0 -0
- /package/dist/{chunk-4RYWFQK7.js.map → chunk-IWUFZ6NR.js.map} +0 -0
- /package/dist/{chunk-F35G42TF.js.map → chunk-J7Q5VYR7.js.map} +0 -0
- /package/dist/{chunk-MPLWPWL4.js.map → chunk-JQDN7KAZ.js.map} +0 -0
- /package/dist/{chunk-LSSGS2QS.js.map → chunk-K6MQV6SK.js.map} +0 -0
- /package/dist/{chunk-YVQSDBTK.js.map → chunk-KCN5N3PB.js.map} +0 -0
- /package/dist/{chunk-WVKGO3Y5.js.map → chunk-LJ6V54NR.js.map} +0 -0
- /package/dist/{chunk-VCUXNKOY.js.map → chunk-LX7UXZBN.js.map} +0 -0
- /package/dist/{chunk-Z6KROWH4.js.map → chunk-OJR3ASZI.js.map} +0 -0
- /package/dist/{chunk-WVBJRFFM.js.map → chunk-PWPKZNCV.js.map} +0 -0
- /package/dist/{chunk-SKDTGHCD.js.map → chunk-Q2HB5SWU.js.map} +0 -0
- /package/dist/{chunk-NS5COBTT.js.map → chunk-VH6P7UGF.js.map} +0 -0
- /package/dist/{chunk-42PQKBVU.js.map → chunk-VI4X5DN5.js.map} +0 -0
- /package/dist/{chunk-THLQS2AW.js.map → chunk-XDNGMXOZ.js.map} +0 -0
- /package/dist/{chunk-GPZQCLZJ.js.map → chunk-XSULY25W.js.map} +0 -0
- /package/dist/{load-agent-defs-2H42B2OO.js.map → load-agent-defs-KWHG7P7G.js.map} +0 -0
- /package/dist/{recompile-project-agents-QIAMBCM4.js.map → recompile-project-agents-5FTDDHX7.js.map} +0 -0
- /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-
|
|
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-
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
15673
|
+
const pluginDir = path17.dirname(path17.dirname(manifestPath));
|
|
15975
15674
|
if (manifest.skills && typeof manifest.skills === "string") {
|
|
15976
|
-
const skillsPath =
|
|
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 =
|
|
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 =
|
|
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),
|
|
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 =
|
|
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),
|
|
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(
|
|
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 =
|
|
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-
|
|
19111
|
+
//# sourceMappingURL=chunk-OUG6TCQ4.js.map
|