@orderful/droid 0.27.4 → 0.27.5

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/AGENTS.md CHANGED
@@ -71,6 +71,7 @@ Don't consolidate them. Using Ink for simple prompts would be overkill.
71
71
  ## Code Style
72
72
 
73
73
  - TypeScript strict mode
74
+ - **Use single quotes** for strings (enforced by ESLint)
74
75
  - Prefer `const` over `let`
75
76
  - Use Canadian/British spelling (behaviour, colour, favourite)
76
77
  - Use "allow list/deny list" not "whitelist/blacklist"
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @orderful/droid
2
2
 
3
+ ## 0.27.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [`dd0e5f1`](https://github.com/Orderful/droid/commit/dd0e5f114f11ab2ff34c6e329265ea84117792e9) Thanks [@frytyler](https://github.com/frytyler)! - Fix TUI displaying commands as `/[object Object]` instead of actual command names. Commands are now displayed correctly (e.g., `/brain, /scratchpad`) after handling both string and object formats in TOOL.yaml.
8
+
3
9
  ## 0.27.4
4
10
 
5
11
  ### Patch Changes
package/dist/bin/droid.js CHANGED
@@ -642,60 +642,9 @@ function createConfigSkillNameMigration(version2) {
642
642
  }
643
643
  };
644
644
  }
645
- function createFilesystemSyncMigration(version2) {
646
- return {
647
- version: version2,
648
- description: "Sync config with actually installed skills on filesystem",
649
- up: () => {
650
- const config = loadConfig();
651
- const originalPlatform = config.platform;
652
- let configChanged = false;
653
- for (const platformKey of ["claude-code" /* ClaudeCode */, "opencode" /* OpenCode */]) {
654
- if (!config.platforms[platformKey]) continue;
655
- const skillsPath = getSkillsPath(platformKey);
656
- if (!existsSync4(skillsPath)) continue;
657
- config.platform = platformKey;
658
- const trackedTools = getPlatformTools(config);
659
- let platformChanged = false;
660
- const bundledTools = getBundledTools();
661
- const allToolNames = new Set(
662
- bundledTools.flatMap(
663
- (tool) => tool.includes.skills.map((s) => s.name)
664
- )
665
- );
666
- const installedDirs = readdirSync3(skillsPath, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
667
- for (const dirName of installedDirs) {
668
- if (!allToolNames.has(dirName)) continue;
669
- if (trackedTools[dirName]) continue;
670
- let version3 = "0.0.0";
671
- const matchingTool = bundledTools.find(
672
- (tool) => tool.includes.skills.some((s) => s.name === dirName && s.required)
673
- );
674
- if (matchingTool) {
675
- version3 = matchingTool.version;
676
- }
677
- trackedTools[dirName] = {
678
- version: version3,
679
- installed_at: (/* @__PURE__ */ new Date()).toISOString()
680
- };
681
- platformChanged = true;
682
- configChanged = true;
683
- }
684
- if (platformChanged) {
685
- setPlatformTools(config, trackedTools);
686
- }
687
- }
688
- config.platform = originalPlatform;
689
- if (configChanged) {
690
- saveConfig(config);
691
- }
692
- }
693
- };
694
- }
695
645
  var PACKAGE_MIGRATIONS = [
696
646
  createPlatformSyncMigration("0.25.0"),
697
- createConfigSkillNameMigration("0.27.2"),
698
- createFilesystemSyncMigration("0.27.4")
647
+ createConfigSkillNameMigration("0.27.2")
699
648
  ];
700
649
  var TOOL_MIGRATIONS = {
701
650
  brain: [createConfigDirMigration("droid-brain", "0.2.3")],
@@ -1974,7 +1923,13 @@ function ToolDetails({
1974
1923
  const isSystemTool = tool.system === true;
1975
1924
  const actions = installed ? [
1976
1925
  { id: "explore", label: "Explore", variant: "default" },
1977
- ...updateStatus.hasUpdate ? [{ id: "update", label: `Update (${updateStatus.bundledVersion})`, variant: "primary" }] : [],
1926
+ ...updateStatus.hasUpdate ? [
1927
+ {
1928
+ id: "update",
1929
+ label: `Update (${updateStatus.bundledVersion})`,
1930
+ variant: "primary"
1931
+ }
1932
+ ] : [],
1978
1933
  { id: "configure", label: "Configure", variant: "default" },
1979
1934
  // System tools can't be uninstalled
1980
1935
  ...!isSystemTool ? [{ id: "uninstall", label: "Uninstall", variant: "danger" }] : []
@@ -1990,7 +1945,8 @@ function ToolDetails({
1990
1945
  tool.status && ` \xB7 ${tool.status}`,
1991
1946
  installed && /* @__PURE__ */ jsx4(Text4, { color: colors.success, children: " \xB7 installed" }),
1992
1947
  updateStatus.hasUpdate && /* @__PURE__ */ jsxs4(Text4, { color: colors.primary, children: [
1993
- " \xB7 update (",
1948
+ " ",
1949
+ "\xB7 update (",
1994
1950
  installedVersion,
1995
1951
  " \u2192 ",
1996
1952
  updateStatus.bundledVersion,
@@ -2008,7 +1964,7 @@ function ToolDetails({
2008
1964
  ] }),
2009
1965
  tool.includes.commands.length > 0 && /* @__PURE__ */ jsxs4(Text4, { children: [
2010
1966
  /* @__PURE__ */ jsx4(Text4, { color: colors.command, children: "Commands: " }),
2011
- /* @__PURE__ */ jsx4(Text4, { color: colors.textMuted, children: tool.includes.commands.map((c) => `/${c}`).join(", ") })
1967
+ /* @__PURE__ */ jsx4(Text4, { color: colors.textMuted, children: tool.includes.commands.map((c) => typeof c === "string" ? `/${c}` : `/${c.name}`).join(", ") })
2012
1968
  ] }),
2013
1969
  tool.includes.agents.length > 0 && /* @__PURE__ */ jsxs4(Text4, { children: [
2014
1970
  /* @__PURE__ */ jsx4(Text4, { color: colors.agent, children: "Agents: " }),
@@ -1 +1 @@
1
- {"version":3,"file":"ToolDetails.d.ts","sourceRoot":"","sources":["../../../../src/commands/tui/components/ToolDetails.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,cAAc,GACf,EAAE,gBAAgB,2CAoGlB"}
1
+ {"version":3,"file":"ToolDetails.d.ts","sourceRoot":"","sources":["../../../../src/commands/tui/components/ToolDetails.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,cAAc,GACf,EAAE,gBAAgB,2CA2HlB"}
package/dist/index.js CHANGED
@@ -615,60 +615,9 @@ function createConfigSkillNameMigration(version) {
615
615
  }
616
616
  };
617
617
  }
618
- function createFilesystemSyncMigration(version) {
619
- return {
620
- version,
621
- description: "Sync config with actually installed skills on filesystem",
622
- up: () => {
623
- const config = loadConfig();
624
- const originalPlatform = config.platform;
625
- let configChanged = false;
626
- for (const platformKey of ["claude-code" /* ClaudeCode */, "opencode" /* OpenCode */]) {
627
- if (!config.platforms[platformKey]) continue;
628
- const skillsPath = getSkillsPath(platformKey);
629
- if (!existsSync4(skillsPath)) continue;
630
- config.platform = platformKey;
631
- const trackedTools = getPlatformTools(config);
632
- let platformChanged = false;
633
- const bundledTools = getBundledTools();
634
- const allToolNames = new Set(
635
- bundledTools.flatMap(
636
- (tool) => tool.includes.skills.map((s) => s.name)
637
- )
638
- );
639
- const installedDirs = readdirSync3(skillsPath, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
640
- for (const dirName of installedDirs) {
641
- if (!allToolNames.has(dirName)) continue;
642
- if (trackedTools[dirName]) continue;
643
- let version2 = "0.0.0";
644
- const matchingTool = bundledTools.find(
645
- (tool) => tool.includes.skills.some((s) => s.name === dirName && s.required)
646
- );
647
- if (matchingTool) {
648
- version2 = matchingTool.version;
649
- }
650
- trackedTools[dirName] = {
651
- version: version2,
652
- installed_at: (/* @__PURE__ */ new Date()).toISOString()
653
- };
654
- platformChanged = true;
655
- configChanged = true;
656
- }
657
- if (platformChanged) {
658
- setPlatformTools(config, trackedTools);
659
- }
660
- }
661
- config.platform = originalPlatform;
662
- if (configChanged) {
663
- saveConfig(config);
664
- }
665
- }
666
- };
667
- }
668
618
  var PACKAGE_MIGRATIONS = [
669
619
  createPlatformSyncMigration("0.25.0"),
670
- createConfigSkillNameMigration("0.27.2"),
671
- createFilesystemSyncMigration("0.27.4")
620
+ createConfigSkillNameMigration("0.27.2")
672
621
  ];
673
622
  var TOOL_MIGRATIONS = {
674
623
  brain: [createConfigDirMigration("droid-brain", "0.2.3")],
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/lib/migrations.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,SAAS,CAAC;AA8SjB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,IAAI,CAmBN;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2CtC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAStC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAyDA"}
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/lib/migrations.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,SAAS,CAAC;AAmOjB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,IAAI,CAmBN;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2CtC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAStC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAyDA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderful/droid",
3
- "version": "0.27.4",
3
+ "version": "0.27.5",
4
4
  "description": "AI workflow toolkit for sharing skills, commands, and agents across the team",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,5 +1,9 @@
1
1
  import { Box, Text } from 'ink';
2
- import { isToolInstalled, getInstalledToolVersion, getToolUpdateStatus } from '../../../lib/tools';
2
+ import {
3
+ isToolInstalled,
4
+ getInstalledToolVersion,
5
+ getToolUpdateStatus,
6
+ } from '../../../lib/tools';
3
7
  import type { ToolManifest } from '../../../lib/types';
4
8
  import { colors } from '../constants';
5
9
  import { ComponentBadges } from './Badge';
@@ -26,17 +30,26 @@ export function ToolDetails({
26
30
  const installed = isToolInstalled(tool.name);
27
31
  const installedVersion = getInstalledToolVersion(tool.name);
28
32
  const updateStatus = getToolUpdateStatus(tool.name);
29
- const isSystemTool = (tool as ToolManifest & { system?: boolean }).system === true;
33
+ const isSystemTool =
34
+ (tool as ToolManifest & { system?: boolean }).system === true;
30
35
 
31
36
  const actions = installed
32
37
  ? [
33
38
  { id: 'explore', label: 'Explore', variant: 'default' },
34
39
  ...(updateStatus.hasUpdate
35
- ? [{ id: 'update', label: `Update (${updateStatus.bundledVersion})`, variant: 'primary' }]
40
+ ? [
41
+ {
42
+ id: 'update',
43
+ label: `Update (${updateStatus.bundledVersion})`,
44
+ variant: 'primary',
45
+ },
46
+ ]
36
47
  : []),
37
48
  { id: 'configure', label: 'Configure', variant: 'default' },
38
49
  // System tools can't be uninstalled
39
- ...(!isSystemTool ? [{ id: 'uninstall', label: 'Uninstall', variant: 'danger' }] : []),
50
+ ...(!isSystemTool
51
+ ? [{ id: 'uninstall', label: 'Uninstall', variant: 'danger' }]
52
+ : []),
40
53
  ]
41
54
  : [
42
55
  { id: 'explore', label: 'Explore', variant: 'default' },
@@ -46,7 +59,9 @@ export function ToolDetails({
46
59
 
47
60
  return (
48
61
  <Box flexDirection="column" paddingLeft={2} flexGrow={1}>
49
- <Text color={colors.text} bold>{tool.name}</Text>
62
+ <Text color={colors.text} bold>
63
+ {tool.name}
64
+ </Text>
50
65
 
51
66
  <Box marginTop={1}>
52
67
  <Text color={colors.textDim}>
@@ -54,7 +69,10 @@ export function ToolDetails({
54
69
  {tool.status && ` · ${tool.status}`}
55
70
  {installed && <Text color={colors.success}> · installed</Text>}
56
71
  {updateStatus.hasUpdate && (
57
- <Text color={colors.primary}> · update ({installedVersion} → {updateStatus.bundledVersion})</Text>
72
+ <Text color={colors.primary}>
73
+ {' '}
74
+ · update ({installedVersion} → {updateStatus.bundledVersion})
75
+ </Text>
58
76
  )}
59
77
  </Text>
60
78
  </Box>
@@ -74,19 +92,27 @@ export function ToolDetails({
74
92
  {tool.includes.skills.length > 0 && (
75
93
  <Text>
76
94
  <Text color={colors.skill}>Skills: </Text>
77
- <Text color={colors.textMuted}>{tool.includes.skills.map(s => s.name).join(', ')}</Text>
95
+ <Text color={colors.textMuted}>
96
+ {tool.includes.skills.map((s) => s.name).join(', ')}
97
+ </Text>
78
98
  </Text>
79
99
  )}
80
100
  {tool.includes.commands.length > 0 && (
81
101
  <Text>
82
102
  <Text color={colors.command}>Commands: </Text>
83
- <Text color={colors.textMuted}>{tool.includes.commands.map(c => `/${c}`).join(', ')}</Text>
103
+ <Text color={colors.textMuted}>
104
+ {tool.includes.commands
105
+ .map((c) => (typeof c === 'string' ? `/${c}` : `/${c.name}`))
106
+ .join(', ')}
107
+ </Text>
84
108
  </Text>
85
109
  )}
86
110
  {tool.includes.agents.length > 0 && (
87
111
  <Text>
88
112
  <Text color={colors.agent}>Agents: </Text>
89
- <Text color={colors.textMuted}>{tool.includes.agents.join(', ')}</Text>
113
+ <Text color={colors.textMuted}>
114
+ {tool.includes.agents.join(', ')}
115
+ </Text>
90
116
  </Text>
91
117
  )}
92
118
  </Box>
@@ -107,7 +133,8 @@ export function ToolDetails({
107
133
  color={selectedAction === index ? '#ffffff' : colors.textMuted}
108
134
  bold={selectedAction === index}
109
135
  >
110
- {' '}{action.label}{' '}
136
+ {' '}
137
+ {action.label}{' '}
111
138
  </Text>
112
139
  ))}
113
140
  </Box>
@@ -211,80 +211,6 @@ function createConfigSkillNameMigration(version: string): Migration {
211
211
  };
212
212
  }
213
213
 
214
- /**
215
- * Sync config with filesystem - add any installed skills that aren't tracked
216
- * This is a one-time cleanup migration to fix config inconsistencies from v0.27.x
217
- */
218
- function createFilesystemSyncMigration(version: string): Migration {
219
- return {
220
- version,
221
- description: 'Sync config with actually installed skills on filesystem',
222
- up: () => {
223
- const config = loadConfig();
224
- const originalPlatform = config.platform;
225
- let configChanged = false;
226
-
227
- // Check both platforms
228
- for (const platformKey of [Platform.ClaudeCode, Platform.OpenCode]) {
229
- if (!config.platforms[platformKey]) continue;
230
-
231
- const skillsPath = getSkillsPath(platformKey);
232
- if (!existsSync(skillsPath)) continue;
233
-
234
- config.platform = platformKey;
235
- const trackedTools = getPlatformTools(config);
236
- let platformChanged = false;
237
-
238
- // Get all tool names from manifests
239
- const bundledTools = getBundledTools();
240
- const allToolNames = new Set(
241
- bundledTools.flatMap((tool) =>
242
- tool.includes.skills.map((s) => s.name),
243
- ),
244
- );
245
-
246
- // Scan filesystem for installed skills
247
- const installedDirs = readdirSync(skillsPath, { withFileTypes: true })
248
- .filter((dirent) => dirent.isDirectory())
249
- .map((dirent) => dirent.name);
250
-
251
- for (const dirName of installedDirs) {
252
- // Skip if not a known tool skill
253
- if (!allToolNames.has(dirName)) continue;
254
-
255
- // Skip if already tracked
256
- if (trackedTools[dirName]) continue;
257
-
258
- // Try to get version from bundled tool
259
- let version = '0.0.0';
260
- const matchingTool = bundledTools.find((tool) =>
261
- tool.includes.skills.some((s) => s.name === dirName && s.required),
262
- );
263
- if (matchingTool) {
264
- version = matchingTool.version;
265
- }
266
-
267
- trackedTools[dirName] = {
268
- version,
269
- installed_at: new Date().toISOString(),
270
- };
271
- platformChanged = true;
272
- configChanged = true;
273
- }
274
-
275
- if (platformChanged) {
276
- setPlatformTools(config, trackedTools);
277
- }
278
- }
279
-
280
- config.platform = originalPlatform;
281
- if (configChanged) {
282
- saveConfig(config);
283
- }
284
- },
285
- };
286
- }
287
-
288
214
  /**
289
215
  * Registry of package-level migrations
290
216
  * These run when the @orderful/droid npm package updates
@@ -294,7 +220,6 @@ function createFilesystemSyncMigration(version: string): Migration {
294
220
  const PACKAGE_MIGRATIONS: Migration[] = [
295
221
  createPlatformSyncMigration('0.25.0'),
296
222
  createConfigSkillNameMigration('0.27.2'),
297
- createFilesystemSyncMigration('0.27.4'),
298
223
  ];
299
224
 
300
225
  /**