@agents-inc/cli 0.47.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +113 -118
- package/config/skill-categories.yaml +344 -0
- package/config/skill-rules.yaml +740 -0
- package/config/stacks.yaml +0 -1
- package/dist/{chunk-CJFWO46A.js → chunk-26MXZUHU.js} +2 -2
- package/dist/{chunk-KQ27IDYL.js → chunk-2BWCR762.js} +2 -3
- package/dist/chunk-2BWCR762.js.map +1 -0
- package/dist/chunk-3VOL4WEG.js +31 -0
- package/dist/chunk-3VOL4WEG.js.map +1 -0
- package/dist/chunk-4QWDB2MD.js +571 -0
- package/dist/chunk-4QWDB2MD.js.map +1 -0
- package/dist/{chunk-LJ5E4GXC.js → chunk-4R52TQ3K.js} +2 -2
- package/dist/{chunk-SPSGZWTZ.js → chunk-5FCHJLM7.js} +34 -16
- package/dist/chunk-5FCHJLM7.js.map +1 -0
- package/dist/chunk-5FPIKTSA.js +40 -0
- package/dist/chunk-5FPIKTSA.js.map +1 -0
- package/dist/{chunk-HLTJK3XB.js → chunk-5L724R4C.js} +5 -6
- package/dist/{chunk-HLTJK3XB.js.map → chunk-5L724R4C.js.map} +1 -1
- package/dist/{chunk-JTTTXGHX.js → chunk-7LV4V6A4.js} +4 -4
- package/dist/{chunk-FTD5Z6QD.js → chunk-AWP5A6IM.js} +15 -7
- package/dist/chunk-AWP5A6IM.js.map +1 -0
- package/dist/chunk-C3Q43WLC.js +118 -0
- package/dist/chunk-C3Q43WLC.js.map +1 -0
- package/dist/{chunk-B4QYXVPZ.js → chunk-CMNKHDOX.js} +2 -2
- package/dist/{chunk-TBB3THSL.js → chunk-D72AFYQR.js} +8 -13
- package/dist/chunk-D72AFYQR.js.map +1 -0
- package/dist/{chunk-QR2TM4OY.js → chunk-DCE423KO.js} +46 -30
- package/dist/chunk-DCE423KO.js.map +1 -0
- package/dist/chunk-GBOW6FUW.js +74 -0
- package/dist/chunk-GBOW6FUW.js.map +1 -0
- package/dist/{chunk-GFDGYQ6M.js → chunk-HMSHB5EQ.js} +569 -269
- package/dist/chunk-HMSHB5EQ.js.map +1 -0
- package/dist/{chunk-NRCKIHND.js → chunk-HYEUETIC.js} +2 -2
- package/dist/{chunk-OEJDFGAF.js → chunk-I6IOGZSZ.js} +61 -52
- package/dist/chunk-I6IOGZSZ.js.map +1 -0
- package/dist/{chunk-3APMMQUA.js → chunk-JFF7P4LC.js} +30 -93
- package/dist/chunk-JFF7P4LC.js.map +1 -0
- package/dist/{chunk-N5OCAAXY.js → chunk-JWYRXE6C.js} +2 -2
- package/dist/{chunk-TWDVLTU6.js → chunk-KAO3LKB5.js} +3 -3
- package/dist/{chunk-XTRPYUWK.js → chunk-KQOU4POU.js} +26 -28
- package/dist/chunk-KQOU4POU.js.map +1 -0
- package/dist/{chunk-YTRFL3MR.js → chunk-M3GQ2R3E.js} +29 -28
- package/dist/chunk-M3GQ2R3E.js.map +1 -0
- package/dist/{chunk-LNA6M2IE.js → chunk-PGY5XROM.js} +2 -2
- package/dist/chunk-PGY5XROM.js.map +1 -0
- package/dist/{chunk-VAQJLHUW.js → chunk-QB5HHTAA.js} +8 -19
- package/dist/chunk-QB5HHTAA.js.map +1 -0
- package/dist/{chunk-VSZ5GDET.js → chunk-QYLCINGC.js} +2 -2
- package/dist/{chunk-IRJADQM7.js → chunk-RA2IPRO2.js} +2 -2
- package/dist/{chunk-DC333ZDC.js → chunk-RDWGYKDY.js} +4 -4
- package/dist/{chunk-FXQYEXLS.js → chunk-RFKDGJAJ.js} +26 -57
- package/dist/chunk-RFKDGJAJ.js.map +1 -0
- package/dist/{chunk-HPJP3HFD.js → chunk-SPFHPHYL.js} +7 -7
- package/dist/{chunk-EZ46ZTAQ.js → chunk-U2W5SENM.js} +3 -3
- package/dist/{chunk-MVEYK55V.js → chunk-U7X4V4HE.js} +2 -2
- package/dist/{chunk-INKJBMPJ.js → chunk-UAD3SC27.js} +4 -12
- package/dist/chunk-UAD3SC27.js.map +1 -0
- package/dist/{chunk-C4QI54PN.js → chunk-WBHPCBVN.js} +57 -34
- package/dist/chunk-WBHPCBVN.js.map +1 -0
- package/dist/chunk-WFFV254H.js +314 -0
- package/dist/chunk-WFFV254H.js.map +1 -0
- package/dist/{chunk-ZWAL2ZY7.js → chunk-WJHFV6RI.js} +3 -2
- package/dist/chunk-WJHFV6RI.js.map +1 -0
- package/dist/{chunk-2RQYJFKA.js → chunk-WLZHCM7O.js} +2 -2
- package/dist/{chunk-DVW6ASTO.js → chunk-XDSVV5GZ.js} +4 -4
- package/dist/{chunk-JZHIF3K7.js → chunk-YDYRAXSY.js} +57 -27
- package/dist/chunk-YDYRAXSY.js.map +1 -0
- package/dist/commands/build/marketplace.js +4 -4
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +11 -9
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/get.js +4 -4
- package/dist/commands/config/index.js +5 -5
- package/dist/commands/config/path.js +4 -4
- package/dist/commands/config/set-project.js +4 -4
- package/dist/commands/config/show.js +5 -5
- package/dist/commands/config/unset-project.js +4 -4
- package/dist/commands/diff.js +4 -4
- package/dist/commands/doctor.js +4 -4
- package/dist/commands/edit.js +58 -52
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +4 -4
- package/dist/commands/import/skill.js +7 -8
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +5 -5
- package/dist/commands/init.js +40 -435
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +4 -4
- package/dist/commands/new/agent.js +11 -10
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +24 -5
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +15 -209
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +11 -7
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +7 -8
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +6 -6
- package/dist/commands/update.js +6 -6
- package/dist/commands/validate.js +62 -250
- package/dist/commands/validate.js.map +1 -1
- 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 +112 -58
- 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 +5 -4
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +11 -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 +2 -2
- package/dist/components/wizard/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +2 -2
- 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 +4 -3
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +8 -8
- package/dist/components/wizard/step-agents.js +10 -8
- package/dist/components/wizard/step-agents.test.js +18 -17
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +9 -8
- package/dist/components/wizard/step-build.test.js +17 -35
- 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 +8 -8
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +2 -2
- package/dist/components/wizard/step-settings.js +7 -5
- package/dist/components/wizard/step-settings.test.js +10 -8
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +11 -10
- package/dist/components/wizard/step-sources.test.js +12 -11
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +15 -12
- package/dist/components/wizard/step-stack.test.js +16 -13
- 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 +8 -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 +27 -25
- package/dist/config/skill-categories.yaml +344 -0
- package/dist/config/skill-rules.yaml +740 -0
- package/dist/config/stacks.yaml +0 -1
- package/dist/hooks/init.js +55 -3
- package/dist/hooks/init.js.map +1 -1
- package/dist/{source-manager-Q34LTUVM.js → source-manager-BVB2SG73.js} +4 -4
- 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 +5 -7
- package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
- package/dist/stores/wizard-store.js +5 -5
- package/dist/stores/wizard-store.test.js +79 -27
- 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 +5 -7
- package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
- package/src/schemas/agent.schema.json +1 -1
- package/src/schemas/metadata.schema.json +2 -5
- package/src/schemas/project-config.schema.json +0 -3
- package/src/schemas/project-source-config.schema.json +4 -1
- package/config/skills-matrix.yaml +0 -918
- package/dist/chunk-3APMMQUA.js.map +0 -1
- package/dist/chunk-C4QI54PN.js.map +0 -1
- package/dist/chunk-FMQ3A7W4.js +0 -29
- package/dist/chunk-FMQ3A7W4.js.map +0 -1
- package/dist/chunk-FTD5Z6QD.js.map +0 -1
- package/dist/chunk-FXQYEXLS.js.map +0 -1
- package/dist/chunk-GFDGYQ6M.js.map +0 -1
- package/dist/chunk-INKJBMPJ.js.map +0 -1
- package/dist/chunk-JZHIF3K7.js.map +0 -1
- package/dist/chunk-KQ27IDYL.js.map +0 -1
- package/dist/chunk-LNA6M2IE.js.map +0 -1
- package/dist/chunk-M4P5YJ45.js +0 -99
- package/dist/chunk-M4P5YJ45.js.map +0 -1
- package/dist/chunk-OEJDFGAF.js.map +0 -1
- package/dist/chunk-QR2TM4OY.js.map +0 -1
- package/dist/chunk-SPSGZWTZ.js.map +0 -1
- package/dist/chunk-TBB3THSL.js.map +0 -1
- package/dist/chunk-VAQJLHUW.js.map +0 -1
- package/dist/chunk-XTRPYUWK.js.map +0 -1
- package/dist/chunk-YTRFL3MR.js.map +0 -1
- package/dist/chunk-ZWAL2ZY7.js.map +0 -1
- package/dist/config/skills-matrix.yaml +0 -918
- 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/src/schemas/skills-matrix.schema.json +0 -179
- /package/dist/{chunk-CJFWO46A.js.map → chunk-26MXZUHU.js.map} +0 -0
- /package/dist/{chunk-LJ5E4GXC.js.map → chunk-4R52TQ3K.js.map} +0 -0
- /package/dist/{chunk-JTTTXGHX.js.map → chunk-7LV4V6A4.js.map} +0 -0
- /package/dist/{chunk-B4QYXVPZ.js.map → chunk-CMNKHDOX.js.map} +0 -0
- /package/dist/{chunk-NRCKIHND.js.map → chunk-HYEUETIC.js.map} +0 -0
- /package/dist/{chunk-N5OCAAXY.js.map → chunk-JWYRXE6C.js.map} +0 -0
- /package/dist/{chunk-TWDVLTU6.js.map → chunk-KAO3LKB5.js.map} +0 -0
- /package/dist/{chunk-VSZ5GDET.js.map → chunk-QYLCINGC.js.map} +0 -0
- /package/dist/{chunk-IRJADQM7.js.map → chunk-RA2IPRO2.js.map} +0 -0
- /package/dist/{chunk-DC333ZDC.js.map → chunk-RDWGYKDY.js.map} +0 -0
- /package/dist/{chunk-HPJP3HFD.js.map → chunk-SPFHPHYL.js.map} +0 -0
- /package/dist/{chunk-EZ46ZTAQ.js.map → chunk-U2W5SENM.js.map} +0 -0
- /package/dist/{chunk-MVEYK55V.js.map → chunk-U7X4V4HE.js.map} +0 -0
- /package/dist/{chunk-2RQYJFKA.js.map → chunk-WLZHCM7O.js.map} +0 -0
- /package/dist/{chunk-DVW6ASTO.js.map → chunk-XDSVV5GZ.js.map} +0 -0
- /package/dist/{source-manager-Q34LTUVM.js.map → source-manager-BVB2SG73.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,314 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
BaseCommand,
|
|
4
|
+
EXIT_CODES
|
|
5
|
+
} from "./chunk-PGY5XROM.js";
|
|
6
|
+
import {
|
|
7
|
+
LOCAL_DEFAULTS,
|
|
8
|
+
computeSkillFolderHash,
|
|
9
|
+
resolveAuthor
|
|
10
|
+
} from "./chunk-HMSHB5EQ.js";
|
|
11
|
+
import {
|
|
12
|
+
directoryExists,
|
|
13
|
+
ensureDir,
|
|
14
|
+
fileExists,
|
|
15
|
+
getErrorMessage,
|
|
16
|
+
readFile,
|
|
17
|
+
verbose,
|
|
18
|
+
writeFile
|
|
19
|
+
} from "./chunk-WBHPCBVN.js";
|
|
20
|
+
import {
|
|
21
|
+
CLI_BIN_NAME,
|
|
22
|
+
KEBAB_CASE_PATTERN,
|
|
23
|
+
LOCAL_SKILLS_PATH,
|
|
24
|
+
PLUGIN_MANIFEST_DIR,
|
|
25
|
+
SKILLS_DIR_PATH,
|
|
26
|
+
SKILL_CATEGORIES_YAML_PATH,
|
|
27
|
+
SKILL_RULES_YAML_PATH,
|
|
28
|
+
STANDARD_FILES
|
|
29
|
+
} from "./chunk-AWP5A6IM.js";
|
|
30
|
+
import {
|
|
31
|
+
init_esm_shims
|
|
32
|
+
} from "./chunk-DHET7RCE.js";
|
|
33
|
+
|
|
34
|
+
// src/cli/commands/new/skill.ts
|
|
35
|
+
init_esm_shims();
|
|
36
|
+
import { Args, Flags } from "@oclif/core";
|
|
37
|
+
import path from "path";
|
|
38
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
39
|
+
function validateSkillName(name) {
|
|
40
|
+
if (!name || name.trim() === "") {
|
|
41
|
+
return "Skill name is required";
|
|
42
|
+
}
|
|
43
|
+
if (!KEBAB_CASE_PATTERN.test(name)) {
|
|
44
|
+
return "Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)";
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
function toTitleCase(kebabCase) {
|
|
49
|
+
return kebabCase.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
50
|
+
}
|
|
51
|
+
function generateSkillMd(name) {
|
|
52
|
+
const titleName = toTitleCase(name);
|
|
53
|
+
return `---
|
|
54
|
+
name: ${name}
|
|
55
|
+
description: Brief description of this skill
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
# ${titleName}
|
|
59
|
+
|
|
60
|
+
> **Quick Guide:** Add a brief summary of what this skill teaches.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
<critical_requirements>
|
|
65
|
+
|
|
66
|
+
## CRITICAL: Before Using This Skill
|
|
67
|
+
|
|
68
|
+
**(Add critical requirements here)**
|
|
69
|
+
|
|
70
|
+
</critical_requirements>
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
**When to use:**
|
|
75
|
+
|
|
76
|
+
- Add use cases here
|
|
77
|
+
|
|
78
|
+
**Key patterns covered:**
|
|
79
|
+
|
|
80
|
+
- Add patterns here
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
<patterns>
|
|
85
|
+
|
|
86
|
+
## Core Patterns
|
|
87
|
+
|
|
88
|
+
### Pattern 1: Example Pattern
|
|
89
|
+
|
|
90
|
+
Add your patterns here.
|
|
91
|
+
|
|
92
|
+
</patterns>
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
<critical_reminders>
|
|
97
|
+
|
|
98
|
+
## CRITICAL REMINDERS
|
|
99
|
+
|
|
100
|
+
**(Repeat critical requirements here)**
|
|
101
|
+
|
|
102
|
+
</critical_reminders>
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
function generateMetadataYaml(name, author, category, contentHash) {
|
|
106
|
+
const titleName = toTitleCase(name);
|
|
107
|
+
return `custom: true
|
|
108
|
+
category: ${category}
|
|
109
|
+
author: "${author}"
|
|
110
|
+
displayName: ${titleName}
|
|
111
|
+
cliDescription: Brief description
|
|
112
|
+
usageGuidance: Use when <guidance>.
|
|
113
|
+
contentHash: ${contentHash}
|
|
114
|
+
tags:
|
|
115
|
+
- local
|
|
116
|
+
- custom
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
var KNOWN_DOMAINS = /* @__PURE__ */ new Set(["web", "api", "mobile", "cli", "shared"]);
|
|
120
|
+
var DEFAULT_CATEGORY_ORDER = 99;
|
|
121
|
+
function generateSkillCategoriesYaml(category) {
|
|
122
|
+
const prefix = category.split("-")[0];
|
|
123
|
+
const subcategoryPart = category.includes("-") ? category.slice(category.indexOf("-") + 1) : category;
|
|
124
|
+
const displayName = toTitleCase(subcategoryPart);
|
|
125
|
+
const domainLine = KNOWN_DOMAINS.has(prefix) ? `
|
|
126
|
+
domain: ${prefix}` : "";
|
|
127
|
+
return `version: "1.0.0"
|
|
128
|
+
|
|
129
|
+
categories:
|
|
130
|
+
${category}:
|
|
131
|
+
id: ${category}
|
|
132
|
+
displayName: ${displayName}
|
|
133
|
+
description: Skills for ${displayName}${domainLine}
|
|
134
|
+
exclusive: true
|
|
135
|
+
required: false
|
|
136
|
+
order: ${DEFAULT_CATEGORY_ORDER}
|
|
137
|
+
custom: true
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
function generateSkillRulesYaml(skillName) {
|
|
141
|
+
return `version: "1.0.0"
|
|
142
|
+
|
|
143
|
+
# Short aliases mapping to canonical skill IDs
|
|
144
|
+
# Example: react: "web-framework-react"
|
|
145
|
+
aliases:
|
|
146
|
+
${skillName}: "${skillName}"
|
|
147
|
+
`;
|
|
148
|
+
}
|
|
149
|
+
var NewSkill = class _NewSkill extends BaseCommand {
|
|
150
|
+
static summary = "Create a new local skill with proper structure";
|
|
151
|
+
static description = "Create a new local skill scaffold with SKILL.md and metadata.yaml files";
|
|
152
|
+
static args = {
|
|
153
|
+
name: Args.string({
|
|
154
|
+
description: "Name of the skill to create (kebab-case)",
|
|
155
|
+
required: true
|
|
156
|
+
})
|
|
157
|
+
};
|
|
158
|
+
static flags = {
|
|
159
|
+
...BaseCommand.baseFlags,
|
|
160
|
+
author: Flags.string({
|
|
161
|
+
char: "a",
|
|
162
|
+
description: "Author identifier (e.g., @myhandle)",
|
|
163
|
+
required: false
|
|
164
|
+
}),
|
|
165
|
+
category: Flags.string({
|
|
166
|
+
char: "c",
|
|
167
|
+
description: "Skill category",
|
|
168
|
+
default: LOCAL_DEFAULTS.CATEGORY
|
|
169
|
+
}),
|
|
170
|
+
force: Flags.boolean({
|
|
171
|
+
char: "f",
|
|
172
|
+
description: "Overwrite existing skill directory",
|
|
173
|
+
default: false
|
|
174
|
+
}),
|
|
175
|
+
output: Flags.string({
|
|
176
|
+
char: "o",
|
|
177
|
+
description: "Output directory for the skill (overrides marketplace detection)"
|
|
178
|
+
})
|
|
179
|
+
};
|
|
180
|
+
async run() {
|
|
181
|
+
const { args, flags } = await this.parse(_NewSkill);
|
|
182
|
+
const projectDir = process.cwd();
|
|
183
|
+
this.log("");
|
|
184
|
+
this.log("Create New Skill");
|
|
185
|
+
this.log("");
|
|
186
|
+
const validationError = validateSkillName(args.name);
|
|
187
|
+
if (validationError) {
|
|
188
|
+
this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });
|
|
189
|
+
}
|
|
190
|
+
let author = flags.author;
|
|
191
|
+
if (!author) {
|
|
192
|
+
author = await resolveAuthor(projectDir) || LOCAL_DEFAULTS.AUTHOR;
|
|
193
|
+
}
|
|
194
|
+
const category = flags.category;
|
|
195
|
+
let skillsBasePath;
|
|
196
|
+
if (flags.output) {
|
|
197
|
+
skillsBasePath = path.resolve(flags.output);
|
|
198
|
+
} else {
|
|
199
|
+
const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, "marketplace.json");
|
|
200
|
+
if (await fileExists(marketplacePath)) {
|
|
201
|
+
this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);
|
|
202
|
+
skillsBasePath = path.join(projectDir, SKILLS_DIR_PATH);
|
|
203
|
+
} else {
|
|
204
|
+
skillsBasePath = path.join(projectDir, LOCAL_SKILLS_PATH);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const skillDir = path.join(skillsBasePath, args.name);
|
|
208
|
+
if (await directoryExists(skillDir)) {
|
|
209
|
+
if (!flags.force) {
|
|
210
|
+
this.error(`Skill directory already exists: ${skillDir}
|
|
211
|
+
Use --force to overwrite.`, {
|
|
212
|
+
exit: EXIT_CODES.ERROR
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
this.warn(`Overwriting existing skill at ${skillDir}`);
|
|
216
|
+
}
|
|
217
|
+
this.log(`Skill name: ${args.name}`);
|
|
218
|
+
this.log(`Author: ${author}`);
|
|
219
|
+
this.log(`Category: ${category}`);
|
|
220
|
+
this.log(`Directory: ${skillDir}`);
|
|
221
|
+
this.log("");
|
|
222
|
+
if (flags["dry-run"]) {
|
|
223
|
+
this.log("[DRY RUN] Would create skill files");
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
this.log("Creating skill files...");
|
|
227
|
+
try {
|
|
228
|
+
const skillMdContent = generateSkillMd(args.name);
|
|
229
|
+
const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);
|
|
230
|
+
const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);
|
|
231
|
+
await writeFile(skillMdPath, skillMdContent);
|
|
232
|
+
const contentHash = await computeSkillFolderHash(skillDir);
|
|
233
|
+
const metadataContent = generateMetadataYaml(args.name, author, category, contentHash);
|
|
234
|
+
await writeFile(metadataPath, metadataContent);
|
|
235
|
+
this.log("");
|
|
236
|
+
this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${skillMdPath}`);
|
|
237
|
+
this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${metadataPath}`);
|
|
238
|
+
if (!flags.output) {
|
|
239
|
+
const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, "marketplace.json");
|
|
240
|
+
if (await fileExists(marketplacePath)) {
|
|
241
|
+
try {
|
|
242
|
+
await this.updateConfigFiles(projectDir, args.name, category);
|
|
243
|
+
} catch (error) {
|
|
244
|
+
this.warn(`Could not update config files: ${getErrorMessage(error)}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
this.log("");
|
|
249
|
+
this.log(
|
|
250
|
+
`Skill created successfully! Run '${CLI_BIN_NAME} compile' to include it in your agents.`
|
|
251
|
+
);
|
|
252
|
+
this.log("");
|
|
253
|
+
} catch (error) {
|
|
254
|
+
this.handleError(error);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async updateConfigFiles(projectRoot, skillName, category) {
|
|
258
|
+
const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_YAML_PATH);
|
|
259
|
+
const rulesPath = path.join(projectRoot, SKILL_RULES_YAML_PATH);
|
|
260
|
+
if (await fileExists(categoriesPath)) {
|
|
261
|
+
const content = await readFile(categoriesPath);
|
|
262
|
+
const parsed = parseYaml(content);
|
|
263
|
+
const categories = parsed.categories ?? {};
|
|
264
|
+
if (!categories[category]) {
|
|
265
|
+
const prefix = category.split("-")[0];
|
|
266
|
+
const subcategoryPart = category.includes("-") ? category.slice(category.indexOf("-") + 1) : category;
|
|
267
|
+
const entry = {
|
|
268
|
+
id: category,
|
|
269
|
+
displayName: toTitleCase(subcategoryPart),
|
|
270
|
+
description: `Skills for ${toTitleCase(subcategoryPart)}`,
|
|
271
|
+
exclusive: true,
|
|
272
|
+
required: false,
|
|
273
|
+
order: DEFAULT_CATEGORY_ORDER,
|
|
274
|
+
custom: true
|
|
275
|
+
};
|
|
276
|
+
if (KNOWN_DOMAINS.has(prefix)) entry.domain = prefix;
|
|
277
|
+
categories[category] = entry;
|
|
278
|
+
parsed.categories = categories;
|
|
279
|
+
await writeFile(categoriesPath, stringifyYaml(parsed));
|
|
280
|
+
verbose(`Added category '${category}' to ${SKILL_CATEGORIES_YAML_PATH}`);
|
|
281
|
+
}
|
|
282
|
+
} else {
|
|
283
|
+
await ensureDir(path.dirname(categoriesPath));
|
|
284
|
+
await writeFile(categoriesPath, generateSkillCategoriesYaml(category));
|
|
285
|
+
verbose(`Created ${SKILL_CATEGORIES_YAML_PATH}`);
|
|
286
|
+
}
|
|
287
|
+
if (await fileExists(rulesPath)) {
|
|
288
|
+
const content = await readFile(rulesPath);
|
|
289
|
+
const parsed = parseYaml(content);
|
|
290
|
+
const aliases = parsed.aliases ?? {};
|
|
291
|
+
if (!aliases[skillName]) {
|
|
292
|
+
aliases[skillName] = skillName;
|
|
293
|
+
parsed.aliases = aliases;
|
|
294
|
+
await writeFile(rulesPath, stringifyYaml(parsed));
|
|
295
|
+
verbose(`Added alias '${skillName}' to ${SKILL_RULES_YAML_PATH}`);
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
await ensureDir(path.dirname(rulesPath));
|
|
299
|
+
await writeFile(rulesPath, generateSkillRulesYaml(skillName));
|
|
300
|
+
verbose(`Created ${SKILL_RULES_YAML_PATH}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
export {
|
|
306
|
+
validateSkillName,
|
|
307
|
+
toTitleCase,
|
|
308
|
+
generateSkillMd,
|
|
309
|
+
generateMetadataYaml,
|
|
310
|
+
generateSkillCategoriesYaml,
|
|
311
|
+
generateSkillRulesYaml,
|
|
312
|
+
NewSkill
|
|
313
|
+
};
|
|
314
|
+
//# sourceMappingURL=chunk-WFFV254H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/new/skill.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { resolveAuthor } from \"../../lib/configuration/index.js\";\nimport { writeFile, readFile, directoryExists, fileExists, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { verbose } from \"../../utils/logger.js\";\nimport {\n CLI_BIN_NAME,\n KEBAB_CASE_PATTERN,\n LOCAL_SKILLS_PATH,\n PLUGIN_MANIFEST_DIR,\n SKILL_CATEGORIES_YAML_PATH,\n SKILL_RULES_YAML_PATH,\n SKILLS_DIR_PATH,\n STANDARD_FILES,\n} from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { computeSkillFolderHash } from \"../../lib/versioning.js\";\nimport type { CategoryPath } from \"../../types/index.js\";\n\nexport function validateSkillName(name: string): string | null {\n if (!name || name.trim() === \"\") {\n return \"Skill name is required\";\n }\n\n if (!KEBAB_CASE_PATTERN.test(name)) {\n return \"Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)\";\n }\n\n return null;\n}\n\nexport function toTitleCase(kebabCase: string): string {\n return kebabCase\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport function generateSkillMd(name: string): string {\n const titleName = toTitleCase(name);\n\n return `---\nname: ${name}\ndescription: Brief description of this skill\n---\n\n# ${titleName}\n\n> **Quick Guide:** Add a brief summary of what this skill teaches.\n\n---\n\n<critical_requirements>\n\n## CRITICAL: Before Using This Skill\n\n**(Add critical requirements here)**\n\n</critical_requirements>\n\n---\n\n**When to use:**\n\n- Add use cases here\n\n**Key patterns covered:**\n\n- Add patterns here\n\n---\n\n<patterns>\n\n## Core Patterns\n\n### Pattern 1: Example Pattern\n\nAdd your patterns here.\n\n</patterns>\n\n---\n\n<critical_reminders>\n\n## CRITICAL REMINDERS\n\n**(Repeat critical requirements here)**\n\n</critical_reminders>\n`;\n}\n\nexport function generateMetadataYaml(\n name: string,\n author: string,\n category: CategoryPath,\n contentHash: string,\n): string {\n const titleName = toTitleCase(name);\n\n return `custom: true\ncategory: ${category}\nauthor: \"${author}\"\ndisplayName: ${titleName}\ncliDescription: Brief description\nusageGuidance: Use when <guidance>.\ncontentHash: ${contentHash}\ntags:\n - local\n - custom\n`;\n}\n\nconst KNOWN_DOMAINS = new Set([\"web\", \"api\", \"mobile\", \"cli\", \"shared\"]);\nconst DEFAULT_CATEGORY_ORDER = 99;\n\nexport function generateSkillCategoriesYaml(category: CategoryPath): string {\n const prefix = category.split(\"-\")[0];\n const subcategoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n const displayName = toTitleCase(subcategoryPart);\n const domainLine = KNOWN_DOMAINS.has(prefix) ? `\\n domain: ${prefix}` : \"\";\n\n return `version: \"1.0.0\"\n\ncategories:\n ${category}:\n id: ${category}\n displayName: ${displayName}\n description: Skills for ${displayName}${domainLine}\n exclusive: true\n required: false\n order: ${DEFAULT_CATEGORY_ORDER}\n custom: true\n`;\n}\n\nexport function generateSkillRulesYaml(skillName: string): string {\n return `version: \"1.0.0\"\n\n# Short aliases mapping to canonical skill IDs\n# Example: react: \"web-framework-react\"\naliases:\n ${skillName}: \"${skillName}\"\n`;\n}\n\nexport default class NewSkill extends BaseCommand {\n static summary = \"Create a new local skill with proper structure\";\n static description = \"Create a new local skill scaffold with SKILL.md and metadata.yaml files\";\n\n static args = {\n name: Args.string({\n description: \"Name of the skill to create (kebab-case)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n author: Flags.string({\n char: \"a\",\n description: \"Author identifier (e.g., @myhandle)\",\n required: false,\n }),\n category: Flags.string({\n char: \"c\",\n description: \"Skill category\",\n default: LOCAL_DEFAULTS.CATEGORY,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skill directory\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Output directory for the skill (overrides marketplace detection)\",\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewSkill);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Create New Skill\");\n this.log(\"\");\n\n const validationError = validateSkillName(args.name);\n if (validationError) {\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n // Determine author: flag > project config > default\n let author = flags.author;\n if (!author) {\n author = (await resolveAuthor(projectDir)) || LOCAL_DEFAULTS.AUTHOR;\n }\n\n // CLI flag is an untyped string — cast at data boundary\n const category = flags.category as CategoryPath;\n\n // Determine skill output path: --output flag > marketplace detection > local default\n let skillsBasePath: string;\n if (flags.output) {\n skillsBasePath = path.resolve(flags.output);\n } else {\n const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, \"marketplace.json\");\n if (await fileExists(marketplacePath)) {\n this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);\n skillsBasePath = path.join(projectDir, SKILLS_DIR_PATH);\n } else {\n skillsBasePath = path.join(projectDir, LOCAL_SKILLS_PATH);\n }\n }\n\n const skillDir = path.join(skillsBasePath, args.name);\n\n if (await directoryExists(skillDir)) {\n if (!flags.force) {\n this.error(`Skill directory already exists: ${skillDir}\\nUse --force to overwrite.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n this.warn(`Overwriting existing skill at ${skillDir}`);\n }\n\n this.log(`Skill name: ${args.name}`);\n this.log(`Author: ${author}`);\n this.log(`Category: ${category}`);\n this.log(`Directory: ${skillDir}`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(\"[DRY RUN] Would create skill files\");\n return;\n }\n\n this.log(\"Creating skill files...\");\n\n try {\n const skillMdContent = generateSkillMd(args.name);\n\n const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n\n await writeFile(skillMdPath, skillMdContent);\n\n const contentHash = await computeSkillFolderHash(skillDir);\n const metadataContent = generateMetadataYaml(args.name, author, category, contentHash);\n await writeFile(metadataPath, metadataContent);\n\n this.log(\"\");\n this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${skillMdPath}`);\n this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${metadataPath}`);\n\n // Update config files when in marketplace context\n if (!flags.output) {\n const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, \"marketplace.json\");\n if (await fileExists(marketplacePath)) {\n try {\n await this.updateConfigFiles(projectDir, args.name, category);\n } catch (error) {\n this.warn(`Could not update config files: ${getErrorMessage(error)}`);\n }\n }\n }\n\n this.log(\"\");\n this.log(\n `Skill created successfully! Run '${CLI_BIN_NAME} compile' to include it in your agents.`,\n );\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async updateConfigFiles(\n projectRoot: string,\n skillName: string,\n category: CategoryPath,\n ): Promise<void> {\n const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_YAML_PATH);\n const rulesPath = path.join(projectRoot, SKILL_RULES_YAML_PATH);\n\n // Update skill-categories.yaml\n if (await fileExists(categoriesPath)) {\n const content = await readFile(categoriesPath);\n const parsed = parseYaml(content) as Record<string, unknown>;\n const categories = (parsed.categories ?? {}) as Record<string, unknown>;\n if (!categories[category]) {\n const prefix = category.split(\"-\")[0];\n const subcategoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n const entry: Record<string, unknown> = {\n id: category,\n displayName: toTitleCase(subcategoryPart),\n description: `Skills for ${toTitleCase(subcategoryPart)}`,\n exclusive: true,\n required: false,\n order: DEFAULT_CATEGORY_ORDER,\n custom: true,\n };\n if (KNOWN_DOMAINS.has(prefix)) entry.domain = prefix;\n categories[category] = entry;\n parsed.categories = categories;\n await writeFile(categoriesPath, stringifyYaml(parsed));\n verbose(`Added category '${category}' to ${SKILL_CATEGORIES_YAML_PATH}`);\n }\n } else {\n await ensureDir(path.dirname(categoriesPath));\n await writeFile(categoriesPath, generateSkillCategoriesYaml(category));\n verbose(`Created ${SKILL_CATEGORIES_YAML_PATH}`);\n }\n\n // Update skill-rules.yaml\n if (await fileExists(rulesPath)) {\n const content = await readFile(rulesPath);\n const parsed = parseYaml(content) as Record<string, unknown>;\n const aliases = (parsed.aliases ?? {}) as Record<string, unknown>;\n if (!aliases[skillName]) {\n aliases[skillName] = skillName;\n parsed.aliases = aliases;\n await writeFile(rulesPath, stringifyYaml(parsed));\n verbose(`Added alias '${skillName}' to ${SKILL_RULES_YAML_PATH}`);\n }\n } else {\n await ensureDir(path.dirname(rulesPath));\n await writeFile(rulesPath, generateSkillRulesYaml(skillName));\n verbose(`Created ${SKILL_RULES_YAML_PATH}`);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
CLI_COLORS,
|
|
4
4
|
UI_SYMBOLS
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-AWP5A6IM.js";
|
|
6
6
|
import {
|
|
7
7
|
init_esm_shims
|
|
8
8
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -26,6 +26,7 @@ var SelectionCard = ({
|
|
|
26
26
|
paddingX: 2,
|
|
27
27
|
paddingY: 1,
|
|
28
28
|
marginBottom,
|
|
29
|
+
width: "100%",
|
|
29
30
|
children: /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, children: [
|
|
30
31
|
/* @__PURE__ */ jsx(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, bold: isFocused, children: isFocused ? `${UI_SYMBOLS.CHEVRON} ${label}` : label }),
|
|
31
32
|
descriptionLines.map((line, index) => /* @__PURE__ */ jsx(Text, { dimColor: true, children: line }, index))
|
|
@@ -37,4 +38,4 @@ var SelectionCard = ({
|
|
|
37
38
|
export {
|
|
38
39
|
SelectionCard
|
|
39
40
|
};
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
41
|
+
//# sourceMappingURL=chunk-WJHFV6RI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/selection-card.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS, UI_SYMBOLS } from \"../../consts.js\";\n\ntype SelectionCardProps = {\n label: string;\n description: string | string[];\n isFocused: boolean;\n marginBottom?: number;\n};\n\nexport const SelectionCard: React.FC<SelectionCardProps> = ({\n label,\n description,\n isFocused,\n marginBottom,\n}) => {\n const descriptionLines = Array.isArray(description) ? description : [description];\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={isFocused ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL}\n paddingX={2}\n paddingY={1}\n marginBottom={marginBottom}\n width=\"100%\"\n >\n <Box flexDirection=\"column\" gap={1}>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined} bold={isFocused}>\n {isFocused ? `${UI_SYMBOLS.CHEVRON} ${label}` : label}\n </Text>\n {descriptionLines.map((line, index) => (\n <Text key={index} dimColor>\n {line}\n </Text>\n ))}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;AAAA;AAAA,SAAS,KAAK,YAAY;AA4BpB,SACE,KADF;AAjBC,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,mBAAmB,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW;AAEhF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAY;AAAA,MACZ,aAAa,YAAY,WAAW,UAAU,WAAW;AAAA,MACzD,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA,OAAM;AAAA,MAEN,+BAAC,OAAI,eAAc,UAAS,KAAK,GAC/B;AAAA,4BAAC,QAAK,OAAO,YAAY,WAAW,UAAU,QAAW,MAAM,WAC5D,sBAAY,GAAG,WAAW,OAAO,IAAI,KAAK,KAAK,OAClD;AAAA,QACC,iBAAiB,IAAI,CAAC,MAAM,UAC3B,oBAAC,QAAiB,UAAQ,MACvB,kBADQ,KAEX,CACD;AAAA,SACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
CLI_BIN_NAME,
|
|
4
4
|
DEFAULT_BRANDING
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-AWP5A6IM.js";
|
|
6
6
|
import {
|
|
7
7
|
init_esm_shims
|
|
8
8
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -67,4 +67,4 @@ export {
|
|
|
67
67
|
INFO_MESSAGES,
|
|
68
68
|
DRY_RUN_MESSAGES
|
|
69
69
|
};
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
70
|
+
//# sourceMappingURL=chunk-WLZHCM7O.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getDomainDisplayName
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-HYEUETIC.js";
|
|
5
5
|
import {
|
|
6
6
|
ViewTitle
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CMNKHDOX.js";
|
|
8
8
|
import {
|
|
9
9
|
CLI_COLORS
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-AWP5A6IM.js";
|
|
11
11
|
import {
|
|
12
12
|
init_esm_shims
|
|
13
13
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -84,4 +84,4 @@ var StepConfirm = ({
|
|
|
84
84
|
export {
|
|
85
85
|
StepConfirm
|
|
86
86
|
};
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
87
|
+
//# sourceMappingURL=chunk-XDSVV5GZ.js.map
|
|
@@ -5,9 +5,12 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
useKeyboardNavigation
|
|
7
7
|
} from "./chunk-KUV24B5M.js";
|
|
8
|
+
import {
|
|
9
|
+
useRowScroll
|
|
10
|
+
} from "./chunk-3VOL4WEG.js";
|
|
8
11
|
import {
|
|
9
12
|
ViewTitle
|
|
10
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-CMNKHDOX.js";
|
|
11
14
|
import {
|
|
12
15
|
useTextInput
|
|
13
16
|
} from "./chunk-U3IGFMCY.js";
|
|
@@ -16,14 +19,14 @@ import {
|
|
|
16
19
|
addSource,
|
|
17
20
|
getSourceSummary,
|
|
18
21
|
removeSource
|
|
19
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-HMSHB5EQ.js";
|
|
20
23
|
import {
|
|
21
24
|
getErrorMessage,
|
|
22
25
|
verbose
|
|
23
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-WBHPCBVN.js";
|
|
24
27
|
import {
|
|
25
28
|
CLI_COLORS
|
|
26
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-AWP5A6IM.js";
|
|
27
30
|
import {
|
|
28
31
|
init_esm_shims
|
|
29
32
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -78,7 +81,12 @@ function useSourceOperations(projectDir, onReload) {
|
|
|
78
81
|
// src/cli/components/wizard/step-settings.tsx
|
|
79
82
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
80
83
|
var DEFAULT_SOURCE_NAME = "public";
|
|
81
|
-
var
|
|
84
|
+
var SOURCE_LIST_BORDER_LINES = 2;
|
|
85
|
+
var StepSettings = ({
|
|
86
|
+
projectDir,
|
|
87
|
+
availableHeight = 0,
|
|
88
|
+
onClose
|
|
89
|
+
}) => {
|
|
82
90
|
const [summary, setSummary] = useState2(null);
|
|
83
91
|
const addModal = useModalState();
|
|
84
92
|
const {
|
|
@@ -114,6 +122,12 @@ var StepSettings = ({ projectDir, onClose }) => {
|
|
|
114
122
|
{ onEscape: onClose },
|
|
115
123
|
{ wrap: false, vimKeys: false, active: !addModal.isOpen }
|
|
116
124
|
);
|
|
125
|
+
const sourceViewportHeight = availableHeight > SOURCE_LIST_BORDER_LINES ? availableHeight - SOURCE_LIST_BORDER_LINES : 0;
|
|
126
|
+
const { scrollEnabled, scrollTop } = useRowScroll({
|
|
127
|
+
focusedIndex,
|
|
128
|
+
itemCount: sourceCount,
|
|
129
|
+
availableHeight: sourceViewportHeight
|
|
130
|
+
});
|
|
117
131
|
useInput((input, key) => {
|
|
118
132
|
if (statusMessage) {
|
|
119
133
|
clearStatus();
|
|
@@ -162,6 +176,27 @@ var StepSettings = ({ projectDir, onClose }) => {
|
|
|
162
176
|
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Loading sources..." })
|
|
163
177
|
] });
|
|
164
178
|
}
|
|
179
|
+
const sourceElements = summary?.sources.map((source, index) => {
|
|
180
|
+
const isFocused = index === focusedIndex && !addModal.isOpen;
|
|
181
|
+
const isDefault = source.name === DEFAULT_SOURCE_NAME;
|
|
182
|
+
const checkmark = source.enabled ? "\u2713" : " ";
|
|
183
|
+
const displayName = isDefault ? "Public" : source.name;
|
|
184
|
+
const suffix = isDefault ? " (default)" : "";
|
|
185
|
+
return /* @__PURE__ */ jsxs(Box, { flexShrink: 0, children: [
|
|
186
|
+
/* @__PURE__ */ jsxs(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, bold: isFocused, children: [
|
|
187
|
+
isFocused ? ">" : " ",
|
|
188
|
+
" ",
|
|
189
|
+
checkmark,
|
|
190
|
+
" ",
|
|
191
|
+
displayName
|
|
192
|
+
] }),
|
|
193
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
194
|
+
" ",
|
|
195
|
+
source.url,
|
|
196
|
+
suffix
|
|
197
|
+
] })
|
|
198
|
+
] }, source.name);
|
|
199
|
+
});
|
|
165
200
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 2, children: [
|
|
166
201
|
/* @__PURE__ */ jsx(ViewTitle, { children: "Skill Sources" }),
|
|
167
202
|
/* @__PURE__ */ jsx(Box, { marginTop: 1 }),
|
|
@@ -174,27 +209,22 @@ var StepSettings = ({ projectDir, onClose }) => {
|
|
|
174
209
|
borderColor: CLI_COLORS.NEUTRAL,
|
|
175
210
|
paddingX: 1,
|
|
176
211
|
marginTop: 1,
|
|
177
|
-
children:
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
source.url,
|
|
194
|
-
suffix
|
|
195
|
-
] })
|
|
196
|
-
] }, source.name);
|
|
197
|
-
})
|
|
212
|
+
children: /* @__PURE__ */ jsx(
|
|
213
|
+
Box,
|
|
214
|
+
{
|
|
215
|
+
flexDirection: "column",
|
|
216
|
+
...scrollEnabled && { height: sourceViewportHeight, overflow: "hidden" },
|
|
217
|
+
children: /* @__PURE__ */ jsx(
|
|
218
|
+
Box,
|
|
219
|
+
{
|
|
220
|
+
flexDirection: "column",
|
|
221
|
+
marginTop: scrollTop > 0 ? -scrollTop : 0,
|
|
222
|
+
...scrollEnabled && { flexShrink: 0 },
|
|
223
|
+
children: sourceElements
|
|
224
|
+
}
|
|
225
|
+
)
|
|
226
|
+
}
|
|
227
|
+
)
|
|
198
228
|
}
|
|
199
229
|
),
|
|
200
230
|
/* @__PURE__ */ jsx(
|
|
@@ -232,4 +262,4 @@ var StepSettings = ({ projectDir, onClose }) => {
|
|
|
232
262
|
export {
|
|
233
263
|
StepSettings
|
|
234
264
|
};
|
|
235
|
-
//# sourceMappingURL=chunk-
|
|
265
|
+
//# sourceMappingURL=chunk-YDYRAXSY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/step-settings.tsx","../src/cli/components/hooks/use-source-operations.ts"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { ViewTitle } from \"./view-title.js\";\nimport { getSourceSummary, type SourceSummary } from \"../../lib/configuration/source-manager.js\";\nimport { DEFAULT_SOURCE } from \"../../lib/configuration/config.js\";\nimport { useKeyboardNavigation } from \"../hooks/use-keyboard-navigation.js\";\nimport { useModalState } from \"../hooks/use-modal-state.js\";\nimport { useRowScroll } from \"../hooks/use-row-scroll.js\";\nimport { useSourceOperations } from \"../hooks/use-source-operations.js\";\nimport { useTextInput } from \"../hooks/use-text-input.js\";\nimport { verbose } from \"../../utils/logger.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\n\nconst DEFAULT_SOURCE_NAME = \"public\";\n\n/** Fixed lines around the source list: border top/bottom (2) */\nconst SOURCE_LIST_BORDER_LINES = 2;\n\nexport type StepSettingsProps = {\n projectDir: string;\n /** Available height in terminal lines for the scrollable source list. 0 = no constraint. */\n availableHeight?: number;\n onClose: () => void;\n};\n\nexport const StepSettings: React.FC<StepSettingsProps> = ({\n projectDir,\n availableHeight = 0,\n onClose,\n}) => {\n const [summary, setSummary] = useState<SourceSummary | null>(null);\n const addModal = useModalState();\n const {\n value: addSourceInput,\n setValue: setAddSourceInput,\n handleInput: handleTextInput,\n } = useTextInput(\"\");\n const [isLoading, setIsLoading] = useState(true);\n\n const loadSummary = useCallback(async () => {\n try {\n const result = await getSourceSummary(projectDir);\n setSummary(result);\n } catch (error) {\n verbose(`Failed to load source summary: ${getErrorMessage(error)}`);\n setSummary({\n sources: [{ name: DEFAULT_SOURCE_NAME, url: DEFAULT_SOURCE, enabled: true }],\n localSkillCount: 0,\n pluginSkillCount: 0,\n });\n }\n setIsLoading(false);\n }, [projectDir]);\n\n useEffect(() => {\n void loadSummary();\n }, [loadSummary]);\n\n const { handleAdd, handleRemove, statusMessage, clearStatus } = useSourceOperations(\n projectDir,\n loadSummary,\n );\n\n const sourceCount = summary?.sources.length ?? 0;\n\n const { focusedIndex, setFocusedIndex } = useKeyboardNavigation(\n sourceCount,\n { onEscape: onClose },\n { wrap: false, vimKeys: false, active: !addModal.isOpen },\n );\n\n // Compute scroll offset for source list\n const sourceViewportHeight =\n availableHeight > SOURCE_LIST_BORDER_LINES ? availableHeight - SOURCE_LIST_BORDER_LINES : 0;\n const { scrollEnabled, scrollTop } = useRowScroll({\n focusedIndex,\n itemCount: sourceCount,\n availableHeight: sourceViewportHeight,\n });\n\n useInput((input, key) => {\n if (statusMessage) {\n clearStatus();\n }\n\n if (addModal.isOpen) {\n if (key.escape) {\n addModal.close();\n setAddSourceInput(\"\");\n return;\n }\n\n if (key.return) {\n if (addSourceInput.trim()) {\n addModal.close();\n setAddSourceInput(\"\");\n void handleAdd(addSourceInput.trim());\n }\n return;\n }\n\n handleTextInput(input, key);\n return;\n }\n\n if (key.return) {\n // Toggle enabled/disabled is a placeholder for future enabledSources store integration\n return;\n }\n\n if (key.backspace || key.delete) {\n if (summary?.sources[focusedIndex]) {\n const source = summary.sources[focusedIndex];\n if (source.name !== DEFAULT_SOURCE_NAME) {\n void handleRemove(source.name).then((success) => {\n if (success) {\n setFocusedIndex((prev) => Math.max(0, prev - 1));\n }\n });\n }\n }\n return;\n }\n\n if (input === \"a\" || input === \"A\") {\n addModal.open(true);\n setAddSourceInput(\"\");\n }\n });\n\n if (isLoading) {\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>Skill Sources</ViewTitle>\n <Text dimColor>Loading sources...</Text>\n </Box>\n );\n }\n\n const sourceElements = summary?.sources.map((source, index) => {\n const isFocused = index === focusedIndex && !addModal.isOpen;\n const isDefault = source.name === DEFAULT_SOURCE_NAME;\n const checkmark = source.enabled ? \"\\u2713\" : \" \";\n const displayName = isDefault ? \"Public\" : source.name;\n const suffix = isDefault ? \" (default)\" : \"\";\n\n return (\n <Box key={source.name} flexShrink={0}>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined} bold={isFocused}>\n {isFocused ? \">\" : \" \"} {checkmark} {displayName}\n </Text>\n <Text dimColor>\n {\" \"}\n {source.url}\n {suffix}\n </Text>\n </Box>\n );\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>Skill Sources</ViewTitle>\n <Box marginTop={1} />\n\n <Text bold>Configured marketplaces:</Text>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={CLI_COLORS.NEUTRAL}\n paddingX={1}\n marginTop={1}\n >\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled && { height: sourceViewportHeight, overflow: \"hidden\" as const })}\n >\n <Box\n flexDirection=\"column\"\n marginTop={scrollTop > 0 ? -scrollTop : 0}\n {...(scrollEnabled && { flexShrink: 0 })}\n >\n {sourceElements}\n </Box>\n </Box>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={addModal.isOpen ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL}\n paddingX={1}\n marginTop={1}\n >\n <Text color={addModal.isOpen ? CLI_COLORS.PRIMARY : undefined}>\n + Add source: {addModal.isOpen ? addSourceInput : \"\"}\n {addModal.isOpen ? \"\\u2588\" : \"\"}\n </Text>\n </Box>\n\n {statusMessage && (\n <Box marginTop={1}>\n <Text color={statusMessage.color}>{statusMessage.text}</Text>\n </Box>\n )}\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Local skills: {summary?.localSkillCount ?? 0} in .claude/skills/</Text>\n <Text dimColor>Plugins: {summary?.pluginSkillCount ?? 0} from installed plugins</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n {addModal.isOpen ? \"ENTER submit ESC cancel\" : \"A add DEL remove ESC or G to close\"}\n </Text>\n </Box>\n </Box>\n );\n};\n","import { useState, useCallback } from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { addSource, removeSource } from \"../../lib/configuration/source-manager.js\";\n\ntype StatusMessage = { text: string; color: \"red\" | \"green\" } | null;\n\ntype UseSourceOperationsResult = {\n handleAdd: (url: string) => Promise<void>;\n handleRemove: (name: string) => Promise<boolean>;\n statusMessage: StatusMessage;\n clearStatus: () => void;\n};\n\nexport function useSourceOperations(\n projectDir: string,\n onReload: () => Promise<void>,\n): UseSourceOperationsResult {\n const [statusMessage, setStatusMessage] = useState<StatusMessage>(null);\n\n const handleAdd = useCallback(\n async (url: string) => {\n try {\n const result = await addSource(projectDir, url);\n setStatusMessage({\n text: `Added \"${result.name}\" (${result.skillCount} skills)`,\n color: CLI_COLORS.SUCCESS,\n });\n await onReload();\n } catch (error) {\n const message = getErrorMessage(error);\n setStatusMessage({ text: `Failed to add source: ${message}`, color: CLI_COLORS.ERROR });\n }\n },\n [projectDir, onReload],\n );\n\n const handleRemove = useCallback(\n async (name: string): Promise<boolean> => {\n try {\n await removeSource(projectDir, name);\n setStatusMessage({ text: `Removed \"${name}\"`, color: CLI_COLORS.SUCCESS });\n await onReload();\n return true;\n } catch (error) {\n const message = getErrorMessage(error);\n setStatusMessage({ text: `Failed to remove: ${message}`, color: CLI_COLORS.ERROR });\n return false;\n }\n },\n [projectDir, onReload],\n );\n\n const clearStatus = useCallback(() => {\n setStatusMessage(null);\n }, []);\n\n return { handleAdd, handleRemove, statusMessage, clearStatus };\n}\n"],"mappings":"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","names":["useState","useCallback","useState","useCallback"]}
|
|
@@ -3,19 +3,19 @@ import {
|
|
|
3
3
|
generateMarketplace,
|
|
4
4
|
getMarketplaceStats,
|
|
5
5
|
writeMarketplace
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-KAO3LKB5.js";
|
|
7
7
|
import {
|
|
8
8
|
BaseCommand
|
|
9
|
-
} from "../../chunk-
|
|
9
|
+
} from "../../chunk-PGY5XROM.js";
|
|
10
10
|
import {
|
|
11
11
|
setVerbose
|
|
12
|
-
} from "../../chunk-
|
|
12
|
+
} from "../../chunk-WBHPCBVN.js";
|
|
13
13
|
import {
|
|
14
14
|
DEFAULT_BRANDING,
|
|
15
15
|
DEFAULT_PLUGIN_NAME,
|
|
16
16
|
DEFAULT_VERSION,
|
|
17
17
|
PLUGIN_MANIFEST_DIR
|
|
18
|
-
} from "../../chunk-
|
|
18
|
+
} from "../../chunk-AWP5A6IM.js";
|
|
19
19
|
import {
|
|
20
20
|
init_esm_shims
|
|
21
21
|
} from "../../chunk-DHET7RCE.js";
|
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
import {
|
|
3
3
|
compileAllAgentPlugins,
|
|
4
4
|
printAgentCompilationSummary
|
|
5
|
-
} from "../../chunk-
|
|
5
|
+
} from "../../chunk-7LV4V6A4.js";
|
|
6
6
|
import {
|
|
7
7
|
BaseCommand
|
|
8
|
-
} from "../../chunk-
|
|
8
|
+
} from "../../chunk-PGY5XROM.js";
|
|
9
9
|
import {
|
|
10
10
|
compileAllSkillPlugins,
|
|
11
11
|
compileSkillPlugin,
|
|
12
12
|
printCompilationSummary
|
|
13
|
-
} from "../../chunk-
|
|
13
|
+
} from "../../chunk-HMSHB5EQ.js";
|
|
14
14
|
import "../../chunk-T4EXUIBY.js";
|
|
15
15
|
import {
|
|
16
16
|
setVerbose
|
|
17
|
-
} from "../../chunk-
|
|
17
|
+
} from "../../chunk-WBHPCBVN.js";
|
|
18
18
|
import {
|
|
19
19
|
DIRS
|
|
20
|
-
} from "../../chunk-
|
|
20
|
+
} from "../../chunk-AWP5A6IM.js";
|
|
21
21
|
import {
|
|
22
22
|
init_esm_shims
|
|
23
23
|
} from "../../chunk-DHET7RCE.js";
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getAgentDefinitions
|
|
4
|
-
} from "../../chunk-
|
|
4
|
+
} from "../../chunk-7LV4V6A4.js";
|
|
5
5
|
import {
|
|
6
6
|
BaseCommand,
|
|
7
7
|
EXIT_CODES
|
|
8
|
-
} from "../../chunk-
|
|
8
|
+
} from "../../chunk-PGY5XROM.js";
|
|
9
9
|
import {
|
|
10
10
|
compileStackPlugin,
|
|
11
11
|
loadStacks,
|
|
12
12
|
printStackCompilationSummary
|
|
13
|
-
} from "../../chunk-
|
|
13
|
+
} from "../../chunk-HMSHB5EQ.js";
|
|
14
14
|
import "../../chunk-T4EXUIBY.js";
|
|
15
15
|
import {
|
|
16
16
|
setVerbose
|
|
17
|
-
} from "../../chunk-
|
|
17
|
+
} from "../../chunk-WBHPCBVN.js";
|
|
18
18
|
import {
|
|
19
19
|
PROJECT_ROOT
|
|
20
|
-
} from "../../chunk-
|
|
20
|
+
} from "../../chunk-AWP5A6IM.js";
|
|
21
21
|
import {
|
|
22
22
|
init_esm_shims
|
|
23
23
|
} from "../../chunk-DHET7RCE.js";
|