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.
- package/CHANGELOG.md +34 -0
- package/dist/{chunk-P6OKOH62.js → chunk-4APXK7ZY.js} +2 -2
- package/dist/{chunk-QNAMXQKF.js → chunk-4VVKVOOP.js} +2 -2
- package/dist/{chunk-DAUY2SB3.js → chunk-5K33RJ7Z.js} +70 -25
- package/dist/chunk-5K33RJ7Z.js.map +1 -0
- package/dist/{chunk-G6G2FT2G.js → chunk-5KB4I5J7.js} +2 -5
- package/dist/chunk-5KB4I5J7.js.map +1 -0
- package/dist/{chunk-2PN4QXON.js → chunk-6CP3CLDE.js} +5 -10
- package/dist/chunk-6CP3CLDE.js.map +1 -0
- package/dist/{chunk-TUXXBEBB.js → chunk-7JQPIMKD.js} +3 -3
- package/dist/{chunk-KUZBMEWR.js → chunk-AU5FS3QK.js} +3 -3
- package/dist/{chunk-WMVOJY6V.js → chunk-C5P7RUDR.js} +4 -4
- package/dist/{chunk-H4CL23HG.js → chunk-CICB4AKA.js} +3 -3
- package/dist/{chunk-KVVXINCJ.js → chunk-CWQLRKWB.js} +3 -3
- package/dist/{chunk-L4FHSOL5.js → chunk-DEWI5HDF.js} +5 -5
- package/dist/{chunk-JG3B47P3.js → chunk-EPBUWEW4.js} +8 -8
- package/dist/{chunk-EEAX7E2X.js → chunk-GWPKIXBM.js} +2 -2
- package/dist/{chunk-DP6YQFVO.js → chunk-IJ7GWQUR.js} +5 -5
- package/dist/{chunk-TZRXWFF5.js → chunk-ITEJARWI.js} +3 -3
- package/dist/{chunk-TPQ5M3BW.js → chunk-IWUFZ6NR.js} +3 -3
- package/dist/{chunk-PNRLBPGS.js → chunk-J7Q5VYR7.js} +12 -12
- package/dist/{chunk-4ABNXKAR.js → chunk-JQDN7KAZ.js} +2 -2
- package/dist/{chunk-Q7CAE5NN.js → chunk-K6MQV6SK.js} +3 -3
- package/dist/{chunk-54QLV3OH.js → chunk-KCN5N3PB.js} +34 -6
- package/dist/chunk-KCN5N3PB.js.map +1 -0
- package/dist/{chunk-X52QUV4U.js → chunk-LJ6V54NR.js} +5 -5
- package/dist/{chunk-H25VRR2T.js → chunk-LX7UXZBN.js} +6 -6
- package/dist/{chunk-VZRO7RYT.js → chunk-OI2H6M5I.js} +1 -103
- package/dist/chunk-OI2H6M5I.js.map +1 -0
- package/dist/{chunk-VTIDLRNA.js → chunk-OJIQOVWB.js} +2 -2
- package/dist/{chunk-OQB2CKBT.js → chunk-OJR3ASZI.js} +7 -7
- package/dist/{chunk-3PJLLBUS.js → chunk-OUG6TCQ4.js} +220 -345
- package/dist/chunk-OUG6TCQ4.js.map +1 -0
- package/dist/{chunk-WCZNQECQ.js → chunk-PEHYVSJG.js} +2 -2
- package/dist/{chunk-6DBE562W.js → chunk-PIUCYRLP.js} +5 -15
- package/dist/chunk-PIUCYRLP.js.map +1 -0
- package/dist/{chunk-PZNXBORZ.js → chunk-PWPKZNCV.js} +4 -4
- package/dist/{chunk-SJ4T5YLG.js → chunk-Q2HB5SWU.js} +5 -5
- package/dist/{chunk-H2DHTJKW.js → chunk-RJ3JYZJ7.js} +9 -9
- package/dist/chunk-RJ3JYZJ7.js.map +1 -0
- package/dist/{chunk-DZD25NHW.js → chunk-SITF5EZM.js} +2 -2
- package/dist/{chunk-IK6YOXZH.js → chunk-SLB2SFTX.js} +4 -28
- package/dist/chunk-SLB2SFTX.js.map +1 -0
- package/dist/{chunk-LKI3ENGQ.js → chunk-VH6P7UGF.js} +4 -4
- package/dist/{chunk-3Q2N7CSY.js → chunk-VI4X5DN5.js} +6 -6
- package/dist/{chunk-YXI3BTQQ.js → chunk-X5PLVOJS.js} +2 -2
- package/dist/{chunk-XNYHMRVJ.js → chunk-XDNGMXOZ.js} +4 -4
- package/dist/{chunk-3NBXQSW2.js → chunk-XSULY25W.js} +6 -6
- package/dist/{chunk-7Z4N4JWQ.js → chunk-XX657S4U.js} +1 -103
- package/dist/chunk-XX657S4U.js.map +1 -0
- package/dist/{chunk-4DMFK67G.js → chunk-YKRPWZ3G.js} +2 -2
- package/dist/commands/build/marketplace.js +8 -8
- package/dist/commands/build/plugins.js +8 -8
- package/dist/commands/compile.js +11 -11
- package/dist/commands/doctor.js +13 -13
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +59 -68
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +11 -11
- package/dist/commands/init.js +41 -37
- package/dist/commands/list.js +9 -9
- package/dist/commands/new/marketplace.js +8 -9
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +11 -11
- package/dist/commands/share.js +100 -16
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/uninstall.js +12 -12
- package/dist/commands/update.js +7 -7
- package/dist/components/common/removal-plan-confirm.js +2 -2
- package/dist/components/common/select-list.js +2 -2
- package/dist/components/wizard/category-grid.js +4 -4
- package/dist/components/wizard/checkbox-grid.js +4 -4
- package/dist/components/wizard/domain-selection.js +10 -10
- package/dist/components/wizard/run-wizard-session.js +27 -27
- package/dist/components/wizard/scroll-affordance.js +2 -2
- package/dist/components/wizard/skill-agent-summary.js +6 -6
- package/dist/components/wizard/source-grid.js +5 -5
- package/dist/components/wizard/stack-selection.js +8 -8
- package/dist/components/wizard/step-agents.js +9 -9
- package/dist/components/wizard/step-build.js +8 -8
- package/dist/components/wizard/step-confirm.js +10 -10
- package/dist/components/wizard/step-sources.js +9 -9
- package/dist/components/wizard/step-stack.js +9 -9
- package/dist/components/wizard/summary-panel.js +9 -9
- package/dist/components/wizard/toast.js +2 -2
- package/dist/components/wizard/wizard-layout.js +13 -13
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard.js +26 -26
- package/dist/config-exports.js +1 -1
- package/dist/hooks/init.js +37 -37
- package/dist/load-agent-defs-KWHG7P7G.js +13 -0
- package/dist/recompile-project-agents-5FTDDHX7.js +17 -0
- package/dist/{source-loader-CO2FZ3OO.js → source-loader-CDYH2NIM.js} +5 -5
- 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 +5 -5
- 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/src/schemas/project-source-config.schema.json +0 -3
- package/dist/chunk-2PN4QXON.js.map +0 -1
- package/dist/chunk-3PJLLBUS.js.map +0 -1
- package/dist/chunk-54QLV3OH.js.map +0 -1
- package/dist/chunk-6DBE562W.js.map +0 -1
- package/dist/chunk-7Z4N4JWQ.js.map +0 -1
- package/dist/chunk-DAUY2SB3.js.map +0 -1
- package/dist/chunk-G6G2FT2G.js.map +0 -1
- package/dist/chunk-H2DHTJKW.js.map +0 -1
- package/dist/chunk-IK6YOXZH.js.map +0 -1
- package/dist/chunk-VZRO7RYT.js.map +0 -1
- package/dist/load-agent-defs-2VYAV5GL.js +0 -13
- package/dist/recompile-project-agents-NG5DCPHJ.js +0 -17
- /package/dist/{chunk-P6OKOH62.js.map → chunk-4APXK7ZY.js.map} +0 -0
- /package/dist/{chunk-QNAMXQKF.js.map → chunk-4VVKVOOP.js.map} +0 -0
- /package/dist/{chunk-TUXXBEBB.js.map → chunk-7JQPIMKD.js.map} +0 -0
- /package/dist/{chunk-KUZBMEWR.js.map → chunk-AU5FS3QK.js.map} +0 -0
- /package/dist/{chunk-WMVOJY6V.js.map → chunk-C5P7RUDR.js.map} +0 -0
- /package/dist/{chunk-H4CL23HG.js.map → chunk-CICB4AKA.js.map} +0 -0
- /package/dist/{chunk-KVVXINCJ.js.map → chunk-CWQLRKWB.js.map} +0 -0
- /package/dist/{chunk-L4FHSOL5.js.map → chunk-DEWI5HDF.js.map} +0 -0
- /package/dist/{chunk-JG3B47P3.js.map → chunk-EPBUWEW4.js.map} +0 -0
- /package/dist/{chunk-EEAX7E2X.js.map → chunk-GWPKIXBM.js.map} +0 -0
- /package/dist/{chunk-DP6YQFVO.js.map → chunk-IJ7GWQUR.js.map} +0 -0
- /package/dist/{chunk-TZRXWFF5.js.map → chunk-ITEJARWI.js.map} +0 -0
- /package/dist/{chunk-TPQ5M3BW.js.map → chunk-IWUFZ6NR.js.map} +0 -0
- /package/dist/{chunk-PNRLBPGS.js.map → chunk-J7Q5VYR7.js.map} +0 -0
- /package/dist/{chunk-4ABNXKAR.js.map → chunk-JQDN7KAZ.js.map} +0 -0
- /package/dist/{chunk-Q7CAE5NN.js.map → chunk-K6MQV6SK.js.map} +0 -0
- /package/dist/{chunk-X52QUV4U.js.map → chunk-LJ6V54NR.js.map} +0 -0
- /package/dist/{chunk-H25VRR2T.js.map → chunk-LX7UXZBN.js.map} +0 -0
- /package/dist/{chunk-VTIDLRNA.js.map → chunk-OJIQOVWB.js.map} +0 -0
- /package/dist/{chunk-OQB2CKBT.js.map → chunk-OJR3ASZI.js.map} +0 -0
- /package/dist/{chunk-WCZNQECQ.js.map → chunk-PEHYVSJG.js.map} +0 -0
- /package/dist/{chunk-PZNXBORZ.js.map → chunk-PWPKZNCV.js.map} +0 -0
- /package/dist/{chunk-SJ4T5YLG.js.map → chunk-Q2HB5SWU.js.map} +0 -0
- /package/dist/{chunk-DZD25NHW.js.map → chunk-SITF5EZM.js.map} +0 -0
- /package/dist/{chunk-LKI3ENGQ.js.map → chunk-VH6P7UGF.js.map} +0 -0
- /package/dist/{chunk-3Q2N7CSY.js.map → chunk-VI4X5DN5.js.map} +0 -0
- /package/dist/{chunk-YXI3BTQQ.js.map → chunk-X5PLVOJS.js.map} +0 -0
- /package/dist/{chunk-XNYHMRVJ.js.map → chunk-XDNGMXOZ.js.map} +0 -0
- /package/dist/{chunk-3NBXQSW2.js.map → chunk-XSULY25W.js.map} +0 -0
- /package/dist/{chunk-4DMFK67G.js.map → chunk-YKRPWZ3G.js.map} +0 -0
- /package/dist/{load-agent-defs-2VYAV5GL.js.map → load-agent-defs-KWHG7P7G.js.map} +0 -0
- /package/dist/{recompile-project-agents-NG5DCPHJ.js.map → recompile-project-agents-5FTDDHX7.js.map} +0 -0
- /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-
|
|
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-
|
|
60
|
+
} from "./chunk-5KB4I5J7.js";
|
|
61
61
|
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";
|
|
@@ -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
|
|
1991
|
+
const [own, global] = await Promise.all([
|
|
1992
|
+
loadOwnProjectSourceConfig(projectDir),
|
|
1993
|
+
loadGlobalSourceConfig()
|
|
1994
|
+
]);
|
|
1996
1995
|
return {
|
|
1997
|
-
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
15673
|
+
const pluginDir = path17.dirname(path17.dirname(manifestPath));
|
|
15976
15674
|
if (manifest.skills && typeof manifest.skills === "string") {
|
|
15977
|
-
const skillsPath =
|
|
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 =
|
|
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 =
|
|
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),
|
|
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 =
|
|
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),
|
|
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(
|
|
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 =
|
|
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
|
|
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-
|
|
19111
|
+
//# sourceMappingURL=chunk-OUG6TCQ4.js.map
|