@orderful/droid 0.17.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.github/workflows/claude-code-review.yml +58 -0
  2. package/.github/workflows/claude.yml +50 -0
  3. package/CHANGELOG.md +37 -0
  4. package/dist/bin/droid.js +212 -79
  5. package/dist/index.js +188 -69
  6. package/dist/lib/config.d.ts.map +1 -1
  7. package/dist/lib/migrations.d.ts +30 -0
  8. package/dist/lib/migrations.d.ts.map +1 -0
  9. package/dist/lib/skill-config.d.ts.map +1 -1
  10. package/dist/lib/skills.d.ts.map +1 -1
  11. package/dist/lib/tools.d.ts.map +1 -1
  12. package/dist/lib/types.d.ts +10 -0
  13. package/dist/lib/types.d.ts.map +1 -1
  14. package/dist/tools/brain/TOOL.yaml +3 -3
  15. package/{src/tools/brain/skills/brain → dist/tools/brain/skills/droid-brain}/SKILL.md +1 -1
  16. package/dist/tools/brain/skills/{brain-obsidian → droid-brain-obsidian}/SKILL.md +1 -1
  17. package/dist/tools/coach/TOOL.yaml +2 -2
  18. package/dist/tools/coach/skills/{coach → droid-coach}/SKILL.md +1 -1
  19. package/dist/tools/code-review/TOOL.yaml +2 -2
  20. package/dist/tools/code-review/skills/{code-review → droid-code-review}/SKILL.md +1 -1
  21. package/dist/tools/comments/TOOL.yaml +2 -2
  22. package/dist/tools/comments/skills/{comments → droid-comments}/SKILL.md +1 -1
  23. package/dist/tools/project/TOOL.yaml +2 -2
  24. package/{src/tools/project/skills/project → dist/tools/project/skills/droid-project}/SKILL.md +1 -1
  25. package/package.json +1 -1
  26. package/src/lib/config.ts +13 -2
  27. package/src/lib/migrations.test.ts +163 -0
  28. package/src/lib/migrations.ts +182 -0
  29. package/src/lib/skill-config.ts +3 -1
  30. package/src/lib/skills.ts +57 -1
  31. package/src/lib/tools.ts +16 -2
  32. package/src/lib/types.ts +11 -0
  33. package/src/tools/brain/TOOL.yaml +3 -3
  34. package/{dist/tools/brain/skills/brain → src/tools/brain/skills/droid-brain}/SKILL.md +1 -1
  35. package/src/tools/brain/skills/{brain-obsidian → droid-brain-obsidian}/SKILL.md +1 -1
  36. package/src/tools/coach/TOOL.yaml +2 -2
  37. package/src/tools/coach/skills/{coach → droid-coach}/SKILL.md +1 -1
  38. package/src/tools/code-review/TOOL.yaml +2 -2
  39. package/src/tools/code-review/skills/{code-review → droid-code-review}/SKILL.md +1 -1
  40. package/src/tools/comments/TOOL.yaml +2 -2
  41. package/src/tools/comments/skills/{comments → droid-comments}/SKILL.md +1 -1
  42. package/src/tools/project/TOOL.yaml +2 -2
  43. package/{dist/tools/project/skills/project → src/tools/project/skills/droid-project}/SKILL.md +1 -1
  44. /package/dist/tools/brain/skills/{brain → droid-brain}/references/metadata.md +0 -0
  45. /package/dist/tools/brain/skills/{brain → droid-brain}/references/naming.md +0 -0
  46. /package/dist/tools/brain/skills/{brain → droid-brain}/references/templates.md +0 -0
  47. /package/dist/tools/brain/skills/{brain → droid-brain}/references/workflows.md +0 -0
  48. /package/dist/tools/brain/skills/{brain-obsidian → droid-brain-obsidian}/references/templates.md +0 -0
  49. /package/dist/tools/brain/skills/{brain-obsidian → droid-brain-obsidian}/references/workflows.md +0 -0
  50. /package/dist/tools/project/skills/{project → droid-project}/references/changelog.md +0 -0
  51. /package/dist/tools/project/skills/{project → droid-project}/references/creating.md +0 -0
  52. /package/dist/tools/project/skills/{project → droid-project}/references/loading.md +0 -0
  53. /package/dist/tools/project/skills/{project → droid-project}/references/templates.md +0 -0
  54. /package/dist/tools/project/skills/{project → droid-project}/references/updating.md +0 -0
  55. /package/dist/tools/project/skills/{project → droid-project}/references/versioning.md +0 -0
  56. /package/src/tools/brain/skills/{brain → droid-brain}/references/metadata.md +0 -0
  57. /package/src/tools/brain/skills/{brain → droid-brain}/references/naming.md +0 -0
  58. /package/src/tools/brain/skills/{brain → droid-brain}/references/templates.md +0 -0
  59. /package/src/tools/brain/skills/{brain → droid-brain}/references/workflows.md +0 -0
  60. /package/src/tools/brain/skills/{brain-obsidian → droid-brain-obsidian}/references/templates.md +0 -0
  61. /package/src/tools/brain/skills/{brain-obsidian → droid-brain-obsidian}/references/workflows.md +0 -0
  62. /package/src/tools/project/skills/{project → droid-project}/references/changelog.md +0 -0
  63. /package/src/tools/project/skills/{project → droid-project}/references/creating.md +0 -0
  64. /package/src/tools/project/skills/{project → droid-project}/references/loading.md +0 -0
  65. /package/src/tools/project/skills/{project → droid-project}/references/templates.md +0 -0
  66. /package/src/tools/project/skills/{project → droid-project}/references/updating.md +0 -0
  67. /package/src/tools/project/skills/{project → droid-project}/references/versioning.md +0 -0
package/dist/index.js CHANGED
@@ -140,8 +140,12 @@ function getConfigPath() {
140
140
  function getConfigDir() {
141
141
  return CONFIG_DIR;
142
142
  }
143
+ function normalizeSkillNameForConfig(skillName) {
144
+ return skillName.replace(/^droid-/, "");
145
+ }
143
146
  function getSkillOverridesPath(skillName) {
144
- return join(CONFIG_DIR, "skills", skillName, "overrides.yaml");
147
+ const normalizedName = normalizeSkillNameForConfig(skillName);
148
+ return join(CONFIG_DIR, "skills", normalizedName, "overrides.yaml");
145
149
  }
146
150
  function loadSkillOverrides(skillName) {
147
151
  const overridesPath = getSkillOverridesPath(skillName);
@@ -156,8 +160,9 @@ function loadSkillOverrides(skillName) {
156
160
  }
157
161
  }
158
162
  function saveSkillOverrides(skillName, overrides) {
163
+ const normalizedName = normalizeSkillNameForConfig(skillName);
159
164
  const overridesPath = getSkillOverridesPath(skillName);
160
- const skillDir = join(CONFIG_DIR, "skills", skillName);
165
+ const skillDir = join(CONFIG_DIR, "skills", normalizedName);
161
166
  if (!existsSync(skillDir)) {
162
167
  mkdirSync(skillDir, { recursive: true });
163
168
  }
@@ -182,8 +187,8 @@ function setAutoUpdateConfig(updates) {
182
187
  }
183
188
 
184
189
  // src/lib/skills.ts
185
- import { existsSync as existsSync4, readdirSync as readdirSync3, readFileSync as readFileSync5, mkdirSync as mkdirSync3, writeFileSync as writeFileSync3, rmSync } from "fs";
186
- import { join as join6, dirname as dirname4 } from "path";
190
+ import { existsSync as existsSync5, readdirSync as readdirSync3, readFileSync as readFileSync5, mkdirSync as mkdirSync4, writeFileSync as writeFileSync3, rmSync as rmSync2 } from "fs";
191
+ import { join as join7, dirname as dirname5, basename } from "path";
187
192
  import { fileURLToPath as fileURLToPath4 } from "url";
188
193
  import YAML4 from "yaml";
189
194
 
@@ -457,11 +462,104 @@ function uninstallAgent(agentName) {
457
462
  }
458
463
  }
459
464
 
465
+ // src/lib/migrations.ts
466
+ import { existsSync as existsSync4, appendFileSync, mkdirSync as mkdirSync3, renameSync, rmSync } from "fs";
467
+ import { join as join6, dirname as dirname4 } from "path";
468
+ var MIGRATIONS_LOG_FILE = ".migrations.log";
469
+ function getMigrationsLogPath() {
470
+ return join6(getConfigDir(), MIGRATIONS_LOG_FILE);
471
+ }
472
+ function logMigration(toolName, fromVersion, toVersion, status, error) {
473
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
474
+ const logEntry = error ? `${timestamp} ${toolName} ${fromVersion} \u2192 ${toVersion} ${status}: ${error}
475
+ ` : `${timestamp} ${toolName} ${fromVersion} \u2192 ${toVersion} ${status}
476
+ `;
477
+ const logPath = getMigrationsLogPath();
478
+ const logDir = dirname4(logPath);
479
+ if (!existsSync4(logDir)) {
480
+ mkdirSync3(logDir, { recursive: true });
481
+ }
482
+ appendFileSync(logPath, logEntry);
483
+ }
484
+ function createConfigDirMigration(skillName, version) {
485
+ const unprefixedName = skillName.replace(/^droid-/, "");
486
+ return {
487
+ version,
488
+ description: `Move ${skillName} config to unprefixed location`,
489
+ up: (configDir) => {
490
+ const oldDir = join6(configDir, "skills", skillName);
491
+ const newDir = join6(configDir, "skills", unprefixedName);
492
+ if (existsSync4(oldDir) && !existsSync4(newDir)) {
493
+ const parentDir = dirname4(newDir);
494
+ if (!existsSync4(parentDir)) {
495
+ mkdirSync3(parentDir, { recursive: true });
496
+ }
497
+ renameSync(oldDir, newDir);
498
+ } else if (existsSync4(oldDir) && existsSync4(newDir)) {
499
+ rmSync(oldDir, { recursive: true });
500
+ }
501
+ }
502
+ };
503
+ }
504
+ var TOOL_MIGRATIONS = {
505
+ brain: [createConfigDirMigration("droid-brain", "0.2.3")],
506
+ comments: [createConfigDirMigration("droid-comments", "0.2.6")],
507
+ project: [createConfigDirMigration("droid-project", "0.1.5")],
508
+ coach: [createConfigDirMigration("droid-coach", "0.1.3")]
509
+ };
510
+ function getToolMigrations(toolName) {
511
+ return TOOL_MIGRATIONS[toolName] ?? [];
512
+ }
513
+ function getLastMigratedVersion(toolName) {
514
+ const config = loadConfig();
515
+ return config.migrations?.[toolName] ?? "0.0.0";
516
+ }
517
+ function setLastMigratedVersion(toolName, version) {
518
+ const config = loadConfig();
519
+ if (!config.migrations) {
520
+ config.migrations = {};
521
+ }
522
+ config.migrations[toolName] = version;
523
+ saveConfig(config);
524
+ }
525
+ function runMigrations(toolName, fromVersion, toVersion) {
526
+ const migrations = getToolMigrations(toolName);
527
+ const pendingMigrations = migrations.filter((m) => {
528
+ const afterFrom = compareSemver(m.version, fromVersion) > 0;
529
+ const beforeOrAtTo = compareSemver(m.version, toVersion) <= 0;
530
+ return afterFrom && beforeOrAtTo;
531
+ });
532
+ if (pendingMigrations.length === 0) {
533
+ setLastMigratedVersion(toolName, toVersion);
534
+ return { success: true };
535
+ }
536
+ const configDir = getConfigDir();
537
+ for (const migration of pendingMigrations) {
538
+ try {
539
+ migration.up(configDir);
540
+ logMigration(toolName, fromVersion, migration.version, "OK");
541
+ } catch (error) {
542
+ const errorMessage = error instanceof Error ? error.message : String(error);
543
+ logMigration(toolName, fromVersion, migration.version, "FAILED", errorMessage);
544
+ return { success: false, error: `Migration ${migration.version} failed: ${errorMessage}` };
545
+ }
546
+ }
547
+ setLastMigratedVersion(toolName, toVersion);
548
+ return { success: true };
549
+ }
550
+ function runToolMigrations(toolName, installedVersion) {
551
+ const lastMigrated = getLastMigratedVersion(toolName);
552
+ if (compareSemver(installedVersion, lastMigrated) <= 0) {
553
+ return { success: true };
554
+ }
555
+ return runMigrations(toolName, lastMigrated, installedVersion);
556
+ }
557
+
460
558
  // src/lib/skills.ts
461
559
  var DROID_SKILLS_START = "<!-- droid-skills-start -->";
462
560
  var DROID_SKILLS_END = "<!-- droid-skills-end -->";
463
- var __dirname4 = dirname4(fileURLToPath4(import.meta.url));
464
- var BUNDLED_SKILLS_DIR = join6(__dirname4, "../tools");
561
+ var __dirname4 = dirname5(fileURLToPath4(import.meta.url));
562
+ var BUNDLED_SKILLS_DIR = join7(__dirname4, "../tools");
465
563
  function getBundledSkillsDir() {
466
564
  return BUNDLED_SKILLS_DIR;
467
565
  }
@@ -477,7 +575,7 @@ function getPlatformConfigPath(platform) {
477
575
  function updatePlatformConfigSkills(platform, installedSkills) {
478
576
  const configPath = getPlatformConfigPath(platform);
479
577
  let content = "";
480
- if (existsSync4(configPath)) {
578
+ if (existsSync5(configPath)) {
481
579
  content = readFileSync5(configPath, "utf-8");
482
580
  }
483
581
  const skillLines = installedSkills.map((name) => {
@@ -496,9 +594,9 @@ ${DROID_SKILLS_END}` : "";
496
594
  } else if (skillsSection) {
497
595
  content = content.trim() + "\n\n" + skillsSection + "\n";
498
596
  }
499
- const configDir = dirname4(configPath);
500
- if (!existsSync4(configDir)) {
501
- mkdirSync3(configDir, { recursive: true });
597
+ const configDir = dirname5(configPath);
598
+ if (!existsSync5(configDir)) {
599
+ mkdirSync4(configDir, { recursive: true });
502
600
  }
503
601
  writeFileSync3(configPath, content, "utf-8");
504
602
  }
@@ -519,8 +617,8 @@ function parseSkillFrontmatter(content) {
519
617
  }
520
618
  }
521
619
  function loadSkillManifest(skillDir) {
522
- const skillMdPath = join6(skillDir, "SKILL.md");
523
- if (!existsSync4(skillMdPath)) {
620
+ const skillMdPath = join7(skillDir, "SKILL.md");
621
+ if (!existsSync5(skillMdPath)) {
524
622
  return null;
525
623
  }
526
624
  const content = readFileSync5(skillMdPath, "utf-8");
@@ -528,7 +626,7 @@ function loadSkillManifest(skillDir) {
528
626
  if (!frontmatter || !frontmatter.name) {
529
627
  return null;
530
628
  }
531
- const toolDir = dirname4(dirname4(skillDir));
629
+ const toolDir = dirname5(dirname5(skillDir));
532
630
  const toolManifest = loadToolManifest(toolDir);
533
631
  return {
534
632
  name: frontmatter.name,
@@ -540,17 +638,17 @@ function loadSkillManifest(skillDir) {
540
638
  };
541
639
  }
542
640
  function findSkillPath(skillName) {
543
- if (!existsSync4(BUNDLED_SKILLS_DIR)) {
641
+ if (!existsSync5(BUNDLED_SKILLS_DIR)) {
544
642
  return null;
545
643
  }
546
644
  const toolDirs = readdirSync3(BUNDLED_SKILLS_DIR, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
547
645
  for (const toolName of toolDirs) {
548
- const skillsDir = join6(BUNDLED_SKILLS_DIR, toolName, "skills");
549
- if (!existsSync4(skillsDir)) continue;
550
- const skillDir = join6(skillsDir, skillName);
551
- if (existsSync4(skillDir) && existsSync4(join6(skillDir, "SKILL.md"))) {
646
+ const skillsDir = join7(BUNDLED_SKILLS_DIR, toolName, "skills");
647
+ if (!existsSync5(skillsDir)) continue;
648
+ const skillDir = join7(skillsDir, skillName);
649
+ if (existsSync5(skillDir) && existsSync5(join7(skillDir, "SKILL.md"))) {
552
650
  return {
553
- toolDir: join6(BUNDLED_SKILLS_DIR, toolName),
651
+ toolDir: join7(BUNDLED_SKILLS_DIR, toolName),
554
652
  skillDir
555
653
  };
556
654
  }
@@ -558,17 +656,17 @@ function findSkillPath(skillName) {
558
656
  return null;
559
657
  }
560
658
  function getBundledSkills() {
561
- if (!existsSync4(BUNDLED_SKILLS_DIR)) {
659
+ if (!existsSync5(BUNDLED_SKILLS_DIR)) {
562
660
  return [];
563
661
  }
564
662
  const toolDirs = readdirSync3(BUNDLED_SKILLS_DIR, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
565
663
  const skills = [];
566
664
  for (const toolName of toolDirs) {
567
- const skillsDir = join6(BUNDLED_SKILLS_DIR, toolName, "skills");
568
- if (!existsSync4(skillsDir)) continue;
665
+ const skillsDir = join7(BUNDLED_SKILLS_DIR, toolName, "skills");
666
+ if (!existsSync5(skillsDir)) continue;
569
667
  const skillSubdirs = readdirSync3(skillsDir, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
570
668
  for (const skillName of skillSubdirs) {
571
- const manifest = loadSkillManifest(join6(skillsDir, skillName));
669
+ const manifest = loadSkillManifest(join7(skillsDir, skillName));
572
670
  if (manifest) {
573
671
  skills.push(manifest);
574
672
  }
@@ -691,17 +789,33 @@ function installSkill(skillName) {
691
789
  }
692
790
  }
693
791
  const skillsPath = getSkillsInstallPath(config.platform);
694
- const targetSkillDir = join6(skillsPath, skillName);
792
+ const targetSkillDir = join7(skillsPath, skillName);
695
793
  const commandsPath = getCommandsInstallPath(config.platform);
696
794
  const tools = getPlatformTools(config);
697
- const commandsSource = join6(toolDir, "commands");
698
- const agentsSource = join6(toolDir, "agents");
795
+ if (skillName.startsWith("droid-")) {
796
+ const oldSkillName = skillName.replace(/^droid-/, "");
797
+ const oldSkillDir = join7(skillsPath, oldSkillName);
798
+ if (existsSync5(oldSkillDir)) {
799
+ try {
800
+ rmSync2(oldSkillDir, { recursive: true });
801
+ } catch (error) {
802
+ console.warn(`Warning: Could not remove old skill directory ${oldSkillDir}: ${error}`);
803
+ }
804
+ }
805
+ if (tools[oldSkillName]) {
806
+ delete tools[oldSkillName];
807
+ setPlatformTools(config, tools);
808
+ saveConfig(config);
809
+ }
810
+ }
811
+ const commandsSource = join7(toolDir, "commands");
812
+ const agentsSource = join7(toolDir, "agents");
699
813
  if (!tools[skillName]) {
700
- if (existsSync4(commandsSource)) {
814
+ if (existsSync5(commandsSource)) {
701
815
  const commandFiles = readdirSync3(commandsSource).filter((f) => f.endsWith(".md") && f.toLowerCase() !== "readme.md");
702
816
  for (const file of commandFiles) {
703
- const targetCommandPath = join6(commandsPath, file);
704
- if (existsSync4(targetCommandPath)) {
817
+ const targetCommandPath = join7(commandsPath, file);
818
+ if (existsSync5(targetCommandPath)) {
705
819
  const commandName = file.replace(".md", "");
706
820
  return {
707
821
  success: false,
@@ -710,7 +824,7 @@ function installSkill(skillName) {
710
824
  }
711
825
  }
712
826
  }
713
- if (existsSync4(agentsSource)) {
827
+ if (existsSync5(agentsSource)) {
714
828
  const agentDirs = readdirSync3(agentsSource, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
715
829
  for (const agentName of agentDirs) {
716
830
  if (isAgentInstalled(agentName)) {
@@ -722,49 +836,49 @@ function installSkill(skillName) {
722
836
  }
723
837
  }
724
838
  }
725
- if (!existsSync4(skillsPath)) {
726
- mkdirSync3(skillsPath, { recursive: true });
839
+ if (!existsSync5(skillsPath)) {
840
+ mkdirSync4(skillsPath, { recursive: true });
727
841
  }
728
- const skillMdSource = join6(skillDir, "SKILL.md");
729
- if (existsSync4(skillMdSource)) {
730
- if (!existsSync4(targetSkillDir)) {
731
- mkdirSync3(targetSkillDir, { recursive: true });
842
+ const skillMdSource = join7(skillDir, "SKILL.md");
843
+ if (existsSync5(skillMdSource)) {
844
+ if (!existsSync5(targetSkillDir)) {
845
+ mkdirSync4(targetSkillDir, { recursive: true });
732
846
  }
733
- const skillMdTarget = join6(targetSkillDir, "SKILL.md");
847
+ const skillMdTarget = join7(targetSkillDir, "SKILL.md");
734
848
  const content = readFileSync5(skillMdSource, "utf-8");
735
849
  writeFileSync3(skillMdTarget, content);
736
850
  }
737
- const referencesSource = join6(skillDir, "references");
738
- if (existsSync4(referencesSource)) {
739
- const targetReferencesDir = join6(targetSkillDir, "references");
740
- if (!existsSync4(targetReferencesDir)) {
741
- mkdirSync3(targetReferencesDir, { recursive: true });
851
+ const referencesSource = join7(skillDir, "references");
852
+ if (existsSync5(referencesSource)) {
853
+ const targetReferencesDir = join7(targetSkillDir, "references");
854
+ if (!existsSync5(targetReferencesDir)) {
855
+ mkdirSync4(targetReferencesDir, { recursive: true });
742
856
  }
743
857
  const referenceFiles = readdirSync3(referencesSource).filter((f) => f.endsWith(".md"));
744
858
  for (const file of referenceFiles) {
745
- const sourcePath = join6(referencesSource, file);
746
- const targetPath = join6(targetReferencesDir, file);
859
+ const sourcePath = join7(referencesSource, file);
860
+ const targetPath = join7(targetReferencesDir, file);
747
861
  const content = readFileSync5(sourcePath, "utf-8");
748
862
  writeFileSync3(targetPath, content);
749
863
  }
750
864
  }
751
- if (existsSync4(commandsSource)) {
752
- if (!existsSync4(commandsPath)) {
753
- mkdirSync3(commandsPath, { recursive: true });
865
+ if (existsSync5(commandsSource)) {
866
+ if (!existsSync5(commandsPath)) {
867
+ mkdirSync4(commandsPath, { recursive: true });
754
868
  }
755
869
  const commandFiles = readdirSync3(commandsSource).filter((f) => f.endsWith(".md") && f.toLowerCase() !== "readme.md");
756
870
  for (const file of commandFiles) {
757
- const sourcePath = join6(commandsSource, file);
758
- const targetPath = join6(commandsPath, file);
871
+ const sourcePath = join7(commandsSource, file);
872
+ const targetPath = join7(commandsPath, file);
759
873
  const content = readFileSync5(sourcePath, "utf-8");
760
874
  writeFileSync3(targetPath, content);
761
875
  }
762
876
  }
763
877
  const installedAgents = [];
764
- if (existsSync4(agentsSource)) {
878
+ if (existsSync5(agentsSource)) {
765
879
  const agentDirs = readdirSync3(agentsSource, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
766
880
  for (const agentName of agentDirs) {
767
- const agentDir = join6(agentsSource, agentName);
881
+ const agentDir = join7(agentsSource, agentName);
768
882
  const result = installAgentFromPath(agentDir, agentName);
769
883
  if (result.success) {
770
884
  installedAgents.push(agentName);
@@ -783,6 +897,11 @@ function installSkill(skillName) {
783
897
  saveConfig(config);
784
898
  const installedSkillNames = Object.keys(updatedTools);
785
899
  updatePlatformConfigSkills(config.platform, installedSkillNames);
900
+ const toolName = basename(toolDir);
901
+ const migrationResult = runToolMigrations(toolName, manifest.version);
902
+ if (!migrationResult.success) {
903
+ console.warn(`Warning: Migration failed for ${toolName}: ${migrationResult.error}`);
904
+ }
786
905
  return { success: true, message: `Installed ${skillName} v${manifest.version}` };
787
906
  }
788
907
  function uninstallSkill(skillName) {
@@ -792,19 +911,19 @@ function uninstallSkill(skillName) {
792
911
  return { success: false, message: `Skill '${skillName}' is not installed` };
793
912
  }
794
913
  const skillsPath = getSkillsInstallPath(config.platform);
795
- const skillDir = join6(skillsPath, skillName);
796
- if (existsSync4(skillDir)) {
797
- rmSync(skillDir, { recursive: true });
914
+ const skillDir = join7(skillsPath, skillName);
915
+ if (existsSync5(skillDir)) {
916
+ rmSync2(skillDir, { recursive: true });
798
917
  }
799
918
  const skillPath = findSkillPath(skillName);
800
919
  const commandsPath = getCommandsInstallPath(config.platform);
801
- const commandsSource = skillPath ? join6(skillPath.toolDir, "commands") : null;
802
- if (commandsSource && existsSync4(commandsSource)) {
920
+ const commandsSource = skillPath ? join7(skillPath.toolDir, "commands") : null;
921
+ if (commandsSource && existsSync5(commandsSource)) {
803
922
  const commandFiles = readdirSync3(commandsSource).filter((f) => f.endsWith(".md") && f.toLowerCase() !== "readme.md");
804
923
  for (const file of commandFiles) {
805
- const commandPath = join6(commandsPath, file);
806
- if (existsSync4(commandPath)) {
807
- rmSync(commandPath);
924
+ const commandPath = join7(commandsPath, file);
925
+ if (existsSync5(commandPath)) {
926
+ rmSync2(commandPath);
808
927
  }
809
928
  }
810
929
  }
@@ -840,7 +959,7 @@ function isCommandInstalled(commandName, skillName) {
840
959
  const commandsPath = getCommandsInstallPath(config.platform);
841
960
  const cmdPart = commandName.startsWith(skillName + " ") ? commandName.slice(skillName.length + 1) : commandName;
842
961
  const filename = cmdPart.replace(/\s+/g, "-") + ".md";
843
- return existsSync4(join6(commandsPath, filename));
962
+ return existsSync5(join7(commandsPath, filename));
844
963
  }
845
964
  function installCommand(commandName, skillName) {
846
965
  const config = loadConfig();
@@ -848,8 +967,8 @@ function installCommand(commandName, skillName) {
848
967
  if (!skillPath) {
849
968
  return { success: false, message: `Skill '${skillName}' not found` };
850
969
  }
851
- const commandsDir = join6(skillPath.toolDir, "commands");
852
- if (!existsSync4(commandsDir)) {
970
+ const commandsDir = join7(skillPath.toolDir, "commands");
971
+ if (!existsSync5(commandsDir)) {
853
972
  return { success: false, message: `No commands found for skill '${skillName}'` };
854
973
  }
855
974
  const cmdPart = commandName.startsWith(skillName + " ") ? commandName.slice(skillName.length + 1) : commandName;
@@ -862,11 +981,11 @@ function installCommand(commandName, skillName) {
862
981
  return { success: false, message: `Command file not found for: ${commandName}` };
863
982
  }
864
983
  const commandsPath = getCommandsInstallPath(config.platform);
865
- if (!existsSync4(commandsPath)) {
866
- mkdirSync3(commandsPath, { recursive: true });
984
+ if (!existsSync5(commandsPath)) {
985
+ mkdirSync4(commandsPath, { recursive: true });
867
986
  }
868
- const actualSourcePath = join6(commandsDir, sourceFile);
869
- const targetPath = join6(commandsPath, sourceFile);
987
+ const actualSourcePath = join7(commandsDir, sourceFile);
988
+ const targetPath = join7(commandsPath, sourceFile);
870
989
  try {
871
990
  const content = readFileSync5(actualSourcePath, "utf-8");
872
991
  writeFileSync3(targetPath, content);
@@ -890,10 +1009,10 @@ function uninstallCommand(commandName, skillName) {
890
1009
  cmdPart.replace(/\s+/g, "-") + ".md"
891
1010
  ];
892
1011
  for (const filename of possibleFilenames) {
893
- const commandPath = join6(commandsPath, filename);
894
- if (existsSync4(commandPath)) {
1012
+ const commandPath = join7(commandsPath, filename);
1013
+ if (existsSync5(commandPath)) {
895
1014
  try {
896
- rmSync(commandPath);
1015
+ rmSync2(commandPath);
897
1016
  return { success: true, message: `Uninstalled /${commandName}` };
898
1017
  } catch (error) {
899
1018
  return { success: false, message: `Failed to uninstall command: ${error}` };
@@ -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,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
+ {"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;AAWD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/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,CAWrF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAQ5E"}
@@ -0,0 +1,30 @@
1
+ import { type Migration } from './types';
2
+ /**
3
+ * Get migrations for a tool
4
+ */
5
+ export declare function getToolMigrations(toolName: string): Migration[];
6
+ /**
7
+ * Get the last migrated version for a tool
8
+ */
9
+ export declare function getLastMigratedVersion(toolName: string): string;
10
+ /**
11
+ * Update the last migrated version for a tool
12
+ */
13
+ export declare function setLastMigratedVersion(toolName: string, version: string): void;
14
+ /**
15
+ * Run migrations for a tool between two versions
16
+ * Returns true if all migrations succeeded, false otherwise
17
+ */
18
+ export declare function runMigrations(toolName: string, fromVersion: string, toVersion: string): {
19
+ success: boolean;
20
+ error?: string;
21
+ };
22
+ /**
23
+ * Run migrations for a tool after install/update
24
+ * Call this after installSkill() completes
25
+ */
26
+ export declare function runToolMigrations(toolName: string, installedVersion: string): {
27
+ success: boolean;
28
+ error?: string;
29
+ };
30
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/lib/migrations.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AA4FzC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAO9E;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,CAiCtC;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"}
@@ -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,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
+ {"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,CAkFf"}
@@ -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 +1 @@
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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAyD,MAAM,SAAS,CAAC;AAMnG;;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,CAiCvE;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"}
@@ -39,6 +39,7 @@ export interface DroidConfig {
39
39
  git_username: string;
40
40
  platforms: Record<string, PlatformConfig>;
41
41
  auto_update?: AutoUpdateConfig;
42
+ migrations?: Record<string, string>;
42
43
  }
43
44
  export interface LegacyDroidConfig {
44
45
  ai_tool: Platform;
@@ -84,6 +85,15 @@ export interface ConfigOption {
84
85
  export interface SkillOverrides {
85
86
  [key: string]: string | boolean | number;
86
87
  }
88
+ /**
89
+ * Tool migration function
90
+ * Should be idempotent - safe to run multiple times
91
+ */
92
+ export interface Migration {
93
+ version: string;
94
+ description: string;
95
+ up: (configDir: string) => Promise<void> | void;
96
+ }
87
97
  /**
88
98
  * Tool manifest structure (TOOL.yaml)
89
99
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  name: brain
2
2
  description: "Your scratchpad (or brain) - a collaborative space for planning and research. Create docs with /brain plan, /brain research, or /brain review. Use @mentions for async discussion. Docs persist across sessions."
3
- version: 0.2.1
3
+ version: 0.2.3
4
4
  status: beta
5
5
 
6
6
  includes:
7
7
  skills:
8
- - name: brain
8
+ - name: droid-brain
9
9
  required: true
10
- - name: brain-obsidian
10
+ - name: droid-brain-obsidian
11
11
  required: false
12
12
  description: "Obsidian vault integration with YAML frontmatter and wikilinks"
13
13
  commands:
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: brain
2
+ name: droid-brain
3
3
  description: "Collaborative scratchpad for planning and research. Use when planning a feature, exploring a problem, or capturing thinking that should persist across sessions. User prompts like 'let's think through', 'open a scratchpad', 'plan this out', 'use our brain'."
4
4
  globs:
5
5
  - "**/brain/**/*.md"
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: brain-obsidian
2
+ name: droid-brain-obsidian
3
3
  description: "Obsidian extension for brain skill with YAML frontmatter, wikilinks, and PARA folder organization. Use when your brain docs live in an Obsidian vault."
4
4
  globs:
5
5
  - "**/brain/**/*.md"
@@ -1,11 +1,11 @@
1
1
  name: coach
2
2
  description: "Learning-mode AI assistance - AI as coach, not crutch. Use /coach plan for co-authored planning, /coach scaffold for structure with hints, /coach review for Socratic questions."
3
- version: 0.1.1
3
+ version: 0.1.3
4
4
  status: beta
5
5
 
6
6
  includes:
7
7
  skills:
8
- - name: coach
8
+ - name: droid-coach
9
9
  required: true
10
10
  commands:
11
11
  - coach
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: coach
2
+ name: droid-coach
3
3
  description: "Learning-mode AI assistance - scaffolds don't implement, questions don't fix. Use when learning a new codebase, wanting to understand deeply, or building skills to retain. User prompts like 'coach me on', 'help me think through', 'I want to learn how to', 'don't just give me the answer'."
4
4
  alwaysApply: false
5
5
  allowed-tools: Read, Grep, Glob
@@ -1,11 +1,11 @@
1
1
  name: code-review
2
2
  description: "Comprehensive code review using specialized agents. Reviews PRs, staged changes, branches, or specific files with confidence scoring."
3
- version: 0.1.1
3
+ version: 0.1.2
4
4
  status: alpha
5
5
 
6
6
  includes:
7
7
  skills:
8
- - name: code-review
8
+ - name: droid-code-review
9
9
  required: true
10
10
  commands:
11
11
  - code-review
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: code-review
2
+ name: droid-code-review
3
3
  description: "Comprehensive code review using specialized agents. Use when reviewing PRs, checking staged changes, or analysing code quality. User prompts like 'review this PR', 'check my changes', 'review before I commit'."
4
4
  globs:
5
5
  - "**/*"
@@ -1,11 +1,11 @@
1
1
  name: comments
2
2
  description: "Enable inline conversations using @droid/@user markers. Tag @droid to ask the AI, AI responds with @{your-name}. Use /comments check to address markers, /comments cleanup to remove resolved threads. Ideal for code review notes and async collaboration."
3
- version: 0.2.4
3
+ version: 0.2.6
4
4
  status: beta
5
5
 
6
6
  includes:
7
7
  skills:
8
- - name: comments
8
+ - name: droid-comments
9
9
  required: true
10
10
  commands:
11
11
  - comments
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: comments
2
+ name: droid-comments
3
3
  description: "Inline conversations using @droid/@user markers in any file. Use when leaving async questions in code or having discussion that should stay near the code. User prompts like 'check for comments', 'address the @droid markers', 'clean up resolved comments'."
4
4
  globs:
5
5
  - "**/*"