@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,4 +1,4 @@
1
- import { Platform } from './types.js';
1
+ import { Platform } from './types';
2
2
  /**
3
3
  * Get the installation path for agents based on platform
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOtC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrC,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA2BzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,EAAE,CA+BlD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAG9C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAK3D;AA+CD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsChH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAMrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAevF"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOnC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrC,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA2BzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,EAAE,CA+BlD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAG9C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAK3D;AA+CD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsChH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAMrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAevF"}
@@ -1,4 +1,4 @@
1
- import { type DroidConfig, type SkillOverrides, type AutoUpdateConfig } from './types.js';
1
+ import { type DroidConfig, type SkillOverrides, type AutoUpdateConfig } from './types';
2
2
  /**
3
3
  * Ensure the config directory exists
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,WAAW,EAA0B,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAgD3I;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,WAAW,CA2BxC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAKpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAanD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAapE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI,CAUrF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAQ5E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,WAAW,EAA0B,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAgDxI;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,WAAW,CA2BxC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAKpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAanD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAapE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI,CAUrF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAQ5E"}
@@ -1,4 +1,4 @@
1
- import { Platform } from './types.js';
1
+ import { Platform } from './types';
2
2
  /**
3
3
  * Platform-specific paths configuration
4
4
  * Single source of truth for all platform-specific directories
@@ -1 +1 @@
1
- {"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../../src/lib/platforms.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;CAajB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAE5D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,CAElE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD"}
1
+ {"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../../src/lib/platforms.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;CAajB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAE5D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,CAElE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD"}
@@ -1,4 +1,4 @@
1
- import { type ConfigOption } from './types.js';
1
+ import { type ConfigOption } from './types';
2
2
  /**
3
3
  * Prompt user to configure a skill after install
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"skill-config.d.ts","sourceRoot":"","sources":["../../src/lib/skill-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtF;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAgFf"}
1
+ {"version":3,"file":"skill-config.d.ts","sourceRoot":"","sources":["../../src/lib/skill-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnF;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAgFf"}
@@ -1,4 +1,4 @@
1
- import { Platform, SkillStatus, type SkillManifest, type InstalledSkill } from './types.js';
1
+ import { Platform, SkillStatus, type SkillManifest, type InstalledSkill } from './types';
2
2
  /**
3
3
  * Get the path to bundled tools directory
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type ToolManifest } from './types.js';
1
+ import { type ToolManifest } from './types';
2
2
  /**
3
3
  * Get the path to bundled tools directory
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAuC,MAAM,YAAY,CAAC;AAMpF;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAyBrE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAmBhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAczD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBvE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAuBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAyBtD"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAuC,MAAM,SAAS,CAAC;AAMjF;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAyBrE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAmBhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAczD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBvE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAuBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAyBtD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderful/droid",
3
- "version": "0.15.0",
3
+ "version": "0.16.1",
4
4
  "description": "AI workflow toolkit for sharing skills, commands, and agents across the team",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,12 +8,12 @@
8
8
  },
9
9
  "main": "dist/index.js",
10
10
  "scripts": {
11
- "build": "tsc && cp -r src/tools dist/",
11
+ "build": "bun run lint && bun scripts/build.ts",
12
12
  "dev": "tsc --watch",
13
13
  "start": "bun dist/bin/droid.js",
14
14
  "test": "bun test src/",
15
15
  "test:watch": "bun test src/ --watch",
16
- "lint": "eslint src --ext .ts",
16
+ "lint": "eslint src --ext .ts,.tsx",
17
17
  "format": "prettier --write 'src/**/*.ts'",
18
18
  "changeset": "changeset",
19
19
  "version": "changeset version",
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Build script using esbuild for proper ESM bundling
4
+ *
5
+ * This bundles the CLI entry point so Node ESM can resolve imports
6
+ * without explicit .js extensions (which TypeScript doesn't add).
7
+ */
8
+
9
+ import { build, type Plugin } from 'esbuild';
10
+ import { execSync } from 'child_process';
11
+ import { cpSync, rmSync } from 'fs';
12
+
13
+ // Plugin to stub out optional dependencies that may not be installed
14
+ const stubOptionalDeps: Plugin = {
15
+ name: 'stub-optional-deps',
16
+ setup(build) {
17
+ // Stub react-devtools-core (optional Ink dependency for debugging)
18
+ build.onResolve({ filter: /^react-devtools-core$/ }, () => ({
19
+ path: 'react-devtools-core',
20
+ namespace: 'stub',
21
+ }));
22
+ build.onLoad({ filter: /.*/, namespace: 'stub' }, () => ({
23
+ contents: 'export default undefined; export const connectToDevTools = () => {};',
24
+ }));
25
+ },
26
+ };
27
+
28
+ async function main() {
29
+ // Clean dist
30
+ rmSync('dist', { recursive: true, force: true });
31
+
32
+ // Run TypeScript for type checking and declaration files
33
+ console.log('Running TypeScript type check...');
34
+ execSync('tsc --emitDeclarationOnly', { stdio: 'inherit' });
35
+
36
+ // Bundle CLI with esbuild
37
+ console.log('Bundling CLI with esbuild...');
38
+ await build({
39
+ entryPoints: ['src/bin/droid.ts'],
40
+ bundle: true,
41
+ platform: 'node',
42
+ target: 'node18',
43
+ format: 'esm',
44
+ outfile: 'dist/bin/droid.js',
45
+ // Note: shebang is preserved from source file, no banner needed
46
+ plugins: [stubOptionalDeps],
47
+ // Keep npm dependencies external - they'll be installed via package.json
48
+ // Only bundle our own code to fix ESM import resolution
49
+ packages: 'external',
50
+ // Handle React JSX
51
+ jsx: 'automatic',
52
+ jsxImportSource: 'react',
53
+ });
54
+
55
+ // Bundle index.ts for library exports
56
+ console.log('Bundling library exports...');
57
+ await build({
58
+ entryPoints: ['src/index.ts'],
59
+ bundle: true,
60
+ platform: 'node',
61
+ target: 'node18',
62
+ format: 'esm',
63
+ outfile: 'dist/index.js',
64
+ plugins: [stubOptionalDeps],
65
+ packages: 'external',
66
+ });
67
+
68
+ // Copy tools directory
69
+ console.log('Copying tools...');
70
+ cpSync('src/tools', 'dist/tools', { recursive: true });
71
+
72
+ console.log('Build complete!');
73
+ }
74
+
75
+ main().catch((err) => {
76
+ console.error(err);
77
+ process.exit(1);
78
+ });
package/src/bin/droid.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { program } from 'commander';
4
- import { setupCommand } from '../commands/setup.js';
5
- import { configCommand } from '../commands/config.js';
6
- import { skillsCommand } from '../commands/skills.js';
7
- import { installCommand } from '../commands/install.js';
8
- import { uninstallCommand } from '../commands/uninstall.js';
9
- import { updateCommand } from '../commands/update.js';
10
- import { tuiCommand } from '../commands/tui.js';
11
- import { getVersion } from '../lib/version.js';
4
+ import { setupCommand } from '../commands/setup';
5
+ import { configCommand } from '../commands/config';
6
+ import { skillsCommand } from '../commands/skills';
7
+ import { installCommand } from '../commands/install';
8
+ import { uninstallCommand } from '../commands/uninstall';
9
+ import { updateCommand } from '../commands/update';
10
+ import { tuiCommand } from '../commands/tui';
11
+ import { getVersion } from '../lib/version';
12
12
 
13
13
  const version = getVersion();
14
14
 
@@ -6,7 +6,7 @@ import {
6
6
  getConfigValue,
7
7
  setConfigValue,
8
8
  configExists,
9
- } from '../lib/config.js';
9
+ } from '../lib/config';
10
10
 
11
11
  interface ConfigOptions {
12
12
  edit?: boolean;
@@ -1,7 +1,7 @@
1
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';
2
+ import { installSkill } from '../lib/skills';
3
+ import { getBundledTools, isToolInstalled } from '../lib/tools';
4
+ import { promptForSkillConfig } from '../lib/skill-config';
5
5
 
6
6
  export async function installCommand(toolName: string): Promise<void> {
7
7
  // Check if tool exists
@@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, mock, spyOn } from 'bun:te
2
2
  import { existsSync, mkdirSync, rmSync, readFileSync, writeFileSync } from 'fs';
3
3
  import { join } from 'path';
4
4
  import { tmpdir } from 'os';
5
- import { Platform } from '../lib/types.js';
5
+ import { Platform } from '../lib/types';
6
6
 
7
7
  // We need to mock homedir() before importing the module
8
8
  // Create a test directory that will act as our fake home
@@ -4,9 +4,9 @@ import { execSync } from 'child_process';
4
4
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
5
5
  import { join } from 'path';
6
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, type DroidConfig, type OutputPreference } from '../lib/types.js';
7
+ import { loadConfig, saveConfig, configExists } from '../lib/config';
8
+ import { getBundledSkills } from '../lib/skills';
9
+ import { Platform, BuiltInOutput, type DroidConfig, type OutputPreference } from '../lib/types';
10
10
 
11
11
  /**
12
12
  * Permissions droid needs to operate without constant prompts
@@ -1,9 +1,9 @@
1
1
  import inquirer from 'inquirer';
2
2
  import chalk from 'chalk';
3
- import { installSkill, uninstallSkill } from '../lib/skills.js';
4
- import { getBundledTools, isToolInstalled, getInstalledToolVersion } from '../lib/tools.js';
5
- import { promptForSkillConfig } from '../lib/skill-config.js';
6
- import { SkillStatus, type ToolManifest } from '../lib/types.js';
3
+ import { installSkill, uninstallSkill } from '../lib/skills';
4
+ import { getBundledTools, isToolInstalled, getInstalledToolVersion } from '../lib/tools';
5
+ import { promptForSkillConfig } from '../lib/skill-config';
6
+ import { SkillStatus, type ToolManifest } from '../lib/types';
7
7
 
8
8
  function formatToolChoice(tool: ToolManifest): string {
9
9
  const installed = isToolInstalled(tool.name);
@@ -0,0 +1,86 @@
1
+ import { Box, Text } from 'ink';
2
+ import type { ComponentType } from '../types';
3
+ import { colors } from '../constants';
4
+ import type { ToolManifest } from '../../../lib/types';
5
+
6
+ export function Badge({
7
+ type,
8
+ label,
9
+ isSelected = false,
10
+ dimmed = false,
11
+ }: {
12
+ type: ComponentType;
13
+ label?: string;
14
+ isSelected?: boolean;
15
+ dimmed?: boolean;
16
+ }) {
17
+ const color = colors[type];
18
+ const displayLabel = label || type.charAt(0).toUpperCase() + type.slice(1);
19
+
20
+ if (dimmed) {
21
+ return (
22
+ <Text color={colors.textDim}>{displayLabel}</Text>
23
+ );
24
+ }
25
+
26
+ return (
27
+ <Text
28
+ backgroundColor={isSelected ? color : undefined}
29
+ color={isSelected ? '#000000' : color}
30
+ bold={isSelected}
31
+ >
32
+ {isSelected ? ` ${displayLabel} ` : displayLabel}
33
+ </Text>
34
+ );
35
+ }
36
+
37
+ export function ComponentBadges({ tool, compact = false }: { tool: ToolManifest; compact?: boolean }) {
38
+ const hasSkills = tool.includes.skills.length > 0;
39
+ const hasCommands = tool.includes.commands.length > 0;
40
+ const hasAgents = tool.includes.agents.length > 0;
41
+
42
+ if (compact) {
43
+ // Show colored squares for list view (single char with spacing)
44
+ const parts: string[] = [];
45
+ if (hasSkills) parts.push('skill');
46
+ if (hasCommands) parts.push('command');
47
+ if (hasAgents) parts.push('agent');
48
+
49
+ return (
50
+ <Box flexDirection="row">
51
+ {parts.map((type, i) => (
52
+ <Text key={type}>
53
+ <Text backgroundColor={colors[type as ComponentType]}> </Text>
54
+ {i < parts.length - 1 && ' '}
55
+ </Text>
56
+ ))}
57
+ </Box>
58
+ );
59
+ }
60
+
61
+ return (
62
+ <Box flexDirection="row">
63
+ {hasSkills && (
64
+ <Box marginRight={1}>
65
+ <Text backgroundColor={colors.skill} color="#000000" bold>
66
+ {` ${tool.includes.skills.length} skill${tool.includes.skills.length > 1 ? 's' : ''} `}
67
+ </Text>
68
+ </Box>
69
+ )}
70
+ {hasCommands && (
71
+ <Box marginRight={1}>
72
+ <Text backgroundColor={colors.command} color="#000000" bold>
73
+ {` ${tool.includes.commands.length} cmd${tool.includes.commands.length > 1 ? 's' : ''} `}
74
+ </Text>
75
+ </Box>
76
+ )}
77
+ {hasAgents && (
78
+ <Box marginRight={1}>
79
+ <Text backgroundColor={colors.agent} color="#000000" bold>
80
+ {` ${tool.includes.agents.length} agent${tool.includes.agents.length > 1 ? 's' : ''} `}
81
+ </Text>
82
+ </Box>
83
+ )}
84
+ </Box>
85
+ );
86
+ }
@@ -0,0 +1,48 @@
1
+ import { Text } from 'ink';
2
+ import { colors } from '../constants';
3
+
4
+ export function MarkdownLine({ line, inCodeBlock }: { line: string; inCodeBlock: boolean }) {
5
+ // Code block content
6
+ if (inCodeBlock) {
7
+ return <Text color="#a5d6ff">{line || ' '}</Text>;
8
+ }
9
+
10
+ // Code block delimiter
11
+ if (line.startsWith('```')) {
12
+ return <Text color={colors.textDim}>{line}</Text>;
13
+ }
14
+
15
+ // Headers
16
+ if (line.startsWith('# ')) {
17
+ return <Text color={colors.text} bold>{line.slice(2)}</Text>;
18
+ }
19
+ if (line.startsWith('## ')) {
20
+ return <Text color={colors.text} bold>{line.slice(3)}</Text>;
21
+ }
22
+ if (line.startsWith('### ')) {
23
+ return <Text color="#c9d1d9" bold>{line.slice(4)}</Text>;
24
+ }
25
+
26
+ // YAML frontmatter delimiter
27
+ if (line === '---') {
28
+ return <Text color={colors.textDim}>{line}</Text>;
29
+ }
30
+
31
+ // List items
32
+ if (line.match(/^[\s]*[-*]\s/)) {
33
+ return <Text color={colors.textMuted}>{line}</Text>;
34
+ }
35
+
36
+ // Blockquotes
37
+ if (line.startsWith('>')) {
38
+ return <Text color="#8b949e" italic>{line}</Text>;
39
+ }
40
+
41
+ // Table rows
42
+ if (line.includes('|')) {
43
+ return <Text color={colors.textMuted}>{line}</Text>;
44
+ }
45
+
46
+ // Default
47
+ return <Text color={colors.textMuted}>{line || ' '}</Text>;
48
+ }
@@ -0,0 +1,70 @@
1
+ import { Box, Text } from 'ink';
2
+ import { loadConfig, getAutoUpdateConfig } from '../../../lib/config';
3
+ import { Platform } from '../../../lib/types';
4
+ import { colors } from '../constants';
5
+
6
+ export interface SettingsDetailsProps {
7
+ isFocused: boolean;
8
+ }
9
+
10
+ export function SettingsDetails({
11
+ isFocused,
12
+ }: SettingsDetailsProps) {
13
+ const config = loadConfig();
14
+ const autoUpdateConfig = getAutoUpdateConfig();
15
+
16
+ return (
17
+ <Box flexDirection="column" paddingLeft={2} flexGrow={1}>
18
+ <Text color={colors.text} bold>Settings</Text>
19
+
20
+ <Box flexDirection="column" marginTop={1}>
21
+ <Text>
22
+ <Text color={colors.textDim}>Platform: </Text>
23
+ <Text color={colors.text}>
24
+ {config.platform === Platform.ClaudeCode ? 'Claude Code' : 'OpenCode'}
25
+ </Text>
26
+ </Text>
27
+ <Text>
28
+ <Text color={colors.textDim}>Your @mention: </Text>
29
+ <Text color={colors.text}>{config.user_mention}</Text>
30
+ </Text>
31
+ <Text>
32
+ <Text color={colors.textDim}>Auto-update tools: </Text>
33
+ <Text color={colors.text}>{autoUpdateConfig.tools ? 'enabled' : 'disabled'}</Text>
34
+ </Text>
35
+ <Text>
36
+ <Text color={colors.textDim}>Auto-update app: </Text>
37
+ <Text color={colors.text}>{autoUpdateConfig.app ? 'enabled' : 'disabled'}</Text>
38
+ </Text>
39
+ </Box>
40
+
41
+ <Box marginTop={2}>
42
+ <Text color={colors.textDim}>Config: ~/.droid/config.yaml</Text>
43
+ </Box>
44
+
45
+ {isFocused && (
46
+ <Box marginTop={2}>
47
+ <Text
48
+ backgroundColor={colors.primary}
49
+ color="#ffffff"
50
+ bold
51
+ >
52
+ {' '}Edit{' '}
53
+ </Text>
54
+ </Box>
55
+ )}
56
+
57
+ {isFocused && (
58
+ <Box marginTop={1}>
59
+ <Text color={colors.textDim}>enter edit · esc back</Text>
60
+ </Box>
61
+ )}
62
+
63
+ {!isFocused && (
64
+ <Box marginTop={2}>
65
+ <Text color={colors.textDim}>press enter to edit</Text>
66
+ </Box>
67
+ )}
68
+ </Box>
69
+ );
70
+ }
@@ -0,0 +1,26 @@
1
+ import { Box, Text } from 'ink';
2
+ import type { Tab } from '../types';
3
+ import { colors } from '../constants';
4
+
5
+ export interface TabBarProps {
6
+ tabs: { id: Tab; label: string }[];
7
+ activeTab: Tab;
8
+ }
9
+
10
+ export function TabBar({ tabs, activeTab }: TabBarProps) {
11
+ return (
12
+ <Box flexDirection="row" flexWrap="wrap">
13
+ {tabs.map((tab) => (
14
+ <Text
15
+ key={tab.id}
16
+ backgroundColor={tab.id === activeTab ? colors.primary : undefined}
17
+ color={tab.id === activeTab ? '#ffffff' : colors.textMuted}
18
+ bold={tab.id === activeTab}
19
+ wrap="truncate"
20
+ >
21
+ {' '}{tab.label}{' '}
22
+ </Text>
23
+ ))}
24
+ </Box>
25
+ );
26
+ }
@@ -0,0 +1,117 @@
1
+ import { Box, Text } from 'ink';
2
+ import { isToolInstalled, getInstalledToolVersion, getToolUpdateStatus } from '../../../lib/tools';
3
+ import type { ToolManifest } from '../../../lib/types';
4
+ import { colors } from '../constants';
5
+ import { ComponentBadges } from './Badge';
6
+
7
+ export interface ToolDetailsProps {
8
+ tool: ToolManifest | null;
9
+ isFocused: boolean;
10
+ selectedAction: number;
11
+ }
12
+
13
+ export function ToolDetails({
14
+ tool,
15
+ isFocused,
16
+ selectedAction,
17
+ }: ToolDetailsProps) {
18
+ if (!tool) {
19
+ return (
20
+ <Box paddingLeft={2} flexGrow={1}>
21
+ <Text color={colors.textDim}>Select a tool</Text>
22
+ </Box>
23
+ );
24
+ }
25
+
26
+ const installed = isToolInstalled(tool.name);
27
+ const installedVersion = getInstalledToolVersion(tool.name);
28
+ const updateStatus = getToolUpdateStatus(tool.name);
29
+ const isSystemTool = (tool as ToolManifest & { system?: boolean }).system === true;
30
+
31
+ const actions = installed
32
+ ? [
33
+ { id: 'explore', label: 'Explore', variant: 'default' },
34
+ ...(updateStatus.hasUpdate
35
+ ? [{ id: 'update', label: `Update (${updateStatus.bundledVersion})`, variant: 'primary' }]
36
+ : []),
37
+ { id: 'configure', label: 'Configure', variant: 'default' },
38
+ // System tools can't be uninstalled
39
+ ...(!isSystemTool ? [{ id: 'uninstall', label: 'Uninstall', variant: 'danger' }] : []),
40
+ ]
41
+ : [
42
+ { id: 'explore', label: 'Explore', variant: 'default' },
43
+ // System tools auto-install, but show Install for manual trigger if needed
44
+ { id: 'install', label: 'Install', variant: 'primary' },
45
+ ];
46
+
47
+ return (
48
+ <Box flexDirection="column" paddingLeft={2} flexGrow={1}>
49
+ <Text color={colors.text} bold>{tool.name}</Text>
50
+
51
+ <Box marginTop={1}>
52
+ <Text color={colors.textDim}>
53
+ {tool.version}
54
+ {tool.status && ` · ${tool.status}`}
55
+ {installed && <Text color={colors.success}> · installed</Text>}
56
+ {updateStatus.hasUpdate && (
57
+ <Text color={colors.primary}> · update ({installedVersion} → {updateStatus.bundledVersion})</Text>
58
+ )}
59
+ </Text>
60
+ </Box>
61
+
62
+ <Box marginTop={1}>
63
+ <Text color={colors.textMuted}>{tool.description}</Text>
64
+ </Box>
65
+
66
+ {/* Colored component badges */}
67
+ <Box flexDirection="column" marginTop={1}>
68
+ <Text color={colors.textDim}>Includes:</Text>
69
+ <Box marginTop={1}>
70
+ <ComponentBadges tool={tool} />
71
+ </Box>
72
+ {/* Show names below badges */}
73
+ <Box flexDirection="column" marginTop={1} marginLeft={1}>
74
+ {tool.includes.skills.length > 0 && (
75
+ <Text>
76
+ <Text color={colors.skill}>Skills: </Text>
77
+ <Text color={colors.textMuted}>{tool.includes.skills.map(s => s.name).join(', ')}</Text>
78
+ </Text>
79
+ )}
80
+ {tool.includes.commands.length > 0 && (
81
+ <Text>
82
+ <Text color={colors.command}>Commands: </Text>
83
+ <Text color={colors.textMuted}>{tool.includes.commands.map(c => `/${c}`).join(', ')}</Text>
84
+ </Text>
85
+ )}
86
+ {tool.includes.agents.length > 0 && (
87
+ <Text>
88
+ <Text color={colors.agent}>Agents: </Text>
89
+ <Text color={colors.textMuted}>{tool.includes.agents.join(', ')}</Text>
90
+ </Text>
91
+ )}
92
+ </Box>
93
+ </Box>
94
+
95
+ {isFocused && (
96
+ <Box flexDirection="row" marginTop={1}>
97
+ {actions.map((action, index) => (
98
+ <Text
99
+ key={action.id}
100
+ backgroundColor={
101
+ selectedAction === index
102
+ ? action.variant === 'danger'
103
+ ? colors.error
104
+ : colors.primary
105
+ : colors.bgSelected
106
+ }
107
+ color={selectedAction === index ? '#ffffff' : colors.textMuted}
108
+ bold={selectedAction === index}
109
+ >
110
+ {' '}{action.label}{' '}
111
+ </Text>
112
+ ))}
113
+ </Box>
114
+ )}
115
+ </Box>
116
+ );
117
+ }