@orderful/droid 0.26.0 → 0.27.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 (146) hide show
  1. package/.claude-plugin/marketplace.json +7 -7
  2. package/AGENTS.md +36 -32
  3. package/CHANGELOG.md +46 -0
  4. package/dist/bin/droid.js +140 -24
  5. package/dist/index.js +97 -25
  6. package/dist/lib/migrations.d.ts +8 -0
  7. package/dist/lib/migrations.d.ts.map +1 -1
  8. package/dist/lib/skills.d.ts.map +1 -1
  9. package/dist/lib/tools.d.ts.map +1 -1
  10. package/dist/lib/types.d.ts +10 -2
  11. package/dist/lib/types.d.ts.map +1 -1
  12. package/dist/tools/brain/.claude-plugin/plugin.json +1 -1
  13. package/dist/tools/brain/TOOL.yaml +7 -5
  14. package/dist/tools/brain/commands/brain.md +17 -49
  15. package/dist/tools/brain/commands/scratchpad.md +13 -50
  16. package/{src/tools/brain/skills/droid-brain → dist/tools/brain/skills/brain}/SKILL.md +5 -5
  17. package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/SKILL.md +8 -8
  18. package/dist/tools/coach/.claude-plugin/plugin.json +1 -1
  19. package/dist/tools/coach/TOOL.yaml +4 -3
  20. package/dist/tools/coach/commands/coach.md +14 -54
  21. package/{src/tools/coach/skills/droid-coach → dist/tools/coach/skills/coach}/SKILL.md +4 -3
  22. package/dist/tools/code-review/.claude-plugin/plugin.json +1 -1
  23. package/dist/tools/code-review/TOOL.yaml +4 -3
  24. package/dist/tools/code-review/commands/code-review.md +18 -102
  25. package/dist/tools/code-review/skills/code-review/SKILL.md +154 -0
  26. package/dist/tools/codex/.claude-plugin/plugin.json +1 -1
  27. package/dist/tools/codex/TOOL.yaml +4 -3
  28. package/dist/tools/codex/commands/codex.md +18 -65
  29. package/dist/tools/codex/skills/{droid-codex → codex}/SKILL.md +64 -45
  30. package/{src/tools/codex/skills/droid-codex → dist/tools/codex/skills/codex}/references/loading.md +94 -55
  31. package/dist/tools/codex/skills/codex/scripts/git-finish-write.d.ts.map +1 -0
  32. package/dist/tools/codex/skills/codex/scripts/git-preamble.d.ts.map +1 -0
  33. package/dist/tools/codex/skills/codex/scripts/git-start-write.d.ts.map +1 -0
  34. package/dist/tools/comments/.claude-plugin/plugin.json +1 -1
  35. package/dist/tools/comments/TOOL.yaml +4 -3
  36. package/dist/tools/comments/commands/comments.md +12 -14
  37. package/{src/tools/comments/skills/droid-comments → dist/tools/comments/skills/comments}/SKILL.md +3 -1
  38. package/dist/tools/project/.claude-plugin/plugin.json +1 -1
  39. package/dist/tools/project/TOOL.yaml +4 -3
  40. package/dist/tools/project/commands/project.md +12 -27
  41. package/dist/tools/project/skills/{droid-project → project}/SKILL.md +12 -11
  42. package/dist/tools/tech-design/.claude-plugin/plugin.json +1 -1
  43. package/dist/tools/tech-design/TOOL.yaml +4 -3
  44. package/dist/tools/tech-design/commands/tech-design.md +18 -80
  45. package/{src/tools/tech-design/skills/droid-tech-design → dist/tools/tech-design/skills/tech-design}/SKILL.md +1 -1
  46. package/package.json +1 -1
  47. package/src/commands/tui/components/Badge.test.tsx +10 -4
  48. package/src/commands/tui.tsx +4 -4
  49. package/src/lib/migrations.ts +154 -4
  50. package/src/lib/skills.test.ts +199 -74
  51. package/src/lib/skills.ts +55 -54
  52. package/src/lib/tools.ts +19 -12
  53. package/src/lib/types.ts +20 -5
  54. package/src/tools/brain/.claude-plugin/plugin.json +1 -1
  55. package/src/tools/brain/TOOL.yaml +7 -5
  56. package/src/tools/brain/commands/brain.md +17 -49
  57. package/src/tools/brain/commands/scratchpad.md +13 -50
  58. package/{dist/tools/brain/skills/droid-brain → src/tools/brain/skills/brain}/SKILL.md +5 -5
  59. package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/SKILL.md +8 -8
  60. package/src/tools/coach/.claude-plugin/plugin.json +1 -1
  61. package/src/tools/coach/TOOL.yaml +4 -3
  62. package/src/tools/coach/commands/coach.md +14 -54
  63. package/{dist/tools/coach/skills/droid-coach → src/tools/coach/skills/coach}/SKILL.md +4 -3
  64. package/src/tools/code-review/.claude-plugin/plugin.json +1 -1
  65. package/src/tools/code-review/TOOL.yaml +4 -3
  66. package/src/tools/code-review/commands/code-review.md +18 -102
  67. package/src/tools/code-review/skills/code-review/SKILL.md +154 -0
  68. package/src/tools/codex/.claude-plugin/plugin.json +1 -1
  69. package/src/tools/codex/TOOL.yaml +4 -3
  70. package/src/tools/codex/commands/codex.md +18 -65
  71. package/src/tools/codex/skills/{droid-codex → codex}/SKILL.md +64 -45
  72. package/{dist/tools/codex/skills/droid-codex → src/tools/codex/skills/codex}/references/loading.md +94 -55
  73. package/src/tools/comments/.claude-plugin/plugin.json +1 -1
  74. package/src/tools/comments/TOOL.yaml +4 -3
  75. package/src/tools/comments/commands/comments.md +12 -14
  76. package/{dist/tools/comments/skills/droid-comments → src/tools/comments/skills/comments}/SKILL.md +3 -1
  77. package/src/tools/project/.claude-plugin/plugin.json +1 -1
  78. package/src/tools/project/TOOL.yaml +4 -3
  79. package/src/tools/project/commands/project.md +12 -27
  80. package/src/tools/project/skills/{droid-project → project}/SKILL.md +12 -11
  81. package/src/tools/tech-design/.claude-plugin/plugin.json +1 -1
  82. package/src/tools/tech-design/TOOL.yaml +4 -3
  83. package/src/tools/tech-design/commands/tech-design.md +18 -80
  84. package/{dist/tools/tech-design/skills/droid-tech-design → src/tools/tech-design/skills/tech-design}/SKILL.md +1 -1
  85. package/dist/tools/code-review/skills/droid-code-review/SKILL.md +0 -55
  86. package/dist/tools/codex/skills/droid-codex/scripts/git-finish-write.d.ts.map +0 -1
  87. package/dist/tools/codex/skills/droid-codex/scripts/git-preamble.d.ts.map +0 -1
  88. package/dist/tools/codex/skills/droid-codex/scripts/git-start-write.d.ts.map +0 -1
  89. package/src/tools/code-review/skills/droid-code-review/SKILL.md +0 -55
  90. /package/dist/tools/brain/skills/{droid-brain → brain}/references/metadata.md +0 -0
  91. /package/dist/tools/brain/skills/{droid-brain → brain}/references/naming.md +0 -0
  92. /package/dist/tools/brain/skills/{droid-brain → brain}/references/templates.md +0 -0
  93. /package/dist/tools/brain/skills/{droid-brain → brain}/references/workflows.md +0 -0
  94. /package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/templates.md +0 -0
  95. /package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/workflows.md +0 -0
  96. /package/dist/tools/codex/skills/{droid-codex → codex}/references/creating.md +0 -0
  97. /package/dist/tools/codex/skills/{droid-codex → codex}/references/decisions.md +0 -0
  98. /package/dist/tools/codex/skills/{droid-codex → codex}/references/topics.md +0 -0
  99. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.d.ts +0 -0
  100. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.ts +0 -0
  101. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.d.ts +0 -0
  102. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.ts +0 -0
  103. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-scripts.test.ts +0 -0
  104. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.d.ts +0 -0
  105. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.ts +0 -0
  106. /package/dist/tools/project/skills/{droid-project → project}/references/changelog.md +0 -0
  107. /package/dist/tools/project/skills/{droid-project → project}/references/creating.md +0 -0
  108. /package/dist/tools/project/skills/{droid-project → project}/references/loading.md +0 -0
  109. /package/dist/tools/project/skills/{droid-project → project}/references/templates.md +0 -0
  110. /package/dist/tools/project/skills/{droid-project → project}/references/updating.md +0 -0
  111. /package/dist/tools/project/skills/{droid-project → project}/references/versioning.md +0 -0
  112. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/draft.md +0 -0
  113. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/gaps.md +0 -0
  114. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/publish.md +0 -0
  115. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/research-doc-template.md +0 -0
  116. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/rollup-template.md +0 -0
  117. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/start.md +0 -0
  118. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/think.md +0 -0
  119. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/thought-doc-template.md +0 -0
  120. /package/src/tools/brain/skills/{droid-brain → brain}/references/metadata.md +0 -0
  121. /package/src/tools/brain/skills/{droid-brain → brain}/references/naming.md +0 -0
  122. /package/src/tools/brain/skills/{droid-brain → brain}/references/templates.md +0 -0
  123. /package/src/tools/brain/skills/{droid-brain → brain}/references/workflows.md +0 -0
  124. /package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/templates.md +0 -0
  125. /package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/workflows.md +0 -0
  126. /package/src/tools/codex/skills/{droid-codex → codex}/references/creating.md +0 -0
  127. /package/src/tools/codex/skills/{droid-codex → codex}/references/decisions.md +0 -0
  128. /package/src/tools/codex/skills/{droid-codex → codex}/references/topics.md +0 -0
  129. /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.ts +0 -0
  130. /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.ts +0 -0
  131. /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-scripts.test.ts +0 -0
  132. /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.ts +0 -0
  133. /package/src/tools/project/skills/{droid-project → project}/references/changelog.md +0 -0
  134. /package/src/tools/project/skills/{droid-project → project}/references/creating.md +0 -0
  135. /package/src/tools/project/skills/{droid-project → project}/references/loading.md +0 -0
  136. /package/src/tools/project/skills/{droid-project → project}/references/templates.md +0 -0
  137. /package/src/tools/project/skills/{droid-project → project}/references/updating.md +0 -0
  138. /package/src/tools/project/skills/{droid-project → project}/references/versioning.md +0 -0
  139. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/draft.md +0 -0
  140. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/gaps.md +0 -0
  141. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/publish.md +0 -0
  142. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/research-doc-template.md +0 -0
  143. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/rollup-template.md +0 -0
  144. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/start.md +0 -0
  145. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/think.md +0 -0
  146. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/thought-doc-template.md +0 -0
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: droid-project
2
+ name: project
3
3
  description: "Persistent project context for AI memory across sessions. Use when working on multi-session features, refactors, or any work that benefits from accumulated context. User prompts like 'load the project', 'update project context', 'what's the current project?'."
4
4
  globs:
5
5
  - "**/PROJECT.md"
@@ -33,24 +33,25 @@ Chat history disappears. Projects persist.
33
33
  - If `projects_dir` is configured → use **ONLY** that path (do NOT also search defaults)
34
34
  - If not configured → use the default for current AI tool
35
35
 
36
- | Setting | Default | Description |
37
- |---------|---------|-------------|
36
+ | Setting | Default | Description |
37
+ | -------------- | ----------- | ------------------------------------------------- |
38
38
  | `projects_dir` | (see below) | Where projects are stored (use ONE location only) |
39
- | `preset` | `markdown` | Output format: `markdown` or `obsidian` |
39
+ | `preset` | `markdown` | Output format: `markdown` or `obsidian` |
40
40
 
41
41
  Default `projects_dir` by AI tool (only if overrides.yaml is missing or lacks `projects_dir`):
42
+
42
43
  - **claude-code**: `~/.claude/projects`
43
44
  - **opencode**: `~/.config/opencode/projects`
44
45
 
45
46
  ## Commands
46
47
 
47
- | Command | Action |
48
- |---------|--------|
49
- | `/project` | List and select a project |
50
- | `/project {keywords}` | **Search** for existing project (fuzzy-match and load) |
51
- | `/project create {name}` | Create new project (requires `create` keyword) |
52
- | `/project create --from codex:{name}` | Create project seeded with codex context |
53
- | `/project update` | Update from conversation context |
48
+ | Command | Action |
49
+ | ------------------------------------- | ------------------------------------------------------ |
50
+ | `/project` | List and select a project |
51
+ | `/project {keywords}` | **Search** for existing project (fuzzy-match and load) |
52
+ | `/project create {name}` | Create new project (requires `create` keyword) |
53
+ | `/project create --from codex:{name}` | Create project seeded with codex context |
54
+ | `/project update` | Update from conversation context |
54
55
 
55
56
  **IMPORTANT:** The default action for `/project {keywords}` is to **SEARCH** for existing projects, NOT create. Only use `/project create {name}` when the user explicitly wants to create a new project.
56
57
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-tech-design",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Technical design authoring tool for engineers. Create structured tech design docs with /tech-design start, iterate in brain, publish to codex. Three-document approach: research doc (codebase discoveries) + thought doc (design workspace) + roll-up (clean summary for review).",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,14 +1,15 @@
1
1
  name: tech-design
2
2
  description: "Technical design authoring tool for engineers. Create structured tech design docs with /tech-design start, iterate in brain, publish to codex. Three-document approach: research doc (codebase discoveries) + thought doc (design workspace) + roll-up (clean summary for review)."
3
- version: 0.1.0
3
+ version: 0.2.0
4
4
  status: beta
5
5
 
6
6
  includes:
7
7
  skills:
8
- - name: droid-tech-design
8
+ - name: tech-design
9
9
  required: true
10
10
  commands:
11
- - tech-design
11
+ - name: tech-design
12
+ is_alias: false
12
13
  agents: []
13
14
 
14
15
  dependencies:
@@ -1,93 +1,31 @@
1
1
  ---
2
- description: Write, iterate, and publish technical design documents using a two-document approach - messy thought docs in brain, clean roll-ups in codex
2
+ name: tech-design
3
+ description: "Write, iterate, and publish technical design documents using a three-document approach - research doc, thought doc, and roll-up"
3
4
  argument-hint: "[start --from codex:{project} | draft [section] | think [topic] | gaps | publish]"
4
- allowed-tools: [Read, Write, Edit, Glob, Grep, Bash(gh:*), Bash(git:*), Bash(mkdir:*), Task]
5
5
  ---
6
6
 
7
7
  # /tech-design
8
8
 
9
- Entry point for technical design authoring. See the **tech-design skill** for full behavior.
9
+ **User invoked:** `/tech-design $ARGUMENTS`
10
10
 
11
- > Tech designs are where architectural decisions get made. Make them AI-friendly.
12
-
13
- ## Arguments
14
-
15
- $ARGUMENTS
16
-
17
- ## Why `/tech-design` not `/design`?
18
-
19
- Leaves `/design` open for actual design tooling (Figma workflows, design system docs, UI/UX review).
20
-
21
- ## Prerequisites
22
-
23
- Before first use, verify:
24
-
25
- 1. **Brain configured** - For thought doc drafting
26
- 2. **Codex configured** - For PRD context and publishing
27
- 3. **gh CLI** - For creating PRs
28
-
29
- ## Usage
30
-
31
- ```bash
32
- # Core Authoring (v1)
33
- /tech-design start --from codex:{project} # Create thought doc, pull PRD/DESIGN context
34
- /tech-design draft [section] # Auto-generate from PRD + codebase research
35
- /tech-design think [topic] # Guided exploration, stress-test ideas
36
- /tech-design gaps # Checklist of missing/empty sections
37
- /tech-design publish # Generate roll-up + thought doc, open PR to codex
38
-
39
- # Self-Review & Interaction (v2 - not yet implemented)
40
- # /tech-design critic [persona] # Multi-persona review with severity scoring
41
- # /tech-design respond {question} # Author tool: search thought doc to draft reply
42
- # /tech-design ask {question} # Reviewer tool: search both docs to answer questions
43
- ```
44
-
45
- ## Configuration
46
-
47
- Tech-design has no configuration of its own. It delegates to:
48
-
49
- - **Brain skill** - Thought doc location (`brain_dir`, `inbox_folder`)
50
- - **Codex skill** - Repository location (`codex_repo`)
51
-
52
- ## Behavior
53
-
54
- Refer to the tech-design skill for:
55
-
56
- - **Starting**: How to create thought doc from codex context
57
- - **Drafting**: Research-first, structure-second content generation
58
- - **Thinking**: Guided exploration to stress-test ideas
59
- - **Gap Analysis**: What sections are missing or empty
60
- - **Publishing**: Generate clean roll-up and create PR
61
-
62
- The skill's `references/` folder contains detailed procedures for each workflow.
63
-
64
- ## Two-Document Approach
65
-
66
- | Document | Purpose | Location |
67
- | --------------- | --------------------------------------- | ------------- |
68
- | **Thought doc** | Messy iteration, @mentions, exploration | Brain |
69
- | **Roll-up** | Clean, reviewable, decision-focused | Codex project |
70
-
71
- Both documents published to codex on `/tech-design publish` for full transparency.
11
+ **Your task:** Invoke the **tech-design skill** with these arguments.
72
12
 
73
13
  ## Examples
74
14
 
75
- ```bash
76
- # Start a new tech design from codex project context
77
- /tech-design start --from codex:transaction-templates
78
-
79
- # Draft the entire doc from PRD and codebase research
80
- /tech-design draft
81
-
82
- # Explore a specific idea before committing to it
83
- /tech-design think "Should we use events or polling for status updates?"
15
+ - `/tech-design start --from codex:billing-v2` → Create research + thought docs from codex project
16
+ - `/tech-design draft rollout` Auto-generate the rollout section
17
+ - `/tech-design think API design` → Guided exploration of API design, update research doc
18
+ - `/tech-design gaps` → Show checklist of missing/empty sections
19
+ - `/tech-design publish` Generate roll-up and publish to codex
84
20
 
85
- # Draft just the rollout section
86
- /tech-design draft rollout
21
+ ## Quick Reference
87
22
 
88
- # See what's missing
89
- /tech-design gaps
90
-
91
- # Publish to codex when ready for review
92
- /tech-design publish
93
23
  ```
24
+ /tech-design start --from codex:{project} # Create research + thought docs
25
+ /tech-design draft [section] # Auto-generate section
26
+ /tech-design think [topic] # Guided exploration
27
+ /tech-design gaps # Missing sections checklist
28
+ /tech-design publish # Publish to codex
29
+ ```
30
+
31
+ See the **tech-design skill** for complete documentation and procedures.
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: droid-tech-design
2
+ name: tech-design
3
3
  description: "Technical design authoring with three-document approach - research doc (codebase discoveries), thought doc (design iteration), and roll-up (clean summary). Use when writing tech designs, drafting sections, exploring architectural ideas, or publishing to codex. User prompts like 'start tech design for X', 'draft the rollout section', 'let's think through the API design', 'publish this to codex'."
4
4
  globs: []
5
5
  alwaysApply: false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderful/droid",
3
- "version": "0.26.0",
3
+ "version": "0.27.1",
4
4
  "description": "AI workflow toolkit for sharing skills, commands, and agents across the team",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,7 +29,9 @@ describe('Badge', () => {
29
29
  const types = ['skill', 'command', 'agent'] as const;
30
30
  for (const type of types) {
31
31
  const { lastFrame } = render(<Badge type={type} />);
32
- expect(lastFrame()).toContain(type.charAt(0).toUpperCase() + type.slice(1));
32
+ expect(lastFrame()).toContain(
33
+ type.charAt(0).toUpperCase() + type.slice(1),
34
+ );
33
35
  }
34
36
  });
35
37
  });
@@ -44,7 +46,7 @@ describe('ComponentBadges', () => {
44
46
  { name: 'skill1', required: true },
45
47
  { name: 'skill2', required: false },
46
48
  ],
47
- commands: ['cmd1'],
49
+ commands: [{ name: 'cmd1', is_alias: false }],
48
50
  agents: [],
49
51
  },
50
52
  };
@@ -63,7 +65,11 @@ describe('ComponentBadges', () => {
63
65
  it('renders singular form for single item', () => {
64
66
  const singleSkillTool: ToolManifest = {
65
67
  ...mockTool,
66
- includes: { skills: [{ name: 'skill1', required: true }], commands: [], agents: [] },
68
+ includes: {
69
+ skills: [{ name: 'skill1', required: true }],
70
+ commands: [],
71
+ agents: [],
72
+ },
67
73
  };
68
74
  const { lastFrame } = render(<ComponentBadges tool={singleSkillTool} />);
69
75
  expect(lastFrame()).toContain('1 skill');
@@ -82,7 +88,7 @@ describe('ComponentBadges', () => {
82
88
  ...mockTool,
83
89
  includes: {
84
90
  skills: [{ name: 's1', required: true }],
85
- commands: ['c1'],
91
+ commands: [{ name: 'c1', is_alias: false }],
86
92
  agents: ['a1'],
87
93
  },
88
94
  };
@@ -14,7 +14,7 @@ import {
14
14
  import { configExists, loadConfig, getAutoUpdateConfig } from '../lib/config';
15
15
  import { Platform, type ConfigOption, type ToolManifest } from '../lib/types';
16
16
  import { getVersion } from '../lib/version';
17
- import { runToolMigrations } from '../lib/migrations';
17
+ import { runPackageMigrations } from '../lib/migrations';
18
18
  import { type Tab, type View } from './tui/types';
19
19
  import { colors, MAX_VISIBLE_ITEMS } from './tui/constants';
20
20
  import { TabBar } from './tui/components/TabBar';
@@ -72,10 +72,10 @@ function App() {
72
72
  },
73
73
  });
74
74
 
75
- // Run droid meta-tool migration on startup (sync installed tools across platforms)
75
+ // Run droid package migrations on startup (sync installed tools across platforms)
76
76
  useEffect(() => {
77
- const droidVersion = getVersion();
78
- runToolMigrations('droid', droidVersion);
77
+ const packageVersion = getVersion();
78
+ runPackageMigrations(packageVersion);
79
79
  }, []);
80
80
 
81
81
  // Auto-update app if enabled and update available
@@ -153,6 +153,73 @@ function createPlatformSyncMigration(version: string): Migration {
153
153
  };
154
154
  }
155
155
 
156
+ /**
157
+ * Migration: Remove droid- prefix from config skill names
158
+ *
159
+ * After PR #145, all skill names in tool manifests are unprefixed (brain, codex, etc.)
160
+ * This migration updates config entries to match:
161
+ * - droid-brain → brain
162
+ * - droid-codex → codex
163
+ * - droid-project → project
164
+ * - etc.
165
+ */
166
+ function createConfigSkillNameMigration(version: string): Migration {
167
+ return {
168
+ version,
169
+ description: 'Remove droid- prefix from config skill names',
170
+ up: () => {
171
+ const config = loadConfig();
172
+ let configChanged = false;
173
+ const originalPlatform = config.platform;
174
+
175
+ // Check both platforms
176
+ for (const platformKey of [Platform.ClaudeCode, Platform.OpenCode]) {
177
+ if (!config.platforms[platformKey]) continue;
178
+
179
+ config.platform = platformKey;
180
+ const trackedTools = getPlatformTools(config);
181
+ const skillNames = Object.keys(trackedTools);
182
+
183
+ for (const skillName of skillNames) {
184
+ // Skip if already unprefixed or is the special 'droid' tool
185
+ if (!skillName.startsWith('droid-') || skillName === 'droid') {
186
+ continue;
187
+ }
188
+
189
+ const unprefixedName = skillName.replace(/^droid-/, '');
190
+
191
+ // Only migrate if unprefixed name doesn't already exist
192
+ if (!trackedTools[unprefixedName]) {
193
+ trackedTools[unprefixedName] = trackedTools[skillName];
194
+ delete trackedTools[skillName];
195
+ configChanged = true;
196
+ }
197
+ }
198
+
199
+ if (configChanged) {
200
+ setPlatformTools(config, trackedTools);
201
+ }
202
+ }
203
+
204
+ config.platform = originalPlatform;
205
+ if (configChanged) {
206
+ saveConfig(config);
207
+ }
208
+ },
209
+ };
210
+ }
211
+
212
+ /**
213
+ * Registry of package-level migrations
214
+ * These run when the @orderful/droid npm package updates
215
+ * Triggered by package version from package.json (e.g., 0.26.0)
216
+ * Run at TUI startup
217
+ */
218
+ const PACKAGE_MIGRATIONS: Migration[] = [
219
+ createPlatformSyncMigration('0.25.0'),
220
+ createConfigSkillNameMigration('0.27.0'),
221
+ ];
222
+
156
223
  /**
157
224
  * Registry of all tool migrations
158
225
  * Key: tool name (e.g., "brain", "comments")
@@ -169,8 +236,6 @@ const TOOL_MIGRATIONS: Record<string, Migration[]> = {
169
236
  comments: [createConfigDirMigration('droid-comments', '0.2.6')],
170
237
  project: [createConfigDirMigration('droid-project', '0.1.5')],
171
238
  coach: [createConfigDirMigration('droid-coach', '0.1.3')],
172
- // Global migration for the droid meta-tool
173
- droid: [createPlatformSyncMigration('0.25.0')],
174
239
  };
175
240
 
176
241
  /**
@@ -185,7 +250,18 @@ export function getToolMigrations(toolName: string): Migration[] {
185
250
  */
186
251
  export function getLastMigratedVersion(toolName: string): string {
187
252
  const config = loadConfig();
188
- return config.migrations?.[toolName] ?? '0.0.0';
253
+
254
+ // Check new location first
255
+ if (config.migrations?.tools?.[toolName]) {
256
+ return config.migrations.tools[toolName];
257
+ }
258
+
259
+ // Fall back to old location (backward compatibility)
260
+ if (config.migrations && typeof config.migrations[toolName] === 'string') {
261
+ return config.migrations[toolName] as string;
262
+ }
263
+
264
+ return '0.0.0';
189
265
  }
190
266
 
191
267
  /**
@@ -196,10 +272,22 @@ export function setLastMigratedVersion(
196
272
  version: string,
197
273
  ): void {
198
274
  const config = loadConfig();
275
+
276
+ // Ensure new structure exists
199
277
  if (!config.migrations) {
200
278
  config.migrations = {};
201
279
  }
202
- config.migrations[toolName] = version;
280
+ if (!config.migrations.tools) {
281
+ config.migrations.tools = {};
282
+ }
283
+
284
+ config.migrations.tools[toolName] = version;
285
+
286
+ // Clean up old location if it exists
287
+ if (typeof config.migrations[toolName] === 'string') {
288
+ delete config.migrations[toolName];
289
+ }
290
+
203
291
  saveConfig(config);
204
292
  }
205
293
 
@@ -273,3 +361,65 @@ export function runToolMigrations(
273
361
 
274
362
  return runMigrations(toolName, lastMigrated, installedVersion);
275
363
  }
364
+
365
+ /**
366
+ * Run package-level migrations
367
+ * Call this on TUI startup with package version from package.json
368
+ */
369
+ export function runPackageMigrations(packageVersion: string): {
370
+ success: boolean;
371
+ error?: string;
372
+ } {
373
+ const config = loadConfig();
374
+ const lastMigrated = config.migrations?.package ?? '0.0.0';
375
+
376
+ // Only run if the package version is newer than last migrated
377
+ if (compareSemver(packageVersion, lastMigrated) <= 0) {
378
+ return { success: true };
379
+ }
380
+
381
+ // Filter migrations that need to run
382
+ const pendingMigrations = PACKAGE_MIGRATIONS.filter((m) => {
383
+ const afterFrom = compareSemver(m.version, lastMigrated) > 0;
384
+ const beforeOrAtTo = compareSemver(m.version, packageVersion) <= 0;
385
+ return afterFrom && beforeOrAtTo;
386
+ });
387
+
388
+ if (pendingMigrations.length === 0) {
389
+ // No migrations to run, but still update the version marker
390
+ config.migrations = config.migrations || {};
391
+ config.migrations.package = packageVersion;
392
+ saveConfig(config);
393
+ return { success: true };
394
+ }
395
+
396
+ const configDir = getConfigDir();
397
+
398
+ for (const migration of pendingMigrations) {
399
+ try {
400
+ migration.up(configDir);
401
+ logMigration('package', lastMigrated, migration.version, 'OK');
402
+ } catch (error) {
403
+ const errorMessage =
404
+ error instanceof Error ? error.message : String(error);
405
+ logMigration(
406
+ 'package',
407
+ lastMigrated,
408
+ migration.version,
409
+ 'FAILED',
410
+ errorMessage,
411
+ );
412
+ // Don't update version marker on failure - will retry next time
413
+ return {
414
+ success: false,
415
+ error: `Package migration ${migration.version} failed: ${errorMessage}`,
416
+ };
417
+ }
418
+ }
419
+
420
+ // All migrations succeeded, update version marker
421
+ config.migrations = config.migrations || {};
422
+ config.migrations.package = packageVersion;
423
+ saveConfig(config);
424
+ return { success: true };
425
+ }