@maccesar/titools 4.17.0 → 4.17.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.
@@ -100,7 +100,9 @@ export async function doctorCommand() {
100
100
  }
101
101
  }
102
102
  const expectedCommands = COMMANDS.length - pluginCommands.length;
103
- if (pluginCommands.length === COMMANDS.length) {
103
+ if (COMMANDS.length === 0) {
104
+ console.log(` ${CHECK} Slash commands: none (workflows ship as cross-agent skills)`);
105
+ } else if (pluginCommands.length === COMMANDS.length) {
104
106
  console.log(` ${CHECK} Slash commands: all ${COMMANDS.length} served by the marketplace plugin`);
105
107
  } else if (missingCommands.length === 0) {
106
108
  console.log(` ${CHECK} Slash commands: ${expectedCommands}/${expectedCommands} installed in ~/.claude/commands/`);
@@ -138,10 +140,13 @@ export async function doctorCommand() {
138
140
 
139
141
  for (const skill of SKILLS) {
140
142
  // A skill the marketplace plugin provides is *supposed* to have no mirror
141
- // here — the CLI removes it on purpose to avoid a duplicate entry. Counting
142
- // it as missing turns a healthy marketplace install into a wall of errors
143
- // telling the user to run a command that will correctly do nothing.
144
- if (platform.name === 'claude' && pluginProvidesSkill(skill, homeDir)) {
143
+ // here — the CLI removes it on purpose to avoid a duplicate entry. During
144
+ // command-to-skill migrations, a same-name command in an older enabled
145
+ // cache also suppresses the mirror until the marketplace refreshes.
146
+ if (
147
+ platform.name === 'claude' &&
148
+ (pluginProvidesSkill(skill, homeDir) || pluginProvidesCommand(skill, homeDir))
149
+ ) {
145
150
  servedByPlugin.push(skill);
146
151
  continue;
147
152
  }
package/lib/symlink.js CHANGED
@@ -83,8 +83,8 @@ async function removePath(path) {
83
83
  * @returns {Promise<boolean>} True if the plugin provides this skill
84
84
  */
85
85
  export async function isClaudePluginSkillInstalled(skillName, baseDir) {
86
- const { pluginProvidesSkill } = await import('./claude-plugin.js');
87
- return pluginProvidesSkill(skillName, baseDir);
86
+ const { pluginProvidesSkill, pluginProvidesCommand } = await import('./claude-plugin.js');
87
+ return pluginProvidesSkill(skillName, baseDir) || pluginProvidesCommand(skillName, baseDir);
88
88
  }
89
89
 
90
90
  /**
@@ -118,8 +118,9 @@ export async function createSkillSymlinks(platformSkillsDir, skills, baseDir) {
118
118
  const useRelative = !!baseDir;
119
119
 
120
120
  for (const skill of skills) {
121
- // Skip Claude when the marketplace plugin already provides this skill;
122
- // clean up any stale symlink left from a previous CLI install.
121
+ // Skip Claude when the marketplace plugin already provides this skill or
122
+ // still provides a same-name legacy command during a command-to-skill
123
+ // migration; clean up any stale symlink left from a previous CLI install.
123
124
  if (isClaudePlatform && await isClaudePluginSkillInstalled(skill, baseDir)) {
124
125
  const stalePath = join(platformSkillsDir, skill);
125
126
  if (existsSync(stalePath)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maccesar/titools",
3
- "version": "4.17.0",
3
+ "version": "4.17.1",
4
4
  "description": "Titanium SDK skills and agents for AI coding assistants, including native game and sound synthesis modules",
5
5
  "main": "lib/index.js",
6
6
  "type": "module",