agents-inc 0.151.0 → 0.152.1
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 +22 -0
- package/README.md +25 -25
- package/dist/{chunk-YA4QQKKE.js → chunk-5GUOIJSG.js} +3 -7
- package/dist/{chunk-YA4QQKKE.js.map → chunk-5GUOIJSG.js.map} +1 -1
- package/dist/{chunk-44LLPS2N.js → chunk-5UWKOOIS.js} +6 -26
- package/dist/chunk-5UWKOOIS.js.map +1 -0
- package/dist/{chunk-O5ASLZ2K.js → chunk-76ADG7LQ.js} +1 -5
- package/dist/{chunk-O5ASLZ2K.js.map → chunk-76ADG7LQ.js.map} +1 -1
- package/dist/{chunk-WK4J2CHH.js → chunk-BNSRA6HL.js} +13 -18
- package/dist/{chunk-WK4J2CHH.js.map → chunk-BNSRA6HL.js.map} +1 -1
- package/dist/{chunk-FYPUUYSG.js → chunk-DTSG5XZB.js} +3 -7
- package/dist/{chunk-FYPUUYSG.js.map → chunk-DTSG5XZB.js.map} +1 -1
- package/dist/{chunk-NGLQ5W7U.js → chunk-E5X6RJ4E.js} +5 -15
- package/dist/chunk-E5X6RJ4E.js.map +1 -0
- package/dist/{chunk-TVHRMRD3.js → chunk-EEPELKOM.js} +4008 -4084
- package/dist/chunk-EEPELKOM.js.map +1 -0
- package/dist/{chunk-NIKUMXE7.js → chunk-F7T5AFFN.js} +1 -5
- package/dist/{chunk-NIKUMXE7.js.map → chunk-F7T5AFFN.js.map} +1 -1
- package/dist/{chunk-LAXAQ3PZ.js → chunk-FVDKAVOL.js} +10 -14
- package/dist/{chunk-LAXAQ3PZ.js.map → chunk-FVDKAVOL.js.map} +1 -1
- package/dist/{chunk-BNE4HHIH.js → chunk-GRVKW3CC.js} +2 -6
- package/dist/{chunk-BNE4HHIH.js.map → chunk-GRVKW3CC.js.map} +1 -1
- package/dist/{chunk-3XFUQ6OL.js → chunk-IHUY4M22.js} +4 -8
- package/dist/{chunk-3XFUQ6OL.js.map → chunk-IHUY4M22.js.map} +1 -1
- package/dist/{chunk-OZZGXBCN.js → chunk-IUQBOCSU.js} +1 -5
- package/dist/{chunk-OZZGXBCN.js.map → chunk-IUQBOCSU.js.map} +1 -1
- package/dist/{chunk-LYYXX2W5.js → chunk-J27W6TXS.js} +4 -6
- package/dist/{chunk-LYYXX2W5.js.map → chunk-J27W6TXS.js.map} +1 -1
- package/dist/chunk-JFLVEFFP.js +16 -0
- package/dist/chunk-JFLVEFFP.js.map +1 -0
- package/dist/{chunk-PV2HNW4I.js → chunk-KFB5CRXZ.js} +7 -12
- package/dist/{chunk-PV2HNW4I.js.map → chunk-KFB5CRXZ.js.map} +1 -1
- package/dist/{chunk-SYUOXSPU.js → chunk-KR65TPKC.js} +168 -14
- package/dist/chunk-KR65TPKC.js.map +1 -0
- package/dist/{chunk-KOPEM3Q7.js → chunk-KXYVJGJP.js} +2 -6
- package/dist/{chunk-KOPEM3Q7.js.map → chunk-KXYVJGJP.js.map} +1 -1
- package/dist/{chunk-TYJLR32W.js → chunk-L7SZXUBJ.js} +9 -14
- package/dist/{chunk-TYJLR32W.js.map → chunk-L7SZXUBJ.js.map} +1 -1
- package/dist/{chunk-NHCGC6DG.js → chunk-LASI35KT.js} +4 -9
- package/dist/{chunk-NHCGC6DG.js.map → chunk-LASI35KT.js.map} +1 -1
- package/dist/{chunk-VG2TVBFN.js → chunk-LDP5ASDM.js} +2 -6
- package/dist/{chunk-VG2TVBFN.js.map → chunk-LDP5ASDM.js.map} +1 -1
- package/dist/{chunk-5V2O6C3T.js → chunk-LZ52XEPR.js} +4 -8
- package/dist/{chunk-5V2O6C3T.js.map → chunk-LZ52XEPR.js.map} +1 -1
- package/dist/{chunk-WFWCZEMS.js → chunk-M7HO7NBK.js} +4 -8
- package/dist/{chunk-WFWCZEMS.js.map → chunk-M7HO7NBK.js.map} +1 -1
- package/dist/{chunk-XA57SX4T.js → chunk-MJ2KHG24.js} +4 -8
- package/dist/{chunk-XA57SX4T.js.map → chunk-MJ2KHG24.js.map} +1 -1
- package/dist/{chunk-DAG2ULNF.js → chunk-MM7CTTAV.js} +2 -6
- package/dist/chunk-MM7CTTAV.js.map +1 -0
- package/dist/{chunk-UFURYGD3.js → chunk-MQ7FLIYS.js} +2 -6
- package/dist/{chunk-UFURYGD3.js.map → chunk-MQ7FLIYS.js.map} +1 -1
- package/dist/{chunk-SI5FOARI.js → chunk-MVR3SYMN.js} +6 -8
- package/dist/chunk-MVR3SYMN.js.map +1 -0
- package/dist/{chunk-UTFN6UJS.js → chunk-MWG4VU64.js} +12 -17
- package/dist/{chunk-UTFN6UJS.js.map → chunk-MWG4VU64.js.map} +1 -1
- package/dist/{chunk-ES3NJZON.js → chunk-NR3OZGL4.js} +1 -5
- package/dist/{chunk-ES3NJZON.js.map → chunk-NR3OZGL4.js.map} +1 -1
- package/dist/{chunk-GYG5SE2D.js → chunk-ODNDXQH2.js} +2 -6
- package/dist/{chunk-GYG5SE2D.js.map → chunk-ODNDXQH2.js.map} +1 -1
- package/dist/{chunk-2RSNKBXC.js → chunk-P44SXVH3.js} +6 -10
- package/dist/{chunk-2RSNKBXC.js.map → chunk-P44SXVH3.js.map} +1 -1
- package/dist/{chunk-3LIU2ZEF.js → chunk-PMM2MYMA.js} +3 -16
- package/dist/{chunk-3LIU2ZEF.js.map → chunk-PMM2MYMA.js.map} +1 -1
- package/dist/{chunk-QTFQEYDA.js → chunk-PZIZNMHK.js} +24 -36
- package/dist/chunk-PZIZNMHK.js.map +1 -0
- package/dist/{chunk-C55DN7GE.js → chunk-Q2KG7UV3.js} +3 -5
- package/dist/chunk-Q2KG7UV3.js.map +1 -0
- package/dist/{chunk-QQLRX4KI.js → chunk-Q45ZU6HD.js} +2 -6
- package/dist/{chunk-QQLRX4KI.js.map → chunk-Q45ZU6HD.js.map} +1 -1
- package/dist/{chunk-6RBQBOBS.js → chunk-QRDTLVXG.js} +9 -14
- package/dist/{chunk-6RBQBOBS.js.map → chunk-QRDTLVXG.js.map} +1 -1
- package/dist/{chunk-YBVA7GPW.js → chunk-QZZJFYUQ.js} +3 -7
- package/dist/{chunk-YBVA7GPW.js.map → chunk-QZZJFYUQ.js.map} +1 -1
- package/dist/{chunk-OJIESW5B.js → chunk-R5NOI2LP.js} +13 -17
- package/dist/{chunk-OJIESW5B.js.map → chunk-R5NOI2LP.js.map} +1 -1
- package/dist/{chunk-DUVWGO6E.js → chunk-RNJWAKMO.js} +3 -7
- package/dist/{chunk-DUVWGO6E.js.map → chunk-RNJWAKMO.js.map} +1 -1
- package/dist/{chunk-4R6PGHQQ.js → chunk-SBHBBZKF.js} +7 -23
- package/dist/chunk-SBHBBZKF.js.map +1 -0
- package/dist/{chunk-NM3EDGB5.js → chunk-SKQWRUPX.js} +10 -14
- package/dist/{chunk-NM3EDGB5.js.map → chunk-SKQWRUPX.js.map} +1 -1
- package/dist/{chunk-Y4CXDA3I.js → chunk-STMHDOZD.js} +4 -21
- package/dist/chunk-STMHDOZD.js.map +1 -0
- package/dist/{chunk-SHHOMVWC.js → chunk-SX5H6TSC.js} +7 -11
- package/dist/chunk-SX5H6TSC.js.map +1 -0
- package/dist/{chunk-RBHYLCUB.js → chunk-TJJPWUMA.js} +2 -6
- package/dist/{chunk-RBHYLCUB.js.map → chunk-TJJPWUMA.js.map} +1 -1
- package/dist/{chunk-IOJR5TOY.js → chunk-TSIU7DME.js} +1 -5
- package/dist/{chunk-IOJR5TOY.js.map → chunk-TSIU7DME.js.map} +1 -1
- package/dist/{chunk-EVXG3X6G.js → chunk-TUPYW2IQ.js} +3 -7
- package/dist/{chunk-EVXG3X6G.js.map → chunk-TUPYW2IQ.js.map} +1 -1
- package/dist/{chunk-YU2VGX5R.js → chunk-UBEDZ4FD.js} +1 -8
- package/dist/{chunk-YU2VGX5R.js.map → chunk-UBEDZ4FD.js.map} +1 -1
- package/dist/{chunk-VEP23B5W.js → chunk-VASLW636.js} +1 -5
- package/dist/{chunk-VEP23B5W.js.map → chunk-VASLW636.js.map} +1 -1
- package/dist/{chunk-PG4G4IIK.js → chunk-VY6MNOXL.js} +2 -6
- package/dist/{chunk-PG4G4IIK.js.map → chunk-VY6MNOXL.js.map} +1 -1
- package/dist/{chunk-IHO75PMZ.js → chunk-WBCPLH66.js} +15 -13
- package/dist/chunk-WBCPLH66.js.map +1 -0
- package/dist/{chunk-DG2NGZ7S.js → chunk-WKTHWQKM.js} +2 -7
- package/dist/{chunk-DG2NGZ7S.js.map → chunk-WKTHWQKM.js.map} +1 -1
- package/dist/{chunk-EZ7STXUV.js → chunk-XHUODHZ4.js} +19 -25
- package/dist/{chunk-EZ7STXUV.js.map → chunk-XHUODHZ4.js.map} +1 -1
- package/dist/{chunk-KIR7VYQD.js → chunk-XVAQG2CV.js} +1 -5
- package/dist/{chunk-KIR7VYQD.js.map → chunk-XVAQG2CV.js.map} +1 -1
- package/dist/{chunk-P3PN5SVI.js → chunk-ZL7PFNHN.js} +2 -6
- package/dist/{chunk-P3PN5SVI.js.map → chunk-ZL7PFNHN.js.map} +1 -1
- package/dist/{chunk-3YGUHWLR.js → chunk-ZPPHXXAP.js} +9 -15
- package/dist/{chunk-3YGUHWLR.js.map → chunk-ZPPHXXAP.js.map} +1 -1
- package/dist/commands/build/marketplace.js +10 -15
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +9 -14
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +14 -19
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +13 -18
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +51 -55
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +13 -18
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +9 -14
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/init.js +50 -51
- package/dist/commands/list.js +14 -16
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +12 -16
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +15 -20
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +11 -13
- package/dist/commands/search.js +14 -19
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +17 -21
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +17 -21
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +10 -16
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/common/confirm.js +1 -2
- package/dist/components/common/prompt-confirm.js +2 -2
- package/dist/components/common/select-list.js +3 -4
- package/dist/components/common/spinner.js +1 -2
- package/dist/components/wizard/category-grid.js +8 -9
- package/dist/components/wizard/checkbox-grid.js +6 -7
- package/dist/components/wizard/domain-selection.js +14 -15
- package/dist/components/wizard/run-wizard-session.js +40 -40
- package/dist/components/wizard/scroll-affordance.js +2 -3
- package/dist/components/wizard/search-modal.js +6 -7
- package/dist/components/wizard/selection-card.js +2 -3
- package/dist/components/wizard/skill-agent-summary.js +8 -9
- package/dist/components/wizard/source-grid.js +13 -14
- package/dist/components/wizard/stack-selection.js +12 -13
- package/dist/components/wizard/step-agents.js +14 -15
- package/dist/components/wizard/step-build.js +14 -15
- package/dist/components/wizard/step-confirm.js +13 -14
- package/dist/components/wizard/step-settings.js +11 -12
- package/dist/components/wizard/step-sources.js +20 -21
- package/dist/components/wizard/step-stack.js +13 -14
- package/dist/components/wizard/summary-panel.js +12 -13
- package/dist/components/wizard/toast.js +2 -3
- package/dist/components/wizard/wizard-layout.js +18 -19
- package/dist/components/wizard/wizard-tabs.js +8 -9
- package/dist/components/wizard/wizard.js +38 -39
- package/dist/config-exports.js +1 -7
- package/dist/config-exports.js.map +1 -1
- package/dist/copy-local-skills-6EMVN7RB.js +14 -0
- package/dist/hooks/init.js +50 -54
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/dist/load-agent-defs-BWOUVEAR.js +15 -0
- package/dist/{loader-E2ERJYVA.js → loader-5JP4S7CJ.js} +4 -5
- package/dist/recompile-project-agents-6DL45TDI.js +19 -0
- package/dist/{source-loader-5UNRU7EZ.js → source-loader-MZYCPL2S.js} +7 -8
- package/dist/stores/wizard-store.js +7 -8
- package/package.json +15 -14
- package/dist/chunk-44LLPS2N.js.map +0 -1
- package/dist/chunk-4R6PGHQQ.js.map +0 -1
- package/dist/chunk-7QIHKQL5.js +0 -181
- package/dist/chunk-7QIHKQL5.js.map +0 -1
- package/dist/chunk-C55DN7GE.js.map +0 -1
- package/dist/chunk-DAG2ULNF.js.map +0 -1
- package/dist/chunk-DIBCRIMR.js +0 -36
- package/dist/chunk-DIBCRIMR.js.map +0 -1
- package/dist/chunk-EKWAUOQB.js +0 -96
- package/dist/chunk-EKWAUOQB.js.map +0 -1
- package/dist/chunk-I3XKEGHM.js +0 -16383
- package/dist/chunk-I3XKEGHM.js.map +0 -1
- package/dist/chunk-IHO75PMZ.js.map +0 -1
- package/dist/chunk-K3OU6TGX.js +0 -77
- package/dist/chunk-K3OU6TGX.js.map +0 -1
- package/dist/chunk-KSZ6PCY4.js +0 -43
- package/dist/chunk-KSZ6PCY4.js.map +0 -1
- package/dist/chunk-NGLQ5W7U.js.map +0 -1
- package/dist/chunk-P56WJ5FA.js +0 -50
- package/dist/chunk-P56WJ5FA.js.map +0 -1
- package/dist/chunk-QTFQEYDA.js.map +0 -1
- package/dist/chunk-SHHOMVWC.js.map +0 -1
- package/dist/chunk-SI5FOARI.js.map +0 -1
- package/dist/chunk-SYUOXSPU.js.map +0 -1
- package/dist/chunk-THKIOI32.js +0 -939
- package/dist/chunk-THKIOI32.js.map +0 -1
- package/dist/chunk-TVHRMRD3.js.map +0 -1
- package/dist/chunk-V7QOSGQA.js +0 -298
- package/dist/chunk-V7QOSGQA.js.map +0 -1
- package/dist/chunk-Y4CXDA3I.js.map +0 -1
- package/dist/components/common/confirm.test.js +0 -203
- package/dist/components/common/confirm.test.js.map +0 -1
- package/dist/components/wizard/category-grid.test.js +0 -1253
- package/dist/components/wizard/category-grid.test.js.map +0 -1
- package/dist/components/wizard/checkbox-grid.test.js +0 -264
- package/dist/components/wizard/checkbox-grid.test.js.map +0 -1
- package/dist/components/wizard/search-modal.test.js +0 -212
- package/dist/components/wizard/search-modal.test.js.map +0 -1
- package/dist/components/wizard/source-grid.test.js +0 -1094
- package/dist/components/wizard/source-grid.test.js.map +0 -1
- package/dist/components/wizard/step-agents.test.js +0 -204
- package/dist/components/wizard/step-agents.test.js.map +0 -1
- package/dist/components/wizard/step-build.test.js +0 -552
- package/dist/components/wizard/step-build.test.js.map +0 -1
- package/dist/components/wizard/step-confirm.test.js +0 -744
- package/dist/components/wizard/step-confirm.test.js.map +0 -1
- package/dist/components/wizard/step-settings.test.js +0 -244
- package/dist/components/wizard/step-settings.test.js.map +0 -1
- package/dist/components/wizard/step-sources.test.js +0 -155
- package/dist/components/wizard/step-sources.test.js.map +0 -1
- package/dist/components/wizard/step-stack.test.js +0 -262
- package/dist/components/wizard/step-stack.test.js.map +0 -1
- package/dist/components/wizard/summary-panel.test.js +0 -317
- package/dist/components/wizard/summary-panel.test.js.map +0 -1
- package/dist/components/wizard/wizard-layout.test.js +0 -200
- package/dist/components/wizard/wizard-layout.test.js.map +0 -1
- package/dist/components/wizard/wizard-tabs.test.js +0 -290
- package/dist/components/wizard/wizard-tabs.test.js.map +0 -1
- package/dist/copy-local-skills-UPA2GUZV.js +0 -15
- package/dist/dist-VNJNNJK7.js +0 -550
- package/dist/dist-VNJNNJK7.js.map +0 -1
- package/dist/load-agent-defs-SB4XAOVB.js +0 -16
- package/dist/magic-string.es-5TV73NJD.js +0 -1316
- package/dist/magic-string.es-5TV73NJD.js.map +0 -1
- package/dist/recompile-project-agents-U4ZY2GDX.js +0 -20
- package/dist/source-manager-3O54SIIB.js +0 -18
- package/dist/source-manager-3O54SIIB.js.map +0 -1
- package/dist/stores/d227-same-scope-tombstone-duplicate.test.js +0 -118
- package/dist/stores/d227-same-scope-tombstone-duplicate.test.js.map +0 -1
- package/dist/stores/wizard-store.test.js +0 -3053
- package/dist/stores/wizard-store.test.js.map +0 -1
- /package/dist/{copy-local-skills-UPA2GUZV.js.map → copy-local-skills-6EMVN7RB.js.map} +0 -0
- /package/dist/{load-agent-defs-SB4XAOVB.js.map → load-agent-defs-BWOUVEAR.js.map} +0 -0
- /package/dist/{loader-E2ERJYVA.js.map → loader-5JP4S7CJ.js.map} +0 -0
- /package/dist/{recompile-project-agents-U4ZY2GDX.js.map → recompile-project-agents-6DL45TDI.js.map} +0 -0
- /package/dist/{source-loader-5UNRU7EZ.js.map → source-loader-MZYCPL2S.js.map} +0 -0
package/dist/chunk-V7QOSGQA.js
DELETED
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
init_esm_shims
|
|
4
|
-
} from "./chunk-P56WJ5FA.js";
|
|
5
|
-
|
|
6
|
-
// src/cli/lib/__tests__/factories/skill-factories.ts
|
|
7
|
-
init_esm_shims();
|
|
8
|
-
var _canonicalSkillCategories;
|
|
9
|
-
function getCanonicalSkillCategories() {
|
|
10
|
-
if (!_canonicalSkillCategories) {
|
|
11
|
-
_canonicalSkillCategories = {
|
|
12
|
-
"web-framework-react": "web-framework",
|
|
13
|
-
"web-framework-vue-composition-api": "web-framework",
|
|
14
|
-
"web-framework-original": "web-framework",
|
|
15
|
-
"web-framework-simple": "web-framework",
|
|
16
|
-
"web-framework-arbitrary": "web-framework",
|
|
17
|
-
"web-framework-unknown": "web-framework",
|
|
18
|
-
"web-styling-tailwind": "web-styling",
|
|
19
|
-
"web-styling-scss-modules": "web-styling",
|
|
20
|
-
"web-styling-custom": "web-styling",
|
|
21
|
-
"web-state-zustand": "web-client-state",
|
|
22
|
-
"web-state-pinia": "web-client-state",
|
|
23
|
-
"web-state-mobx": "web-client-state",
|
|
24
|
-
"web-testing-vitest": "web-testing",
|
|
25
|
-
"web-testing-copier": "web-testing",
|
|
26
|
-
"web-testing-metadata": "web-testing",
|
|
27
|
-
"web-testing-playwright": "web-testing",
|
|
28
|
-
"web-testing-cypress-e2e": "web-testing",
|
|
29
|
-
"web-testing-playwright-e2e": "web-testing",
|
|
30
|
-
"web-server-state-react-query": "web-server-state",
|
|
31
|
-
"web-data-fetching-react-query": "web-server-state",
|
|
32
|
-
"web-tooling-vite": "shared-tooling",
|
|
33
|
-
"web-tooling-acme": "web-tooling",
|
|
34
|
-
"web-tooling-custom": "web-tooling",
|
|
35
|
-
"web-tooling-nometadata": "web-tooling",
|
|
36
|
-
"web-tooling-personal": "web-tooling",
|
|
37
|
-
"web-tooling-valid": "web-tooling",
|
|
38
|
-
"web-tooling-incomplete": "web-tooling",
|
|
39
|
-
"web-tooling-my-skill": "web-tooling",
|
|
40
|
-
"web-tooling-forked-skill": "web-tooling",
|
|
41
|
-
"web-tooling-test-minimal": "web-tooling",
|
|
42
|
-
"web-tooling-local-skill": "web-tooling",
|
|
43
|
-
"web-skill-a": "web-framework",
|
|
44
|
-
"web-skill-a-v": "web-framework",
|
|
45
|
-
"web-skill-b": "web-framework",
|
|
46
|
-
"web-skill-b-v": "web-framework",
|
|
47
|
-
"web-skill-c": "web-framework",
|
|
48
|
-
"web-skill-d": "web-framework",
|
|
49
|
-
"web-skill-setup": "web-framework",
|
|
50
|
-
"web-skill-usage": "web-framework",
|
|
51
|
-
"web-local-skill": "local",
|
|
52
|
-
"web-custom-skill": "web-framework",
|
|
53
|
-
"web-missing-skill": "web-framework",
|
|
54
|
-
"web-unknown-skill": "web-framework",
|
|
55
|
-
"web-nonexistent-skill": "web-framework",
|
|
56
|
-
"api-framework-hono": "api-api",
|
|
57
|
-
"api-framework-express": "api-api",
|
|
58
|
-
"api-database-drizzle": "api-database",
|
|
59
|
-
"api-security-auth-patterns": "api-security",
|
|
60
|
-
"api-observability-datadog": "api-observability",
|
|
61
|
-
"cli-framework-commander": "cli-framework",
|
|
62
|
-
"infra-setup-env": "infra-config",
|
|
63
|
-
"infra-tooling-linter": "unmapped-category",
|
|
64
|
-
"infra-tooling-docker": "shared-tooling",
|
|
65
|
-
"infra-ci-cd-github-actions": "infra-ci-cd",
|
|
66
|
-
"infra-ci-cd-gitlab-ci": "infra-ci-cd",
|
|
67
|
-
"web-accessibility-a11y": "web-accessibility",
|
|
68
|
-
"web-animation-framer": "web-animation",
|
|
69
|
-
"meta-methodology-investigation": "meta-methodology",
|
|
70
|
-
"meta-methodology-success-criteria": "meta-methodology",
|
|
71
|
-
"meta-methodology-investigation-requirements": "meta-methodology",
|
|
72
|
-
"meta-methodology-anti-over-engineering": "meta-methodology",
|
|
73
|
-
"meta-methodology-write-verification": "meta-methodology",
|
|
74
|
-
"meta-methodology-improvement-protocol": "meta-methodology",
|
|
75
|
-
"meta-methodology-context-management": "meta-methodology",
|
|
76
|
-
"meta-methodology-research-methodology": "meta-methodology",
|
|
77
|
-
"meta-reviewing-reviewing": "meta-reviewing",
|
|
78
|
-
"meta-reviewing-cli-reviewing": "meta-reviewing",
|
|
79
|
-
"meta-company-patterns": "local",
|
|
80
|
-
"meta-test-skill": "meta-reviewing",
|
|
81
|
-
"web-framework-nonexistent": "web-framework",
|
|
82
|
-
"web-framework-react-pro": "web-framework",
|
|
83
|
-
"web-framework-react-strict": "web-framework",
|
|
84
|
-
"web-framework-react-minimal": "web-framework"
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
return _canonicalSkillCategories;
|
|
88
|
-
}
|
|
89
|
-
var DOMAIN_PREFIX_MAP = {
|
|
90
|
-
meta: "meta",
|
|
91
|
-
infra: "infra",
|
|
92
|
-
security: "shared"
|
|
93
|
-
};
|
|
94
|
-
function deriveSlugFromId(id) {
|
|
95
|
-
const segments = id.split("-");
|
|
96
|
-
return segments.length >= 3 ? segments.slice(2).join("-") : id;
|
|
97
|
-
}
|
|
98
|
-
function deriveDisplayName(slug) {
|
|
99
|
-
return slug.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
100
|
-
}
|
|
101
|
-
function createTestSkill(id, description, overrides) {
|
|
102
|
-
const segments = id.split("-");
|
|
103
|
-
const rawPrefix = segments[0] ?? "web";
|
|
104
|
-
const domain = DOMAIN_PREFIX_MAP[rawPrefix] ?? rawPrefix;
|
|
105
|
-
const canonicalCategories = getCanonicalSkillCategories();
|
|
106
|
-
const category = canonicalCategories[id] ?? `${segments[0]}-${segments[1]}`;
|
|
107
|
-
const slug = deriveSlugFromId(id);
|
|
108
|
-
const displayName = deriveDisplayName(slug);
|
|
109
|
-
return {
|
|
110
|
-
id,
|
|
111
|
-
slug,
|
|
112
|
-
displayName,
|
|
113
|
-
description,
|
|
114
|
-
category,
|
|
115
|
-
author: "@test",
|
|
116
|
-
domain,
|
|
117
|
-
...overrides
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
function createMockSkill(id, overrides) {
|
|
121
|
-
const category = overrides?.category ?? getCanonicalSkillCategories()[id];
|
|
122
|
-
if (!category) {
|
|
123
|
-
throw new Error(
|
|
124
|
-
`createMockSkill: "${id}" not in canonical registry \u2014 provide { category } in overrides`
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
const defaultSlug = deriveSlugFromId(id);
|
|
128
|
-
const defaultDisplayName = deriveDisplayName(defaultSlug);
|
|
129
|
-
return {
|
|
130
|
-
id,
|
|
131
|
-
slug: defaultSlug,
|
|
132
|
-
displayName: defaultDisplayName,
|
|
133
|
-
description: `${id} skill`,
|
|
134
|
-
category,
|
|
135
|
-
author: "@test",
|
|
136
|
-
conflictsWith: [],
|
|
137
|
-
isRecommended: false,
|
|
138
|
-
requires: [],
|
|
139
|
-
alternatives: [],
|
|
140
|
-
discourages: [],
|
|
141
|
-
compatibleWith: [],
|
|
142
|
-
path: `skills/${category}/${id}/`,
|
|
143
|
-
...overrides
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
function createMockSkillEntry(id, preloaded = false, overrides) {
|
|
147
|
-
return {
|
|
148
|
-
id,
|
|
149
|
-
path: `skills/${id}/`,
|
|
150
|
-
description: `${id} skill`,
|
|
151
|
-
usage: `when working with ${id}`,
|
|
152
|
-
preloaded,
|
|
153
|
-
...overrides
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// src/cli/lib/__tests__/test-fixtures.ts
|
|
158
|
-
init_esm_shims();
|
|
159
|
-
|
|
160
|
-
// src/cli/lib/__tests__/factories/category-factories.ts
|
|
161
|
-
init_esm_shims();
|
|
162
|
-
function createMockCategory(id, displayName, overrides) {
|
|
163
|
-
return {
|
|
164
|
-
id,
|
|
165
|
-
displayName,
|
|
166
|
-
description: `${displayName} category`,
|
|
167
|
-
domain: "web",
|
|
168
|
-
exclusive: true,
|
|
169
|
-
required: false,
|
|
170
|
-
order: 0,
|
|
171
|
-
...overrides
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// src/cli/lib/__tests__/test-fixtures.ts
|
|
176
|
-
var SKILLS = {
|
|
177
|
-
// Web domain
|
|
178
|
-
react: createMockSkill("web-framework-react"),
|
|
179
|
-
vue: createMockSkill("web-framework-vue-composition-api"),
|
|
180
|
-
zustand: createMockSkill("web-state-zustand", {
|
|
181
|
-
compatibleWith: ["web-framework-react"]
|
|
182
|
-
}),
|
|
183
|
-
pinia: createMockSkill("web-state-pinia", {
|
|
184
|
-
compatibleWith: ["web-framework-vue-composition-api"]
|
|
185
|
-
}),
|
|
186
|
-
scss: createMockSkill("web-styling-scss-modules"),
|
|
187
|
-
tailwind: createMockSkill("web-styling-tailwind"),
|
|
188
|
-
vitest: createMockSkill("web-testing-vitest"),
|
|
189
|
-
// API domain
|
|
190
|
-
hono: createMockSkill("api-framework-hono"),
|
|
191
|
-
drizzle: createMockSkill("api-database-drizzle"),
|
|
192
|
-
// Methodology
|
|
193
|
-
antiOverEng: createMockSkill("meta-reviewing-reviewing", {
|
|
194
|
-
description: "Surgical implementation, not architectural innovation"
|
|
195
|
-
})
|
|
196
|
-
};
|
|
197
|
-
var TEST_CATEGORIES = {
|
|
198
|
-
// Web domain
|
|
199
|
-
framework: createMockCategory("web-framework", "Framework"),
|
|
200
|
-
clientState: createMockCategory("web-client-state", "Client State"),
|
|
201
|
-
styling: createMockCategory("web-styling", "Styling"),
|
|
202
|
-
testing: createMockCategory("web-testing", "Testing"),
|
|
203
|
-
serverState: createMockCategory("web-server-state", "Server State"),
|
|
204
|
-
animation: createMockCategory("web-animation", "Animation"),
|
|
205
|
-
accessibility: createMockCategory("web-accessibility", "Accessibility"),
|
|
206
|
-
// API domain
|
|
207
|
-
api: createMockCategory("api-api", "Backend Framework"),
|
|
208
|
-
database: createMockCategory("api-database", "Database"),
|
|
209
|
-
observability: createMockCategory("api-observability", "Observability"),
|
|
210
|
-
// Shared domain
|
|
211
|
-
methodology: createMockCategory("meta-reviewing", "Meta", { domain: "meta" }),
|
|
212
|
-
tooling: createMockCategory("shared-tooling", "Tooling"),
|
|
213
|
-
security: createMockCategory("shared-security", "Security"),
|
|
214
|
-
// CLI domain
|
|
215
|
-
cliFramework: createMockCategory("cli-framework", "CLI Framework"),
|
|
216
|
-
// Mobile domain
|
|
217
|
-
mobileFramework: createMockCategory("mobile-framework", "Mobile Framework")
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
// src/cli/lib/__tests__/factories/stack-factories.ts
|
|
221
|
-
init_esm_shims();
|
|
222
|
-
function createMockResolvedStack(id, name, overrides) {
|
|
223
|
-
return {
|
|
224
|
-
id,
|
|
225
|
-
name,
|
|
226
|
-
description: `${name} stack`,
|
|
227
|
-
skills: {},
|
|
228
|
-
allSkillIds: [],
|
|
229
|
-
philosophy: "",
|
|
230
|
-
...overrides
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// src/cli/lib/__tests__/factories/matrix-factories.ts
|
|
235
|
-
init_esm_shims();
|
|
236
|
-
function buildCategoryMap(defs) {
|
|
237
|
-
return defs;
|
|
238
|
-
}
|
|
239
|
-
function createMockMatrix(skillsOrFirstSkill, ...rest) {
|
|
240
|
-
let skillsRecord;
|
|
241
|
-
let overrides;
|
|
242
|
-
if (skillsOrFirstSkill === void 0) {
|
|
243
|
-
skillsRecord = {};
|
|
244
|
-
} else if ("id" in skillsOrFirstSkill && typeof skillsOrFirstSkill.id === "string" && "slug" in skillsOrFirstSkill) {
|
|
245
|
-
const allArgs = [skillsOrFirstSkill, ...rest];
|
|
246
|
-
const lastArg = allArgs[allArgs.length - 1];
|
|
247
|
-
const hasOverrides = lastArg !== void 0 && !("id" in lastArg && "slug" in lastArg);
|
|
248
|
-
overrides = hasOverrides ? lastArg : void 0;
|
|
249
|
-
const skills = hasOverrides ? allArgs.slice(0, -1) : allArgs;
|
|
250
|
-
skillsRecord = Object.fromEntries(skills.map((skill) => [skill.id, skill]));
|
|
251
|
-
} else {
|
|
252
|
-
skillsRecord = skillsOrFirstSkill;
|
|
253
|
-
overrides = rest[0];
|
|
254
|
-
}
|
|
255
|
-
const skillsWithSlugs = Object.values(skillsRecord).filter((skill) => skill.slug);
|
|
256
|
-
const autoSlugToId = Object.fromEntries(
|
|
257
|
-
skillsWithSlugs.map((skill) => [skill.slug, skill.id])
|
|
258
|
-
);
|
|
259
|
-
const autoIdToSlug = Object.fromEntries(
|
|
260
|
-
skillsWithSlugs.map((skill) => [skill.id, skill.slug])
|
|
261
|
-
);
|
|
262
|
-
return {
|
|
263
|
-
version: "1.0.0",
|
|
264
|
-
categories: {},
|
|
265
|
-
skills: skillsRecord,
|
|
266
|
-
suggestedStacks: [],
|
|
267
|
-
slugMap: { slugToId: autoSlugToId, idToSlug: autoIdToSlug },
|
|
268
|
-
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
269
|
-
...overrides
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
function createMockMatrixConfig(categories, overrides) {
|
|
273
|
-
const defaultRelationships = {
|
|
274
|
-
conflicts: [],
|
|
275
|
-
discourages: [],
|
|
276
|
-
recommends: [],
|
|
277
|
-
requires: [],
|
|
278
|
-
alternatives: []
|
|
279
|
-
};
|
|
280
|
-
return {
|
|
281
|
-
categories,
|
|
282
|
-
relationships: overrides?.relationships ? { ...defaultRelationships, ...overrides.relationships } : defaultRelationships
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
export {
|
|
287
|
-
createTestSkill,
|
|
288
|
-
createMockSkill,
|
|
289
|
-
createMockSkillEntry,
|
|
290
|
-
createMockCategory,
|
|
291
|
-
SKILLS,
|
|
292
|
-
TEST_CATEGORIES,
|
|
293
|
-
createMockResolvedStack,
|
|
294
|
-
buildCategoryMap,
|
|
295
|
-
createMockMatrix,
|
|
296
|
-
createMockMatrixConfig
|
|
297
|
-
};
|
|
298
|
-
//# sourceMappingURL=chunk-V7QOSGQA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/lib/__tests__/factories/skill-factories.ts","../src/cli/lib/__tests__/test-fixtures.ts","../src/cli/lib/__tests__/factories/category-factories.ts","../src/cli/lib/__tests__/factories/stack-factories.ts","../src/cli/lib/__tests__/factories/matrix-factories.ts"],"sourcesContent":["import type {\n CategoryPath,\n Domain,\n ExtractedSkillMetadata,\n ResolvedSkill,\n Skill,\n SkillAssignment,\n SkillDefinition,\n SkillId,\n SkillSlug,\n SkillSource,\n SkillSourceType,\n} from \"../../../types\";\nimport type { CopiedSkill } from \"../../skills\";\nimport type { TestSkill } from \"../fixtures/create-test-source\";\n\n/**\n * Canonical category for known test skills.\n * createMockSkill() looks up from here when no category override is provided.\n * Custom/novel skills must pass { category } in overrides.\n *\n * Uses a lazy singleton to avoid circular initialization issues:\n * test-fixtures.ts calls createMockSkill() at module level during import,\n * and ESM hoists all imports before evaluating any `const` declarations.\n */\n// Boundary cast: test factory maps arbitrary skill IDs to category strings (not all are valid Category union members)\n// eslint-disable-next-line no-var -- `var` avoids TDZ in circular ESM imports (let/const would throw)\nvar _canonicalSkillCategories: Record<string, string> | undefined;\nfunction getCanonicalSkillCategories(): Record<string, string> {\n if (!_canonicalSkillCategories) {\n _canonicalSkillCategories = {\n \"web-framework-react\": \"web-framework\",\n \"web-framework-vue-composition-api\": \"web-framework\",\n \"web-framework-original\": \"web-framework\",\n \"web-framework-simple\": \"web-framework\",\n \"web-framework-arbitrary\": \"web-framework\",\n \"web-framework-unknown\": \"web-framework\",\n \"web-styling-tailwind\": \"web-styling\",\n \"web-styling-scss-modules\": \"web-styling\",\n \"web-styling-custom\": \"web-styling\",\n \"web-state-zustand\": \"web-client-state\",\n \"web-state-pinia\": \"web-client-state\",\n \"web-state-mobx\": \"web-client-state\",\n \"web-testing-vitest\": \"web-testing\",\n \"web-testing-copier\": \"web-testing\",\n \"web-testing-metadata\": \"web-testing\",\n \"web-testing-playwright\": \"web-testing\",\n \"web-testing-cypress-e2e\": \"web-testing\",\n \"web-testing-playwright-e2e\": \"web-testing\",\n \"web-server-state-react-query\": \"web-server-state\",\n \"web-data-fetching-react-query\": \"web-server-state\",\n \"web-tooling-vite\": \"shared-tooling\",\n \"web-tooling-acme\": \"web-tooling\",\n \"web-tooling-custom\": \"web-tooling\",\n \"web-tooling-nometadata\": \"web-tooling\",\n \"web-tooling-personal\": \"web-tooling\",\n \"web-tooling-valid\": \"web-tooling\",\n \"web-tooling-incomplete\": \"web-tooling\",\n \"web-tooling-my-skill\": \"web-tooling\",\n \"web-tooling-forked-skill\": \"web-tooling\",\n \"web-tooling-test-minimal\": \"web-tooling\",\n \"web-tooling-local-skill\": \"web-tooling\",\n \"web-skill-a\": \"web-framework\",\n \"web-skill-a-v\": \"web-framework\",\n \"web-skill-b\": \"web-framework\",\n \"web-skill-b-v\": \"web-framework\",\n \"web-skill-c\": \"web-framework\",\n \"web-skill-d\": \"web-framework\",\n \"web-skill-setup\": \"web-framework\",\n \"web-skill-usage\": \"web-framework\",\n \"web-local-skill\": \"local\",\n \"web-custom-skill\": \"web-framework\",\n \"web-missing-skill\": \"web-framework\",\n \"web-unknown-skill\": \"web-framework\",\n \"web-nonexistent-skill\": \"web-framework\",\n \"api-framework-hono\": \"api-api\",\n \"api-framework-express\": \"api-api\",\n \"api-database-drizzle\": \"api-database\",\n \"api-security-auth-patterns\": \"api-security\",\n \"api-observability-datadog\": \"api-observability\",\n \"cli-framework-commander\": \"cli-framework\",\n \"infra-setup-env\": \"infra-config\",\n \"infra-tooling-linter\": \"unmapped-category\",\n \"infra-tooling-docker\": \"shared-tooling\",\n \"infra-ci-cd-github-actions\": \"infra-ci-cd\",\n \"infra-ci-cd-gitlab-ci\": \"infra-ci-cd\",\n \"web-accessibility-a11y\": \"web-accessibility\",\n \"web-animation-framer\": \"web-animation\",\n \"meta-methodology-investigation\": \"meta-methodology\",\n \"meta-methodology-success-criteria\": \"meta-methodology\",\n \"meta-methodology-investigation-requirements\": \"meta-methodology\",\n \"meta-methodology-anti-over-engineering\": \"meta-methodology\",\n \"meta-methodology-write-verification\": \"meta-methodology\",\n \"meta-methodology-improvement-protocol\": \"meta-methodology\",\n \"meta-methodology-context-management\": \"meta-methodology\",\n \"meta-methodology-research-methodology\": \"meta-methodology\",\n \"meta-reviewing-reviewing\": \"meta-reviewing\",\n \"meta-reviewing-cli-reviewing\": \"meta-reviewing\",\n \"meta-company-patterns\": \"local\",\n \"meta-test-skill\": \"meta-reviewing\",\n \"web-framework-nonexistent\": \"web-framework\",\n \"web-framework-react-pro\": \"web-framework\",\n \"web-framework-react-strict\": \"web-framework\",\n \"web-framework-react-minimal\": \"web-framework\",\n };\n }\n return _canonicalSkillCategories;\n}\n\n/** Maps non-domain SkillIdPrefix values to their corresponding Domain */\nconst DOMAIN_PREFIX_MAP: Record<string, Domain> = {\n meta: \"meta\",\n infra: \"infra\",\n security: \"shared\",\n};\n\n/** Strip the domain-category prefix: \"web-framework-react\" -> \"react\". */\nfunction deriveSlugFromId(id: SkillId): SkillSlug {\n const segments = id.split(\"-\");\n // Boundary cast: slug is derived from the ID's trailing segments\n return (segments.length >= 3 ? segments.slice(2).join(\"-\") : id) as SkillSlug;\n}\n\n/** Title-case each slug segment: \"react-query\" -> \"React Query\". */\nfunction deriveDisplayName(slug: SkillSlug): string {\n return slug\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\n/**\n * Creates a TestSkill for disk-based integration tests (createTestSource).\n * Derives slug, displayName, domain, and category from the skill ID,\n * using the canonical category registry for correct category mapping.\n */\nexport function createTestSkill(\n id: SkillId,\n description: string,\n overrides?: Partial<TestSkill>,\n): TestSkill {\n const segments = id.split(\"-\");\n const rawPrefix = segments[0] ?? \"web\";\n const domain = (DOMAIN_PREFIX_MAP[rawPrefix] ?? rawPrefix) as Domain;\n const canonicalCategories = getCanonicalSkillCategories();\n // Boundary cast: category registry returns arbitrary strings for non-canonical IDs\n const category = (canonicalCategories[id] ?? `${segments[0]}-${segments[1]}`) as CategoryPath;\n const slug = deriveSlugFromId(id);\n const displayName = deriveDisplayName(slug);\n\n return {\n id,\n slug,\n displayName,\n description,\n category,\n author: \"@test\",\n domain,\n ...overrides,\n };\n}\n\nexport function createMockSkill(id: SkillId, overrides?: Partial<ResolvedSkill>): ResolvedSkill {\n // Boundary cast: category registry returns arbitrary strings for non-canonical IDs\n const category = (overrides?.category ?? getCanonicalSkillCategories()[id]) as\n CategoryPath | undefined;\n\n if (!category) {\n throw new Error(\n `createMockSkill: \"${id}\" not in canonical registry — provide { category } in overrides`,\n );\n }\n\n const defaultSlug = deriveSlugFromId(id);\n const defaultDisplayName = deriveDisplayName(defaultSlug);\n\n return {\n id,\n slug: defaultSlug,\n displayName: defaultDisplayName,\n description: `${id} skill`,\n category,\n author: \"@test\",\n conflictsWith: [],\n isRecommended: false,\n requires: [],\n alternatives: [],\n discourages: [],\n compatibleWith: [],\n path: `skills/${category}/${id}/`,\n ...overrides,\n };\n}\n\n/**\n * Creates a mock ExtractedSkillMetadata for testing.\n * Used when mocking extractAllSkills() return values.\n */\nexport function createMockExtractedSkill(\n id: SkillId,\n overrides?: Partial<ExtractedSkillMetadata>,\n): ExtractedSkillMetadata {\n // Derive directory path and category from the skill ID convention: \"domain-category-name\"\n const segments = id.split(\"-\");\n const domain = segments[0] ?? \"web\";\n const category = segments[1] ?? \"framework\";\n const name = segments.slice(2).join(\"-\") || \"skill\";\n const directoryPath = `${domain}/${category}/${name}`;\n\n return {\n id,\n directoryPath,\n description: `${id} skill`,\n category: `${domain}-${category}` as CategoryPath,\n author: \"@test\",\n path: `skills/${directoryPath}/`,\n domain: domain as Domain,\n displayName: name,\n slug: name as SkillSlug,\n ...overrides,\n };\n}\n\nexport function createMockSkillEntry(\n id: SkillId,\n preloaded = false,\n overrides?: Partial<Skill>,\n): Skill {\n return {\n id,\n path: `skills/${id}/`,\n description: `${id} skill`,\n usage: `when working with ${id}`,\n preloaded,\n ...overrides,\n };\n}\n\n/** Convert a TestSkill (disk-based) to a ResolvedSkill (in-memory) for matrix creation. */\nexport function testSkillToResolvedSkill(\n skill: TestSkill,\n overrides?: Partial<ResolvedSkill>,\n): ResolvedSkill {\n // Boundary cast: TestSkill.id is string, but in practice always a valid SkillId\n return createMockSkill(skill.id as SkillId, {\n description: skill.description,\n ...overrides,\n });\n}\n\nexport function createMockSkillDefinition(\n id: SkillId,\n overrides?: Partial<SkillDefinition>,\n): SkillDefinition {\n return {\n id,\n path: `skills/${id}/`,\n description: `${id} skill`,\n ...overrides,\n };\n}\n\nexport function createMockSkillAssignment(id: SkillId, preloaded = false): SkillAssignment {\n return { id, preloaded };\n}\n\n/** Terse alias of createMockSkillAssignment for stack/assignment fixtures. */\nexport const sa = (id: SkillId, preloaded = false): SkillAssignment =>\n createMockSkillAssignment(id, preloaded);\n\n/** Creates a CopiedSkill mock (the record copySkillsToLocalFlattened reports). */\nexport function createMockCopiedSkill(id: SkillId, overrides?: Partial<CopiedSkill>): CopiedSkill {\n return {\n skillId: id,\n contentHash: \"abc123\",\n sourcePath: `/source/skills/${id}`,\n destPath: `/project/.claude/skills/${id}`,\n ...overrides,\n };\n}\n\n/**\n * Creates a ResolvedSkill with availableSources annotation for multi-source testing.\n * Simulates what multi-source-loader.ts does after tagging.\n */\nexport function createMockMultiSourceSkill(\n id: SkillId,\n sources: SkillSource[],\n overrides?: Partial<ResolvedSkill>,\n): ResolvedSkill {\n const activeSource = sources.find((s) => s.installed) ?? sources[0];\n return createMockSkill(id, {\n availableSources: sources,\n activeSource,\n ...overrides,\n });\n}\n\nexport function createMockSkillSource(\n type: SkillSourceType,\n overrides?: Partial<SkillSource>,\n): SkillSource {\n const defaults: Record<SkillSourceType, SkillSource> = {\n public: { name: \"public\", type: \"public\", installed: false },\n private: {\n name: \"private-source\",\n type: \"private\",\n url: \"github:org/skills\",\n installed: false,\n },\n local: { name: \"eject\", type: \"local\", installed: true, installMode: \"eject\" },\n };\n return { ...defaults[type], ...overrides };\n}\n","import type { ResolvedSkill } from \"../../types\";\nimport { createMockSkill } from \"./factories/skill-factories.js\";\nimport { createMockCategory } from \"./factories/category-factories.js\";\n\n// ---------------------------------------------------------------------------\n// Canonical SKILLS registry — single source of truth for all test ResolvedSkills.\n// Use SKILLS.react, SKILLS.hono etc. directly in new test code.\n// ---------------------------------------------------------------------------\n\nexport const SKILLS = {\n // Web domain\n react: createMockSkill(\"web-framework-react\"),\n vue: createMockSkill(\"web-framework-vue-composition-api\"),\n zustand: createMockSkill(\"web-state-zustand\", {\n compatibleWith: [\"web-framework-react\"],\n }),\n pinia: createMockSkill(\"web-state-pinia\", {\n compatibleWith: [\"web-framework-vue-composition-api\"],\n }),\n scss: createMockSkill(\"web-styling-scss-modules\"),\n tailwind: createMockSkill(\"web-styling-tailwind\"),\n vitest: createMockSkill(\"web-testing-vitest\"),\n // API domain\n hono: createMockSkill(\"api-framework-hono\"),\n drizzle: createMockSkill(\"api-database-drizzle\"),\n // Methodology\n antiOverEng: createMockSkill(\"meta-reviewing-reviewing\", {\n description: \"Surgical implementation, not architectural innovation\",\n }),\n} satisfies Record<string, ResolvedSkill>;\n\n// ---------------------------------------------------------------------------\n// Shared base category fixtures — canonical defaults with no overrides.\n// Use spread for per-test customization: `{ ...TEST_CATEGORIES.framework, required: true }`\n// ---------------------------------------------------------------------------\n\nexport const TEST_CATEGORIES = {\n // Web domain\n framework: createMockCategory(\"web-framework\", \"Framework\"),\n clientState: createMockCategory(\"web-client-state\", \"Client State\"),\n styling: createMockCategory(\"web-styling\", \"Styling\"),\n testing: createMockCategory(\"web-testing\", \"Testing\"),\n serverState: createMockCategory(\"web-server-state\", \"Server State\"),\n animation: createMockCategory(\"web-animation\", \"Animation\"),\n accessibility: createMockCategory(\"web-accessibility\", \"Accessibility\"),\n // API domain\n api: createMockCategory(\"api-api\", \"Backend Framework\"),\n database: createMockCategory(\"api-database\", \"Database\"),\n observability: createMockCategory(\"api-observability\", \"Observability\"),\n // Shared domain\n methodology: createMockCategory(\"meta-reviewing\", \"Meta\", { domain: \"meta\" }),\n tooling: createMockCategory(\"shared-tooling\", \"Tooling\"),\n security: createMockCategory(\"shared-security\", \"Security\"),\n // CLI domain\n cliFramework: createMockCategory(\"cli-framework\", \"CLI Framework\"),\n // Mobile domain\n mobileFramework: createMockCategory(\"mobile-framework\", \"Mobile Framework\"),\n};\n","import type { Category, CategoryDefinition } from \"../../../types\";\n\nexport function createMockCategory(\n id: string,\n displayName: string,\n overrides?: Partial<CategoryDefinition>,\n): CategoryDefinition {\n // Boundary cast: test factory accepts arbitrary category IDs for test isolation\n return {\n id: id as Category,\n displayName,\n description: `${displayName} category`,\n domain: \"web\",\n exclusive: true,\n required: false,\n order: 0,\n ...overrides,\n };\n}\n","import type { ResolvedStack, Stack, StackAgentConfig } from \"../../../types\";\n\nexport function createMockResolvedStack(\n id: string,\n name: string,\n overrides?: Partial<ResolvedStack>,\n): ResolvedStack {\n return {\n id,\n name,\n description: `${name} stack`,\n skills: {},\n allSkillIds: [],\n philosophy: \"\",\n ...overrides,\n };\n}\n\nexport function createMockStack(\n id: string,\n config: {\n name: string;\n description?: string;\n agents: Record<string, StackAgentConfig>;\n philosophy?: string;\n },\n): Stack {\n return {\n id,\n name: config.name,\n description: config.description ?? \"\",\n // Boundary cast: test callers may pass arbitrary agent names (e.g., \"nonexistent-agent\")\n agents: config.agents as Stack[\"agents\"],\n philosophy: config.philosophy,\n };\n}\n\nexport function createMockRawStacksConfig() {\n return {\n stacks: [\n {\n id: \"nextjs-fullstack\",\n name: \"Next.js Full-Stack\",\n description: \"Full-stack Next.js with Hono API\",\n agents: {\n \"web-developer\": {\n \"web-framework\": \"web-framework-react\",\n \"web-styling\": \"web-styling-scss-modules\",\n },\n \"api-developer\": {\n \"api-api\": \"api-framework-hono\",\n \"api-database\": \"api-database-drizzle\",\n },\n },\n },\n {\n id: \"vue-spa\",\n name: \"Vue SPA\",\n description: \"Vue single-page application\",\n agents: {\n \"web-developer\": {\n \"web-framework\": \"web-framework-vue-composition-api\",\n \"web-styling\": \"web-styling-tailwind\",\n },\n },\n },\n ],\n };\n}\n\nexport function createMockRawStacksConfigWithArrays() {\n return {\n stacks: [\n {\n id: \"multi-select-stack\",\n name: \"Multi-Select Stack\",\n description: \"Stack with array-valued categories\",\n agents: {\n \"web-developer\": {\n \"web-framework\": \"web-framework-react\",\n \"meta-reviewing\": [\n \"meta-methodology-research-methodology\",\n \"meta-reviewing-reviewing\",\n \"meta-reviewing-cli-reviewing\",\n ],\n },\n \"pattern-scout\": {\n \"meta-reviewing\": [\"meta-methodology-research-methodology\"],\n },\n },\n },\n ],\n };\n}\n\nexport function createMockRawStacksConfigWithObjects() {\n return {\n stacks: [\n {\n id: \"object-stack\",\n name: \"Object Stack\",\n description: \"Stack with object-form skill assignments\",\n agents: {\n \"web-developer\": {\n \"web-framework\": [{ id: \"web-framework-react\", preloaded: true }],\n \"web-styling\": \"web-styling-scss-modules\",\n \"meta-reviewing\": [\n { id: \"meta-methodology-research-methodology\", preloaded: true },\n \"meta-reviewing-reviewing\",\n ],\n },\n },\n },\n ],\n };\n}\n","import { typedEntries } from \"../../../utils/typed-object\";\nimport type {\n Category,\n CategoryDefinition,\n MergedSkillsMatrix,\n RelationshipDefinitions,\n ResolvedSkill,\n ResolvedStack,\n SkillId,\n SkillSlug,\n SkillSlugMap,\n} from \"../../../types\";\nimport type { TestSkill } from \"../fixtures/create-test-source\";\nimport { SKILLS, TEST_CATEGORIES } from \"../test-fixtures\";\nimport { testSkillToResolvedSkill } from \"./skill-factories.js\";\nimport { createMockResolvedStack } from \"./stack-factories.js\";\n\n/**\n * Builds a matrix from disk-oriented TestSkills by resolving each to a\n * ResolvedSkill. Pass `toResolvedOverrides` to carry per-skill fields (e.g.\n * `author`) that the default derivation would otherwise replace with defaults.\n */\nexport function createMatrixFromTestSkills(\n skills: TestSkill[],\n toResolvedOverrides?: (skill: TestSkill) => Partial<ResolvedSkill>,\n): MergedSkillsMatrix {\n return createMockMatrix(\n Object.fromEntries(\n skills.map((skill) => [\n skill.id,\n testSkillToResolvedSkill(skill, toResolvedOverrides?.(skill)),\n ]),\n ),\n );\n}\n\n/**\n * Holds THE one documented boundary cast for test category maps. Test fixtures\n * supply a subset of the Category union and often partial CategoryDefinition\n * values (e.g. just `{ domain }`), but the matrix consumes a complete\n * Record<Category, CategoryDefinition>.\n *\n * NOTE: param is `Partial<Record<Category, Partial<CategoryDefinition>>>` (values\n * are also partial at call sites) — wider than the ledger's `Partial<Record<Category,\n * CategoryDefinition>>`, which would reject the `{ domain: \"web\" }` shorthand.\n */\nexport function buildCategoryMap(\n defs: Partial<Record<Category, Partial<CategoryDefinition>>>,\n): Record<Category, CategoryDefinition> {\n return defs as Record<Category, CategoryDefinition>;\n}\n\nexport function createMockMatrix(\n skillsOrFirstSkill?: Record<string, ResolvedSkill> | ResolvedSkill,\n ...rest: (ResolvedSkill | Partial<MergedSkillsMatrix>)[]\n): MergedSkillsMatrix {\n let skillsRecord: Record<string, ResolvedSkill>;\n let overrides: Partial<MergedSkillsMatrix> | undefined;\n\n if (skillsOrFirstSkill === undefined) {\n // Empty call: createMockMatrix()\n skillsRecord = {};\n } else if (\n \"id\" in skillsOrFirstSkill &&\n typeof (skillsOrFirstSkill as ResolvedSkill).id === \"string\" &&\n \"slug\" in skillsOrFirstSkill\n ) {\n // New spread syntax: createMockMatrix(skill1, skill2, ..., optionalOverrides?)\n const allArgs = [skillsOrFirstSkill, ...rest];\n const lastArg = allArgs[allArgs.length - 1];\n\n // The last arg is overrides when it lacks the 'id' + 'slug' skill shape\n const hasOverrides = lastArg !== undefined && !(\"id\" in lastArg && \"slug\" in lastArg);\n overrides = hasOverrides ? (lastArg as Partial<MergedSkillsMatrix>) : undefined;\n const skills = (hasOverrides ? allArgs.slice(0, -1) : allArgs) as ResolvedSkill[];\n skillsRecord = Object.fromEntries(skills.map((skill) => [skill.id, skill]));\n } else {\n // Old record syntax: createMockMatrix({ \"id\": skill }, overrides?)\n skillsRecord = skillsOrFirstSkill as Record<string, ResolvedSkill>;\n overrides = rest[0] as Partial<MergedSkillsMatrix> | undefined;\n }\n\n const skillsWithSlugs = Object.values(skillsRecord).filter((skill) => skill.slug);\n // Boundary casts: Object.fromEntries widens keys to string\n const autoSlugToId = Object.fromEntries(\n skillsWithSlugs.map((skill) => [skill.slug, skill.id]),\n ) as Record<SkillSlug, SkillId>;\n const autoIdToSlug = Object.fromEntries(\n skillsWithSlugs.map((skill) => [skill.id, skill.slug]),\n ) as Record<SkillId, SkillSlug>;\n\n return {\n version: \"1.0.0\",\n categories: {} as Record<Category, CategoryDefinition>,\n skills: skillsRecord,\n suggestedStacks: [],\n slugMap: { slugToId: autoSlugToId, idToSlug: autoIdToSlug },\n generatedAt: new Date().toISOString(),\n ...overrides,\n };\n}\n\n/**\n * Builds a comprehensive test matrix with 8 skills across 7 categories,\n * 2 suggested stacks, display name mappings, and relationship data\n * (conflicts, recommends). Includes anti-over-engineering methodology skill.\n * @returns A fully populated MergedSkillsMatrix with realistic test data\n */\nexport function createComprehensiveMatrix(\n overrides?: Partial<MergedSkillsMatrix>,\n): MergedSkillsMatrix {\n // Skill categories use domain-prefixed Category IDs (matching production\n // metadata.yaml and the categories map keys, e.g., \"web-framework\", \"api-api\").\n const skills = {\n \"web-framework-react\": SKILLS.react,\n \"web-framework-vue-composition-api\": {\n ...SKILLS.vue,\n conflictsWith: [{ skillId: \"web-framework-react\", reason: \"Choose one framework\" }],\n } satisfies ResolvedSkill,\n \"web-state-zustand\": SKILLS.zustand,\n \"web-styling-scss-modules\": SKILLS.scss,\n \"api-framework-hono\": SKILLS.hono,\n \"api-database-drizzle\": SKILLS.drizzle,\n \"web-testing-vitest\": SKILLS.vitest,\n // Methodology skill\n \"meta-reviewing-reviewing\": SKILLS.antiOverEng,\n };\n\n const categories = {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n domain: \"web\",\n exclusive: true,\n required: true,\n },\n \"web-client-state\": { ...TEST_CATEGORIES.clientState, domain: \"web\", order: 1 },\n \"web-styling\": { ...TEST_CATEGORIES.styling, domain: \"web\", order: 2 },\n \"api-api\": { ...TEST_CATEGORIES.api, domain: \"api\", exclusive: true, required: true },\n \"api-database\": { ...TEST_CATEGORIES.database, domain: \"api\", order: 1 },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n domain: \"shared\",\n exclusive: false,\n order: 10,\n },\n \"meta-reviewing\": {\n ...TEST_CATEGORIES.methodology,\n domain: \"meta\",\n exclusive: false,\n required: false,\n order: 11,\n },\n } as Record<Category, CategoryDefinition>;\n\n const suggestedStacks: ResolvedStack[] = [\n createMockResolvedStack(\"nextjs-fullstack\", \"Next.js Full-Stack\", {\n description: \"Complete Next.js stack with React and Hono\",\n skills: {\n \"web-developer\": {\n \"web-framework\": [\"web-framework-react\"],\n \"web-client-state\": [\"web-state-zustand\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n \"api-developer\": {\n \"api-api\": [\"api-framework-hono\"],\n \"api-database\": [\"api-database-drizzle\"],\n },\n } as ResolvedStack[\"skills\"],\n allSkillIds: [\n \"web-framework-react\",\n \"web-state-zustand\",\n \"web-styling-scss-modules\",\n \"api-framework-hono\",\n \"api-database-drizzle\",\n ],\n philosophy: \"Modern, type-safe fullstack development\",\n }),\n createMockResolvedStack(\"vue-modern-fullstack\", \"Vue Modern Full-Stack\", {\n description: \"Vue.js frontend stack\",\n skills: {\n \"web-developer\": {\n \"web-framework\": [\"web-framework-vue-composition-api\"],\n },\n } as ResolvedStack[\"skills\"],\n allSkillIds: [\"web-framework-vue-composition-api\"],\n philosophy: \"Progressive framework approach\",\n }),\n ];\n\n // Boundary cast: test matrix only contains a subset of all possible slugs\n const slugToId = {\n react: \"web-framework-react\",\n \"vue-composition-api\": \"web-framework-vue-composition-api\",\n zustand: \"web-state-zustand\",\n \"scss-modules\": \"web-styling-scss-modules\",\n hono: \"api-framework-hono\",\n drizzle: \"api-database-drizzle\",\n vitest: \"web-testing-vitest\",\n reviewing: \"meta-reviewing-reviewing\",\n } as Record<SkillSlug, SkillId>;\n\n // Boundary cast: Object.fromEntries returns { [k: string]: string }\n const idToSlug = Object.fromEntries(\n typedEntries(slugToId).map(([slug, fullId]) => [fullId, slug]),\n ) as SkillSlugMap[\"idToSlug\"];\n\n return createMockMatrix(skills, {\n categories,\n suggestedStacks,\n slugMap: { slugToId, idToSlug },\n ...overrides,\n });\n}\n\n/**\n * Builds a lightweight test matrix with 5 skills, 5 categories, and 2 stacks.\n * Use instead of createComprehensiveMatrix when relationship data is not needed.\n * @returns A minimal MergedSkillsMatrix for basic integration tests\n */\nexport function createBasicMatrix(overrides?: Partial<MergedSkillsMatrix>): MergedSkillsMatrix {\n // Domain-prefixed Category IDs — see createComprehensiveMatrix comment\n const skills = {\n \"web-framework-react\": SKILLS.react,\n \"web-state-zustand\": SKILLS.zustand,\n \"api-framework-hono\": SKILLS.hono,\n \"web-testing-vitest\": SKILLS.vitest,\n // Methodology skill\n \"meta-reviewing-reviewing\": SKILLS.antiOverEng,\n };\n\n const suggestedStacks: ResolvedStack[] = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"testing-stack\", \"Testing Stack\", {\n allSkillIds: [\"web-testing-vitest\"],\n }),\n ];\n\n return createMockMatrix(skills, {\n suggestedStacks,\n categories: {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n domain: \"web\",\n exclusive: true,\n required: true,\n },\n \"web-client-state\": { ...TEST_CATEGORIES.clientState, domain: \"web\", order: 1 },\n \"api-api\": {\n ...TEST_CATEGORIES.api,\n domain: \"api\",\n exclusive: true,\n required: true,\n },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n displayName: \"Testing Framework\",\n domain: \"shared\",\n exclusive: false,\n },\n \"meta-reviewing\": {\n ...TEST_CATEGORIES.methodology,\n domain: \"meta\",\n exclusive: false,\n required: false,\n },\n } as Record<Category, CategoryDefinition>,\n ...overrides,\n });\n}\n\n/** Decomposed matrix config returned by createMockMatrixConfig (replaces SkillsMatrixConfig) */\nexport type MockMatrixConfig = {\n categories: Record<string, CategoryDefinition>;\n relationships: RelationshipDefinitions;\n};\n\nexport function createMockMatrixConfig(\n categories: Record<string, CategoryDefinition>,\n overrides?: {\n relationships?: Partial<RelationshipDefinitions>;\n },\n): MockMatrixConfig {\n const defaultRelationships: RelationshipDefinitions = {\n conflicts: [],\n discourages: [],\n recommends: [],\n requires: [],\n alternatives: [],\n };\n return {\n categories,\n relationships: overrides?.relationships\n ? { ...defaultRelationships, ...overrides.relationships }\n : defaultRelationships,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/lib/operations/source/load-source.ts","../src/cli/lib/operations/source/index.ts","../src/cli/lib/operations/project/detect-project.ts","../src/cli/lib/operations/project/detect-both-installations.ts","../src/cli/lib/operations/project/write-project-config.ts","../src/cli/lib/operations/project/compile-agents-all-scopes.ts","../src/cli/lib/operations/project/index.ts","../src/cli/lib/operations/index.ts"],"sourcesContent":["import { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../../loading/index.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n type StartupMessage,\n} from \"../../../utils/logger.js\";\n\nexport type LoadSourceOptions = {\n sourceFlag?: string;\n projectDir: string;\n forceRefresh?: boolean;\n /** When true, enables message buffering and captures startup messages. Default: false. */\n captureStartupMessages?: boolean;\n};\n\nexport type LoadedSource = {\n sourceResult: SourceLoadResult;\n /** Empty array when captureStartupMessages is false. */\n startupMessages: StartupMessage[];\n};\n\n/**\n * Loads the skills matrix from a resolved source.\n *\n * When `captureStartupMessages` is true, wraps the load in buffer mode so\n * warn() calls during loading are captured instead of written to stderr.\n * The caller (init/edit) passes these messages to the Wizard's <Static> block.\n *\n * @throws {Error} If source resolution or fetching fails.\n */\nexport async function loadSource(options: LoadSourceOptions): Promise<LoadedSource> {\n const { sourceFlag, projectDir, forceRefresh, captureStartupMessages } = options;\n\n if (captureStartupMessages) {\n enableBuffering();\n }\n\n let sourceResult: SourceLoadResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag,\n projectDir,\n forceRefresh,\n });\n } catch (error) {\n if (captureStartupMessages) {\n disableBuffering();\n }\n throw error;\n }\n\n let startupMessages: StartupMessage[] = [];\n if (captureStartupMessages) {\n startupMessages = drainBuffer();\n disableBuffering();\n }\n\n return { sourceResult, startupMessages };\n}\n","export { loadSource, type LoadSourceOptions, type LoadedSource } from \"./load-source.js\";\nexport { ensureMarketplace, type MarketplaceResult } from \"./ensure-marketplace.js\";\nexport { requireMarketplace, type MarketplaceRequirement } from \"./require-marketplace.js\";\n","import { detectInstallation, type Installation } from \"../../installation/index.js\";\nimport { ConfigLoadError, loadProjectConfig } from \"../../configuration/index.js\";\nimport type { ProjectConfig } from \"../../../types/index.js\";\n\nexport type DetectedProject = {\n installation: Installation;\n config: ProjectConfig | null;\n configPath: string | null;\n};\n\n/**\n * Detects an existing CLI installation and loads its project config.\n *\n * Uses detectInstallation() which checks project-level first, then falls back\n * to global. Returns the installation metadata plus the loaded config.\n *\n * Does NOT throw. Returns null when no installation is found OR when the config\n * file exists but is corrupt — the caller (doctor, edit) reports the resulting\n * null as a config/installation problem to the user. `compile` deliberately\n * does NOT use this wrapper: it detects scopes directly so it can hard-error on\n * a corrupt config instead of degrading to null.\n */\nexport async function detectProject(projectDir?: string): Promise<DetectedProject | null> {\n const resolvedDir = projectDir ?? process.cwd();\n\n let installation: Installation | null;\n try {\n installation = await detectInstallation(resolvedDir);\n } catch (error) {\n if (error instanceof ConfigLoadError) return null;\n throw error;\n }\n\n if (!installation) {\n return null;\n }\n\n const loaded = await loadProjectConfig(installation.projectDir);\n\n return {\n installation,\n config: loaded?.config ?? null,\n configPath: loaded?.configPath ?? null,\n };\n}\n","import {\n detectGlobalInstallation,\n detectProjectInstallation,\n isHomeDirectory,\n type Installation,\n} from \"../../installation/index.js\";\n\nexport type BothInstallations = {\n global: Installation | null;\n project: Installation | null;\n hasBoth: boolean;\n};\n\n/**\n * Detects both global and project installations.\n *\n * Skips project detection when projectDir is the home directory\n * to avoid double-compile. Returns a convenience `hasBoth` flag\n * used by callers to set scopeFilter on compile passes.\n */\nexport async function detectBothInstallations(projectDir: string): Promise<BothInstallations> {\n const global = await detectGlobalInstallation();\n\n const project = isHomeDirectory(projectDir) ? null : await detectProjectInstallation(projectDir);\n return { global, project, hasBoth: !!global && !!project };\n}\n","import path from \"path\";\nimport {\n buildAndMergeConfig,\n resolveInstallPaths,\n isHomeDirectory,\n} from \"../../installation/index.js\";\nimport { loadMergedAgents, type SourceLoadResult } from \"../../loading/index.js\";\nimport type { AuthoritativeScope } from \"../../configuration/index.js\";\nimport {\n ensureBlankPair,\n writeScopedFromWizard,\n type GateReport,\n} from \"../../config-gate/index.js\";\nimport { ensureDir } from \"../../../utils/fs.js\";\nimport type { ProjectConfig, AgentDefinition, AgentName } from \"../../../types/index.js\";\nimport type { WizardResultV2 } from \"../../../components/wizard/wizard.js\";\n\nexport type ConfigWriteOptions = {\n wizardResult: WizardResultV2;\n sourceResult: SourceLoadResult;\n projectDir: string;\n sourceFlag?: string;\n /** Pre-loaded agent definitions. If omitted, loads from CLI + source. */\n agents?: Record<AgentName, AgentDefinition>;\n /**\n * Authority of `cc edit`'s newConfig over absent entries (D-233 Scenario C):\n * `\"all\"` (global edit) drops any deselected entry, `\"owned\"` (project edit) drops deselected\n * project-owned entries only, `undefined` (init) keeps additive union-preserve.\n */\n authoritativeScope?: AuthoritativeScope;\n};\n\nexport type ConfigWriteResult = {\n config: ProjectConfig;\n configPath: string;\n wasMerged: boolean;\n existingConfigPath?: string;\n filesWritten: number;\n /**\n * What the gated write did: what moved in the global config, which registered\n * projects it fanned out to, and the recompile it drove in them. The caller\n * renders it; the work is already done.\n */\n propagation: GateReport;\n};\n\n/**\n * Builds, merges, and writes project configuration files.\n *\n * Handles the full config pipeline:\n * 1. buildAndMergeConfig() — generates config from wizard result, merges with existing\n * 2. loadAllAgents() — loads agent definitions for config-types generation\n * 3. ensureBlankPair() — ensures the global config pair exists (when in project context)\n * 4. writeScopedFromWizard() — writes config.ts and config-types.ts split by scope,\n * fans global changes out to registered projects and recompiles their agents\n */\nexport async function writeProjectConfig(options: ConfigWriteOptions): Promise<ConfigWriteResult> {\n const { wizardResult, sourceResult, projectDir, sourceFlag } = options;\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n\n await ensureDir(path.dirname(projectPaths.configPath));\n\n let agents: Record<AgentName, AgentDefinition>;\n if (options.agents) {\n agents = options.agents;\n } else {\n agents = await loadMergedAgents(sourceResult.sourcePath);\n }\n\n const mergeResult = await buildAndMergeConfig(\n wizardResult,\n sourceResult,\n projectDir,\n sourceFlag,\n options.authoritativeScope,\n );\n const finalConfig = mergeResult.config;\n\n const isProjectContext = !isHomeDirectory(projectDir);\n\n if (isProjectContext) {\n await ensureBlankPair();\n }\n\n const propagation = await writeScopedFromWizard({\n finalConfig,\n matrix: sourceResult.matrix,\n agents,\n projectDir,\n projectConfigPath: projectPaths.configPath,\n projectInstallationExists: isProjectContext,\n });\n\n return {\n config: finalConfig,\n configPath: projectPaths.configPath,\n wasMerged: mergeResult.merged,\n existingConfigPath: mergeResult.existingConfigPath,\n filesWritten: isProjectContext ? 4 : 2,\n propagation,\n };\n}\n","import os from \"os\";\nimport { compileAgents, type CompilationResult } from \"./compile-agents.js\";\nimport { isHomeDirectory, resolveInstallPaths } from \"../../installation/index.js\";\nimport type { AgentName, SkillDefinitionMap, SkillScope } from \"../../../types/index.js\";\n\nexport type CompileAllScopesOptions = {\n /** Working directory of the command — a project root, or home for global context. */\n projectDir: string;\n sourcePath: string;\n skills: SkillDefinitionMap;\n agentScopeMap: Map<AgentName, SkillScope>;\n};\n\n/**\n * Compiles agents for every scope the current context owns.\n *\n * Home context: a single pass writing to the home agents directory.\n * Project context: a global pass (from home) then a project pass, each\n * filtered to its own scope so the project pass cannot overwrite global\n * agents with zero-skill versions. Results merge in pass order.\n */\nexport async function compileAgentsAllScopes(\n options: CompileAllScopesOptions,\n): Promise<CompilationResult> {\n const { projectDir, sourcePath, skills, agentScopeMap } = options;\n const base = { sourcePath, skills, agentScopeMap };\n\n if (isHomeDirectory(projectDir)) {\n return compileAgents({\n ...base,\n projectDir,\n outputDir: resolveInstallPaths(projectDir, \"project\").agentsDir,\n });\n }\n\n const globalResult = await compileAgents({\n ...base,\n projectDir: os.homedir(),\n outputDir: resolveInstallPaths(os.homedir(), \"global\").agentsDir,\n scopeFilter: \"global\",\n });\n const projectResult = await compileAgents({\n ...base,\n projectDir,\n outputDir: resolveInstallPaths(projectDir, \"project\").agentsDir,\n scopeFilter: \"project\",\n });\n return mergeCompilationResults(globalResult, projectResult);\n}\n\nfunction mergeCompilationResults(...results: CompilationResult[]): CompilationResult {\n return {\n compiled: results.flatMap((r) => r.compiled),\n failed: results.flatMap((r) => r.failed),\n warnings: results.flatMap((r) => r.warnings),\n };\n}\n","export { detectProject, type DetectedProject } from \"./detect-project.js\";\nexport { detectBothInstallations, type BothInstallations } from \"./detect-both-installations.js\";\nexport {\n writeProjectConfig,\n type ConfigWriteOptions,\n type ConfigWriteResult,\n} from \"./write-project-config.js\";\nexport {\n compileAgents,\n type CompileAgentsOptions,\n type CompilationResult,\n} from \"./compile-agents.js\";\nexport {\n type CompileAllScopesOptions,\n compileAgentsAllScopes,\n} from \"./compile-agents-all-scopes.js\";\nexport {\n recompileRegisteredProjectAgents,\n recompilePropagatedProjectAgents,\n type PropagatedRecompileSummary,\n} from \"./recompile-project-agents.js\";\nexport { loadAgentDefs, type AgentDefs } from \"./load-agent-defs.js\";\n","// Operations — composable building blocks for CLI commands.\n// Each operation wraps lower-level lib functions into a single typed call.\n\nexport {\n loadSource,\n type LoadSourceOptions,\n type LoadedSource,\n ensureMarketplace,\n type MarketplaceResult,\n requireMarketplace,\n type MarketplaceRequirement,\n} from \"./source/index.js\";\n\nexport {\n discoverInstalledSkills,\n discoverLocalProjectSkills,\n mergeSkills,\n type DiscoveredSkills,\n collectScopedSkillDirs,\n type ScopedSkillDir,\n type ScopedSkillDirsResult,\n copyLocalSkills,\n type SkillCopyResult,\n compareSkillsWithSource,\n buildSourceSkillsMap,\n type SkillComparisonResults,\n findSkillMatch,\n type SkillMatchResult,\n installPluginSkills,\n type PluginInstallResult,\n pluginInstallFailureError,\n uninstallPluginSkills,\n type PluginUninstallResult,\n} from \"./skills/index.js\";\n\nexport {\n detectProject,\n type DetectedProject,\n detectBothInstallations,\n type BothInstallations,\n writeProjectConfig,\n type ConfigWriteOptions,\n type ConfigWriteResult,\n compileAgents,\n type CompileAgentsOptions,\n type CompilationResult,\n compileAgentsAllScopes,\n type CompileAllScopesOptions,\n recompileRegisteredProjectAgents,\n recompilePropagatedProjectAgents,\n type PropagatedRecompileSummary,\n loadAgentDefs,\n type AgentDefs,\n} from \"./project/index.js\";\n"],"mappings":"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","names":[]}
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
CONFIRM_INPUT_DELAY_MS,
|
|
4
|
-
ENTER,
|
|
5
|
-
KEY_N,
|
|
6
|
-
KEY_Y,
|
|
7
|
-
RENDER_DELAY_MS,
|
|
8
|
-
delay
|
|
9
|
-
} from "../../chunk-KSZ6PCY4.js";
|
|
10
|
-
import {
|
|
11
|
-
render
|
|
12
|
-
} from "../../chunk-EKWAUOQB.js";
|
|
13
|
-
import {
|
|
14
|
-
Confirm
|
|
15
|
-
} from "../../chunk-ES3NJZON.js";
|
|
16
|
-
import {
|
|
17
|
-
afterEach,
|
|
18
|
-
describe,
|
|
19
|
-
globalExpect,
|
|
20
|
-
it,
|
|
21
|
-
vi
|
|
22
|
-
} from "../../chunk-I3XKEGHM.js";
|
|
23
|
-
import {
|
|
24
|
-
init_esm_shims
|
|
25
|
-
} from "../../chunk-P56WJ5FA.js";
|
|
26
|
-
|
|
27
|
-
// src/cli/components/common/confirm.test.tsx
|
|
28
|
-
init_esm_shims();
|
|
29
|
-
import { jsx } from "react/jsx-runtime";
|
|
30
|
-
describe("Confirm component", () => {
|
|
31
|
-
let cleanup;
|
|
32
|
-
afterEach(() => {
|
|
33
|
-
cleanup?.();
|
|
34
|
-
cleanup = void 0;
|
|
35
|
-
});
|
|
36
|
-
describe("rendering", () => {
|
|
37
|
-
it("should render the message", () => {
|
|
38
|
-
const { lastFrame, unmount } = render(
|
|
39
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Do you want to proceed?", onConfirm: () => {
|
|
40
|
-
}, onCancel: () => {
|
|
41
|
-
} })
|
|
42
|
-
);
|
|
43
|
-
cleanup = unmount;
|
|
44
|
-
const output = lastFrame();
|
|
45
|
-
globalExpect(output).toContain("Do you want to proceed?");
|
|
46
|
-
});
|
|
47
|
-
it("should show y/n prompt", () => {
|
|
48
|
-
const { lastFrame, unmount } = render(
|
|
49
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Continue?", onConfirm: () => {
|
|
50
|
-
}, onCancel: () => {
|
|
51
|
-
} })
|
|
52
|
-
);
|
|
53
|
-
cleanup = unmount;
|
|
54
|
-
const output = lastFrame();
|
|
55
|
-
globalExpect(output?.toLowerCase()).toMatch(/[yn]/);
|
|
56
|
-
});
|
|
57
|
-
it("should show Y/n when default is confirm (true)", () => {
|
|
58
|
-
const { lastFrame, unmount } = render(
|
|
59
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm: () => {
|
|
60
|
-
}, onCancel: () => {
|
|
61
|
-
}, defaultValue: true })
|
|
62
|
-
);
|
|
63
|
-
cleanup = unmount;
|
|
64
|
-
const output = lastFrame();
|
|
65
|
-
globalExpect(output).toContain("Y/n");
|
|
66
|
-
});
|
|
67
|
-
it("should show y/N when default is cancel (false)", () => {
|
|
68
|
-
const { lastFrame, unmount } = render(
|
|
69
|
-
/* @__PURE__ */ jsx(
|
|
70
|
-
Confirm,
|
|
71
|
-
{
|
|
72
|
-
message: "Confirm?",
|
|
73
|
-
onConfirm: () => {
|
|
74
|
-
},
|
|
75
|
-
onCancel: () => {
|
|
76
|
-
},
|
|
77
|
-
defaultValue: false
|
|
78
|
-
}
|
|
79
|
-
)
|
|
80
|
-
);
|
|
81
|
-
cleanup = unmount;
|
|
82
|
-
const output = lastFrame();
|
|
83
|
-
globalExpect(output).toContain("y/N");
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
describe("keyboard interactions", () => {
|
|
87
|
-
it("should call onConfirm when pressing y", async () => {
|
|
88
|
-
const onConfirm = vi.fn();
|
|
89
|
-
const onCancel = vi.fn();
|
|
90
|
-
const { stdin, unmount } = render(
|
|
91
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm, onCancel })
|
|
92
|
-
);
|
|
93
|
-
cleanup = unmount;
|
|
94
|
-
await delay(RENDER_DELAY_MS);
|
|
95
|
-
await stdin.write(KEY_Y);
|
|
96
|
-
await delay(CONFIRM_INPUT_DELAY_MS);
|
|
97
|
-
globalExpect(onConfirm).toHaveBeenCalled();
|
|
98
|
-
globalExpect(onCancel).not.toHaveBeenCalled();
|
|
99
|
-
});
|
|
100
|
-
it("should call onCancel when pressing n", async () => {
|
|
101
|
-
const onConfirm = vi.fn();
|
|
102
|
-
const onCancel = vi.fn();
|
|
103
|
-
const { stdin, unmount } = render(
|
|
104
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm, onCancel })
|
|
105
|
-
);
|
|
106
|
-
cleanup = unmount;
|
|
107
|
-
await delay(RENDER_DELAY_MS);
|
|
108
|
-
await stdin.write(KEY_N);
|
|
109
|
-
await delay(CONFIRM_INPUT_DELAY_MS);
|
|
110
|
-
globalExpect(onCancel).toHaveBeenCalled();
|
|
111
|
-
globalExpect(onConfirm).not.toHaveBeenCalled();
|
|
112
|
-
});
|
|
113
|
-
it("should call onConfirm when default is true and enter pressed", async () => {
|
|
114
|
-
const onConfirm = vi.fn();
|
|
115
|
-
const onCancel = vi.fn();
|
|
116
|
-
const { stdin, unmount } = render(
|
|
117
|
-
/* @__PURE__ */ jsx(
|
|
118
|
-
Confirm,
|
|
119
|
-
{
|
|
120
|
-
message: "Confirm?",
|
|
121
|
-
onConfirm,
|
|
122
|
-
onCancel,
|
|
123
|
-
defaultValue: true
|
|
124
|
-
}
|
|
125
|
-
)
|
|
126
|
-
);
|
|
127
|
-
cleanup = unmount;
|
|
128
|
-
await delay(RENDER_DELAY_MS);
|
|
129
|
-
await stdin.write(ENTER);
|
|
130
|
-
await delay(CONFIRM_INPUT_DELAY_MS);
|
|
131
|
-
globalExpect(onConfirm).toHaveBeenCalled();
|
|
132
|
-
globalExpect(onCancel).not.toHaveBeenCalled();
|
|
133
|
-
});
|
|
134
|
-
it("should call onCancel when default is false and enter pressed", async () => {
|
|
135
|
-
const onConfirm = vi.fn();
|
|
136
|
-
const onCancel = vi.fn();
|
|
137
|
-
const { stdin, unmount } = render(
|
|
138
|
-
/* @__PURE__ */ jsx(
|
|
139
|
-
Confirm,
|
|
140
|
-
{
|
|
141
|
-
message: "Confirm?",
|
|
142
|
-
onConfirm,
|
|
143
|
-
onCancel,
|
|
144
|
-
defaultValue: false
|
|
145
|
-
}
|
|
146
|
-
)
|
|
147
|
-
);
|
|
148
|
-
cleanup = unmount;
|
|
149
|
-
await delay(RENDER_DELAY_MS);
|
|
150
|
-
await stdin.write(ENTER);
|
|
151
|
-
await delay(CONFIRM_INPUT_DELAY_MS);
|
|
152
|
-
globalExpect(onCancel).toHaveBeenCalled();
|
|
153
|
-
globalExpect(onConfirm).not.toHaveBeenCalled();
|
|
154
|
-
});
|
|
155
|
-
it("should handle uppercase Y", async () => {
|
|
156
|
-
const onConfirm = vi.fn();
|
|
157
|
-
const { stdin, unmount } = render(
|
|
158
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm, onCancel: () => {
|
|
159
|
-
} })
|
|
160
|
-
);
|
|
161
|
-
cleanup = unmount;
|
|
162
|
-
await delay(RENDER_DELAY_MS);
|
|
163
|
-
await stdin.write("Y");
|
|
164
|
-
await delay(CONFIRM_INPUT_DELAY_MS);
|
|
165
|
-
globalExpect(onConfirm).toHaveBeenCalled();
|
|
166
|
-
});
|
|
167
|
-
it("should handle uppercase N", async () => {
|
|
168
|
-
const onCancel = vi.fn();
|
|
169
|
-
const { stdin, unmount } = render(
|
|
170
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm: () => {
|
|
171
|
-
}, onCancel })
|
|
172
|
-
);
|
|
173
|
-
cleanup = unmount;
|
|
174
|
-
await delay(RENDER_DELAY_MS);
|
|
175
|
-
await stdin.write("N");
|
|
176
|
-
await delay(CONFIRM_INPUT_DELAY_MS);
|
|
177
|
-
globalExpect(onCancel).toHaveBeenCalled();
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
describe("default value", () => {
|
|
181
|
-
it("should default to false when not specified", () => {
|
|
182
|
-
const { lastFrame, unmount } = render(
|
|
183
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm: () => {
|
|
184
|
-
}, onCancel: () => {
|
|
185
|
-
} })
|
|
186
|
-
);
|
|
187
|
-
cleanup = unmount;
|
|
188
|
-
const output = lastFrame();
|
|
189
|
-
globalExpect(output).toContain("y/N");
|
|
190
|
-
});
|
|
191
|
-
it("should render with specified default value of true", () => {
|
|
192
|
-
const { lastFrame, unmount } = render(
|
|
193
|
-
/* @__PURE__ */ jsx(Confirm, { message: "Confirm?", onConfirm: () => {
|
|
194
|
-
}, onCancel: () => {
|
|
195
|
-
}, defaultValue: true })
|
|
196
|
-
);
|
|
197
|
-
cleanup = unmount;
|
|
198
|
-
const output = lastFrame();
|
|
199
|
-
globalExpect(output).toContain("Y/n");
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
//# sourceMappingURL=confirm.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/components/common/confirm.test.tsx"],"sourcesContent":["// ConfirmInput requires longer delays than other components for useInput processing\nimport { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { Confirm } from \"./confirm\";\nimport {\n KEY_Y,\n KEY_N,\n ENTER,\n RENDER_DELAY_MS,\n CONFIRM_INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\ndescribe(\"Confirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render the message\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Do you want to proceed?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Do you want to proceed?\");\n });\n\n it(\"should show y/n prompt\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Continue?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // ConfirmInput shows (Y/n) or (y/N) depending on default\n expect(output?.toLowerCase()).toMatch(/[yn]/);\n });\n\n it(\"should show Y/n when default is confirm (true)\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} defaultValue={true} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Y/n\");\n });\n\n it(\"should show y/N when default is cancel (false)\", () => {\n const { lastFrame, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={() => {}}\n onCancel={() => {}}\n defaultValue={false}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"y/N\");\n });\n });\n\n describe(\"keyboard interactions\", () => {\n it(\"should call onConfirm when pressing y\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n // Wait for component to mount and set up input handler\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(KEY_Y);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n expect(onCancel).not.toHaveBeenCalled();\n });\n\n it(\"should call onCancel when pressing n\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(KEY_N);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n expect(onConfirm).not.toHaveBeenCalled();\n });\n\n it(\"should call onConfirm when default is true and enter pressed\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={true}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(ENTER);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n expect(onCancel).not.toHaveBeenCalled();\n });\n\n it(\"should call onCancel when default is false and enter pressed\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(ENTER);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n expect(onConfirm).not.toHaveBeenCalled();\n });\n\n it(\"should handle uppercase Y\", async () => {\n const onConfirm = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(\"Y\");\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n });\n\n it(\"should handle uppercase N\", async () => {\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(\"N\");\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n });\n });\n\n describe(\"default value\", () => {\n it(\"should default to false when not specified\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // When default is false, N is capitalized (y/N)\n expect(output).toContain(\"y/N\");\n });\n\n it(\"should render with specified default value of true\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} defaultValue={true} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // When default is true, Y is capitalized (Y/n)\n expect(output).toContain(\"Y/n\");\n });\n });\n});\n"],"mappings":"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","names":[]}
|