@agents-inc/cli 0.48.0 → 0.60.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 +181 -5
- package/README.md +1 -2
- package/dist/{chunk-2DNDAXF6.js → chunk-52M2XF3W.js} +57 -27
- package/dist/chunk-52M2XF3W.js.map +1 -0
- package/dist/{chunk-WSGKCBY5.js → chunk-52XO4ULK.js} +6 -9
- package/dist/chunk-52XO4ULK.js.map +1 -0
- package/dist/{chunk-AMNCCZSG.js → chunk-6G3KZSO4.js} +82 -63
- package/dist/chunk-6G3KZSO4.js.map +1 -0
- package/dist/{chunk-LESHL6SM.js → chunk-6OWHQ7HM.js} +21 -13
- package/dist/chunk-6OWHQ7HM.js.map +1 -0
- package/dist/{chunk-X3SZIBVW.js → chunk-7FMEMXJ4.js} +71 -71
- package/dist/chunk-7FMEMXJ4.js.map +1 -0
- package/dist/{chunk-I52THVF6.js → chunk-AJJJE7F7.js} +2 -2
- package/dist/{chunk-ZML3OCYA.js → chunk-AX3SZZWA.js} +2 -2
- package/dist/{chunk-NJVJ7VO5.js → chunk-BFD5NZQ4.js} +5 -4
- package/dist/chunk-BFD5NZQ4.js.map +1 -0
- package/dist/{chunk-GSPPOXMG.js → chunk-BKJHAJQW.js} +2 -2
- package/dist/{chunk-GSPPOXMG.js.map → chunk-BKJHAJQW.js.map} +1 -1
- package/dist/{chunk-FPTUCWBY.js → chunk-BMJZBLP7.js} +46 -30
- package/dist/chunk-BMJZBLP7.js.map +1 -0
- package/dist/chunk-BNQ5O6LE.js +74 -0
- package/dist/chunk-BNQ5O6LE.js.map +1 -0
- package/dist/{chunk-W62XVWXB.js → chunk-C577AJE7.js} +3 -3
- package/dist/chunk-CIG7IKX3.js +118 -0
- package/dist/chunk-CIG7IKX3.js.map +1 -0
- package/dist/chunk-EC3UJRKZ.js +1534 -0
- package/dist/chunk-EC3UJRKZ.js.map +1 -0
- package/dist/{chunk-IS7GP6XC.js → chunk-EMIUPGPL.js} +57 -52
- package/dist/chunk-EMIUPGPL.js.map +1 -0
- package/dist/chunk-G6WHCALR.js +593 -0
- package/dist/chunk-G6WHCALR.js.map +1 -0
- package/dist/{chunk-OTTITQ7C.js → chunk-H7WJK7NJ.js} +48 -95
- package/dist/chunk-H7WJK7NJ.js.map +1 -0
- package/dist/chunk-HGTC76BX.js +16 -0
- package/dist/chunk-HGTC76BX.js.map +1 -0
- package/dist/{chunk-G5OZQ376.js → chunk-K6OLORQL.js} +6 -6
- package/dist/{chunk-OHDEJEYB.js → chunk-KIWFEBKH.js} +41 -11
- package/dist/chunk-KIWFEBKH.js.map +1 -0
- package/dist/{chunk-YMUWTPOM.js → chunk-LWXRUR6B.js} +92 -100
- package/dist/chunk-LWXRUR6B.js.map +1 -0
- package/dist/{chunk-U2AEK4ZL.js → chunk-MGNYPVOJ.js} +2 -2
- package/dist/chunk-MKCHLXMY.js +40 -0
- package/dist/chunk-MKCHLXMY.js.map +1 -0
- package/dist/{chunk-37QYD33C.js → chunk-MMFQNJPE.js} +2 -2
- package/dist/{chunk-DG2U2WY3.js → chunk-MR6OBL3B.js} +3 -11
- package/dist/{chunk-DG2U2WY3.js.map → chunk-MR6OBL3B.js.map} +1 -1
- package/dist/{chunk-7IAKVZL5.js → chunk-O6BA7Q2B.js} +28 -59
- package/dist/chunk-O6BA7Q2B.js.map +1 -0
- package/dist/chunk-OCEFD7V6.js +201 -0
- package/dist/chunk-OCEFD7V6.js.map +1 -0
- package/dist/{chunk-YZTWZVGX.js → chunk-PUT7X3GA.js} +1 -1
- package/dist/chunk-PUT7X3GA.js.map +1 -0
- package/dist/chunk-RO6LX3UV.js +342 -0
- package/dist/chunk-RO6LX3UV.js.map +1 -0
- package/dist/{chunk-34BP5BC4.js → chunk-SDKCQXWE.js} +2 -2
- package/dist/{chunk-VBAAATPU.js → chunk-SEJF7CGJ.js} +41 -28
- package/dist/chunk-SEJF7CGJ.js.map +1 -0
- package/dist/{chunk-5O6GKXAN.js → chunk-SZRK3VOR.js} +24 -14
- package/dist/chunk-SZRK3VOR.js.map +1 -0
- package/dist/{chunk-5MN5S3DV.js → chunk-TC3NHO34.js} +22 -17
- package/dist/chunk-TC3NHO34.js.map +1 -0
- package/dist/{chunk-SPVSWDFM.js → chunk-TGLRDEEL.js} +8 -14
- package/dist/chunk-TGLRDEEL.js.map +1 -0
- package/dist/{chunk-P2SFRDWI.js → chunk-TZXYBG3R.js} +3634 -2875
- package/dist/chunk-TZXYBG3R.js.map +1 -0
- package/dist/{chunk-2BVZOYJP.js → chunk-VR3CDXDT.js} +2 -6
- package/dist/chunk-VR3CDXDT.js.map +1 -0
- package/dist/{chunk-KPJJOLAQ.js → chunk-WF6RM73R.js} +272 -40
- package/dist/chunk-WF6RM73R.js.map +1 -0
- package/dist/chunk-WYVDNGJB.js +31 -0
- package/dist/chunk-WYVDNGJB.js.map +1 -0
- package/dist/{chunk-F7KTUFGU.js → chunk-X5EG4EFP.js} +3 -2
- package/dist/chunk-X5EG4EFP.js.map +1 -0
- package/dist/{chunk-FHKNG3UA.js → chunk-XUDTFI4M.js} +2 -2
- package/dist/{chunk-AXV7NFFJ.js → chunk-YHCYKUA3.js} +14 -10
- package/dist/chunk-YHCYKUA3.js.map +1 -0
- package/dist/commands/build/marketplace.js +4 -4
- package/dist/commands/build/plugins.js +9 -7
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +13 -10
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +45 -72
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +7 -5
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +8 -6
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/show.js +7 -5
- package/dist/commands/diff.js +9 -7
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +20 -16
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +196 -94
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +20 -41
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +10 -18
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +21 -20
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +41 -435
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +8 -6
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +28 -15
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +67 -31
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +17 -208
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +16 -10
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +45 -35
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +93 -123
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +11 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +42 -267
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/common/confirm.test.js +4 -4
- package/dist/components/skill-search/skill-search.js +3 -3
- package/dist/components/wizard/category-grid.js +3 -2
- package/dist/components/wizard/category-grid.test.js +113 -59
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +5 -3
- package/dist/components/wizard/checkbox-grid.test.js +6 -5
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +12 -9
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/menu-item.js +1 -1
- package/dist/components/wizard/search-modal.js +2 -2
- package/dist/components/wizard/search-modal.test.js +3 -3
- 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 +4 -4
- 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 +4 -3
- package/dist/components/wizard/source-grid.test.js +5 -4
- 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 -8
- package/dist/components/wizard/step-agents.test.js +20 -18
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +11 -8
- package/dist/components/wizard/step-build.test.js +18 -36
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +4 -4
- package/dist/components/wizard/step-confirm.test.js +83 -23
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +3 -3
- package/dist/components/wizard/step-settings.js +9 -5
- package/dist/components/wizard/step-settings.test.js +13 -9
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +13 -10
- package/dist/components/wizard/step-sources.test.js +19 -16
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +16 -12
- package/dist/components/wizard/step-stack.test.js +18 -14
- 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 -25
- package/dist/config-exports.js +20 -0
- package/dist/config-exports.js.map +1 -0
- package/dist/hooks/init.js +56 -3
- package/dist/hooks/init.js.map +1 -1
- package/dist/loader-2O32KKAQ.js +19 -0
- package/dist/source-loader-A6B3NDI4.js +16 -0
- package/dist/source-loader-A6B3NDI4.js.map +1 -0
- package/dist/source-manager-Q7IQSGIX.js +18 -0
- package/dist/source-manager-Q7IQSGIX.js.map +1 -0
- package/dist/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
- package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
- package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
- package/dist/src/agents/meta/agent-summoner/output-format.md +1 -1
- package/dist/src/agents/meta/agent-summoner/workflow.md +8 -10
- package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
- package/dist/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
- package/dist/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
- package/dist/src/agents/meta/skill-summoner/intro.md +1 -1
- package/dist/src/agents/meta/skill-summoner/output-format.md +3 -3
- package/dist/src/agents/meta/skill-summoner/workflow.md +8 -8
- package/dist/stores/wizard-store.js +6 -5
- package/dist/stores/wizard-store.test.js +367 -75
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +5 -1
- package/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
- package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
- package/src/agents/meta/agent-summoner/examples.md +2 -2
- package/src/agents/meta/agent-summoner/output-format.md +1 -1
- package/src/agents/meta/agent-summoner/workflow.md +8 -10
- package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
- package/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
- package/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
- package/src/agents/meta/skill-summoner/intro.md +1 -1
- package/src/agents/meta/skill-summoner/output-format.md +3 -3
- package/src/agents/meta/skill-summoner/workflow.md +8 -8
- package/src/schemas/agent.schema.json +1 -1
- package/src/schemas/metadata.schema.json +6 -0
- package/src/schemas/project-config.schema.json +0 -3
- package/src/schemas/stacks.schema.json +1 -1
- package/config/skill-categories.yaml +0 -344
- package/config/skill-rules.yaml +0 -740
- package/config/stacks.yaml +0 -1865
- package/dist/chunk-2BVZOYJP.js.map +0 -1
- package/dist/chunk-2DNDAXF6.js.map +0 -1
- package/dist/chunk-5MN5S3DV.js.map +0 -1
- package/dist/chunk-5O6GKXAN.js.map +0 -1
- package/dist/chunk-7IAKVZL5.js.map +0 -1
- package/dist/chunk-AMNCCZSG.js.map +0 -1
- package/dist/chunk-AXV7NFFJ.js.map +0 -1
- package/dist/chunk-AXZNJ5PN.js +0 -99
- package/dist/chunk-AXZNJ5PN.js.map +0 -1
- package/dist/chunk-C7DLY64D.js +0 -115
- package/dist/chunk-C7DLY64D.js.map +0 -1
- package/dist/chunk-F7KTUFGU.js.map +0 -1
- package/dist/chunk-FPTUCWBY.js.map +0 -1
- package/dist/chunk-IS7GP6XC.js.map +0 -1
- package/dist/chunk-KPJJOLAQ.js.map +0 -1
- package/dist/chunk-LESHL6SM.js.map +0 -1
- package/dist/chunk-NJVJ7VO5.js.map +0 -1
- package/dist/chunk-OHDEJEYB.js.map +0 -1
- package/dist/chunk-OTTITQ7C.js.map +0 -1
- package/dist/chunk-P2SFRDWI.js.map +0 -1
- package/dist/chunk-PY2XZUBF.js +0 -29
- package/dist/chunk-PY2XZUBF.js.map +0 -1
- package/dist/chunk-SPVSWDFM.js.map +0 -1
- package/dist/chunk-VBAAATPU.js.map +0 -1
- package/dist/chunk-WSGKCBY5.js.map +0 -1
- package/dist/chunk-X3SZIBVW.js.map +0 -1
- package/dist/chunk-YDASDMTH.js +0 -183
- package/dist/chunk-YDASDMTH.js.map +0 -1
- package/dist/chunk-YMUWTPOM.js.map +0 -1
- package/dist/chunk-YZTWZVGX.js.map +0 -1
- package/dist/commands/config/get.js +0 -61
- package/dist/commands/config/get.js.map +0 -1
- package/dist/commands/config/set-project.js +0 -61
- package/dist/commands/config/set-project.js.map +0 -1
- package/dist/commands/config/unset-project.js +0 -57
- package/dist/commands/config/unset-project.js.map +0 -1
- package/dist/config/skill-categories.yaml +0 -344
- package/dist/config/skill-rules.yaml +0 -740
- package/dist/config/stacks.yaml +0 -1865
- package/dist/source-manager-Y7R6WPOW.js +0 -16
- package/dist/src/agents/migration/cli-migrator/agent.yaml +0 -12
- package/dist/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
- package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
- package/dist/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
- package/dist/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
- package/dist/src/agents/migration/cli-migrator/intro.md +0 -15
- package/dist/src/agents/migration/cli-migrator/output-format.md +0 -164
- package/dist/src/agents/migration/cli-migrator/workflow.md +0 -230
- package/src/agents/migration/cli-migrator/agent.yaml +0 -12
- package/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
- package/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
- package/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
- package/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
- package/src/agents/migration/cli-migrator/intro.md +0 -15
- package/src/agents/migration/cli-migrator/output-format.md +0 -164
- package/src/agents/migration/cli-migrator/workflow.md +0 -230
- /package/dist/{chunk-I52THVF6.js.map → chunk-AJJJE7F7.js.map} +0 -0
- /package/dist/{chunk-ZML3OCYA.js.map → chunk-AX3SZZWA.js.map} +0 -0
- /package/dist/{chunk-W62XVWXB.js.map → chunk-C577AJE7.js.map} +0 -0
- /package/dist/{chunk-G5OZQ376.js.map → chunk-K6OLORQL.js.map} +0 -0
- /package/dist/{chunk-U2AEK4ZL.js.map → chunk-MGNYPVOJ.js.map} +0 -0
- /package/dist/{chunk-37QYD33C.js.map → chunk-MMFQNJPE.js.map} +0 -0
- /package/dist/{chunk-34BP5BC4.js.map → chunk-SDKCQXWE.js.map} +0 -0
- /package/dist/{chunk-FHKNG3UA.js.map → chunk-XUDTFI4M.js.map} +0 -0
- /package/dist/{source-manager-Y7R6WPOW.js.map → loader-2O32KKAQ.js.map} +0 -0
- /package/dist/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
Wizard
|
|
4
|
+
} from "./chunk-6G3KZSO4.js";
|
|
5
|
+
import {
|
|
6
|
+
STATUS_MESSAGES,
|
|
7
|
+
SUCCESS_MESSAGES
|
|
8
|
+
} from "./chunk-MR6OBL3B.js";
|
|
9
|
+
import {
|
|
10
|
+
claudePluginInstall,
|
|
11
|
+
claudePluginMarketplaceAdd,
|
|
12
|
+
claudePluginMarketplaceExists,
|
|
13
|
+
deriveInstallMode,
|
|
14
|
+
detectGlobalInstallation,
|
|
15
|
+
detectProjectInstallation,
|
|
16
|
+
ensureBlankGlobalConfig,
|
|
17
|
+
getInstallationInfo,
|
|
18
|
+
getMarketplaceLabel,
|
|
19
|
+
hasIndividualPlugins,
|
|
20
|
+
installLocal,
|
|
21
|
+
installPluginConfig,
|
|
22
|
+
loadProjectConfig,
|
|
23
|
+
loadSkillsMatrixFromSource
|
|
24
|
+
} from "./chunk-TZXYBG3R.js";
|
|
25
|
+
import {
|
|
26
|
+
BaseCommand,
|
|
27
|
+
EXIT_CODES
|
|
28
|
+
} from "./chunk-VR3CDXDT.js";
|
|
29
|
+
import {
|
|
30
|
+
disableBuffering,
|
|
31
|
+
drainBuffer,
|
|
32
|
+
enableBuffering,
|
|
33
|
+
fileExists,
|
|
34
|
+
getErrorMessage,
|
|
35
|
+
readFileSafe,
|
|
36
|
+
settingsFileSchema,
|
|
37
|
+
warn,
|
|
38
|
+
warnUnknownFields
|
|
39
|
+
} from "./chunk-LWXRUR6B.js";
|
|
40
|
+
import {
|
|
41
|
+
ASCII_LOGO,
|
|
42
|
+
CLAUDE_DIR,
|
|
43
|
+
CLAUDE_SRC_DIR,
|
|
44
|
+
CLI_BIN_NAME,
|
|
45
|
+
CLI_COLORS,
|
|
46
|
+
DEFAULT_BRANDING,
|
|
47
|
+
GLOBAL_INSTALL_ROOT,
|
|
48
|
+
MAX_CONFIG_FILE_SIZE
|
|
49
|
+
} from "./chunk-6OWHQ7HM.js";
|
|
50
|
+
import {
|
|
51
|
+
init_esm_shims
|
|
52
|
+
} from "./chunk-DHET7RCE.js";
|
|
53
|
+
|
|
54
|
+
// src/cli/commands/init.tsx
|
|
55
|
+
init_esm_shims();
|
|
56
|
+
import { useState } from "react";
|
|
57
|
+
import { Flags } from "@oclif/core";
|
|
58
|
+
import { render, Box as Box2, Text as Text2, useApp, useInput } from "ink";
|
|
59
|
+
import os from "os";
|
|
60
|
+
import path2 from "path";
|
|
61
|
+
|
|
62
|
+
// src/cli/lib/permission-checker.tsx
|
|
63
|
+
init_esm_shims();
|
|
64
|
+
import { Text, Box } from "ink";
|
|
65
|
+
import path from "path";
|
|
66
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
67
|
+
async function checkPermissions(projectRoot) {
|
|
68
|
+
const settingsPath = path.join(projectRoot, CLAUDE_DIR, "settings.json");
|
|
69
|
+
const localSettingsPath = path.join(projectRoot, CLAUDE_DIR, "settings.local.json");
|
|
70
|
+
let permissions;
|
|
71
|
+
for (const filePath of [localSettingsPath, settingsPath]) {
|
|
72
|
+
if (await fileExists(filePath)) {
|
|
73
|
+
try {
|
|
74
|
+
const content = await readFileSafe(filePath, MAX_CONFIG_FILE_SIZE);
|
|
75
|
+
const raw = JSON.parse(content);
|
|
76
|
+
if (typeof raw === "object" && raw !== null && !Array.isArray(raw)) {
|
|
77
|
+
const EXPECTED_SETTINGS_KEYS = [
|
|
78
|
+
"permissions",
|
|
79
|
+
"enabledPlugins",
|
|
80
|
+
"env",
|
|
81
|
+
"allowedTools",
|
|
82
|
+
"customInstructions",
|
|
83
|
+
"defaultModel"
|
|
84
|
+
];
|
|
85
|
+
warnUnknownFields(
|
|
86
|
+
raw,
|
|
87
|
+
EXPECTED_SETTINGS_KEYS,
|
|
88
|
+
`settings file '${filePath}'`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
const result = settingsFileSchema.safeParse(raw);
|
|
92
|
+
const parsed = result.success ? result.data : {};
|
|
93
|
+
if (parsed.permissions) {
|
|
94
|
+
permissions = parsed.permissions;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
} catch {
|
|
98
|
+
warn(`Malformed settings file at '${filePath}' \u2014 skipping`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!permissions) {
|
|
103
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: CLI_COLORS.WARNING, padding: 1, children: [
|
|
104
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: CLI_COLORS.WARNING, children: "Permission Notice" }),
|
|
105
|
+
/* @__PURE__ */ jsx(Text, { children: "No permissions configured in .claude/settings.json" }),
|
|
106
|
+
/* @__PURE__ */ jsx(Text, { children: "Agents will prompt for approval on each tool use." }),
|
|
107
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
108
|
+
/* @__PURE__ */ jsx(Text, { children: "For autonomous operation, add to .claude/settings.json:" }),
|
|
109
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
110
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: "{" }),
|
|
111
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: ' "permissions": {' }),
|
|
112
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: ' "allow": [' }),
|
|
113
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: ' "Read(*)",' }),
|
|
114
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: ' "Bash(git *)",' }),
|
|
115
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: ' "Bash(bun *)"' }),
|
|
116
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: " ]" }),
|
|
117
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: " }" }),
|
|
118
|
+
/* @__PURE__ */ jsx(Text, { color: "dim", children: "}" })
|
|
119
|
+
] });
|
|
120
|
+
}
|
|
121
|
+
const hasRestrictiveBash = permissions.deny?.some(
|
|
122
|
+
(rule) => rule === "Bash(*)" || rule === "Bash"
|
|
123
|
+
);
|
|
124
|
+
const hasNoAllows = !permissions.allow || permissions.allow.length === 0;
|
|
125
|
+
if (hasRestrictiveBash || hasNoAllows) {
|
|
126
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: CLI_COLORS.WARNING, padding: 1, children: [
|
|
127
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: CLI_COLORS.WARNING, children: "Permission Warnings" }),
|
|
128
|
+
hasRestrictiveBash && /* @__PURE__ */ jsx(Text, { children: "\u26A0 Bash is denied in permissions. Some agents require Bash for git, testing, and build commands." }),
|
|
129
|
+
hasNoAllows && /* @__PURE__ */ jsx(Text, { children: "\u26A0 No allow rules configured. Agents will prompt for each tool use." })
|
|
130
|
+
] });
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/cli/commands/init.tsx
|
|
136
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
137
|
+
var DASHBOARD_OPTIONS = [
|
|
138
|
+
{ label: "Edit", command: "edit" },
|
|
139
|
+
{ label: "Compile", command: "compile" },
|
|
140
|
+
{ label: "Doctor", command: "doctor" },
|
|
141
|
+
{ label: "List", command: "list" }
|
|
142
|
+
];
|
|
143
|
+
var Dashboard = ({
|
|
144
|
+
skillCount,
|
|
145
|
+
agentCount,
|
|
146
|
+
source,
|
|
147
|
+
mode,
|
|
148
|
+
onSelect,
|
|
149
|
+
onCancel
|
|
150
|
+
}) => {
|
|
151
|
+
const { exit } = useApp();
|
|
152
|
+
const [focusIndex, setFocusIndex] = useState(0);
|
|
153
|
+
useInput((_input, key) => {
|
|
154
|
+
if (key.escape) {
|
|
155
|
+
onCancel();
|
|
156
|
+
exit();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (key.return) {
|
|
160
|
+
onSelect(DASHBOARD_OPTIONS[focusIndex].command);
|
|
161
|
+
exit();
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (key.leftArrow) {
|
|
165
|
+
setFocusIndex((i) => i > 0 ? i - 1 : DASHBOARD_OPTIONS.length - 1);
|
|
166
|
+
}
|
|
167
|
+
if (key.rightArrow) {
|
|
168
|
+
setFocusIndex((i) => i < DASHBOARD_OPTIONS.length - 1 ? i + 1 : 0);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
|
|
172
|
+
/* @__PURE__ */ jsx2(Text2, { bold: true, children: DEFAULT_BRANDING.NAME }),
|
|
173
|
+
/* @__PURE__ */ jsx2(Text2, { children: " " }),
|
|
174
|
+
/* @__PURE__ */ jsxs2(Text2, { children: [
|
|
175
|
+
" Skills: ",
|
|
176
|
+
skillCount,
|
|
177
|
+
" installed"
|
|
178
|
+
] }),
|
|
179
|
+
/* @__PURE__ */ jsxs2(Text2, { children: [
|
|
180
|
+
" Agents: ",
|
|
181
|
+
agentCount,
|
|
182
|
+
" compiled"
|
|
183
|
+
] }),
|
|
184
|
+
/* @__PURE__ */ jsxs2(Text2, { children: [
|
|
185
|
+
" Mode: ",
|
|
186
|
+
mode === "plugin" ? "Plugin" : "Local"
|
|
187
|
+
] }),
|
|
188
|
+
source && /* @__PURE__ */ jsxs2(Text2, { children: [
|
|
189
|
+
" Source: ",
|
|
190
|
+
source
|
|
191
|
+
] }),
|
|
192
|
+
/* @__PURE__ */ jsx2(Text2, { children: " " }),
|
|
193
|
+
/* @__PURE__ */ jsxs2(Box2, { children: [
|
|
194
|
+
/* @__PURE__ */ jsx2(Text2, { children: " " }),
|
|
195
|
+
DASHBOARD_OPTIONS.map((option, index) => /* @__PURE__ */ jsx2(Box2, { marginRight: 1, children: /* @__PURE__ */ jsxs2(
|
|
196
|
+
Text2,
|
|
197
|
+
{
|
|
198
|
+
color: index === focusIndex ? CLI_COLORS.FOCUS : void 0,
|
|
199
|
+
bold: index === focusIndex,
|
|
200
|
+
children: [
|
|
201
|
+
"[",
|
|
202
|
+
option.label,
|
|
203
|
+
"]"
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
) }, option.command))
|
|
207
|
+
] }),
|
|
208
|
+
/* @__PURE__ */ jsx2(Text2, { dimColor: true, children: " Use arrow keys to select, Enter to confirm, Esc to exit" })
|
|
209
|
+
] });
|
|
210
|
+
};
|
|
211
|
+
var GLOBAL_CONFIG_OPTIONS = [
|
|
212
|
+
{ label: "Edit global installation", choice: "edit-global" },
|
|
213
|
+
{ label: "Create new project installation", choice: "create-project" }
|
|
214
|
+
];
|
|
215
|
+
var GlobalConfigPrompt = ({
|
|
216
|
+
globalConfigDir,
|
|
217
|
+
onSelect,
|
|
218
|
+
onCancel
|
|
219
|
+
}) => {
|
|
220
|
+
const { exit } = useApp();
|
|
221
|
+
const [focusIndex, setFocusIndex] = useState(0);
|
|
222
|
+
useInput((_input, key) => {
|
|
223
|
+
if (key.escape) {
|
|
224
|
+
onCancel();
|
|
225
|
+
exit();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (key.return) {
|
|
229
|
+
onSelect(GLOBAL_CONFIG_OPTIONS[focusIndex].choice);
|
|
230
|
+
exit();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (key.leftArrow) {
|
|
234
|
+
setFocusIndex((i) => i > 0 ? i - 1 : GLOBAL_CONFIG_OPTIONS.length - 1);
|
|
235
|
+
}
|
|
236
|
+
if (key.rightArrow) {
|
|
237
|
+
setFocusIndex((i) => i < GLOBAL_CONFIG_OPTIONS.length - 1 ? i + 1 : 0);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
|
|
241
|
+
/* @__PURE__ */ jsxs2(Text2, { children: [
|
|
242
|
+
"A global installation was found at ",
|
|
243
|
+
globalConfigDir
|
|
244
|
+
] }),
|
|
245
|
+
/* @__PURE__ */ jsx2(Text2, { children: "What would you like to do?" }),
|
|
246
|
+
/* @__PURE__ */ jsx2(Text2, { children: " " }),
|
|
247
|
+
/* @__PURE__ */ jsxs2(Box2, { children: [
|
|
248
|
+
/* @__PURE__ */ jsx2(Text2, { children: " " }),
|
|
249
|
+
GLOBAL_CONFIG_OPTIONS.map((option, index) => /* @__PURE__ */ jsx2(Box2, { marginRight: 1, children: /* @__PURE__ */ jsxs2(
|
|
250
|
+
Text2,
|
|
251
|
+
{
|
|
252
|
+
color: index === focusIndex ? CLI_COLORS.FOCUS : void 0,
|
|
253
|
+
bold: index === focusIndex,
|
|
254
|
+
children: [
|
|
255
|
+
"[",
|
|
256
|
+
option.label,
|
|
257
|
+
"]"
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
) }, option.choice))
|
|
261
|
+
] }),
|
|
262
|
+
/* @__PURE__ */ jsx2(Text2, { dimColor: true, children: " Use arrow keys to select, Enter to confirm, Esc to exit" })
|
|
263
|
+
] });
|
|
264
|
+
};
|
|
265
|
+
async function getDashboardData(projectDir) {
|
|
266
|
+
const [info, loaded] = await Promise.all([getInstallationInfo(), loadProjectConfig(projectDir)]);
|
|
267
|
+
const skillCount = loaded?.config?.skills?.length ?? 0;
|
|
268
|
+
const agentCount = info?.agentCount ?? 0;
|
|
269
|
+
const mode = info?.mode ?? (loaded?.config?.skills ? deriveInstallMode(loaded.config.skills) : "local");
|
|
270
|
+
const source = loaded?.config?.source;
|
|
271
|
+
return { skillCount, agentCount, mode, source };
|
|
272
|
+
}
|
|
273
|
+
function formatDashboardText(data) {
|
|
274
|
+
const modeLabel = data.mode === "plugin" ? "Plugin" : "Local";
|
|
275
|
+
const lines = [
|
|
276
|
+
DEFAULT_BRANDING.NAME,
|
|
277
|
+
"",
|
|
278
|
+
` Skills: ${data.skillCount} installed`,
|
|
279
|
+
` Agents: ${data.agentCount} compiled`,
|
|
280
|
+
` Mode: ${modeLabel}`
|
|
281
|
+
];
|
|
282
|
+
if (data.source) {
|
|
283
|
+
lines.push(` Source: ${data.source}`);
|
|
284
|
+
}
|
|
285
|
+
lines.push("");
|
|
286
|
+
lines.push(` [Edit] [Compile] [Doctor] [List]`);
|
|
287
|
+
return lines.join("\n");
|
|
288
|
+
}
|
|
289
|
+
async function showDashboard(projectDir, log) {
|
|
290
|
+
const data = await getDashboardData(projectDir);
|
|
291
|
+
if (!process.stdin.isTTY) {
|
|
292
|
+
const output = log ?? console.log;
|
|
293
|
+
output(formatDashboardText(data));
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
let selectedCommand = null;
|
|
297
|
+
const { waitUntilExit } = render(
|
|
298
|
+
/* @__PURE__ */ jsx2(
|
|
299
|
+
Dashboard,
|
|
300
|
+
{
|
|
301
|
+
skillCount: data.skillCount,
|
|
302
|
+
agentCount: data.agentCount,
|
|
303
|
+
source: data.source,
|
|
304
|
+
mode: data.mode,
|
|
305
|
+
onSelect: (command) => {
|
|
306
|
+
selectedCommand = command;
|
|
307
|
+
},
|
|
308
|
+
onCancel: () => {
|
|
309
|
+
selectedCommand = null;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
);
|
|
314
|
+
await waitUntilExit();
|
|
315
|
+
return selectedCommand;
|
|
316
|
+
}
|
|
317
|
+
var Init = class _Init extends BaseCommand {
|
|
318
|
+
static summary = `Initialize ${DEFAULT_BRANDING.NAME} in this project`;
|
|
319
|
+
static description = "Interactive wizard to set up skills and agents. Supports Plugin Mode (native install) and Local Mode (copy to .claude/).";
|
|
320
|
+
static examples = [
|
|
321
|
+
{
|
|
322
|
+
description: "Start the setup wizard",
|
|
323
|
+
command: "<%= config.bin %> <%= command.id %>"
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
description: "Initialize from a custom marketplace",
|
|
327
|
+
command: "<%= config.bin %> <%= command.id %> --source github:org/marketplace"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
description: "Force refresh skills from remote",
|
|
331
|
+
command: "<%= config.bin %> <%= command.id %> --refresh"
|
|
332
|
+
}
|
|
333
|
+
];
|
|
334
|
+
static flags = {
|
|
335
|
+
...BaseCommand.baseFlags,
|
|
336
|
+
refresh: Flags.boolean({
|
|
337
|
+
description: "Force refresh from remote source",
|
|
338
|
+
default: false
|
|
339
|
+
})
|
|
340
|
+
};
|
|
341
|
+
async run() {
|
|
342
|
+
const { flags } = await this.parse(_Init);
|
|
343
|
+
const projectDir = process.cwd();
|
|
344
|
+
const individualPluginsExist = await hasIndividualPlugins(projectDir);
|
|
345
|
+
const existingInstallation = await detectProjectInstallation(projectDir);
|
|
346
|
+
if (individualPluginsExist || existingInstallation) {
|
|
347
|
+
const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));
|
|
348
|
+
if (selectedCommand) {
|
|
349
|
+
await this.config.runCommand(selectedCommand);
|
|
350
|
+
}
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
const globalInstallation = await detectGlobalInstallation();
|
|
354
|
+
if (globalInstallation) {
|
|
355
|
+
const globalConfigDir = path2.join(os.homedir(), CLAUDE_SRC_DIR);
|
|
356
|
+
if (process.stdin.isTTY) {
|
|
357
|
+
let globalChoice = null;
|
|
358
|
+
const { waitUntilExit: waitForPrompt } = render(
|
|
359
|
+
/* @__PURE__ */ jsx2(
|
|
360
|
+
GlobalConfigPrompt,
|
|
361
|
+
{
|
|
362
|
+
globalConfigDir,
|
|
363
|
+
onSelect: (choice) => {
|
|
364
|
+
globalChoice = choice;
|
|
365
|
+
},
|
|
366
|
+
onCancel: () => {
|
|
367
|
+
globalChoice = null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
)
|
|
371
|
+
);
|
|
372
|
+
await waitForPrompt();
|
|
373
|
+
if (globalChoice === "edit-global") {
|
|
374
|
+
const selectedCommand = await showDashboard(os.homedir(), (msg) => this.log(msg));
|
|
375
|
+
if (selectedCommand) {
|
|
376
|
+
await this.config.runCommand(selectedCommand);
|
|
377
|
+
}
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (globalChoice === null) {
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (projectDir !== GLOBAL_INSTALL_ROOT) {
|
|
386
|
+
const created = await ensureBlankGlobalConfig();
|
|
387
|
+
if (created) {
|
|
388
|
+
this.log("Created blank global config at ~/" + CLAUDE_SRC_DIR);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
enableBuffering();
|
|
392
|
+
let sourceResult;
|
|
393
|
+
let startupMessages = [];
|
|
394
|
+
try {
|
|
395
|
+
sourceResult = await loadSkillsMatrixFromSource({
|
|
396
|
+
sourceFlag: flags.source,
|
|
397
|
+
projectDir,
|
|
398
|
+
forceRefresh: flags.refresh
|
|
399
|
+
});
|
|
400
|
+
} catch (error) {
|
|
401
|
+
disableBuffering();
|
|
402
|
+
this.error(getErrorMessage(error), {
|
|
403
|
+
exit: EXIT_CODES.ERROR
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
startupMessages = drainBuffer();
|
|
407
|
+
disableBuffering();
|
|
408
|
+
let wizardResult = null;
|
|
409
|
+
const marketplaceLabel = getMarketplaceLabel(sourceResult);
|
|
410
|
+
const { waitUntilExit } = render(
|
|
411
|
+
/* @__PURE__ */ jsx2(
|
|
412
|
+
Wizard,
|
|
413
|
+
{
|
|
414
|
+
matrix: sourceResult.matrix,
|
|
415
|
+
version: this.config.version,
|
|
416
|
+
marketplaceLabel,
|
|
417
|
+
logo: ASCII_LOGO,
|
|
418
|
+
projectDir,
|
|
419
|
+
startupMessages,
|
|
420
|
+
onComplete: (result2) => {
|
|
421
|
+
wizardResult = result2;
|
|
422
|
+
},
|
|
423
|
+
onCancel: () => {
|
|
424
|
+
this.log("Setup cancelled");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
)
|
|
428
|
+
);
|
|
429
|
+
await waitUntilExit();
|
|
430
|
+
const result = wizardResult;
|
|
431
|
+
if (!result || result.cancelled) {
|
|
432
|
+
this.exit(EXIT_CODES.CANCELLED);
|
|
433
|
+
}
|
|
434
|
+
if (result.skills.length === 0) {
|
|
435
|
+
this.error("No skills selected", { exit: EXIT_CODES.ERROR });
|
|
436
|
+
}
|
|
437
|
+
await this.handleInstallation(result, sourceResult, flags);
|
|
438
|
+
}
|
|
439
|
+
async handleInstallation(result, sourceResult, flags) {
|
|
440
|
+
const projectDir = process.cwd();
|
|
441
|
+
const installMode = deriveInstallMode(result.skills);
|
|
442
|
+
this.log("\n");
|
|
443
|
+
this.log(`Selected ${result.skills.length} skills`);
|
|
444
|
+
this.log(
|
|
445
|
+
`Install mode: ${installMode === "plugin" ? "Plugin (native install)" : "Local (copy to .claude/skills/)"}`
|
|
446
|
+
);
|
|
447
|
+
if (installMode === "plugin") {
|
|
448
|
+
if (sourceResult.marketplace) {
|
|
449
|
+
await this.installIndividualPlugins(result, sourceResult, flags, projectDir);
|
|
450
|
+
} else {
|
|
451
|
+
this.warn("Plugin Mode requires a marketplace for individual skill installation.");
|
|
452
|
+
this.log(`Falling back to Local Mode (copying to .claude/skills/)...`);
|
|
453
|
+
this.log("To use Plugin Mode, either select a stack or configure a marketplace source.\n");
|
|
454
|
+
await this.installLocalMode(result, sourceResult, flags, projectDir);
|
|
455
|
+
}
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
await this.installLocalMode(result, sourceResult, flags, projectDir);
|
|
459
|
+
}
|
|
460
|
+
async installIndividualPlugins(result, sourceResult, flags, projectDir) {
|
|
461
|
+
if (sourceResult.marketplace) {
|
|
462
|
+
const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);
|
|
463
|
+
if (!marketplaceExists) {
|
|
464
|
+
this.log(`Registering marketplace "${sourceResult.marketplace}"...`);
|
|
465
|
+
try {
|
|
466
|
+
const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, "");
|
|
467
|
+
await claudePluginMarketplaceAdd(marketplaceSource);
|
|
468
|
+
this.log(`Registered marketplace: ${sourceResult.marketplace}`);
|
|
469
|
+
} catch (error) {
|
|
470
|
+
this.error(getErrorMessage(error), {
|
|
471
|
+
exit: EXIT_CODES.ERROR
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
this.log("Installing skill plugins...");
|
|
477
|
+
for (const skill of result.skills.filter((s) => s.source !== "local")) {
|
|
478
|
+
const pluginRef = `${skill.id}@${sourceResult.marketplace}`;
|
|
479
|
+
const pluginScope = skill.scope === "global" ? "user" : "project";
|
|
480
|
+
try {
|
|
481
|
+
await claudePluginInstall(pluginRef, pluginScope, projectDir);
|
|
482
|
+
this.log(` Installed ${pluginRef}`);
|
|
483
|
+
} catch (error) {
|
|
484
|
+
this.error(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`, {
|
|
485
|
+
exit: EXIT_CODES.ERROR
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
const pluginSkillCount = result.skills.filter((s) => s.source !== "local").length;
|
|
490
|
+
this.log(`Installed ${pluginSkillCount} skill plugins
|
|
491
|
+
`);
|
|
492
|
+
this.log("Generating configuration...");
|
|
493
|
+
try {
|
|
494
|
+
const configResult = await installPluginConfig({
|
|
495
|
+
wizardResult: result,
|
|
496
|
+
sourceResult,
|
|
497
|
+
projectDir,
|
|
498
|
+
sourceFlag: flags.source
|
|
499
|
+
});
|
|
500
|
+
if (configResult.wasMerged) {
|
|
501
|
+
this.log(`Merged with existing config at ${configResult.mergedConfigPath}`);
|
|
502
|
+
}
|
|
503
|
+
this.log(`Configuration saved (${configResult.config.agents.length} agents)
|
|
504
|
+
`);
|
|
505
|
+
this.log(STATUS_MESSAGES.COMPILING_AGENTS);
|
|
506
|
+
this.log(`Compiled ${configResult.compiledAgents.length} agents to .claude/agents/
|
|
507
|
+
`);
|
|
508
|
+
this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}
|
|
509
|
+
`);
|
|
510
|
+
this.log("Agents compiled to:");
|
|
511
|
+
this.log(` ${configResult.agentsDir}`);
|
|
512
|
+
for (const agentName of configResult.compiledAgents) {
|
|
513
|
+
this.log(` ${agentName}.md`);
|
|
514
|
+
}
|
|
515
|
+
this.log("");
|
|
516
|
+
this.log("Configuration:");
|
|
517
|
+
this.log(` ${configResult.configPath}`);
|
|
518
|
+
this.log("");
|
|
519
|
+
this.log("To customize agent-skill assignments:");
|
|
520
|
+
this.log(` 1. Edit .claude-src/config.ts`);
|
|
521
|
+
this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);
|
|
522
|
+
this.log("");
|
|
523
|
+
const permissionWarning = await checkPermissions(projectDir);
|
|
524
|
+
if (permissionWarning) {
|
|
525
|
+
const { waitUntilExit } = render(permissionWarning);
|
|
526
|
+
await waitUntilExit();
|
|
527
|
+
}
|
|
528
|
+
} catch (error) {
|
|
529
|
+
this.handleError(error);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
async installLocalMode(result, sourceResult, flags, projectDir) {
|
|
533
|
+
const matrix = sourceResult.matrix;
|
|
534
|
+
this.log("Copying skills to local directory...");
|
|
535
|
+
try {
|
|
536
|
+
const installResult = await installLocal({
|
|
537
|
+
wizardResult: result,
|
|
538
|
+
sourceResult,
|
|
539
|
+
projectDir,
|
|
540
|
+
sourceFlag: flags.source
|
|
541
|
+
});
|
|
542
|
+
this.log(`Copied ${installResult.copiedSkills.length} skills to .claude/skills/
|
|
543
|
+
`);
|
|
544
|
+
this.log("Generating configuration...");
|
|
545
|
+
if (installResult.wasMerged) {
|
|
546
|
+
this.log(`Merged with existing config at ${installResult.mergedConfigPath}`);
|
|
547
|
+
}
|
|
548
|
+
this.log(`Configuration saved (${installResult.config.agents.length} agents)
|
|
549
|
+
`);
|
|
550
|
+
this.log(STATUS_MESSAGES.COMPILING_AGENTS);
|
|
551
|
+
this.log(`Compiled ${installResult.compiledAgents.length} agents to .claude/agents/
|
|
552
|
+
`);
|
|
553
|
+
this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}
|
|
554
|
+
`);
|
|
555
|
+
this.log("Skills copied to:");
|
|
556
|
+
this.log(` ${installResult.skillsDir}`);
|
|
557
|
+
for (const copiedSkill of installResult.copiedSkills) {
|
|
558
|
+
const skill = matrix.skills[copiedSkill.skillId];
|
|
559
|
+
const displayName = skill?.displayName || copiedSkill.skillId;
|
|
560
|
+
this.log(` ${displayName}/`);
|
|
561
|
+
}
|
|
562
|
+
this.log("");
|
|
563
|
+
this.log("Agents compiled to:");
|
|
564
|
+
this.log(` ${installResult.agentsDir}`);
|
|
565
|
+
for (const agentName of installResult.compiledAgents) {
|
|
566
|
+
this.log(` ${agentName}.md`);
|
|
567
|
+
}
|
|
568
|
+
this.log("");
|
|
569
|
+
this.log("Configuration:");
|
|
570
|
+
this.log(` ${installResult.configPath}`);
|
|
571
|
+
this.log("");
|
|
572
|
+
this.log("To customize agent-skill assignments:");
|
|
573
|
+
this.log(` 1. Edit .claude-src/config.ts`);
|
|
574
|
+
this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);
|
|
575
|
+
this.log("");
|
|
576
|
+
const permissionWarning = await checkPermissions(projectDir);
|
|
577
|
+
if (permissionWarning) {
|
|
578
|
+
const { waitUntilExit } = render(permissionWarning);
|
|
579
|
+
await waitUntilExit();
|
|
580
|
+
}
|
|
581
|
+
} catch (error) {
|
|
582
|
+
this.handleError(error);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
export {
|
|
588
|
+
getDashboardData,
|
|
589
|
+
formatDashboardText,
|
|
590
|
+
showDashboard,
|
|
591
|
+
Init
|
|
592
|
+
};
|
|
593
|
+
//# sourceMappingURL=chunk-G6WHCALR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/init.tsx","../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport {\n loadSkillsMatrixFromSource,\n getMarketplaceLabel,\n type SourceLoadResult,\n} from \"../lib/loading/index.js\";\nimport {\n installLocal,\n installPluginConfig,\n detectGlobalInstallation,\n detectProjectInstallation,\n deriveInstallMode,\n} from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport { getInstallationInfo } from \"../lib/plugins/plugin-info.js\";\nimport { hasIndividualPlugins } from \"../lib/plugins/index.js\";\nimport {\n claudePluginInstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport {\n ASCII_LOGO,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n CLI_COLORS,\n DEFAULT_BRANDING,\n GLOBAL_INSTALL_ROOT,\n} from \"../consts.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n type StartupMessage,\n} from \"../utils/logger.js\";\nimport { SUCCESS_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\nimport { ensureBlankGlobalConfig } from \"../lib/configuration/config-writer.js\";\n\ntype DashboardOption = {\n label: string;\n command: string;\n};\n\nconst DASHBOARD_OPTIONS: DashboardOption[] = [\n { label: \"Edit\", command: \"edit\" },\n { label: \"Compile\", command: \"compile\" },\n { label: \"Doctor\", command: \"doctor\" },\n { label: \"List\", command: \"list\" },\n];\n\ntype DashboardProps = DashboardData & {\n onSelect: (command: string) => void;\n onCancel: () => void;\n};\n\nconst Dashboard: React.FC<DashboardProps> = ({\n skillCount,\n agentCount,\n source,\n mode,\n onSelect,\n onCancel,\n}) => {\n const { exit } = useApp();\n const [focusIndex, setFocusIndex] = useState(0);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n exit();\n return;\n }\n if (key.return) {\n onSelect(DASHBOARD_OPTIONS[focusIndex].command);\n exit();\n return;\n }\n if (key.leftArrow) {\n setFocusIndex((i) => (i > 0 ? i - 1 : DASHBOARD_OPTIONS.length - 1));\n }\n if (key.rightArrow) {\n setFocusIndex((i) => (i < DASHBOARD_OPTIONS.length - 1 ? i + 1 : 0));\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{DEFAULT_BRANDING.NAME}</Text>\n <Text> </Text>\n <Text> Skills: {skillCount} installed</Text>\n <Text> Agents: {agentCount} compiled</Text>\n <Text> Mode: {mode === \"plugin\" ? \"Plugin\" : \"Local\"}</Text>\n {source && <Text> Source: {source}</Text>}\n <Text> </Text>\n <Box>\n <Text> </Text>\n {DASHBOARD_OPTIONS.map((option, index) => (\n <Box key={option.command} marginRight={1}>\n <Text\n color={index === focusIndex ? CLI_COLORS.FOCUS : undefined}\n bold={index === focusIndex}\n >\n [{option.label}]\n </Text>\n </Box>\n ))}\n </Box>\n <Text dimColor> Use arrow keys to select, Enter to confirm, Esc to exit</Text>\n </Box>\n );\n};\n\ntype GlobalConfigChoice = \"edit-global\" | \"create-project\";\n\nconst GLOBAL_CONFIG_OPTIONS: { label: string; choice: GlobalConfigChoice }[] = [\n { label: \"Edit global installation\", choice: \"edit-global\" },\n { label: \"Create new project installation\", choice: \"create-project\" },\n];\n\ntype GlobalConfigPromptProps = {\n globalConfigDir: string;\n onSelect: (choice: GlobalConfigChoice) => void;\n onCancel: () => void;\n};\n\nconst GlobalConfigPrompt: React.FC<GlobalConfigPromptProps> = ({\n globalConfigDir,\n onSelect,\n onCancel,\n}) => {\n const { exit } = useApp();\n const [focusIndex, setFocusIndex] = useState(0);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n exit();\n return;\n }\n if (key.return) {\n onSelect(GLOBAL_CONFIG_OPTIONS[focusIndex].choice);\n exit();\n return;\n }\n if (key.leftArrow) {\n setFocusIndex((i) => (i > 0 ? i - 1 : GLOBAL_CONFIG_OPTIONS.length - 1));\n }\n if (key.rightArrow) {\n setFocusIndex((i) => (i < GLOBAL_CONFIG_OPTIONS.length - 1 ? i + 1 : 0));\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Text>A global installation was found at {globalConfigDir}</Text>\n <Text>What would you like to do?</Text>\n <Text> </Text>\n <Box>\n <Text> </Text>\n {GLOBAL_CONFIG_OPTIONS.map((option, index) => (\n <Box key={option.choice} marginRight={1}>\n <Text\n color={index === focusIndex ? CLI_COLORS.FOCUS : undefined}\n bold={index === focusIndex}\n >\n [{option.label}]\n </Text>\n </Box>\n ))}\n </Box>\n <Text dimColor> Use arrow keys to select, Enter to confirm, Esc to exit</Text>\n </Box>\n );\n};\n\nexport type DashboardData = {\n skillCount: number;\n agentCount: number;\n mode: string;\n source?: string;\n};\n\n/** Gathers dashboard data from the installation and project config. */\nexport async function getDashboardData(projectDir: string): Promise<DashboardData> {\n const [info, loaded] = await Promise.all([getInstallationInfo(), loadProjectConfig(projectDir)]);\n\n // Skill count from config (canonical source of truth for installed skills)\n const skillCount = loaded?.config?.skills?.length ?? 0;\n // Agent count from filesystem (compiled .md files in agents dir)\n const agentCount = info?.agentCount ?? 0;\n const mode =\n info?.mode ?? (loaded?.config?.skills ? deriveInstallMode(loaded.config.skills) : \"local\");\n const source = loaded?.config?.source;\n\n return { skillCount, agentCount, mode, source };\n}\n\n/** Formats the dashboard summary as plain text lines (for non-interactive/test output). */\nexport function formatDashboardText(data: DashboardData): string {\n const modeLabel = data.mode === \"plugin\" ? \"Plugin\" : \"Local\";\n const lines = [\n DEFAULT_BRANDING.NAME,\n \"\",\n ` Skills: ${data.skillCount} installed`,\n ` Agents: ${data.agentCount} compiled`,\n ` Mode: ${modeLabel}`,\n ];\n if (data.source) {\n lines.push(` Source: ${data.source}`);\n }\n lines.push(\"\");\n lines.push(` [Edit] [Compile] [Doctor] [List]`);\n return lines.join(\"\\n\");\n}\n\n/**\n * Shows the project dashboard and returns the selected command (or null if cancelled).\n * In non-interactive environments (no TTY), prints the summary text and returns null.\n */\nexport async function showDashboard(\n projectDir: string,\n log?: (message: string) => void,\n): Promise<string | null> {\n const data = await getDashboardData(projectDir);\n\n // Non-interactive: print text summary and exit (CI, piped, tests)\n if (!process.stdin.isTTY) {\n const output = log ?? console.log;\n output(formatDashboardText(data));\n return null;\n }\n\n let selectedCommand: string | null = null;\n\n const { waitUntilExit } = render(\n <Dashboard\n skillCount={data.skillCount}\n agentCount={data.agentCount}\n source={data.source}\n mode={data.mode}\n onSelect={(command) => {\n selectedCommand = command;\n }}\n onCancel={() => {\n selectedCommand = null;\n }}\n />,\n );\n\n await waitUntilExit();\n\n return selectedCommand;\n}\n\nexport default class Init extends BaseCommand {\n static summary = `Initialize ${DEFAULT_BRANDING.NAME} in this project`;\n static description =\n \"Interactive wizard to set up skills and agents. Supports Plugin Mode (native install) and Local Mode (copy to .claude/).\";\n\n static examples = [\n {\n description: \"Start the setup wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Initialize from a custom marketplace\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n {\n description: \"Force refresh skills from remote\",\n command: \"<%= config.bin %> <%= command.id %> --refresh\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Init);\n const projectDir = process.cwd();\n\n // For \"already initialized\" check, only look at the target directory (no global fallback)\n const individualPluginsExist = await hasIndividualPlugins(projectDir);\n const existingInstallation = await detectProjectInstallation(projectDir);\n\n if (individualPluginsExist || existingInstallation) {\n const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return;\n }\n\n // No project config exists: check if a global installation exists\n const globalInstallation = await detectGlobalInstallation();\n if (globalInstallation) {\n const globalConfigDir = path.join(os.homedir(), CLAUDE_SRC_DIR);\n\n // Non-interactive: skip prompt and fall through to wizard\n if (process.stdin.isTTY) {\n let globalChoice: GlobalConfigChoice | null = null;\n\n const { waitUntilExit: waitForPrompt } = render(\n <GlobalConfigPrompt\n globalConfigDir={globalConfigDir}\n onSelect={(choice) => {\n globalChoice = choice;\n }}\n onCancel={() => {\n globalChoice = null;\n }}\n />,\n );\n\n await waitForPrompt();\n\n if (globalChoice === \"edit-global\") {\n const selectedCommand = await showDashboard(os.homedir(), (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return;\n }\n\n // User cancelled (Esc)\n if (globalChoice === null) {\n return;\n }\n\n // \"create-project\" falls through to wizard below\n }\n }\n\n // Auto-create blank global config on first init from a project directory.\n // This ensures the project config can always import from global.\n if (projectDir !== GLOBAL_INSTALL_ROOT) {\n const created = await ensureBlankGlobalConfig();\n if (created) {\n this.log(\"Created blank global config at ~/\" + CLAUDE_SRC_DIR);\n }\n }\n\n enableBuffering();\n\n let sourceResult: SourceLoadResult;\n let startupMessages: StartupMessage[] = [];\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n } catch (error) {\n disableBuffering();\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n startupMessages = drainBuffer();\n disableBuffering();\n\n let wizardResult: WizardResultV2 | null = null;\n\n const marketplaceLabel = getMarketplaceLabel(sourceResult);\n const { waitUntilExit } = render(\n <Wizard\n matrix={sourceResult.matrix}\n version={this.config.version}\n marketplaceLabel={marketplaceLabel}\n logo={ASCII_LOGO}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n // Boundary cast: Ink render callback returns unknown result type\n wizardResult = result as WizardResultV2;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // Boundary cast: re-narrow after Ink waitUntilExit()\n const result = wizardResult as WizardResultV2 | null;\n if (!result || result.cancelled) {\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (result.skills.length === 0) {\n this.error(\"No skills selected\", { exit: EXIT_CODES.ERROR });\n }\n\n await this.handleInstallation(result, sourceResult, flags);\n }\n\n private async handleInstallation(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n const installMode = deriveInstallMode(result.skills);\n\n this.log(\"\\n\");\n this.log(`Selected ${result.skills.length} skills`);\n this.log(\n `Install mode: ${installMode === \"plugin\" ? \"Plugin (native install)\" : \"Local (copy to .claude/skills/)\"}`,\n );\n\n if (installMode === \"plugin\") {\n if (sourceResult.marketplace) {\n await this.installIndividualPlugins(result, sourceResult, flags, projectDir);\n } else {\n this.warn(\"Plugin Mode requires a marketplace for individual skill installation.\");\n this.log(`Falling back to Local Mode (copying to .claude/skills/)...`);\n this.log(\"To use Plugin Mode, either select a stack or configure a marketplace source.\\n\");\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n }\n return;\n }\n\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n }\n\n private async installIndividualPlugins(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n if (sourceResult.marketplace) {\n const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);\n\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${sourceResult.marketplace}\"...`);\n try {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n this.log(`Registered marketplace: ${sourceResult.marketplace}`);\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n }\n\n this.log(\"Installing skill plugins...\");\n for (const skill of result.skills.filter((s) => s.source !== \"local\")) {\n const pluginRef = `${skill.id}@${sourceResult.marketplace}`;\n const pluginScope = skill.scope === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginInstall(pluginRef, pluginScope, projectDir);\n this.log(` Installed ${pluginRef}`);\n } catch (error) {\n this.error(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n const pluginSkillCount = result.skills.filter((s) => s.source !== \"local\").length;\n this.log(`Installed ${pluginSkillCount} skill plugins\\n`);\n\n this.log(\"Generating configuration...\");\n try {\n const configResult = await installPluginConfig({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n if (configResult.wasMerged) {\n this.log(`Merged with existing config at ${configResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${configResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${configResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Agents compiled to:\");\n this.log(` ${configResult.agentsDir}`);\n for (const agentName of configResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${configResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async installLocalMode(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n const matrix = sourceResult.matrix;\n\n this.log(\"Copying skills to local directory...\");\n try {\n const installResult = await installLocal({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n this.log(`Copied ${installResult.copiedSkills.length} skills to .claude/skills/\\n`);\n this.log(\"Generating configuration...\");\n\n if (installResult.wasMerged) {\n this.log(`Merged with existing config at ${installResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${installResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${installResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Skills copied to:\");\n this.log(` ${installResult.skillsDir}`);\n for (const copiedSkill of installResult.copiedSkills) {\n const skill = matrix.skills[copiedSkill.skillId];\n const displayName = skill?.displayName || copiedSkill.skillId;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n this.log(\"Agents compiled to:\");\n this.log(` ${installResult.agentsDir}`);\n for (const agentName of installResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${installResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n","import React from \"react\";\n\nimport { Text, Box } from \"ink\";\nimport path from \"path\";\n\nimport { CLAUDE_DIR, CLI_COLORS, MAX_CONFIG_FILE_SIZE } from \"../consts\";\nimport { fileExists, readFileSafe } from \"../utils/fs\";\nimport { warn } from \"../utils/logger\";\nimport { settingsFileSchema, warnUnknownFields } from \"./schemas\";\n\ntype PermissionConfig = {\n allow?: string[];\n deny?: string[];\n};\n\ntype SettingsFile = {\n permissions?: PermissionConfig;\n};\n\nexport async function checkPermissions(projectRoot: string): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.json\");\n const localSettingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.local.json\");\n\n let permissions: PermissionConfig | undefined;\n\n for (const filePath of [localSettingsPath, settingsPath]) {\n if (await fileExists(filePath)) {\n try {\n const content = await readFileSafe(filePath, MAX_CONFIG_FILE_SIZE);\n const raw = JSON.parse(content);\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n // Known Claude CLI settings.json fields (permissions is ours; the rest are managed by Claude CLI)\n const EXPECTED_SETTINGS_KEYS = [\n \"permissions\",\n \"enabledPlugins\",\n \"env\",\n \"allowedTools\",\n \"customInstructions\",\n \"defaultModel\",\n ] as const;\n warnUnknownFields(\n raw as Record<string, unknown>,\n EXPECTED_SETTINGS_KEYS,\n `settings file '${filePath}'`,\n );\n }\n const result = settingsFileSchema.safeParse(raw);\n const parsed: SettingsFile = result.success ? (result.data as SettingsFile) : {};\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {\n warn(`Malformed settings file at '${filePath}' — skipping`);\n }\n }\n }\n\n if (!permissions) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Notice\n </Text>\n <Text>No permissions configured in .claude/settings.json</Text>\n <Text>Agents will prompt for approval on each tool use.</Text>\n <Text> </Text>\n <Text>For autonomous operation, add to .claude/settings.json:</Text>\n <Text> </Text>\n <Text color=\"dim\">{\"{\"}</Text>\n <Text color=\"dim\">{' \"permissions\": {'}</Text>\n <Text color=\"dim\">{' \"allow\": ['}</Text>\n <Text color=\"dim\">{' \"Read(*)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(git *)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(bun *)\"'}</Text>\n <Text color=\"dim\">{\" ]\"}</Text>\n <Text color=\"dim\">{\" }\"}</Text>\n <Text color=\"dim\">{\"}\"}</Text>\n </Box>\n );\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash || hasNoAllows) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Warnings\n </Text>\n {hasRestrictiveBash && (\n <Text>\n ⚠ Bash is denied in permissions. Some agents require Bash for git, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</Text>\n )}\n </Box>\n );\n }\n\n return null;\n}\n"],"mappings":"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","names":["Box","Text","path","jsx","jsxs","Box","Text","path","result"]}
|