@agents-inc/cli 0.61.0 → 0.64.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 +36 -0
- package/README.md +23 -172
- package/dist/{chunk-YHOHLNHM.js → chunk-3YNT3NX3.js} +13 -11
- package/dist/chunk-3YNT3NX3.js.map +1 -0
- package/dist/{chunk-IGM6HA3S.js → chunk-4C7CSZC5.js} +27 -149
- package/dist/chunk-4C7CSZC5.js.map +1 -0
- package/dist/{chunk-WHISPMAQ.js → chunk-4KVBH2X4.js} +33 -14
- package/dist/chunk-4KVBH2X4.js.map +1 -0
- package/dist/{chunk-KIWFEBKH.js → chunk-52THXN5G.js} +14 -5
- package/dist/chunk-52THXN5G.js.map +1 -0
- package/dist/{chunk-FWMWWE3X.js → chunk-53URJ5XK.js} +448 -152
- package/dist/chunk-53URJ5XK.js.map +1 -0
- package/dist/{chunk-H5DASUX5.js → chunk-6DEK3TDF.js} +10 -10
- package/dist/chunk-6DEK3TDF.js.map +1 -0
- package/dist/{chunk-SDKCQXWE.js → chunk-6IK2TCK7.js} +13 -6
- package/dist/chunk-6IK2TCK7.js.map +1 -0
- package/dist/chunk-6VIOO74O.js +51 -0
- package/dist/chunk-6VIOO74O.js.map +1 -0
- package/dist/{chunk-52XO4ULK.js → chunk-7DI3HGKL.js} +32 -14
- package/dist/chunk-7DI3HGKL.js.map +1 -0
- package/dist/{chunk-MGNYPVOJ.js → chunk-AQYAVLZK.js} +2 -2
- package/dist/{chunk-BNQ5O6LE.js → chunk-AUNBGZS4.js} +2 -2
- package/dist/chunk-BGPGQF35.js +248 -0
- package/dist/chunk-BGPGQF35.js.map +1 -0
- package/dist/chunk-BKL3DF2Q.js +45 -0
- package/dist/chunk-BKL3DF2Q.js.map +1 -0
- package/dist/{chunk-AX3SZZWA.js → chunk-BKTPEATV.js} +13 -6
- package/dist/chunk-BKTPEATV.js.map +1 -0
- package/dist/{chunk-H7WJK7NJ.js → chunk-CKPJTMNC.js} +13 -6
- package/dist/chunk-CKPJTMNC.js.map +1 -0
- package/dist/{chunk-MR6OBL3B.js → chunk-CXRVM7BA.js} +2 -4
- package/dist/chunk-CXRVM7BA.js.map +1 -0
- package/dist/{chunk-VR3CDXDT.js → chunk-EE5EPS32.js} +2 -2
- package/dist/{chunk-6OWHQ7HM.js → chunk-EGMQ3SXN.js} +2 -11
- package/dist/{chunk-6OWHQ7HM.js.map → chunk-EGMQ3SXN.js.map} +1 -1
- package/dist/{chunk-6DAZG54T.js → chunk-EZ35IPXZ.js} +10 -7
- package/dist/chunk-EZ35IPXZ.js.map +1 -0
- package/dist/{chunk-OCEFD7V6.js → chunk-F3REOP7N.js} +3 -3
- package/dist/{chunk-C577AJE7.js → chunk-FGLUQSVU.js} +3 -3
- package/dist/{chunk-Z3TM4N37.js → chunk-J4POGAJF.js} +24 -24
- package/dist/chunk-J4POGAJF.js.map +1 -0
- package/dist/{chunk-O6BA7Q2B.js → chunk-KFDTVSIC.js} +18 -8
- package/dist/chunk-KFDTVSIC.js.map +1 -0
- package/dist/{chunk-LWXRUR6B.js → chunk-LMZXL5RQ.js} +2 -2
- package/dist/{chunk-LWXRUR6B.js.map → chunk-LMZXL5RQ.js.map} +1 -1
- package/dist/{chunk-7FMEMXJ4.js → chunk-MOMI77PL.js} +100 -59
- package/dist/chunk-MOMI77PL.js.map +1 -0
- package/dist/{chunk-BFD5NZQ4.js → chunk-MVYJVKVT.js} +19 -11
- package/dist/chunk-MVYJVKVT.js.map +1 -0
- package/dist/{chunk-X5EG4EFP.js → chunk-MWGDG4QN.js} +2 -2
- package/dist/{chunk-KDO6WU76.js → chunk-O2HK3NTG.js} +10 -6
- package/dist/chunk-O2HK3NTG.js.map +1 -0
- package/dist/{chunk-46DQG2N7.js → chunk-OORWBS6F.js} +45 -52
- package/dist/chunk-OORWBS6F.js.map +1 -0
- package/dist/{chunk-CIG7IKX3.js → chunk-OV5UJWS5.js} +4 -4
- package/dist/{chunk-IEEVXLJB.js → chunk-R46CB36B.js} +5 -5
- package/dist/{chunk-GH2RQ4MI.js → chunk-RG3KDXMR.js} +16 -8
- package/dist/chunk-RG3KDXMR.js.map +1 -0
- package/dist/{chunk-MMFQNJPE.js → chunk-SXGBPQY6.js} +3 -3
- package/dist/chunk-SXGBPQY6.js.map +1 -0
- package/dist/{chunk-XUDTFI4M.js → chunk-T5DJCIUP.js} +2 -2
- package/dist/{chunk-AJJJE7F7.js → chunk-TQLDQ3XZ.js} +2 -2
- package/dist/{chunk-M6YWRMXH.js → chunk-WSMQ5GAP.js} +33 -21
- package/dist/chunk-WSMQ5GAP.js.map +1 -0
- package/dist/{chunk-WYVDNGJB.js → chunk-XMLCXRTS.js} +3 -3
- package/dist/{chunk-SDLDPFNV.js → chunk-YEGPTBX5.js} +4 -4
- package/dist/{chunk-SRBN6RRD.js → chunk-ZFY5EMDV.js} +5 -5
- package/dist/{chunk-BKJHAJQW.js → chunk-ZYUASJUN.js} +7 -4
- package/dist/chunk-ZYUASJUN.js.map +1 -0
- package/dist/commands/build/marketplace.js +4 -4
- package/dist/commands/build/plugins.js +7 -6
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +7 -6
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +11 -80
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +7 -6
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +6 -5
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/show.js +7 -6
- package/dist/commands/diff.js +6 -5
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +11 -15
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +63 -69
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +13 -13
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +7 -6
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +14 -16
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +32 -30
- package/dist/commands/list.js +6 -5
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +7 -6
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +28 -11
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +7 -6
- package/dist/commands/outdated.js +6 -5
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +13 -11
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +9 -10
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +12 -8
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +20 -42
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/skill-search/skill-search.js +4 -3
- package/dist/components/wizard/category-grid.js +5 -3
- package/dist/components/wizard/category-grid.test.js +242 -194
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +5 -5
- package/dist/components/wizard/checkbox-grid.test.js +5 -5
- package/dist/components/wizard/domain-selection.js +12 -11
- package/dist/components/wizard/help-modal.js +3 -2
- package/dist/components/wizard/menu-item.js +1 -1
- package/dist/components/wizard/search-modal.js +3 -2
- package/dist/components/wizard/search-modal.test.js +3 -2
- package/dist/components/wizard/search-modal.test.js.map +1 -1
- package/dist/components/wizard/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +3 -3
- package/dist/components/wizard/section-progress.test.js.map +1 -1
- package/dist/components/wizard/selection-card.js +2 -2
- package/dist/components/wizard/source-grid.js +6 -4
- package/dist/components/wizard/source-grid.test.js +65 -40
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +9 -8
- package/dist/components/wizard/step-agents.js +11 -10
- package/dist/components/wizard/step-agents.test.js +28 -25
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +12 -10
- package/dist/components/wizard/step-build.test.js +28 -34
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +6 -4
- package/dist/components/wizard/step-confirm.test.js +11 -15
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +3 -2
- package/dist/components/wizard/step-refine.test.js +3 -2
- package/dist/components/wizard/step-refine.test.js.map +1 -1
- package/dist/components/wizard/step-settings.js +10 -8
- package/dist/components/wizard/step-settings.test.js +17 -13
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +13 -11
- package/dist/components/wizard/step-sources.test.js +17 -14
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +15 -14
- package/dist/components/wizard/step-stack.test.js +42 -38
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +2 -2
- package/dist/components/wizard/wizard-layout.js +10 -8
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard-tabs.test.js +2 -2
- package/dist/components/wizard/wizard.js +29 -27
- package/dist/hooks/init.js +32 -30
- package/dist/hooks/init.js.map +1 -1
- package/dist/{loader-2O32KKAQ.js → loader-4YOZCFIP.js} +4 -4
- package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
- package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
- package/dist/{source-loader-KMEBBZCQ.js → source-loader-O5RMYUBW.js} +6 -5
- package/dist/{source-manager-5XBSPJNR.js → source-manager-NKLL6HCL.js} +6 -5
- package/dist/stores/matrix-store.js +15 -0
- package/dist/stores/matrix-store.js.map +1 -0
- package/dist/stores/matrix-store.test.js +146 -0
- package/dist/stores/matrix-store.test.js.map +1 -0
- package/dist/stores/wizard-store.js +6 -5
- package/dist/stores/wizard-store.test.js +159 -107
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-46DQG2N7.js.map +0 -1
- package/dist/chunk-52XO4ULK.js.map +0 -1
- package/dist/chunk-6DAZG54T.js.map +0 -1
- package/dist/chunk-7FMEMXJ4.js.map +0 -1
- package/dist/chunk-AX3SZZWA.js.map +0 -1
- package/dist/chunk-BFD5NZQ4.js.map +0 -1
- package/dist/chunk-BKJHAJQW.js.map +0 -1
- package/dist/chunk-FWMWWE3X.js.map +0 -1
- package/dist/chunk-GH2RQ4MI.js.map +0 -1
- package/dist/chunk-H5DASUX5.js.map +0 -1
- package/dist/chunk-H7WJK7NJ.js.map +0 -1
- package/dist/chunk-IGM6HA3S.js.map +0 -1
- package/dist/chunk-KD2YS76O.js +0 -151
- package/dist/chunk-KD2YS76O.js.map +0 -1
- package/dist/chunk-KDO6WU76.js.map +0 -1
- package/dist/chunk-KIWFEBKH.js.map +0 -1
- package/dist/chunk-M6YWRMXH.js.map +0 -1
- package/dist/chunk-MMFQNJPE.js.map +0 -1
- package/dist/chunk-MR6OBL3B.js.map +0 -1
- package/dist/chunk-O6BA7Q2B.js.map +0 -1
- package/dist/chunk-SDKCQXWE.js.map +0 -1
- package/dist/chunk-WHISPMAQ.js.map +0 -1
- package/dist/chunk-YHOHLNHM.js.map +0 -1
- package/dist/chunk-Z3TM4N37.js.map +0 -1
- /package/dist/{chunk-MGNYPVOJ.js.map → chunk-AQYAVLZK.js.map} +0 -0
- /package/dist/{chunk-BNQ5O6LE.js.map → chunk-AUNBGZS4.js.map} +0 -0
- /package/dist/{chunk-VR3CDXDT.js.map → chunk-EE5EPS32.js.map} +0 -0
- /package/dist/{chunk-OCEFD7V6.js.map → chunk-F3REOP7N.js.map} +0 -0
- /package/dist/{chunk-C577AJE7.js.map → chunk-FGLUQSVU.js.map} +0 -0
- /package/dist/{chunk-X5EG4EFP.js.map → chunk-MWGDG4QN.js.map} +0 -0
- /package/dist/{chunk-CIG7IKX3.js.map → chunk-OV5UJWS5.js.map} +0 -0
- /package/dist/{chunk-IEEVXLJB.js.map → chunk-R46CB36B.js.map} +0 -0
- /package/dist/{chunk-XUDTFI4M.js.map → chunk-T5DJCIUP.js.map} +0 -0
- /package/dist/{chunk-AJJJE7F7.js.map → chunk-TQLDQ3XZ.js.map} +0 -0
- /package/dist/{chunk-WYVDNGJB.js.map → chunk-XMLCXRTS.js.map} +0 -0
- /package/dist/{chunk-SDLDPFNV.js.map → chunk-YEGPTBX5.js.map} +0 -0
- /package/dist/{chunk-SRBN6RRD.js.map → chunk-ZFY5EMDV.js.map} +0 -0
- /package/dist/{loader-2O32KKAQ.js.map → loader-4YOZCFIP.js.map} +0 -0
- /package/dist/{source-loader-KMEBBZCQ.js.map → source-loader-O5RMYUBW.js.map} +0 -0
- /package/dist/{source-manager-5XBSPJNR.js.map → source-manager-NKLL6HCL.js.map} +0 -0
package/dist/commands/init.js
CHANGED
|
@@ -4,43 +4,45 @@ import {
|
|
|
4
4
|
formatDashboardText,
|
|
5
5
|
getDashboardData,
|
|
6
6
|
showDashboard
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-MMFQNJPE.js";
|
|
7
|
+
} from "../chunk-3YNT3NX3.js";
|
|
8
|
+
import "../chunk-OORWBS6F.js";
|
|
9
|
+
import "../chunk-4KVBH2X4.js";
|
|
10
|
+
import "../chunk-SXGBPQY6.js";
|
|
11
|
+
import "../chunk-RG3KDXMR.js";
|
|
12
|
+
import "../chunk-WSMQ5GAP.js";
|
|
14
13
|
import "../chunk-HGTC76BX.js";
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
14
|
+
import "../chunk-6DEK3TDF.js";
|
|
15
|
+
import "../chunk-EZ35IPXZ.js";
|
|
16
|
+
import "../chunk-J4POGAJF.js";
|
|
17
|
+
import "../chunk-BGPGQF35.js";
|
|
17
18
|
import "../chunk-K77I4XGL.js";
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
19
|
+
import "../chunk-52THXN5G.js";
|
|
20
|
+
import "../chunk-7DI3HGKL.js";
|
|
21
|
+
import "../chunk-MWGDG4QN.js";
|
|
22
|
+
import "../chunk-KFDTVSIC.js";
|
|
20
23
|
import "../chunk-7SOPVGDV.js";
|
|
21
|
-
import "../chunk-
|
|
24
|
+
import "../chunk-6IK2TCK7.js";
|
|
22
25
|
import "../chunk-KUV24B5M.js";
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-X5EG4EFP.js";
|
|
25
|
-
import "../chunk-H7WJK7NJ.js";
|
|
26
|
+
import "../chunk-CKPJTMNC.js";
|
|
26
27
|
import "../chunk-GG4BSB6S.js";
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-
|
|
30
|
-
import "../chunk-
|
|
31
|
-
import "../chunk-
|
|
32
|
-
import "../chunk-
|
|
33
|
-
import "../chunk-
|
|
34
|
-
import "../chunk-
|
|
35
|
-
import "../chunk-XUDTFI4M.js";
|
|
28
|
+
import "../chunk-O2HK3NTG.js";
|
|
29
|
+
import "../chunk-ZYUASJUN.js";
|
|
30
|
+
import "../chunk-OV5UJWS5.js";
|
|
31
|
+
import "../chunk-XMLCXRTS.js";
|
|
32
|
+
import "../chunk-AQYAVLZK.js";
|
|
33
|
+
import "../chunk-AUNBGZS4.js";
|
|
34
|
+
import "../chunk-4C7CSZC5.js";
|
|
35
|
+
import "../chunk-T5DJCIUP.js";
|
|
36
36
|
import "../chunk-U3IGFMCY.js";
|
|
37
|
-
import "../chunk-
|
|
38
|
-
import "../chunk-
|
|
39
|
-
import "../chunk-
|
|
37
|
+
import "../chunk-6VIOO74O.js";
|
|
38
|
+
import "../chunk-CXRVM7BA.js";
|
|
39
|
+
import "../chunk-53URJ5XK.js";
|
|
40
|
+
import "../chunk-F3REOP7N.js";
|
|
40
41
|
import "../chunk-T4EXUIBY.js";
|
|
41
|
-
import "../chunk-
|
|
42
|
-
import "../chunk-
|
|
43
|
-
import "../chunk-
|
|
42
|
+
import "../chunk-BKL3DF2Q.js";
|
|
43
|
+
import "../chunk-EE5EPS32.js";
|
|
44
|
+
import "../chunk-LMZXL5RQ.js";
|
|
45
|
+
import "../chunk-EGMQ3SXN.js";
|
|
44
46
|
import "../chunk-EC3UJRKZ.js";
|
|
45
47
|
import "../chunk-DHET7RCE.js";
|
|
46
48
|
export {
|
package/dist/commands/list.js
CHANGED
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
import {
|
|
3
3
|
formatInstallationDisplay,
|
|
4
4
|
getInstallationInfo
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-53URJ5XK.js";
|
|
6
|
+
import "../chunk-F3REOP7N.js";
|
|
7
7
|
import "../chunk-T4EXUIBY.js";
|
|
8
|
+
import "../chunk-BKL3DF2Q.js";
|
|
8
9
|
import {
|
|
9
10
|
BaseCommand
|
|
10
|
-
} from "../chunk-
|
|
11
|
-
import "../chunk-
|
|
11
|
+
} from "../chunk-EE5EPS32.js";
|
|
12
|
+
import "../chunk-LMZXL5RQ.js";
|
|
12
13
|
import {
|
|
13
14
|
CLI_BIN_NAME,
|
|
14
15
|
DEFAULT_BRANDING
|
|
15
|
-
} from "../chunk-
|
|
16
|
+
} from "../chunk-EGMQ3SXN.js";
|
|
16
17
|
import "../chunk-EC3UJRKZ.js";
|
|
17
18
|
import {
|
|
18
19
|
init_esm_shims
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/list.ts"],"sourcesContent":["import { BaseCommand } from \"../base-command.js\";\nimport { CLI_BIN_NAME, DEFAULT_BRANDING } from \"../consts.js\";\nimport { getInstallationInfo, formatInstallationDisplay } from \"../lib/plugins/index.js\";\n\nexport default class List extends BaseCommand {\n static summary = \"Show installation information\";\n static description = `Display details about the ${DEFAULT_BRANDING.NAME} installation (local or plugin mode)`;\n static aliases = [\"ls\"];\n\n static examples = [\n {\n description: \"Show current installation details\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n async run(): Promise<void> {\n await this.parse(List);\n\n const info = await getInstallationInfo();\n\n if (!info) {\n this.log(\"No installation found.\");\n this.log(`Run '${CLI_BIN_NAME} init' to create one.`);\n return;\n }\n\n this.log(\"\");\n this.log(formatInstallationDisplay(info));\n this.log(\"\");\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/list.ts"],"sourcesContent":["import { BaseCommand } from \"../base-command.js\";\nimport { CLI_BIN_NAME, DEFAULT_BRANDING } from \"../consts.js\";\nimport { getInstallationInfo, formatInstallationDisplay } from \"../lib/plugins/index.js\";\n\nexport default class List extends BaseCommand {\n static summary = \"Show installation information\";\n static description = `Display details about the ${DEFAULT_BRANDING.NAME} installation (local or plugin mode)`;\n static aliases = [\"ls\"];\n\n static examples = [\n {\n description: \"Show current installation details\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n async run(): Promise<void> {\n await this.parse(List);\n\n const info = await getInstallationInfo();\n\n if (!info) {\n this.log(\"No installation found.\");\n this.log(`Run '${CLI_BIN_NAME} init' to create one.`);\n return;\n }\n\n this.log(\"\");\n this.log(formatInstallationDisplay(info));\n this.log(\"\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAIA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc,6BAA6B,iBAAiB,IAAI;AAAA,EACvE,OAAO,UAAU,CAAC,IAAI;AAAA,EAEtB,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,KAAI;AAErB,UAAM,OAAO,MAAM,oBAAoB;AAEvC,QAAI,CAAC,MAAM;AACT,WAAK,IAAI,wBAAwB;AACjC,WAAK,IAAI,QAAQ,YAAY,uBAAuB;AACpD;AAAA,IACF;AAEA,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,0BAA0B,IAAI,CAAC;AACxC,SAAK,IAAI,EAAE;AAAA,EACb;AACF;","names":[]}
|
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getAgentDefinitions
|
|
4
|
-
} from "../../chunk-
|
|
4
|
+
} from "../../chunk-ZFY5EMDV.js";
|
|
5
5
|
import {
|
|
6
6
|
isClaudeCLIAvailable,
|
|
7
7
|
loadConfigTypesDataInBackground,
|
|
8
8
|
regenerateConfigTypes,
|
|
9
9
|
resolveSource
|
|
10
|
-
} from "../../chunk-
|
|
11
|
-
import "../../chunk-
|
|
10
|
+
} from "../../chunk-53URJ5XK.js";
|
|
11
|
+
import "../../chunk-F3REOP7N.js";
|
|
12
12
|
import "../../chunk-T4EXUIBY.js";
|
|
13
|
+
import "../../chunk-BKL3DF2Q.js";
|
|
13
14
|
import {
|
|
14
15
|
BaseCommand,
|
|
15
16
|
EXIT_CODES
|
|
16
|
-
} from "../../chunk-
|
|
17
|
+
} from "../../chunk-EE5EPS32.js";
|
|
17
18
|
import {
|
|
18
19
|
fileExists,
|
|
19
20
|
getErrorMessage,
|
|
20
21
|
readFile
|
|
21
|
-
} from "../../chunk-
|
|
22
|
+
} from "../../chunk-LMZXL5RQ.js";
|
|
22
23
|
import {
|
|
23
24
|
CLAUDE_DIR,
|
|
24
25
|
CLI_COLORS,
|
|
25
26
|
STANDARD_FILES
|
|
26
|
-
} from "../../chunk-
|
|
27
|
+
} from "../../chunk-EGMQ3SXN.js";
|
|
27
28
|
import "../../chunk-EC3UJRKZ.js";
|
|
28
29
|
import {
|
|
29
30
|
init_esm_shims
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/new/agent.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { Args, Flags } from \"@oclif/core\";\nimport { TextInput } from \"@inkjs/ui\";\nimport { spawn } from \"child_process\";\nimport matter from \"gray-matter\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { CLAUDE_DIR, CLI_COLORS, STANDARD_FILES } from \"../../consts.js\";\nimport { getAgentDefinitions } from \"../../lib/agents/index.js\";\nimport { resolveSource } from \"../../lib/configuration/index.js\";\nimport {\n loadConfigTypesDataInBackground,\n regenerateConfigTypes,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { isClaudeCLIAvailable } from \"../../utils/exec.js\";\nimport { fileExists, readFile } from \"../../utils/fs.js\";\n\nconst META_AGENT_NAME = \"agent-summoner\";\nconst SEPARATOR_WIDTH = 60;\n\ntype NewAgentInput = {\n description: string;\n prompt: string;\n model?: string;\n tools?: string[];\n};\n\ntype PurposeInputProps = {\n onSubmit: (purpose: string) => void;\n onCancel: () => void;\n};\n\nconst PurposeInput: React.FC<PurposeInputProps> = ({ onSubmit, onCancel }) => {\n const { exit } = useApp();\n const [error, setError] = useState<string | null>(null);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n exit();\n }\n });\n\n const handleSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Purpose is required\");\n return;\n }\n onSubmit(trimmed);\n exit();\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Create New Agent</Text>\n <Text>What should this agent do?</Text>\n <Text dimColor>e.g., Manages database migrations with rollback support</Text>\n <Text> </Text>\n <TextInput placeholder=\"Enter agent purpose...\" onSubmit={handleSubmit} />\n {error && (\n <Box marginTop={1}>\n <Text color={CLI_COLORS.ERROR}>{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nfunction parseCompiledAgent(content: string): NewAgentInput {\n const { data: frontmatter, content: body } = matter(content);\n const tools =\n typeof frontmatter.tools === \"string\"\n ? frontmatter.tools.split(\",\").map((t: string) => t.trim())\n : frontmatter.tools;\n\n return {\n description: frontmatter.description || \"Creates new agents\",\n prompt: body.trim(),\n model: frontmatter.model,\n tools,\n };\n}\n\nasync function loadMetaAgent(\n projectDir: string,\n source: string,\n forceRefresh: boolean,\n): Promise<NewAgentInput> {\n const compiledFileName = `${META_AGENT_NAME}.md`;\n\n // Check for compiled agent in the current project\n const localAgentPath = path.join(projectDir, CLAUDE_DIR, \"agents\", compiledFileName);\n if (await fileExists(localAgentPath)) {\n return parseCompiledAgent(await readFile(localAgentPath));\n }\n\n // Fall back to remote source (may not have agents)\n try {\n const agentPaths = await getAgentDefinitions(source, { forceRefresh, projectDir });\n const remoteAgentPath = path.join(\n agentPaths.sourcePath,\n CLAUDE_DIR,\n \"agents\",\n compiledFileName,\n );\n if (await fileExists(remoteAgentPath)) {\n return parseCompiledAgent(await readFile(remoteAgentPath));\n }\n } catch {\n // Source does not contain agents — fall through to error\n }\n\n throw new Error(\n `Agent '${META_AGENT_NAME}' not found.\\n\\n` + `Run 'compile' first to generate agents.`,\n );\n}\n\nexport function buildAgentPrompt(agentName: string, purpose: string, outputDir: string): string {\n return `Create a new Claude Code agent named \"${agentName}\" in the directory \"${outputDir}\".\n\nAgent Purpose: ${purpose}\n\nRequirements:\n1. Create the agent directory structure at ${outputDir}/${agentName}/\n2. Create metadata.yaml with appropriate configuration\n3. Create intro.md with the agent's role and context\n4. Create workflow.md with the agent's operational process\n5. Optionally create examples.md if relevant examples would help\n6. Optionally create critical-requirements.md for important rules\n7. Include \\`custom: true\\` in the metadata.yaml configuration\n\nFollow the existing agent patterns in the codebase. Keep the agent focused and practical.`;\n}\n\nasync function invokeMetaAgent(\n agentDef: NewAgentInput,\n prompt: string,\n nonInteractive: boolean,\n): Promise<void> {\n const agentsJson = JSON.stringify({\n [META_AGENT_NAME]: {\n description: agentDef.description,\n prompt: agentDef.prompt,\n model: agentDef.model,\n tools: agentDef.tools,\n },\n });\n\n const args = [\"--agents\", agentsJson, \"--agent\", META_AGENT_NAME];\n\n if (nonInteractive) {\n args.push(\"-p\", prompt);\n } else {\n args.push(\"--prompt\", prompt);\n }\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"claude\", args, {\n stdio: \"inherit\",\n });\n\n child.on(\"error\", (error) => {\n reject(new Error(`Failed to spawn claude CLI: ${error.message}`));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Claude CLI exited with code ${code}`));\n }\n });\n });\n}\n\nexport default class NewAgent extends BaseCommand {\n static summary = \"Create a new custom agent using AI generation\";\n static description =\n \"Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.\";\n\n static args = {\n name: Args.string({\n description: \"Name of the agent to create\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n purpose: Flags.string({\n char: \"p\",\n description: \"Purpose/description of the agent\",\n required: false,\n }),\n \"non-interactive\": Flags.boolean({\n char: \"n\",\n description: \"Run in non-interactive mode\",\n default: false,\n }),\n refresh: Flags.boolean({\n char: \"r\",\n description: \"Force refresh remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewAgent);\n const projectDir = process.cwd();\n\n // Kick off background loading for config-types.ts regeneration (non-blocking)\n const configTypesReady = loadConfigTypesDataInBackground(flags.source, projectDir);\n\n const cliAvailable = await isClaudeCLIAvailable();\n if (!cliAvailable) {\n this.error(\n \"Claude CLI not found. Please install it first:\\n\" +\n \" npm install -g @anthropic-ai/claude-code\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n let purpose = flags.purpose;\n\n if (!purpose) {\n let inputResult: string | null = null;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <PurposeInput\n onSubmit={(value) => {\n inputResult = value;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled || !inputResult) {\n this.log(\"Cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n purpose = inputResult;\n }\n\n const outputDir = path.join(projectDir, CLAUDE_DIR, \"agents\", \"_custom\");\n\n this.log(\"\");\n this.log(`Agent name: ${args.name}`);\n this.log(`Purpose: ${purpose}`);\n this.log(`Output: ${outputDir}`);\n this.log(\"\");\n\n this.log(\"Fetching agent-summoner from source...\");\n\n try {\n const sourceConfig = await resolveSource(flags.source, projectDir);\n const agentDef = await loadMetaAgent(projectDir, sourceConfig.source, flags.refresh);\n this.log(\"Meta-agent loaded\");\n this.log(\"\");\n\n const agentPrompt = buildAgentPrompt(args.name, purpose, outputDir);\n\n this.log(\"Invoking agent-summoner to create your agent...\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.log(\"\");\n\n await invokeMetaAgent(agentDef, agentPrompt, flags[\"non-interactive\"]);\n\n // Regenerate config-types.ts to include the new agent\n try {\n await regenerateConfigTypes(projectDir, configTypesReady, {\n extraAgentNames: [args.name],\n });\n } catch (error) {\n this.warn(`Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`);\n }\n\n this.log(\"\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.logSuccess(\"Agent creation complete!\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/new/agent.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { Args, Flags } from \"@oclif/core\";\nimport { TextInput } from \"@inkjs/ui\";\nimport { spawn } from \"child_process\";\nimport matter from \"gray-matter\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { CLAUDE_DIR, CLI_COLORS, STANDARD_FILES } from \"../../consts.js\";\nimport { getAgentDefinitions } from \"../../lib/agents/index.js\";\nimport { resolveSource } from \"../../lib/configuration/index.js\";\nimport {\n loadConfigTypesDataInBackground,\n regenerateConfigTypes,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { isClaudeCLIAvailable } from \"../../utils/exec.js\";\nimport { fileExists, readFile } from \"../../utils/fs.js\";\n\nconst META_AGENT_NAME = \"agent-summoner\";\nconst SEPARATOR_WIDTH = 60;\n\ntype NewAgentInput = {\n description: string;\n prompt: string;\n model?: string;\n tools?: string[];\n};\n\ntype PurposeInputProps = {\n onSubmit: (purpose: string) => void;\n onCancel: () => void;\n};\n\nconst PurposeInput: React.FC<PurposeInputProps> = ({ onSubmit, onCancel }) => {\n const { exit } = useApp();\n const [error, setError] = useState<string | null>(null);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n exit();\n }\n });\n\n const handleSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Purpose is required\");\n return;\n }\n onSubmit(trimmed);\n exit();\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Create New Agent</Text>\n <Text>What should this agent do?</Text>\n <Text dimColor>e.g., Manages database migrations with rollback support</Text>\n <Text> </Text>\n <TextInput placeholder=\"Enter agent purpose...\" onSubmit={handleSubmit} />\n {error && (\n <Box marginTop={1}>\n <Text color={CLI_COLORS.ERROR}>{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nfunction parseCompiledAgent(content: string): NewAgentInput {\n const { data: frontmatter, content: body } = matter(content);\n const tools =\n typeof frontmatter.tools === \"string\"\n ? frontmatter.tools.split(\",\").map((t: string) => t.trim())\n : frontmatter.tools;\n\n return {\n description: frontmatter.description || \"Creates new agents\",\n prompt: body.trim(),\n model: frontmatter.model,\n tools,\n };\n}\n\nasync function loadMetaAgent(\n projectDir: string,\n source: string,\n forceRefresh: boolean,\n): Promise<NewAgentInput> {\n const compiledFileName = `${META_AGENT_NAME}.md`;\n\n // Check for compiled agent in the current project\n const localAgentPath = path.join(projectDir, CLAUDE_DIR, \"agents\", compiledFileName);\n if (await fileExists(localAgentPath)) {\n return parseCompiledAgent(await readFile(localAgentPath));\n }\n\n // Fall back to remote source (may not have agents)\n try {\n const agentPaths = await getAgentDefinitions(source, { forceRefresh, projectDir });\n const remoteAgentPath = path.join(\n agentPaths.sourcePath,\n CLAUDE_DIR,\n \"agents\",\n compiledFileName,\n );\n if (await fileExists(remoteAgentPath)) {\n return parseCompiledAgent(await readFile(remoteAgentPath));\n }\n } catch {\n // Source does not contain agents — fall through to error\n }\n\n throw new Error(\n `Agent '${META_AGENT_NAME}' not found.\\n\\n` + `Run 'compile' first to generate agents.`,\n );\n}\n\nexport function buildAgentPrompt(agentName: string, purpose: string, outputDir: string): string {\n return `Create a new Claude Code agent named \"${agentName}\" in the directory \"${outputDir}\".\n\nAgent Purpose: ${purpose}\n\nRequirements:\n1. Create the agent directory structure at ${outputDir}/${agentName}/\n2. Create metadata.yaml with appropriate configuration\n3. Create intro.md with the agent's role and context\n4. Create workflow.md with the agent's operational process\n5. Optionally create examples.md if relevant examples would help\n6. Optionally create critical-requirements.md for important rules\n7. Include \\`custom: true\\` in the metadata.yaml configuration\n\nFollow the existing agent patterns in the codebase. Keep the agent focused and practical.`;\n}\n\nasync function invokeMetaAgent(\n agentDef: NewAgentInput,\n prompt: string,\n nonInteractive: boolean,\n): Promise<void> {\n const agentsJson = JSON.stringify({\n [META_AGENT_NAME]: {\n description: agentDef.description,\n prompt: agentDef.prompt,\n model: agentDef.model,\n tools: agentDef.tools,\n },\n });\n\n const args = [\"--agents\", agentsJson, \"--agent\", META_AGENT_NAME];\n\n if (nonInteractive) {\n args.push(\"-p\", prompt);\n } else {\n args.push(\"--prompt\", prompt);\n }\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"claude\", args, {\n stdio: \"inherit\",\n });\n\n child.on(\"error\", (error) => {\n reject(new Error(`Failed to spawn claude CLI: ${error.message}`));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Claude CLI exited with code ${code}`));\n }\n });\n });\n}\n\nexport default class NewAgent extends BaseCommand {\n static summary = \"Create a new custom agent using AI generation\";\n static description =\n \"Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.\";\n\n static args = {\n name: Args.string({\n description: \"Name of the agent to create\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n purpose: Flags.string({\n char: \"p\",\n description: \"Purpose/description of the agent\",\n required: false,\n }),\n \"non-interactive\": Flags.boolean({\n char: \"n\",\n description: \"Run in non-interactive mode\",\n default: false,\n }),\n refresh: Flags.boolean({\n char: \"r\",\n description: \"Force refresh remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewAgent);\n const projectDir = process.cwd();\n\n // Kick off background loading for config-types.ts regeneration (non-blocking)\n const configTypesReady = loadConfigTypesDataInBackground(flags.source, projectDir);\n\n const cliAvailable = await isClaudeCLIAvailable();\n if (!cliAvailable) {\n this.error(\n \"Claude CLI not found. Please install it first:\\n\" +\n \" npm install -g @anthropic-ai/claude-code\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n let purpose = flags.purpose;\n\n if (!purpose) {\n let inputResult: string | null = null;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <PurposeInput\n onSubmit={(value) => {\n inputResult = value;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled || !inputResult) {\n this.log(\"Cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n purpose = inputResult;\n }\n\n const outputDir = path.join(projectDir, CLAUDE_DIR, \"agents\", \"_custom\");\n\n this.log(\"\");\n this.log(`Agent name: ${args.name}`);\n this.log(`Purpose: ${purpose}`);\n this.log(`Output: ${outputDir}`);\n this.log(\"\");\n\n this.log(\"Fetching agent-summoner from source...\");\n\n try {\n const sourceConfig = await resolveSource(flags.source, projectDir);\n const agentDef = await loadMetaAgent(projectDir, sourceConfig.source, flags.refresh);\n this.log(\"Meta-agent loaded\");\n this.log(\"\");\n\n const agentPrompt = buildAgentPrompt(args.name, purpose, outputDir);\n\n this.log(\"Invoking agent-summoner to create your agent...\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.log(\"\");\n\n await invokeMetaAgent(agentDef, agentPrompt, flags[\"non-interactive\"]);\n\n // Regenerate config-types.ts to include the new agent\n try {\n await regenerateConfigTypes(projectDir, configTypesReady, {\n extraAgentNames: [args.name],\n });\n } catch (error) {\n this.warn(`Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`);\n }\n\n this.log(\"\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.logSuccess(\"Agent creation complete!\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,32 +2,34 @@
|
|
|
2
2
|
import {
|
|
3
3
|
generateSkillCategoriesTs,
|
|
4
4
|
generateSkillRulesTs
|
|
5
|
-
} from "../../chunk-
|
|
5
|
+
} from "../../chunk-R46CB36B.js";
|
|
6
6
|
import {
|
|
7
7
|
generateMarketplace,
|
|
8
8
|
writeMarketplace
|
|
9
|
-
} from "../../chunk-
|
|
9
|
+
} from "../../chunk-FGLUQSVU.js";
|
|
10
10
|
import {
|
|
11
11
|
LOCAL_DEFAULTS,
|
|
12
12
|
compileAllSkillPlugins,
|
|
13
|
+
generateConfigSource,
|
|
13
14
|
loadConfigTypesDataInBackground,
|
|
14
|
-
regenerateConfigTypes
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
import "../../chunk-OCEFD7V6.js";
|
|
15
|
+
regenerateConfigTypes
|
|
16
|
+
} from "../../chunk-53URJ5XK.js";
|
|
17
|
+
import "../../chunk-F3REOP7N.js";
|
|
18
18
|
import "../../chunk-T4EXUIBY.js";
|
|
19
|
+
import "../../chunk-BKL3DF2Q.js";
|
|
19
20
|
import {
|
|
20
21
|
BaseCommand,
|
|
21
22
|
EXIT_CODES
|
|
22
|
-
} from "../../chunk-
|
|
23
|
+
} from "../../chunk-EE5EPS32.js";
|
|
23
24
|
import {
|
|
24
25
|
directoryExists,
|
|
25
26
|
ensureDir,
|
|
26
27
|
extendSchemasWithCustomValues,
|
|
27
28
|
getErrorMessage,
|
|
28
29
|
writeFile
|
|
29
|
-
} from "../../chunk-
|
|
30
|
+
} from "../../chunk-LMZXL5RQ.js";
|
|
30
31
|
import {
|
|
32
|
+
CLAUDE_SRC_DIR,
|
|
31
33
|
CLI_BIN_NAME,
|
|
32
34
|
KEBAB_CASE_PATTERN,
|
|
33
35
|
PLUGIN_MANIFEST_DIR,
|
|
@@ -36,7 +38,7 @@ import {
|
|
|
36
38
|
SKILL_RULES_PATH,
|
|
37
39
|
STACKS_FILE_PATH,
|
|
38
40
|
STANDARD_FILES
|
|
39
|
-
} from "../../chunk-
|
|
41
|
+
} from "../../chunk-EGMQ3SXN.js";
|
|
40
42
|
import "../../chunk-EC3UJRKZ.js";
|
|
41
43
|
import {
|
|
42
44
|
init_esm_shims
|
|
@@ -211,10 +213,25 @@ Use --force to overwrite.`, {
|
|
|
211
213
|
const readmeContent = generateReadme(marketplaceName);
|
|
212
214
|
const readmePath = path.join(marketplaceDir, "README.md");
|
|
213
215
|
await writeFile(readmePath, readmeContent);
|
|
214
|
-
|
|
216
|
+
const configDir = path.join(marketplaceDir, CLAUDE_SRC_DIR);
|
|
217
|
+
await ensureDir(configDir);
|
|
218
|
+
const configContent = generateConfigSource({
|
|
219
|
+
name: marketplaceName,
|
|
220
|
+
skills: [{ id: skillName, scope: "project", source: "local" }],
|
|
221
|
+
agents: [],
|
|
215
222
|
source: ".",
|
|
216
|
-
marketplace: marketplaceName
|
|
223
|
+
marketplace: marketplaceName,
|
|
224
|
+
stack: {
|
|
225
|
+
["web-developer"]: {
|
|
226
|
+
[LOCAL_DEFAULTS.CATEGORY]: [{ id: skillName }]
|
|
227
|
+
}
|
|
228
|
+
}
|
|
217
229
|
});
|
|
230
|
+
const marketplaceComment = "// Marketplaces house skills only \u2014 agents are defined by consumer projects.\n\n";
|
|
231
|
+
await writeFile(
|
|
232
|
+
path.join(configDir, STANDARD_FILES.CONFIG_TS),
|
|
233
|
+
marketplaceComment + configContent
|
|
234
|
+
);
|
|
218
235
|
this.log("");
|
|
219
236
|
this.logSuccess(`Created ${STACKS_FILE_PATH}`);
|
|
220
237
|
this.logSuccess(`Created ${SKILL_CATEGORIES_PATH}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/new/marketplace.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { writeFile, directoryExists, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport {\n CLI_BIN_NAME,\n KEBAB_CASE_PATTERN,\n PLUGIN_MANIFEST_DIR,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STACKS_FILE_PATH,\n STANDARD_FILES,\n} from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { compileAllSkillPlugins } from \"../../lib/skills/skill-plugin-compiler.js\";\nimport {\n loadConfigTypesDataInBackground,\n regenerateConfigTypes,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { saveProjectConfig } from \"../../lib/configuration/config.js\";\nimport { generateMarketplace, writeMarketplace } from \"../../lib/marketplace-generator.js\";\nimport { extendSchemasWithCustomValues } from \"../../lib/schemas.js\";\nimport { generateSkillCategoriesTs, generateSkillRulesTs } from \"./skill.js\";\nimport type { CategoryPath } from \"../../types/index.js\";\n\nexport function validateMarketplaceName(name: string): string | null {\n if (!name || name.trim() === \"\") {\n return \"Marketplace name is required\";\n }\n\n if (!KEBAB_CASE_PATTERN.test(name)) {\n return \"Marketplace name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)\";\n }\n\n return null;\n}\n\nexport function generateStacksTs(name: string): string {\n const data = {\n stacks: [\n {\n id: \"dummy-stack\",\n name: \"Dummy Stack\",\n description: `Default stack for ${name}`,\n agents: {\n \"web-developer\": {\n \"dummy-category\": \"dummy-skill\",\n },\n },\n philosophy: \"Ship fast, iterate faster\",\n },\n ],\n };\n const body = JSON.stringify(data, null, 2);\n return `// Stack definitions for ${name}\\nexport default ${body};\\n`;\n}\n\nexport function generateReadme(name: string): string {\n return `# ${name}\n\nPrivate marketplace for custom skills and stacks.\n\n## Directory Structure\n\n\\`\\`\\`\n${STACKS_FILE_PATH} # Stack definitions (agent groupings with skill mappings)\n${SKILLS_DIR_PATH}/ # Custom skill definitions\n\\`\\`\\`\n\n## Creating Skills\n\n\\`\\`\\`bash\n${CLI_BIN_NAME} new skill <name> --category <category-name>\n\\`\\`\\`\n\nEach skill lives in \\`${SKILLS_DIR_PATH}/<skill-name>/\\` with:\n- \\`${STANDARD_FILES.SKILL_MD}\\` -- Skill content (what the skill teaches)\n- \\`${STANDARD_FILES.METADATA_YAML}\\` -- Skill metadata (category, author, description, custom: true)\n\n## Using This Marketplace\n\nPoint the CLI at this marketplace as a source:\n\n\\`\\`\\`bash\n# Local development\n${CLI_BIN_NAME} init --source /path/to/${name}\n\n# From a git repository\n${CLI_BIN_NAME} init --source github:your-org/${name}\n\\`\\`\\`\n\n## How It Works\n\nThe CLI auto-discovers skills from the \\`${SKILLS_DIR_PATH}/\\` directory\nand stacks from \\`${STACKS_FILE_PATH}\\`.\nCustom categories are discovered from skill \\`${STANDARD_FILES.METADATA_YAML}\\` files with \\`custom: true\\`.\nCustom skills appear alongside built-in ones in the wizard. No manual registration needed.\n`;\n}\n\nexport default class NewMarketplace extends BaseCommand {\n static summary = \"Scaffold a new private marketplace project\";\n static description =\n \"Create a new private marketplace directory with the required structure \" +\n \"for custom skills and stacks.\";\n\n static examples = [\n {\n description: \"Create a new marketplace\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills\",\n },\n {\n description: \"Initialize the current directory as a marketplace\",\n command: \"<%= config.bin %> <%= command.id %> .\",\n },\n {\n description: \"Create in a specific location\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills --output ~/projects\",\n },\n {\n description: \"Overwrite an existing directory\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills --force\",\n },\n ];\n\n static args = {\n name: Args.string({\n description:\n 'Name of the marketplace directory (kebab-case), or \".\" to use the current directory',\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing directory\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Parent directory to create the marketplace in (default: current directory)\",\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewMarketplace);\n\n this.log(\"\");\n this.log(\"Create New Marketplace\");\n this.log(\"\");\n\n const parentDir = flags.output ? path.resolve(flags.output) : process.cwd();\n const useCurrentDir = args.name === \".\";\n\n const marketplaceName = useCurrentDir ? path.basename(parentDir) : args.name;\n const marketplaceDir = useCurrentDir ? parentDir : path.join(parentDir, args.name);\n\n const validationError = validateMarketplaceName(marketplaceName);\n if (validationError) {\n if (useCurrentDir) {\n this.error(\n `Current directory name '${marketplaceName}' is not valid kebab-case. Rename it or pass an explicit name.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n // Skip existing directory check when using \".\" (the directory obviously exists)\n if (!useCurrentDir && (await directoryExists(marketplaceDir))) {\n if (!flags.force) {\n this.error(`Directory already exists: ${marketplaceDir}\\nUse --force to overwrite.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n this.warn(`Overwriting existing directory at ${marketplaceDir}`);\n }\n\n this.log(`Marketplace: ${marketplaceName}`);\n this.log(`Directory: ${marketplaceDir}`);\n this.log(\"\");\n\n const skillName = \"dummy-skill\";\n\n this.log(\"Creating marketplace structure...\");\n\n try {\n // Create config/stacks.ts\n const stacksContent = generateStacksTs(marketplaceName);\n const stacksPath = path.join(marketplaceDir, STACKS_FILE_PATH);\n await ensureDir(path.dirname(stacksPath));\n await writeFile(stacksPath, stacksContent);\n\n // Create config/skill-categories.ts\n const categoriesContent = generateSkillCategoriesTs(\n LOCAL_DEFAULTS.CATEGORY as CategoryPath,\n LOCAL_DEFAULTS.DOMAIN,\n );\n const categoriesPath = path.join(marketplaceDir, SKILL_CATEGORIES_PATH);\n await writeFile(categoriesPath, categoriesContent);\n\n // Create config/skill-rules.ts\n const rulesContent = generateSkillRulesTs();\n const rulesPath = path.join(marketplaceDir, SKILL_RULES_PATH);\n await writeFile(rulesPath, rulesContent);\n\n // Delegate skill creation to the new:skill command\n const skillsDir = path.join(marketplaceDir, SKILLS_DIR_PATH);\n\n const skillArgs = [skillName, \"--output\", skillsDir, \"--domain\", LOCAL_DEFAULTS.DOMAIN];\n if (flags.force) skillArgs.push(\"--force\");\n await this.config.runCommand(\"new:skill\", skillArgs);\n\n // Create README.md\n const readmeContent = generateReadme(marketplaceName);\n const readmePath = path.join(marketplaceDir, \"README.md\");\n await writeFile(readmePath, readmeContent);\n\n // Create .claude-src/config.ts so the marketplace is a valid installation\n await saveProjectConfig(marketplaceDir, {\n source: \".\",\n marketplace: marketplaceName,\n });\n\n this.log(\"\");\n this.logSuccess(`Created ${STACKS_FILE_PATH}`);\n this.logSuccess(`Created ${SKILL_CATEGORIES_PATH}`);\n this.logSuccess(`Created ${SKILL_RULES_PATH}`);\n this.logSuccess(\"Created README.md\");\n this.logSuccess(\"Created .claude-src/config.ts\");\n this.log(\"\");\n\n // Build plugins and marketplace.json so the marketplace is immediately valid\n await this.buildMarketplace(marketplaceDir, marketplaceName);\n\n this.log(\"Marketplace created successfully!\");\n this.log(\"\");\n this.log(\"Next steps:\");\n if (!useCurrentDir) {\n this.log(` 1. cd ${marketplaceName}`);\n }\n this.log(\n ` ${useCurrentDir ? \"1\" : \"2\"}. ${CLI_BIN_NAME} new skill <name> --category <category-name>`,\n );\n this.log(` ${useCurrentDir ? \"2\" : \"3\"}. Push to a git repository`);\n this.log(\n ` ${useCurrentDir ? \"3\" : \"4\"}. ${CLI_BIN_NAME} init --source github:your-org/${marketplaceName}`,\n );\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async buildMarketplace(marketplaceDir: string, marketplaceName: string): Promise<void> {\n const skillsDir = path.resolve(marketplaceDir, SKILLS_DIR_PATH);\n const pluginsOutputDir = path.resolve(marketplaceDir, \"dist/plugins\");\n const marketplaceOutputPath = path.resolve(\n marketplaceDir,\n PLUGIN_MANIFEST_DIR,\n \"marketplace.json\",\n );\n\n try {\n // Register custom values so schema validation accepts marketplace-specific domains/categories\n extendSchemasWithCustomValues({\n categories: [LOCAL_DEFAULTS.CATEGORY],\n domains: [LOCAL_DEFAULTS.DOMAIN],\n });\n\n this.log(\"Building plugins...\");\n const results = await compileAllSkillPlugins(skillsDir, pluginsOutputDir);\n this.logSuccess(`Built ${results.length} skill plugins.`);\n\n this.log(\"Generating marketplace.json...\");\n const marketplace = await generateMarketplace(pluginsOutputDir, {\n name: marketplaceName,\n ownerName: marketplaceName,\n pluginRoot: \"./dist/plugins\",\n });\n await writeMarketplace(marketplaceOutputPath, marketplace);\n this.logSuccess(\n `Generated ${PLUGIN_MANIFEST_DIR}/marketplace.json with ${marketplace.plugins.length} plugins.`,\n );\n\n this.log(\"Generating config-types.ts...\");\n const configTypesData = loadConfigTypesDataInBackground(marketplaceDir, marketplaceDir);\n await regenerateConfigTypes(marketplaceDir, configTypesData);\n this.logSuccess(\"Generated .claude-src/config-types.ts\");\n } catch (error) {\n this.warn(`Build step failed: ${getErrorMessage(error)}`);\n this.warn(\n \"The scaffold is still valid. Run 'build plugins' and 'build marketplace' manually.\",\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/new/marketplace.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { writeFile, directoryExists, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport {\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n KEBAB_CASE_PATTERN,\n PLUGIN_MANIFEST_DIR,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STACKS_FILE_PATH,\n STANDARD_FILES,\n} from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { compileAllSkillPlugins } from \"../../lib/skills/skill-plugin-compiler.js\";\nimport {\n loadConfigTypesDataInBackground,\n regenerateConfigTypes,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { generateConfigSource } from \"../../lib/configuration/config-writer.js\";\nimport { generateMarketplace, writeMarketplace } from \"../../lib/marketplace-generator.js\";\nimport { extendSchemasWithCustomValues } from \"../../lib/schemas.js\";\nimport { generateSkillCategoriesTs, generateSkillRulesTs } from \"./skill.js\";\nimport type { AgentName, Category, CategoryPath, SkillId } from \"../../types/index.js\";\n\nexport function validateMarketplaceName(name: string): string | null {\n if (!name || name.trim() === \"\") {\n return \"Marketplace name is required\";\n }\n\n if (!KEBAB_CASE_PATTERN.test(name)) {\n return \"Marketplace name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)\";\n }\n\n return null;\n}\n\nexport function generateStacksTs(name: string): string {\n const data = {\n stacks: [\n {\n id: \"dummy-stack\",\n name: \"Dummy Stack\",\n description: `Default stack for ${name}`,\n agents: {\n \"web-developer\": {\n \"dummy-category\": \"dummy-skill\",\n },\n },\n philosophy: \"Ship fast, iterate faster\",\n },\n ],\n };\n const body = JSON.stringify(data, null, 2);\n return `// Stack definitions for ${name}\\nexport default ${body};\\n`;\n}\n\nexport function generateReadme(name: string): string {\n return `# ${name}\n\nPrivate marketplace for custom skills and stacks.\n\n## Directory Structure\n\n\\`\\`\\`\n${STACKS_FILE_PATH} # Stack definitions (agent groupings with skill mappings)\n${SKILLS_DIR_PATH}/ # Custom skill definitions\n\\`\\`\\`\n\n## Creating Skills\n\n\\`\\`\\`bash\n${CLI_BIN_NAME} new skill <name> --category <category-name>\n\\`\\`\\`\n\nEach skill lives in \\`${SKILLS_DIR_PATH}/<skill-name>/\\` with:\n- \\`${STANDARD_FILES.SKILL_MD}\\` -- Skill content (what the skill teaches)\n- \\`${STANDARD_FILES.METADATA_YAML}\\` -- Skill metadata (category, author, description, custom: true)\n\n## Using This Marketplace\n\nPoint the CLI at this marketplace as a source:\n\n\\`\\`\\`bash\n# Local development\n${CLI_BIN_NAME} init --source /path/to/${name}\n\n# From a git repository\n${CLI_BIN_NAME} init --source github:your-org/${name}\n\\`\\`\\`\n\n## How It Works\n\nThe CLI auto-discovers skills from the \\`${SKILLS_DIR_PATH}/\\` directory\nand stacks from \\`${STACKS_FILE_PATH}\\`.\nCustom categories are discovered from skill \\`${STANDARD_FILES.METADATA_YAML}\\` files with \\`custom: true\\`.\nCustom skills appear alongside built-in ones in the wizard. No manual registration needed.\n`;\n}\n\nexport default class NewMarketplace extends BaseCommand {\n static summary = \"Scaffold a new private marketplace project\";\n static description =\n \"Create a new private marketplace directory with the required structure \" +\n \"for custom skills and stacks.\";\n\n static examples = [\n {\n description: \"Create a new marketplace\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills\",\n },\n {\n description: \"Initialize the current directory as a marketplace\",\n command: \"<%= config.bin %> <%= command.id %> .\",\n },\n {\n description: \"Create in a specific location\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills --output ~/projects\",\n },\n {\n description: \"Overwrite an existing directory\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills --force\",\n },\n ];\n\n static args = {\n name: Args.string({\n description:\n 'Name of the marketplace directory (kebab-case), or \".\" to use the current directory',\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing directory\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Parent directory to create the marketplace in (default: current directory)\",\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewMarketplace);\n\n this.log(\"\");\n this.log(\"Create New Marketplace\");\n this.log(\"\");\n\n const parentDir = flags.output ? path.resolve(flags.output) : process.cwd();\n const useCurrentDir = args.name === \".\";\n\n const marketplaceName = useCurrentDir ? path.basename(parentDir) : args.name;\n const marketplaceDir = useCurrentDir ? parentDir : path.join(parentDir, args.name);\n\n const validationError = validateMarketplaceName(marketplaceName);\n if (validationError) {\n if (useCurrentDir) {\n this.error(\n `Current directory name '${marketplaceName}' is not valid kebab-case. Rename it or pass an explicit name.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n // Skip existing directory check when using \".\" (the directory obviously exists)\n if (!useCurrentDir && (await directoryExists(marketplaceDir))) {\n if (!flags.force) {\n this.error(`Directory already exists: ${marketplaceDir}\\nUse --force to overwrite.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n this.warn(`Overwriting existing directory at ${marketplaceDir}`);\n }\n\n this.log(`Marketplace: ${marketplaceName}`);\n this.log(`Directory: ${marketplaceDir}`);\n this.log(\"\");\n\n const skillName = \"dummy-skill\";\n\n this.log(\"Creating marketplace structure...\");\n\n try {\n // Create config/stacks.ts\n const stacksContent = generateStacksTs(marketplaceName);\n const stacksPath = path.join(marketplaceDir, STACKS_FILE_PATH);\n await ensureDir(path.dirname(stacksPath));\n await writeFile(stacksPath, stacksContent);\n\n // Create config/skill-categories.ts\n const categoriesContent = generateSkillCategoriesTs(\n LOCAL_DEFAULTS.CATEGORY as CategoryPath,\n LOCAL_DEFAULTS.DOMAIN,\n );\n const categoriesPath = path.join(marketplaceDir, SKILL_CATEGORIES_PATH);\n await writeFile(categoriesPath, categoriesContent);\n\n // Create config/skill-rules.ts\n const rulesContent = generateSkillRulesTs();\n const rulesPath = path.join(marketplaceDir, SKILL_RULES_PATH);\n await writeFile(rulesPath, rulesContent);\n\n // Delegate skill creation to the new:skill command\n const skillsDir = path.join(marketplaceDir, SKILLS_DIR_PATH);\n\n const skillArgs = [skillName, \"--output\", skillsDir, \"--domain\", LOCAL_DEFAULTS.DOMAIN];\n if (flags.force) skillArgs.push(\"--force\");\n await this.config.runCommand(\"new:skill\", skillArgs);\n\n // Create README.md\n const readmeContent = generateReadme(marketplaceName);\n const readmePath = path.join(marketplaceDir, \"README.md\");\n await writeFile(readmePath, readmeContent);\n\n // Create .claude-src/config.ts so the marketplace is a valid installation\n const configDir = path.join(marketplaceDir, CLAUDE_SRC_DIR);\n await ensureDir(configDir);\n // Boundary cast: custom marketplace skill/agent/category not in standard unions\n const configContent = generateConfigSource({\n name: marketplaceName,\n skills: [{ id: skillName as SkillId, scope: \"project\", source: \"local\" }],\n agents: [],\n source: \".\",\n marketplace: marketplaceName,\n stack: {\n [\"web-developer\" as AgentName]: {\n [LOCAL_DEFAULTS.CATEGORY as Category]: [{ id: skillName as SkillId }],\n },\n },\n });\n const marketplaceComment =\n \"// Marketplaces house skills only — agents are defined by consumer projects.\\n\\n\";\n await writeFile(\n path.join(configDir, STANDARD_FILES.CONFIG_TS),\n marketplaceComment + configContent,\n );\n\n this.log(\"\");\n this.logSuccess(`Created ${STACKS_FILE_PATH}`);\n this.logSuccess(`Created ${SKILL_CATEGORIES_PATH}`);\n this.logSuccess(`Created ${SKILL_RULES_PATH}`);\n this.logSuccess(\"Created README.md\");\n this.logSuccess(\"Created .claude-src/config.ts\");\n this.log(\"\");\n\n // Build plugins and marketplace.json so the marketplace is immediately valid\n await this.buildMarketplace(marketplaceDir, marketplaceName);\n\n this.log(\"Marketplace created successfully!\");\n this.log(\"\");\n this.log(\"Next steps:\");\n if (!useCurrentDir) {\n this.log(` 1. cd ${marketplaceName}`);\n }\n this.log(\n ` ${useCurrentDir ? \"1\" : \"2\"}. ${CLI_BIN_NAME} new skill <name> --category <category-name>`,\n );\n this.log(` ${useCurrentDir ? \"2\" : \"3\"}. Push to a git repository`);\n this.log(\n ` ${useCurrentDir ? \"3\" : \"4\"}. ${CLI_BIN_NAME} init --source github:your-org/${marketplaceName}`,\n );\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async buildMarketplace(marketplaceDir: string, marketplaceName: string): Promise<void> {\n const skillsDir = path.resolve(marketplaceDir, SKILLS_DIR_PATH);\n const pluginsOutputDir = path.resolve(marketplaceDir, \"dist/plugins\");\n const marketplaceOutputPath = path.resolve(\n marketplaceDir,\n PLUGIN_MANIFEST_DIR,\n \"marketplace.json\",\n );\n\n try {\n // Register custom values so schema validation accepts marketplace-specific domains/categories\n extendSchemasWithCustomValues({\n categories: [LOCAL_DEFAULTS.CATEGORY],\n domains: [LOCAL_DEFAULTS.DOMAIN],\n });\n\n this.log(\"Building plugins...\");\n const results = await compileAllSkillPlugins(skillsDir, pluginsOutputDir);\n this.logSuccess(`Built ${results.length} skill plugins.`);\n\n this.log(\"Generating marketplace.json...\");\n const marketplace = await generateMarketplace(pluginsOutputDir, {\n name: marketplaceName,\n ownerName: marketplaceName,\n pluginRoot: \"./dist/plugins\",\n });\n await writeMarketplace(marketplaceOutputPath, marketplace);\n this.logSuccess(\n `Generated ${PLUGIN_MANIFEST_DIR}/marketplace.json with ${marketplace.plugins.length} plugins.`,\n );\n\n this.log(\"Generating config-types.ts...\");\n const configTypesData = loadConfigTypesDataInBackground(marketplaceDir, marketplaceDir);\n await regenerateConfigTypes(marketplaceDir, configTypesData);\n this.logSuccess(\"Generated .claude-src/config-types.ts\");\n } catch (error) {\n this.warn(`Build step failed: ${getErrorMessage(error)}`);\n this.warn(\n \"The scaffold is still valid. Run 'build plugins' and 'build marketplace' manually.\",\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -7,13 +7,14 @@ import {
|
|
|
7
7
|
generateSkillRulesTs,
|
|
8
8
|
toTitleCase,
|
|
9
9
|
validateSkillName
|
|
10
|
-
} from "../../chunk-
|
|
11
|
-
import "../../chunk-
|
|
12
|
-
import "../../chunk-
|
|
10
|
+
} from "../../chunk-R46CB36B.js";
|
|
11
|
+
import "../../chunk-53URJ5XK.js";
|
|
12
|
+
import "../../chunk-F3REOP7N.js";
|
|
13
13
|
import "../../chunk-T4EXUIBY.js";
|
|
14
|
-
import "../../chunk-
|
|
15
|
-
import "../../chunk-
|
|
16
|
-
import "../../chunk-
|
|
14
|
+
import "../../chunk-BKL3DF2Q.js";
|
|
15
|
+
import "../../chunk-EE5EPS32.js";
|
|
16
|
+
import "../../chunk-LMZXL5RQ.js";
|
|
17
|
+
import "../../chunk-EGMQ3SXN.js";
|
|
17
18
|
import "../../chunk-EC3UJRKZ.js";
|
|
18
19
|
import "../../chunk-DHET7RCE.js";
|
|
19
20
|
export {
|
|
@@ -3,23 +3,24 @@ import {
|
|
|
3
3
|
compareLocalSkillsWithSource,
|
|
4
4
|
detectInstallation,
|
|
5
5
|
loadSkillsMatrixFromSource
|
|
6
|
-
} from "../chunk-
|
|
7
|
-
import "../chunk-
|
|
6
|
+
} from "../chunk-53URJ5XK.js";
|
|
7
|
+
import "../chunk-F3REOP7N.js";
|
|
8
8
|
import {
|
|
9
9
|
typedEntries
|
|
10
10
|
} from "../chunk-T4EXUIBY.js";
|
|
11
|
+
import "../chunk-BKL3DF2Q.js";
|
|
11
12
|
import {
|
|
12
13
|
BaseCommand,
|
|
13
14
|
EXIT_CODES
|
|
14
|
-
} from "../chunk-
|
|
15
|
+
} from "../chunk-EE5EPS32.js";
|
|
15
16
|
import {
|
|
16
17
|
fileExists,
|
|
17
18
|
getErrorMessage
|
|
18
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-LMZXL5RQ.js";
|
|
19
20
|
import {
|
|
20
21
|
CLI_BIN_NAME,
|
|
21
22
|
LOCAL_SKILLS_PATH
|
|
22
|
-
} from "../chunk-
|
|
23
|
+
} from "../chunk-EGMQ3SXN.js";
|
|
23
24
|
import "../chunk-EC3UJRKZ.js";
|
|
24
25
|
import {
|
|
25
26
|
init_esm_shims
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/outdated.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport path from \"path\";\nimport { countBy } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { detectInstallation } from \"../lib/installation/index.js\";\nimport { compareLocalSkillsWithSource, type SkillComparisonResult } from \"../lib/skills/index.js\";\nimport { fileExists } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport { typedEntries } from \"../utils/typed-object.js\";\n\ntype ComparisonSummary = {\n outdated: number;\n current: number;\n localOnly: number;\n};\n\nfunction calculateSummary(results: SkillComparisonResult[]): ComparisonSummary {\n const counts = countBy(results, (r) => r.status);\n return {\n outdated: counts[\"outdated\"] ?? 0,\n current: counts[\"current\"] ?? 0,\n localOnly: counts[\"local-only\"] ?? 0,\n };\n}\n\nfunction formatHash(hash: string | null, isLocal: boolean): string {\n if (hash === null) {\n return isLocal ? \"(local)\" : \"-\";\n }\n return hash;\n}\n\nexport default class Outdated extends BaseCommand {\n static summary = \"Check which local skills are out of date compared to source\";\n static description =\n \"Compare local skills against their source repository to identify outdated skills that need updating\";\n\n static examples = [\n {\n description: \"Check for outdated skills\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Output results as JSON\",\n command: \"<%= config.bin %> <%= command.id %> --json\",\n },\n {\n description: \"Check against a custom source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n json: Flags.boolean({\n description: \"Output results as JSON\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Outdated);\n const installation = await detectInstallation();\n const projectDir = installation?.projectDir ?? process.cwd();\n\n try {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n if (!(await fileExists(localSkillsPath))) {\n if (flags.json) {\n this.log(\n JSON.stringify({\n skills: [],\n summary: { outdated: 0, current: 0, localOnly: 0 },\n }),\n );\n } else {\n this.warn(\n `No local skills found. Run \\`${CLI_BIN_NAME} init\\` or \\`${CLI_BIN_NAME} edit\\` first.`,\n );\n }\n return;\n }\n\n if (!flags.json) {\n this.log(\"Loading skills...\");\n }\n\n const { matrix, sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n\n if (!flags.json) {\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n }\n\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of typedEntries(matrix.skills)) {\n if (!skill) continue;\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n\n const results = await compareLocalSkillsWithSource(projectDir, sourcePath, sourceSkills);\n const summary = calculateSummary(results);\n\n if (flags.json) {\n this.log(\n JSON.stringify(\n {\n skills: results.map((r) => ({\n id: r.id,\n localHash: r.localHash,\n sourceHash: r.sourceHash,\n status: r.status,\n })),\n summary: {\n outdated: summary.outdated,\n current: summary.current,\n localOnly: summary.localOnly,\n },\n },\n null,\n 2,\n ),\n );\n } else {\n this.log(\"\");\n if (results.length === 0) {\n this.logInfo(\"No local skills found to compare.\");\n } else {\n printTable({\n data: results.map((result) => ({\n skill: result.id,\n localHash: formatHash(result.localHash, true),\n sourceHash: formatHash(result.sourceHash, false),\n status: result.status,\n })),\n columns: [\n { key: \"skill\", name: \"Skill\" },\n { key: \"localHash\", name: \"Local Hash\" },\n { key: \"sourceHash\", name: \"Source Hash\" },\n { key: \"status\", name: \"Status\" },\n ],\n headerOptions: { bold: true },\n });\n\n this.log(\"\");\n\n const parts: string[] = [];\n if (summary.outdated > 0) {\n parts.push(`${summary.outdated} outdated`);\n }\n if (summary.current > 0) {\n parts.push(`${summary.current} current`);\n }\n if (summary.localOnly > 0) {\n parts.push(`${summary.localOnly} local-only`);\n }\n this.log(`Summary: ${parts.join(\", \")}`);\n }\n this.log(\"\");\n }\n\n if (summary.outdated > 0) {\n this.error(\"Some skills are outdated\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n\n if (flags.json) {\n this.error(JSON.stringify({ error: message }), {\n exit: EXIT_CODES.ERROR,\n });\n } else {\n this.error(`Error: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/outdated.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport path from \"path\";\nimport { countBy } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { detectInstallation } from \"../lib/installation/index.js\";\nimport { compareLocalSkillsWithSource, type SkillComparisonResult } from \"../lib/skills/index.js\";\nimport { fileExists } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport { typedEntries } from \"../utils/typed-object.js\";\n\ntype ComparisonSummary = {\n outdated: number;\n current: number;\n localOnly: number;\n};\n\nfunction calculateSummary(results: SkillComparisonResult[]): ComparisonSummary {\n const counts = countBy(results, (r) => r.status);\n return {\n outdated: counts[\"outdated\"] ?? 0,\n current: counts[\"current\"] ?? 0,\n localOnly: counts[\"local-only\"] ?? 0,\n };\n}\n\nfunction formatHash(hash: string | null, isLocal: boolean): string {\n if (hash === null) {\n return isLocal ? \"(local)\" : \"-\";\n }\n return hash;\n}\n\nexport default class Outdated extends BaseCommand {\n static summary = \"Check which local skills are out of date compared to source\";\n static description =\n \"Compare local skills against their source repository to identify outdated skills that need updating\";\n\n static examples = [\n {\n description: \"Check for outdated skills\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Output results as JSON\",\n command: \"<%= config.bin %> <%= command.id %> --json\",\n },\n {\n description: \"Check against a custom source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n json: Flags.boolean({\n description: \"Output results as JSON\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Outdated);\n const installation = await detectInstallation();\n const projectDir = installation?.projectDir ?? process.cwd();\n\n try {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n if (!(await fileExists(localSkillsPath))) {\n if (flags.json) {\n this.log(\n JSON.stringify({\n skills: [],\n summary: { outdated: 0, current: 0, localOnly: 0 },\n }),\n );\n } else {\n this.warn(\n `No local skills found. Run \\`${CLI_BIN_NAME} init\\` or \\`${CLI_BIN_NAME} edit\\` first.`,\n );\n }\n return;\n }\n\n if (!flags.json) {\n this.log(\"Loading skills...\");\n }\n\n const { matrix, sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n\n if (!flags.json) {\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n }\n\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of typedEntries(matrix.skills)) {\n if (!skill) continue;\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n\n const results = await compareLocalSkillsWithSource(projectDir, sourcePath, sourceSkills);\n const summary = calculateSummary(results);\n\n if (flags.json) {\n this.log(\n JSON.stringify(\n {\n skills: results.map((r) => ({\n id: r.id,\n localHash: r.localHash,\n sourceHash: r.sourceHash,\n status: r.status,\n })),\n summary: {\n outdated: summary.outdated,\n current: summary.current,\n localOnly: summary.localOnly,\n },\n },\n null,\n 2,\n ),\n );\n } else {\n this.log(\"\");\n if (results.length === 0) {\n this.logInfo(\"No local skills found to compare.\");\n } else {\n printTable({\n data: results.map((result) => ({\n skill: result.id,\n localHash: formatHash(result.localHash, true),\n sourceHash: formatHash(result.sourceHash, false),\n status: result.status,\n })),\n columns: [\n { key: \"skill\", name: \"Skill\" },\n { key: \"localHash\", name: \"Local Hash\" },\n { key: \"sourceHash\", name: \"Source Hash\" },\n { key: \"status\", name: \"Status\" },\n ],\n headerOptions: { bold: true },\n });\n\n this.log(\"\");\n\n const parts: string[] = [];\n if (summary.outdated > 0) {\n parts.push(`${summary.outdated} outdated`);\n }\n if (summary.current > 0) {\n parts.push(`${summary.current} current`);\n }\n if (summary.localOnly > 0) {\n parts.push(`${summary.localOnly} local-only`);\n }\n this.log(`Summary: ${parts.join(\", \")}`);\n }\n this.log(\"\");\n }\n\n if (summary.outdated > 0) {\n this.error(\"Some skills are outdated\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n\n if (flags.json) {\n this.error(JSON.stringify({ error: message }), {\n exit: EXIT_CODES.ERROR,\n });\n } else {\n this.error(`Error: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/commands/search.js
CHANGED
|
@@ -1,39 +1,41 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SkillSearch
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-MVYJVKVT.js";
|
|
5
|
+
import "../chunk-T5DJCIUP.js";
|
|
6
6
|
import "../chunk-U3IGFMCY.js";
|
|
7
|
+
import "../chunk-6VIOO74O.js";
|
|
7
8
|
import {
|
|
8
9
|
INFO_MESSAGES,
|
|
9
10
|
STATUS_MESSAGES,
|
|
10
11
|
SUCCESS_MESSAGES
|
|
11
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-CXRVM7BA.js";
|
|
12
13
|
import {
|
|
13
14
|
fetchFromSource,
|
|
14
15
|
loadSkillsMatrixFromSource,
|
|
15
16
|
resolveAllSources
|
|
16
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-53URJ5XK.js";
|
|
17
18
|
import {
|
|
18
19
|
parseFrontmatter
|
|
19
|
-
} from "../chunk-
|
|
20
|
+
} from "../chunk-F3REOP7N.js";
|
|
20
21
|
import "../chunk-T4EXUIBY.js";
|
|
22
|
+
import "../chunk-BKL3DF2Q.js";
|
|
21
23
|
import {
|
|
22
24
|
BaseCommand,
|
|
23
25
|
EXIT_CODES
|
|
24
|
-
} from "../chunk-
|
|
26
|
+
} from "../chunk-EE5EPS32.js";
|
|
25
27
|
import {
|
|
26
28
|
copy,
|
|
27
29
|
ensureDir,
|
|
28
30
|
fileExists,
|
|
29
31
|
listDirectories,
|
|
30
32
|
readFile
|
|
31
|
-
} from "../chunk-
|
|
33
|
+
} from "../chunk-LMZXL5RQ.js";
|
|
32
34
|
import {
|
|
33
35
|
DEFAULT_SKILLS_SUBDIR,
|
|
34
36
|
LOCAL_SKILLS_PATH,
|
|
35
37
|
STANDARD_FILES
|
|
36
|
-
} from "../chunk-
|
|
38
|
+
} from "../chunk-EGMQ3SXN.js";
|
|
37
39
|
import "../chunk-EC3UJRKZ.js";
|
|
38
40
|
import {
|
|
39
41
|
init_esm_shims
|
|
@@ -61,7 +63,7 @@ function matchesQuery(skill, query) {
|
|
|
61
63
|
const lowerQuery = query.toLowerCase();
|
|
62
64
|
if (skill.id.toLowerCase().includes(lowerQuery)) return true;
|
|
63
65
|
if (skill.displayName.toLowerCase().includes(lowerQuery)) return true;
|
|
64
|
-
if (skill.slug
|
|
66
|
+
if (skill.slug.toLowerCase().includes(lowerQuery)) return true;
|
|
65
67
|
if (skill.description.toLowerCase().includes(lowerQuery)) return true;
|
|
66
68
|
if (skill.category.toLowerCase().includes(lowerQuery)) return true;
|
|
67
69
|
return skill.tags.some((tag) => tag.toLowerCase().includes(lowerQuery));
|
|
@@ -256,7 +258,7 @@ var Search = class _Search extends BaseCommand {
|
|
|
256
258
|
if (flags.category) {
|
|
257
259
|
results = results.filter((skill) => matchesCategory(skill, flags.category));
|
|
258
260
|
}
|
|
259
|
-
results = sortBy(results, (r) =>
|
|
261
|
+
results = sortBy(results, (r) => r.displayName.toLowerCase());
|
|
260
262
|
this.log("");
|
|
261
263
|
if (results.length === 0) {
|
|
262
264
|
this.warn(`No skills found matching "${query}"`);
|
|
@@ -273,7 +275,7 @@ var Search = class _Search extends BaseCommand {
|
|
|
273
275
|
this.log("");
|
|
274
276
|
printTable({
|
|
275
277
|
data: results.map((skill) => ({
|
|
276
|
-
id: skill.displayName
|
|
278
|
+
id: skill.displayName,
|
|
277
279
|
category: skill.category,
|
|
278
280
|
description: truncate(skill.description, MAX_DESCRIPTION_WIDTH)
|
|
279
281
|
})),
|