@orderful/droid 0.15.0 → 0.16.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.
Files changed (125) hide show
  1. package/.claude/CLAUDE.md +18 -40
  2. package/AGENTS.md +75 -0
  3. package/CHANGELOG.md +25 -0
  4. package/dist/bin/droid.js +3064 -54
  5. package/dist/commands/setup.d.ts +1 -1
  6. package/dist/commands/setup.d.ts.map +1 -1
  7. package/dist/commands/tui/components/Badge.d.ts +13 -0
  8. package/dist/commands/tui/components/Badge.d.ts.map +1 -0
  9. package/dist/commands/tui/components/Markdown.d.ts +5 -0
  10. package/dist/commands/tui/components/Markdown.d.ts.map +1 -0
  11. package/dist/commands/tui/components/SettingsDetails.d.ts +5 -0
  12. package/dist/commands/tui/components/SettingsDetails.d.ts.map +1 -0
  13. package/dist/commands/tui/components/TabBar.d.ts +10 -0
  14. package/dist/commands/tui/components/TabBar.d.ts.map +1 -0
  15. package/dist/commands/tui/components/ToolDetails.d.ts +8 -0
  16. package/dist/commands/tui/components/ToolDetails.d.ts.map +1 -0
  17. package/dist/commands/tui/components/ToolItem.d.ts +9 -0
  18. package/dist/commands/tui/components/ToolItem.d.ts.map +1 -0
  19. package/dist/commands/tui/constants.d.ts +16 -0
  20. package/dist/commands/tui/constants.d.ts.map +1 -0
  21. package/dist/commands/tui/hooks/useAppUpdate.d.ts +13 -0
  22. package/dist/commands/tui/hooks/useAppUpdate.d.ts.map +1 -0
  23. package/dist/commands/tui/hooks/useToolUpdates.d.ts +22 -0
  24. package/dist/commands/tui/hooks/useToolUpdates.d.ts.map +1 -0
  25. package/dist/commands/tui/types.d.ts +5 -0
  26. package/dist/commands/tui/types.d.ts.map +1 -0
  27. package/dist/commands/tui/views/ReadmeViewer.d.ts +7 -0
  28. package/dist/commands/tui/views/ReadmeViewer.d.ts.map +1 -0
  29. package/dist/commands/tui/views/SetupScreen.d.ts +8 -0
  30. package/dist/commands/tui/views/SetupScreen.d.ts.map +1 -0
  31. package/dist/commands/tui/views/SkillConfigScreen.d.ts +8 -0
  32. package/dist/commands/tui/views/SkillConfigScreen.d.ts.map +1 -0
  33. package/dist/commands/tui/views/ToolExplorer.d.ts +8 -0
  34. package/dist/commands/tui/views/ToolExplorer.d.ts.map +1 -0
  35. package/dist/commands/tui/views/ToolUpdatePrompt.d.ts +10 -0
  36. package/dist/commands/tui/views/ToolUpdatePrompt.d.ts.map +1 -0
  37. package/dist/commands/tui/views/WelcomeScreen.d.ts +11 -0
  38. package/dist/commands/tui/views/WelcomeScreen.d.ts.map +1 -0
  39. package/dist/commands/tui.d.ts.map +1 -1
  40. package/dist/index.d.ts +4 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +952 -6
  43. package/dist/lib/agents.d.ts +1 -1
  44. package/dist/lib/agents.d.ts.map +1 -1
  45. package/dist/lib/config.d.ts +1 -1
  46. package/dist/lib/config.d.ts.map +1 -1
  47. package/dist/lib/platforms.d.ts +1 -1
  48. package/dist/lib/platforms.d.ts.map +1 -1
  49. package/dist/lib/skill-config.d.ts +1 -1
  50. package/dist/lib/skill-config.d.ts.map +1 -1
  51. package/dist/lib/skills.d.ts +1 -1
  52. package/dist/lib/skills.d.ts.map +1 -1
  53. package/dist/lib/tools.d.ts +1 -1
  54. package/dist/lib/tools.d.ts.map +1 -1
  55. package/package.json +3 -3
  56. package/scripts/build.ts +78 -0
  57. package/src/bin/droid.ts +8 -8
  58. package/src/commands/config.ts +1 -1
  59. package/src/commands/install.ts +3 -3
  60. package/src/commands/setup.test.ts +1 -1
  61. package/src/commands/setup.ts +3 -3
  62. package/src/commands/skills.ts +4 -4
  63. package/src/commands/tui/components/Badge.tsx +86 -0
  64. package/src/commands/tui/components/Markdown.tsx +48 -0
  65. package/src/commands/tui/components/SettingsDetails.tsx +70 -0
  66. package/src/commands/tui/components/TabBar.tsx +26 -0
  67. package/src/commands/tui/components/ToolDetails.tsx +117 -0
  68. package/src/commands/tui/components/ToolItem.tsx +39 -0
  69. package/src/commands/tui/constants.ts +17 -0
  70. package/src/commands/tui/hooks/useAppUpdate.ts +67 -0
  71. package/src/commands/tui/hooks/useToolUpdates.ts +110 -0
  72. package/src/commands/tui/types.ts +4 -0
  73. package/src/commands/tui/views/ReadmeViewer.tsx +93 -0
  74. package/src/commands/tui/views/SetupScreen.tsx +242 -0
  75. package/src/commands/tui/views/SkillConfigScreen.tsx +278 -0
  76. package/src/commands/tui/views/ToolExplorer.tsx +190 -0
  77. package/src/commands/tui/views/ToolUpdatePrompt.tsx +109 -0
  78. package/src/commands/tui/views/WelcomeScreen.tsx +149 -0
  79. package/src/commands/tui.tsx +65 -1587
  80. package/src/commands/uninstall.ts +2 -2
  81. package/src/commands/update.ts +1 -1
  82. package/src/index.ts +4 -4
  83. package/src/lib/agents.ts +4 -4
  84. package/src/lib/config.ts +1 -1
  85. package/src/lib/platforms.ts +1 -1
  86. package/src/lib/skill-config.ts +2 -2
  87. package/src/lib/skills.test.ts +2 -2
  88. package/src/lib/skills.ts +5 -5
  89. package/src/lib/tools.ts +3 -3
  90. package/src/lib/types.test.ts +1 -1
  91. package/src/lib/version.test.ts +1 -1
  92. package/dist/bin/droid.js.map +0 -1
  93. package/dist/commands/config.js +0 -67
  94. package/dist/commands/config.js.map +0 -1
  95. package/dist/commands/install.js +0 -45
  96. package/dist/commands/install.js.map +0 -1
  97. package/dist/commands/setup.js +0 -269
  98. package/dist/commands/setup.js.map +0 -1
  99. package/dist/commands/skills.js +0 -144
  100. package/dist/commands/skills.js.map +0 -1
  101. package/dist/commands/tui.js +0 -1008
  102. package/dist/commands/tui.js.map +0 -1
  103. package/dist/commands/uninstall.js +0 -26
  104. package/dist/commands/uninstall.js.map +0 -1
  105. package/dist/commands/update.js +0 -45
  106. package/dist/commands/update.js.map +0 -1
  107. package/dist/index.js.map +0 -1
  108. package/dist/lib/agents.js +0 -248
  109. package/dist/lib/agents.js.map +0 -1
  110. package/dist/lib/config.js +0 -196
  111. package/dist/lib/config.js.map +0 -1
  112. package/dist/lib/platforms.js +0 -52
  113. package/dist/lib/platforms.js.map +0 -1
  114. package/dist/lib/quotes.js +0 -24
  115. package/dist/lib/quotes.js.map +0 -1
  116. package/dist/lib/skill-config.js +0 -80
  117. package/dist/lib/skill-config.js.map +0 -1
  118. package/dist/lib/skills.js +0 -582
  119. package/dist/lib/skills.js.map +0 -1
  120. package/dist/lib/tools.js +0 -145
  121. package/dist/lib/tools.js.map +0 -1
  122. package/dist/lib/types.js +0 -50
  123. package/dist/lib/types.js.map +0 -1
  124. package/dist/lib/version.js +0 -100
  125. package/dist/lib/version.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
- import { uninstallSkill } from '../lib/skills.js';
3
- import { getBundledTools, isToolInstalled } from '../lib/tools.js';
2
+ import { uninstallSkill } from '../lib/skills';
3
+ import { getBundledTools, isToolInstalled } from '../lib/tools';
4
4
 
5
5
  export async function uninstallCommand(toolName: string): Promise<void> {
6
6
  const tools = getBundledTools();
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import { execSync } from 'child_process';
3
- import { getVersion } from '../lib/version.js';
3
+ import { getVersion } from '../lib/version';
4
4
 
5
5
  interface UpdateOptions {
6
6
  tools?: boolean;
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  // Re-export types and utilities for potential programmatic usage
2
- export * from './lib/types.js';
3
- export * from './lib/config.js';
4
- export * from './lib/skills.js';
5
- export * from './lib/version.js';
2
+ export * from './lib/types';
3
+ export * from './lib/config';
4
+ export * from './lib/skills';
5
+ export * from './lib/version';
package/src/lib/agents.ts CHANGED
@@ -2,10 +2,10 @@ import { existsSync, readdirSync, readFileSync, writeFileSync, unlinkSync, mkdir
2
2
  import { join, dirname } from 'path';
3
3
  import { fileURLToPath } from 'url';
4
4
  import YAML from 'yaml';
5
- import { loadConfig } from './config.js';
6
- import { Platform } from './types.js';
7
- import { getAgentsPath } from './platforms.js';
8
- import { loadToolManifest } from './tools.js';
5
+ import { loadConfig } from './config';
6
+ import { Platform } from './types';
7
+ import { getAgentsPath } from './platforms';
8
+ import { loadToolManifest } from './tools';
9
9
 
10
10
  const __dirname = dirname(fileURLToPath(import.meta.url));
11
11
  const BUNDLED_TOOLS_DIR = join(__dirname, '../tools');
package/src/lib/config.ts CHANGED
@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
2
  import { homedir } from 'os';
3
3
  import { join } from 'path';
4
4
  import YAML from 'yaml';
5
- import { Platform, BuiltInOutput, type DroidConfig, type LegacyDroidConfig, type SkillOverrides, type AutoUpdateConfig } from './types.js';
5
+ import { Platform, BuiltInOutput, type DroidConfig, type LegacyDroidConfig, type SkillOverrides, type AutoUpdateConfig } from './types';
6
6
 
7
7
  const CONFIG_DIR = join(homedir(), '.droid');
8
8
  const CONFIG_FILE = join(CONFIG_DIR, 'config.yaml');
@@ -1,6 +1,6 @@
1
1
  import { join } from 'path';
2
2
  import { homedir } from 'os';
3
- import { Platform } from './types.js';
3
+ import { Platform } from './types';
4
4
 
5
5
  /**
6
6
  * Platform-specific paths configuration
@@ -1,7 +1,7 @@
1
1
  import chalk from 'chalk';
2
2
  import inquirer from 'inquirer';
3
- import { saveSkillOverrides, loadConfig, loadSkillOverrides } from './config.js';
4
- import { ConfigOptionType, type SkillOverrides, type ConfigOption } from './types.js';
3
+ import { saveSkillOverrides, loadConfig, loadSkillOverrides } from './config';
4
+ import { ConfigOptionType, type SkillOverrides, type ConfigOption } from './types';
5
5
 
6
6
  /**
7
7
  * Prompt user to configure a skill after install
@@ -4,7 +4,7 @@ import { join } from 'path';
4
4
  import { tmpdir } from 'os';
5
5
  import { homedir } from 'os';
6
6
  import YAML from 'yaml';
7
- import { Platform, SkillStatus } from './types.js';
7
+ import { Platform, SkillStatus } from './types';
8
8
  import {
9
9
  getSkillsInstallPath,
10
10
  getCommandsInstallPath,
@@ -12,7 +12,7 @@ import {
12
12
  getSkillStatusDisplay,
13
13
  getBundledSkillsDir,
14
14
  loadSkillManifest,
15
- } from './skills.js';
15
+ } from './skills';
16
16
 
17
17
  /**
18
18
  * Parse YAML frontmatter from markdown content
package/src/lib/skills.ts CHANGED
@@ -2,11 +2,11 @@ import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync, rmSync
2
2
  import { join, dirname } from 'path';
3
3
  import { fileURLToPath } from 'url';
4
4
  import YAML from 'yaml';
5
- import { loadConfig, saveConfig } from './config.js';
6
- import { Platform, SkillStatus, type SkillManifest, type InstalledSkill, getPlatformTools, setPlatformTools } from './types.js';
7
- import { getInstalledAgentsDir, installAgentFromPath, uninstallAgent, isAgentInstalled } from './agents.js';
8
- import { getSkillsPath, getCommandsPath, getConfigPath } from './platforms.js';
9
- import { loadToolManifest } from './tools.js';
5
+ import { loadConfig, saveConfig } from './config';
6
+ import { Platform, SkillStatus, type SkillManifest, type InstalledSkill, getPlatformTools, setPlatformTools } from './types';
7
+ import { getInstalledAgentsDir, installAgentFromPath, uninstallAgent, isAgentInstalled } from './agents';
8
+ import { getSkillsPath, getCommandsPath, getConfigPath } from './platforms';
9
+ import { loadToolManifest } from './tools';
10
10
 
11
11
  // Marker comments for CLAUDE.md skill registration
12
12
  const DROID_SKILLS_START = '<!-- droid-skills-start -->';
package/src/lib/tools.ts CHANGED
@@ -2,9 +2,9 @@ import { existsSync, readdirSync, readFileSync } from 'fs';
2
2
  import { join, dirname } from 'path';
3
3
  import { fileURLToPath } from 'url';
4
4
  import YAML from 'yaml';
5
- import { loadConfig } from './config.js';
6
- import { type ToolManifest, type ToolIncludes, getPlatformTools } from './types.js';
7
- import { compareSemver } from './version.js';
5
+ import { loadConfig } from './config';
6
+ import { type ToolManifest, type ToolIncludes, getPlatformTools } from './types';
7
+ import { compareSemver } from './version';
8
8
 
9
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
10
10
  const BUNDLED_TOOLS_DIR = join(__dirname, '../tools');
@@ -6,7 +6,7 @@ import {
6
6
  SkillStatus,
7
7
  ConfigOptionType,
8
8
  getAITag,
9
- } from './types.js';
9
+ } from './types';
10
10
 
11
11
  describe('Platform enum', () => {
12
12
  it('should have correct values', () => {
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'bun:test';
2
- import { getVersion, compareSemver } from './version.js';
2
+ import { getVersion, compareSemver } from './version';
3
3
 
4
4
  describe('getVersion', () => {
5
5
  it('should return a version string', () => {
@@ -1 +0,0 @@
1
- {"version":3,"file":"droid.js","sourceRoot":"","sources":["../../src/bin/droid.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAE7B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC;KAC7C,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,CAAC;KACxD,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;KACrD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;KACtC,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC;KACtC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC5C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,qCAAqC;AACrC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC9B,UAAU,EAAE,CAAC;AACf,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
@@ -1,67 +0,0 @@
1
- import chalk from 'chalk';
2
- import { execSync } from 'child_process';
3
- import { loadConfig, getConfigPath, getConfigValue, setConfigValue, configExists, } from '../lib/config.js';
4
- export async function configCommand(options) {
5
- // Handle --edit flag
6
- if (options.edit) {
7
- const configPath = getConfigPath();
8
- const editor = process.env.EDITOR || 'vim';
9
- if (!configExists()) {
10
- console.log(chalk.yellow('No config file exists yet. Run `droid setup` first.'));
11
- return;
12
- }
13
- console.log(chalk.gray(`Opening ${configPath} in ${editor}...`));
14
- try {
15
- execSync(`${editor} "${configPath}"`, { stdio: 'inherit' });
16
- }
17
- catch {
18
- console.error(chalk.red('Failed to open editor'));
19
- }
20
- return;
21
- }
22
- // Handle --get flag
23
- if (options.get) {
24
- const value = getConfigValue(options.get);
25
- if (value === undefined) {
26
- console.log(chalk.yellow(`Config key '${options.get}' not found`));
27
- process.exit(1);
28
- }
29
- if (typeof value === 'object') {
30
- console.log(JSON.stringify(value, null, 2));
31
- }
32
- else {
33
- console.log(value);
34
- }
35
- return;
36
- }
37
- // Handle --set flag
38
- if (options.set) {
39
- const match = options.set.match(/^([^=]+)=(.*)$/);
40
- if (!match) {
41
- console.error(chalk.red('Invalid format. Use: --set key=value'));
42
- process.exit(1);
43
- }
44
- const [, key, rawValue] = match;
45
- // Try to parse as JSON, otherwise use as string
46
- let value;
47
- try {
48
- value = JSON.parse(rawValue);
49
- }
50
- catch {
51
- value = rawValue;
52
- }
53
- setConfigValue(key, value);
54
- console.log(chalk.green(`āœ“ Set ${key} = ${JSON.stringify(value)}`));
55
- return;
56
- }
57
- // Default: show full config
58
- if (!configExists()) {
59
- console.log(chalk.yellow('No config file exists yet. Run `droid setup` first.'));
60
- return;
61
- }
62
- const config = loadConfig();
63
- console.log(chalk.bold('\nšŸ“‹ Droid Config\n'));
64
- console.log(chalk.gray(`Path: ${getConfigPath()}\n`));
65
- console.log(JSON.stringify(config, null, 2));
66
- }
67
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import chalk from 'chalk';
2
- import { installSkill } from '../lib/skills.js';
3
- import { getBundledTools, isToolInstalled } from '../lib/tools.js';
4
- import { promptForSkillConfig } from '../lib/skill-config.js';
5
- export async function installCommand(toolName) {
6
- // Check if tool exists
7
- const tools = getBundledTools();
8
- const tool = tools.find((t) => t.name === toolName);
9
- if (!tool) {
10
- console.error(chalk.red(`\nāœ— Tool '${toolName}' not found`));
11
- console.log(chalk.gray('\nAvailable tools:'));
12
- for (const t of tools) {
13
- console.log(chalk.gray(` - ${t.name}`));
14
- }
15
- process.exit(1);
16
- }
17
- // Check if already installed
18
- if (isToolInstalled(toolName)) {
19
- console.log(chalk.yellow(`\n⚠ Tool '${toolName}' is already installed`));
20
- console.log(chalk.gray('Use `droid update` to update it, or uninstall first.'));
21
- return;
22
- }
23
- console.log(chalk.bold(`\nšŸ¤– Installing ${toolName}...\n`));
24
- // Install via primary skill
25
- const primarySkill = tool.includes.skills.find(s => s.required)?.name || toolName;
26
- const result = installSkill(primarySkill);
27
- if (result.success) {
28
- console.log(chalk.green(`āœ“ Installed ${toolName}`));
29
- // Check if tool has configurable options
30
- if (tool.config_schema && Object.keys(tool.config_schema).length > 0) {
31
- // If any config option lacks a default, go straight to config (it's required)
32
- const hasRequiredConfig = Object.values(tool.config_schema).some((option) => option.default === undefined);
33
- await promptForSkillConfig(primarySkill, tool.config_schema, !hasRequiredConfig);
34
- }
35
- // Show next steps
36
- console.log(chalk.gray('\nNext steps:'));
37
- console.log(chalk.gray(' - Run your AI tool to start using it'));
38
- console.log(chalk.gray(` - Reconfigure anytime with \`droid\` → Configure`));
39
- }
40
- else {
41
- console.error(chalk.red(`āœ— ${result.message}`));
42
- process.exit(1);
43
- }
44
- }
45
- //# sourceMappingURL=install.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,uBAAuB;IACvB,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,QAAQ,aAAa,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,6BAA6B;IAC7B,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,QAAQ,wBAAwB,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,OAAO,CAAC,CAAC,CAAC;IAE5D,4BAA4B;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,QAAQ,CAAC;IAClF,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE1C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEpD,yCAAyC;QACzC,IAAI,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,8EAA8E;YAC9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAC9D,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CACzC,CAAC;YACF,MAAM,oBAAoB,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,iBAAiB,CAAC,CAAC;QACnF,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,269 +0,0 @@
1
- import inquirer from 'inquirer';
2
- import chalk from 'chalk';
3
- import { execSync } from 'child_process';
4
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
5
- import { join } from 'path';
6
- import { homedir } from 'os';
7
- import { loadConfig, saveConfig, configExists } from '../lib/config.js';
8
- import { getBundledSkills } from '../lib/skills.js';
9
- import { Platform, BuiltInOutput } from '../lib/types.js';
10
- /**
11
- * Permissions droid needs to operate without constant prompts
12
- */
13
- const DROID_PERMISSIONS = [
14
- 'Read(~/.droid/**)',
15
- 'Write(~/.droid/**)',
16
- 'Edit(~/.droid/**)',
17
- 'Glob(~/.droid/**)',
18
- 'Grep(~/.droid/**)',
19
- ];
20
- /**
21
- * Detect which platform is installed
22
- */
23
- function detectPlatform() {
24
- try {
25
- execSync('claude --version', { stdio: 'ignore' });
26
- return Platform.ClaudeCode;
27
- }
28
- catch {
29
- // Claude Code not found
30
- }
31
- try {
32
- execSync('opencode --version', { stdio: 'ignore' });
33
- return Platform.OpenCode;
34
- }
35
- catch {
36
- // OpenCode not found
37
- }
38
- return null;
39
- }
40
- /**
41
- * Try to get git username
42
- */
43
- function detectGitUsername() {
44
- try {
45
- return execSync('git config user.name', { encoding: 'utf-8' }).trim();
46
- }
47
- catch {
48
- return '';
49
- }
50
- }
51
- /**
52
- * The opencode-skills plugin name for OpenCode
53
- * This plugin enables Claude Code-style skills in OpenCode
54
- * @see https://github.com/malhashemi/opencode-skills
55
- */
56
- const OPENCODE_SKILLS_PLUGIN = 'opencode-skills';
57
- /**
58
- * Configure platform permissions for droid
59
- */
60
- export function configurePlatformPermissions(platform) {
61
- const added = [];
62
- if (platform === Platform.ClaudeCode) {
63
- const settingsPath = join(homedir(), '.claude', 'settings.json');
64
- // Ensure .claude directory exists
65
- const claudeDir = join(homedir(), '.claude');
66
- if (!existsSync(claudeDir)) {
67
- mkdirSync(claudeDir, { recursive: true });
68
- }
69
- // Load or create settings
70
- let settings = {};
71
- if (existsSync(settingsPath)) {
72
- try {
73
- settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
74
- }
75
- catch {
76
- console.warn(chalk.yellow('⚠ Claude Code settings.json appears corrupted, resetting permissions'));
77
- settings = {};
78
- }
79
- }
80
- // Ensure permissions structure exists
81
- if (!settings.permissions) {
82
- settings.permissions = {};
83
- }
84
- if (!Array.isArray(settings.permissions.allow)) {
85
- settings.permissions.allow = [];
86
- }
87
- // Add missing permissions
88
- for (const perm of DROID_PERMISSIONS) {
89
- if (!settings.permissions.allow.includes(perm)) {
90
- settings.permissions.allow.push(perm);
91
- added.push(perm);
92
- }
93
- }
94
- // Save if we added anything
95
- if (added.length > 0) {
96
- try {
97
- writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
98
- }
99
- catch (e) {
100
- const message = e instanceof Error ? e.message : 'Unknown error';
101
- return { added: [], alreadyPresent: false, error: `Failed to update Claude Code settings: ${message}` };
102
- }
103
- }
104
- return { added, alreadyPresent: added.length === 0 };
105
- }
106
- if (platform === Platform.OpenCode) {
107
- // OpenCode uses opencode.json for config
108
- // Check global config location: ~/.config/opencode/opencode.json
109
- const globalConfigDir = join(homedir(), '.config', 'opencode');
110
- const globalConfigPath = join(globalConfigDir, 'opencode.json');
111
- // Ensure config directory exists
112
- if (!existsSync(globalConfigDir)) {
113
- mkdirSync(globalConfigDir, { recursive: true });
114
- }
115
- // Load or create config
116
- let config = {};
117
- if (existsSync(globalConfigPath)) {
118
- try {
119
- config = JSON.parse(readFileSync(globalConfigPath, 'utf-8'));
120
- }
121
- catch {
122
- console.warn(chalk.yellow('⚠ OpenCode config appears corrupted, resetting'));
123
- config = {};
124
- }
125
- }
126
- // Ensure plugin array exists
127
- if (!Array.isArray(config.plugin)) {
128
- config.plugin = [];
129
- }
130
- // Add opencode-skills plugin if not present
131
- if (!config.plugin.includes(OPENCODE_SKILLS_PLUGIN)) {
132
- config.plugin.push(OPENCODE_SKILLS_PLUGIN);
133
- added.push(OPENCODE_SKILLS_PLUGIN);
134
- }
135
- // Save if we added anything
136
- if (added.length > 0) {
137
- try {
138
- writeFileSync(globalConfigPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
139
- }
140
- catch (e) {
141
- const message = e instanceof Error ? e.message : 'Unknown error';
142
- return { added: [], alreadyPresent: false, error: `Failed to update OpenCode config: ${message}` };
143
- }
144
- }
145
- return { added, alreadyPresent: added.length === 0 };
146
- }
147
- return { added: [], alreadyPresent: true };
148
- }
149
- /**
150
- * Get available output options (built-in + skills that provide output)
151
- */
152
- function getOutputOptions() {
153
- const options = [
154
- { name: 'Terminal (display in CLI)', value: BuiltInOutput.Terminal },
155
- { name: 'Editor ($EDITOR)', value: BuiltInOutput.Editor },
156
- ];
157
- // Add skills that provide output targets
158
- const skills = getBundledSkills();
159
- for (const skill of skills) {
160
- if (skill.provides_output) {
161
- options.push({
162
- name: `${skill.name} (${skill.description})`,
163
- value: skill.name,
164
- });
165
- }
166
- }
167
- return options;
168
- }
169
- export async function setupCommand() {
170
- console.log(chalk.bold('\nšŸ¤– Droid Setup\n'));
171
- const hasExistingConfig = configExists();
172
- if (hasExistingConfig) {
173
- const { overwrite } = await inquirer.prompt([
174
- {
175
- type: 'confirm',
176
- name: 'overwrite',
177
- message: 'Config already exists. Overwrite?',
178
- default: false,
179
- },
180
- ]);
181
- if (!overwrite) {
182
- console.log(chalk.gray('Setup cancelled.'));
183
- return;
184
- }
185
- }
186
- // Detect platform
187
- const detectedPlatform = detectPlatform();
188
- if (detectedPlatform) {
189
- console.log(chalk.green(`āœ“ Detected ${detectedPlatform}\n`));
190
- }
191
- else {
192
- console.log(chalk.yellow('⚠ No platform detected (Claude Code or OpenCode)\n'));
193
- }
194
- // Detect git username
195
- const detectedGitUsername = detectGitUsername();
196
- // Get dynamic output options
197
- const outputOptions = getOutputOptions();
198
- const answers = await inquirer.prompt([
199
- {
200
- type: 'list',
201
- name: 'platform',
202
- message: 'Which platform are you using?',
203
- choices: [
204
- { name: 'Claude Code', value: Platform.ClaudeCode },
205
- { name: 'OpenCode', value: Platform.OpenCode },
206
- ],
207
- default: detectedPlatform || Platform.ClaudeCode,
208
- },
209
- {
210
- type: 'input',
211
- name: 'user_mention',
212
- message: 'What @mention should be used for you?',
213
- default: '@user',
214
- filter: (input) => {
215
- // Auto-add @ prefix if missing
216
- return input.startsWith('@') ? input : `@${input}`;
217
- },
218
- },
219
- {
220
- type: 'list',
221
- name: 'output_preference',
222
- message: 'Default output preference for skill results?',
223
- choices: outputOptions,
224
- default: BuiltInOutput.Terminal,
225
- },
226
- {
227
- type: 'input',
228
- name: 'git_username',
229
- message: 'Git username for attribution?',
230
- default: detectedGitUsername || '',
231
- },
232
- ]);
233
- const existingConfig = loadConfig();
234
- const config = {
235
- ...existingConfig,
236
- platform: answers.platform,
237
- user_mention: answers.user_mention,
238
- output_preference: answers.output_preference,
239
- git_username: answers.git_username,
240
- };
241
- saveConfig(config);
242
- console.log(chalk.green('\nāœ“ Config saved to ~/.droid/config.yaml'));
243
- // Configure platform permissions/plugins
244
- const { added, alreadyPresent, error } = configurePlatformPermissions(answers.platform);
245
- if (error) {
246
- console.log(chalk.red(`āœ— ${error}`));
247
- console.log(chalk.yellow(' You may need to manually configure your platform'));
248
- }
249
- else if (answers.platform === Platform.ClaudeCode) {
250
- if (added.length > 0) {
251
- console.log(chalk.green(`āœ“ Added droid permissions to Claude Code settings`));
252
- }
253
- else if (alreadyPresent) {
254
- console.log(chalk.gray(` Droid permissions already configured in Claude Code`));
255
- }
256
- }
257
- else if (answers.platform === Platform.OpenCode) {
258
- if (added.length > 0) {
259
- console.log(chalk.green(`āœ“ Added opencode-skills plugin to OpenCode config`));
260
- console.log(chalk.gray(` This enables Claude Code-style skills in OpenCode`));
261
- console.log(chalk.gray(` Restart OpenCode to activate the plugin`));
262
- }
263
- else if (alreadyPresent) {
264
- console.log(chalk.gray(` opencode-skills plugin already configured in OpenCode`));
265
- }
266
- }
267
- console.log(chalk.gray('\nRun `droid skills` to browse and install skills.'));
268
- }
269
- //# sourceMappingURL=setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAA2C,MAAM,iBAAiB,CAAC;AAEnG;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,mBAAmB;CACpB,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAkB;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,QAAQ,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAEjE,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,0BAA0B;QAC1B,IAAI,QAAQ,GAA4E,EAAE,CAAC;QAC3F,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,sEAAsE,CAAC,CAAC,CAAC;gBACnG,QAAQ,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1B,QAAQ,CAAC,WAAW,GAAG,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,EAAE,CAAC;QAClC,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YACjF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;gBACjE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,OAAO,EAAE,EAAE,CAAC;YAC1G,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACnC,yCAAyC;QACzC,iEAAiE;QACjE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QAEhE,iCAAiC;QACjC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,wBAAwB;QACxB,IAAI,MAAM,GAA0B,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;gBAC7E,MAAM,GAAG,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACrB,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;gBACjE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,OAAO,EAAE,EAAE,CAAC;YACrG,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB;IACvB,MAAM,OAAO,GAAqD;QAChE,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,aAAa,CAAC,QAAQ,EAAE;QACpE,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE;KAC1D,CAAC;IAEF,yCAAyC;IACzC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,GAAG;gBAC5C,KAAK,EAAE,KAAK,CAAC,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE9C,MAAM,iBAAiB,GAAG,YAAY,EAAE,CAAC;IACzC,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;YAClE;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,mCAAmC;gBAC5C,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,gBAAgB,GAAG,cAAc,EAAE,CAAC;IAC1C,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,gBAAgB,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,sBAAsB;IACtB,MAAM,mBAAmB,GAAG,iBAAiB,EAAE,CAAC;IAEhD,6BAA6B;IAC7B,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IAEzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAKlC;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE;gBACnD,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;aAC/C;YACD,OAAO,EAAE,gBAAgB,IAAI,QAAQ,CAAC,UAAU;SACjD;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,uCAAuC;YAChD,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxB,+BAA+B;gBAC/B,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;YACrD,CAAC;SACF;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,8CAA8C;YACvD,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,aAAa,CAAC,QAAQ;SAChC;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,mBAAmB,IAAI,EAAE;SACnC;KACF,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;IACpC,MAAM,MAAM,GAAgB;QAC1B,GAAG,cAAc;QACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC;IAEF,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAErE,yCAAyC;IACzC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,4BAA4B,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAClF,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAChF,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACvE,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;AAChF,CAAC"}