@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
@@ -22,7 +22,7 @@
22
22
  {
23
23
  "name": "droid-brain",
24
24
  "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.",
25
- "version": "0.2.3",
25
+ "version": "0.3.0",
26
26
  "source": {
27
27
  "source": "github",
28
28
  "repo": "orderful/droid",
@@ -35,7 +35,7 @@
35
35
  {
36
36
  "name": "droid-coach",
37
37
  "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.",
38
- "version": "0.1.3",
38
+ "version": "0.2.0",
39
39
  "source": {
40
40
  "source": "github",
41
41
  "repo": "orderful/droid",
@@ -48,7 +48,7 @@
48
48
  {
49
49
  "name": "droid-code-review",
50
50
  "description": "Comprehensive code review using specialized agents. Reviews PRs, staged changes, branches, or specific files with confidence scoring.",
51
- "version": "0.1.2",
51
+ "version": "0.2.0",
52
52
  "source": {
53
53
  "source": "github",
54
54
  "repo": "orderful/droid",
@@ -61,7 +61,7 @@
61
61
  {
62
62
  "name": "droid-codex",
63
63
  "description": "Shared organizational knowledge - PRDs, tech designs, domains, proposals, patterns, and explored topics. Use when loading project context, searching codex, capturing decisions, or creating new entries.",
64
- "version": "0.1.5",
64
+ "version": "0.1.6",
65
65
  "source": {
66
66
  "source": "github",
67
67
  "repo": "orderful/droid",
@@ -74,7 +74,7 @@
74
74
  {
75
75
  "name": "droid-comments",
76
76
  "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.",
77
- "version": "0.2.6",
77
+ "version": "0.3.0",
78
78
  "source": {
79
79
  "source": "github",
80
80
  "repo": "orderful/droid",
@@ -87,7 +87,7 @@
87
87
  {
88
88
  "name": "droid-project",
89
89
  "description": "Manage project context files for persistent AI memory across sessions. Load, update, or create project context before working on multi-session features.",
90
- "version": "0.2.0",
90
+ "version": "0.3.0",
91
91
  "source": {
92
92
  "source": "github",
93
93
  "repo": "orderful/droid",
@@ -100,7 +100,7 @@
100
100
  {
101
101
  "name": "droid-tech-design",
102
102
  "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).",
103
- "version": "0.1.0",
103
+ "version": "0.2.0",
104
104
  "source": {
105
105
  "source": "github",
106
106
  "repo": "orderful/droid",
package/AGENTS.md CHANGED
@@ -50,12 +50,13 @@ src/
50
50
 
51
51
  We use **two** terminal UI libraries for different purposes:
52
52
 
53
- | Library | Purpose | Used In |
54
- |---------|---------|---------|
55
- | **Ink** | Full React-based TUI dashboard | `tui.tsx`, `tui/components/`, `tui/views/` |
53
+ | Library | Purpose | Used In |
54
+ | ------------ | ------------------------------------------- | ------------------------------------------ |
55
+ | **Ink** | Full React-based TUI dashboard | `tui.tsx`, `tui/components/`, `tui/views/` |
56
56
  | **Inquirer** | Simple CLI prompts (select, confirm, input) | `skills.ts`, `setup.ts`, `skill-config.ts` |
57
57
 
58
58
  **Why both?**
59
+
59
60
  - **Ink** is for the interactive dashboard—stateful, component-based, keyboard navigation
60
61
  - **Inquirer** is for quick sequential prompts ("Which tool?", "Configure now? y/n")
61
62
 
@@ -78,13 +79,12 @@ Don't consolidate them. Using Ink for simple prompts would be overkill.
78
79
 
79
80
  Things that will bite you if you don't know:
80
81
 
81
- | Gotcha | Why | What to do |
82
- |--------|-----|------------|
83
- | Single-line YAML descriptions | Claude Code's frontmatter parser doesn't handle multiline YAML (`>-`) | Use single-line quoted strings in frontmatter |
84
- | Skill directories have `droid-` prefix | Workaround for Claude Code bug where directories matching command names block invocation | Name skill dirs `droid-{name}/`, commands stay as `{name}.md` |
85
- | Bump tool version when skill content changes | Users won't get updates otherwise | Patch bump the tool's TOOL.yaml version |
86
- | Config-first in commands | User overrides must take precedence | Always read `~/.droid/skills/{skill}/overrides.yaml` before using defaults |
87
- | Changeset package name | npm package is scoped | Use `"@orderful/droid"` not `"droid"` in changesets |
82
+ | Gotcha | Why | What to do |
83
+ | -------------------------------------------- | --------------------------------------------------------------------- | -------------------------------------------------------------------------- |
84
+ | Single-line YAML descriptions | Claude Code's frontmatter parser doesn't handle multiline YAML (`>-`) | Use single-line quoted strings in frontmatter |
85
+ | Bump tool version when skill content changes | Users won't get updates otherwise | Patch bump the tool's TOOL.yaml version |
86
+ | Config-first in commands | User overrides must take precedence | Always read `~/.droid/skills/{skill}/overrides.yaml` before using defaults |
87
+ | Changeset package name | npm package is scoped | Use `"@orderful/droid"` not `"droid"` in changesets |
88
88
 
89
89
  ## Testing
90
90
 
@@ -96,6 +96,7 @@ bun run screenshot # On-demand TUI screenshot for visual verification
96
96
  ```
97
97
 
98
98
  **When to run what:**
99
+
99
100
  - Changed core logic (`lib/`) → `bun test src/`
100
101
  - Changed TUI components → `bun run test:tui`
101
102
  - Visual changes you want to verify → `bun run screenshot`
@@ -107,7 +108,7 @@ bun run screenshot # On-demand TUI screenshot for visual verification
107
108
  2. Add `SKILL.md` with frontmatter:
108
109
  ```yaml
109
110
  ---
110
- name: droid-{skill}
111
+ name: { skill }
111
112
  description: "{What it does}. Use when {scenarios}. User prompts like {examples}."
112
113
  globs: []
113
114
  alwaysApply: false
@@ -124,16 +125,16 @@ bun run screenshot # On-demand TUI screenshot for visual verification
124
125
 
125
126
  Each tool has a specific domain. Know where your feature belongs:
126
127
 
127
- | Tool | Purpose | Add skills here when... |
128
- |------|---------|------------------------|
129
- | `brain` | Personal scratchpad, planning docs | Working with brain vault, planning, research |
130
- | `coach` | Learning-mode assistance | Educational interactions, scaffolding |
131
- | `code-review` | PR and code review | Review-related features |
132
- | `codex` | Shared org knowledge (PRDs, designs) | Codex content management, org context |
133
- | `comments` | Inline @mentions in code | Comment handling, async collaboration |
134
- | `droid` | **Meta-tool only** - updates, discovery | NEVER add skills here - create new tool instead |
135
- | `project` | Personal project context | Project file management |
136
- | `tech-design` | Tech design authoring | Tech design workflows |
128
+ | Tool | Purpose | Add skills here when... |
129
+ | ------------- | --------------------------------------- | ----------------------------------------------- |
130
+ | `brain` | Personal scratchpad, planning docs | Working with brain vault, planning, research |
131
+ | `coach` | Learning-mode assistance | Educational interactions, scaffolding |
132
+ | `code-review` | PR and code review | Review-related features |
133
+ | `codex` | Shared org knowledge (PRDs, designs) | Codex content management, org context |
134
+ | `comments` | Inline @mentions in code | Comment handling, async collaboration |
135
+ | `droid` | **Meta-tool only** - updates, discovery | NEVER add skills here - create new tool instead |
136
+ | `project` | Personal project context | Project file management |
137
+ | `tech-design` | Tech design authoring | Tech design workflows |
137
138
 
138
139
  > **Important:** The `droid` tool is special. It only handles update awareness and tool discovery.
139
140
  > If you're building a full-featured capability (like tech-design, codex, brain), create a **new tool**.
@@ -141,6 +142,7 @@ Each tool has a specific domain. Know where your feature belongs:
141
142
  ## Adding a New Tool
142
143
 
143
144
  Create a new tool when the feature:
145
+
144
146
  - Has its own user-facing identity (e.g., `/tech-design`, `/deploy`)
145
147
  - Doesn't naturally belong to an existing tool's domain
146
148
  - Needs its own versioning/release cycle
@@ -150,24 +152,26 @@ Create a new tool when the feature:
150
152
 
151
153
  1. Create directory: `src/tools/{tool}/`
152
154
  2. Add `TOOL.yaml`:
155
+
153
156
  ```yaml
154
- name: {tool}
157
+ name: { tool }
155
158
  description: "What this tool does"
156
159
  version: 0.1.0
157
160
  status: beta
158
161
 
159
162
  includes:
160
163
  skills:
161
- - name: droid-{tool}
164
+ - name: { tool }
162
165
  required: true
163
166
  commands:
164
- - name: {tool}
167
+ - name: { tool }
165
168
  required: false
166
169
  agents: []
167
170
 
168
171
  dependencies: []
169
172
  ```
170
- 3. Create skill: `src/tools/{tool}/skills/droid-{tool}/SKILL.md`
173
+
174
+ 3. Create skill: `src/tools/{tool}/skills/{tool}/SKILL.md`
171
175
  4. Create command: `src/tools/{tool}/commands/{tool}.md`
172
176
  5. Add changeset: `.changeset/{tool}-initial.md`
173
177
 
@@ -177,10 +181,10 @@ Create a new tool when the feature:
177
181
 
178
182
  Decisions that affect how you work:
179
183
 
180
- | Decision | Rationale |
181
- |----------|-----------|
182
- | "Scripts" not "tools" for skill CLIs | Avoids terminology collision—droid "tools" are packages, skill "scripts" are executables |
183
- | Parallel skills (`{skill}-next`) for risky refactors | Dogfood new implementation alongside original, swap when confident |
184
- | Each .md owns its metadata | Single source of truth per artifact, contributors can bring existing skills as-is |
185
- | Ink + Inquirer (not consolidated) | Ink for stateful TUI, Inquirer for simple prompts—right tool for each job |
186
- | Collision detection over prefixing | Detect conflicts at install time rather than polluting command names with prefixes |
184
+ | Decision | Rationale |
185
+ | ---------------------------------------------------- | ---------------------------------------------------------------------------------------- |
186
+ | "Scripts" not "tools" for skill CLIs | Avoids terminology collision—droid "tools" are packages, skill "scripts" are executables |
187
+ | Parallel skills (`{skill}-next`) for risky refactors | Dogfood new implementation alongside original, swap when confident |
188
+ | Each .md owns its metadata | Single source of truth per artifact, contributors can bring existing skills as-is |
189
+ | Ink + Inquirer (not consolidated) | Ink for stateful TUI, Inquirer for simple prompts—right tool for each job |
190
+ | Collision detection over prefixing | Detect conflicts at install time rather than polluting command names with prefixes |
package/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # @orderful/droid
2
2
 
3
+ ## 0.27.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#148](https://github.com/Orderful/droid/pull/148) [`7b030da`](https://github.com/Orderful/droid/commit/7b030da044551b66674f06b0fb8e31257b5a1fd4) Thanks [@frytyler](https://github.com/frytyler)! - Fix installation detection after commands-skills merge
8
+
9
+ **Bug fix:**
10
+ - Add package migration (v0.27.0) to update config entries from `droid-*` to unprefixed names
11
+ - Fixes TUI showing tools as not installed after upgrade from v0.26.0
12
+ - Migration handles both Claude Code and OpenCode platforms automatically
13
+ - Runs seamlessly on TUI startup - no user action required
14
+
15
+ **Technical details:**
16
+ - Config entries renamed: `droid-brain` → `brain`, `droid-codex` → `codex`, etc.
17
+ - Special `droid` tool preserved (not renamed)
18
+ - Platform switching continues to work correctly after migration
19
+
20
+ ## 0.27.0
21
+
22
+ ### Minor Changes
23
+
24
+ - [#145](https://github.com/Orderful/droid/pull/145) [`8bce17d`](https://github.com/Orderful/droid/commit/8bce17d98824e796573db1f8a640a8af786fc2d1) Thanks [@frytyler](https://github.com/frytyler)! - Remove droid- prefix from skills and fix command argument passing
25
+
26
+ **Breaking internal changes:**
27
+ - Skills renamed: `droid-brain` → `brain`, `droid-comments` → `comments`, etc.
28
+ - All skill directories now use unprefixed names
29
+ - Automatic cleanup removes old `droid-*` directories on upgrade
30
+
31
+ **Command improvements:**
32
+ - Commands now use explicit instruction pattern for better argument passing in OpenCode
33
+ - Each command file includes examples and quick reference
34
+ - Alias commands (e.g., `/scratchpad`) properly documented as aliases
35
+
36
+ **Platform compatibility:**
37
+ - OpenCode: Receives all commands (for autocomplete)
38
+ - Claude Code: Receives only alias commands (relies on unified skills/commands)
39
+ - Both platforms get unprefixed skill names
40
+
41
+ Tools updated: brain, coach, code-review, codex, comments, project, tech-design
42
+
43
+ ### Patch Changes
44
+
45
+ - [#146](https://github.com/Orderful/droid/pull/146) [`2c87b87`](https://github.com/Orderful/droid/commit/2c87b874a38b0f52d1edf77b2995e565f155f251) Thanks [@frytyler](https://github.com/frytyler)! - fix(codex): make CONTEXT.md generation synchronous by default with optional async
46
+
47
+ Changed auto-generation from async-only (with background agents) to flexible approach where LLM can choose synchronous (works everywhere) or asynchronous (Claude Code only). This fixes the issue where CONTEXT.md files were never being generated because background agents weren't working reliably.
48
+
3
49
  ## 0.26.0
4
50
 
5
51
  ### Minor Changes
package/dist/bin/droid.js CHANGED
@@ -392,7 +392,9 @@ function getToolsWithUpdates() {
392
392
  const toolsWithUpdates = [];
393
393
  for (const tool of bundledTools) {
394
394
  const requiredSkills = tool.includes.skills.filter((s) => s.required).map((s) => s.name);
395
- const isInstalled = requiredSkills.some((skillName) => skillName in installedTools);
395
+ const isInstalled = requiredSkills.some(
396
+ (skillName) => skillName in installedTools
397
+ );
396
398
  if (isInstalled) {
397
399
  const updateStatus = getToolUpdateStatus(tool.name);
398
400
  if (updateStatus.hasUpdate) {
@@ -613,27 +615,76 @@ function createPlatformSyncMigration(version2) {
613
615
  }
614
616
  };
615
617
  }
618
+ function createConfigSkillNameMigration(version2) {
619
+ return {
620
+ version: version2,
621
+ description: "Remove droid- prefix from config skill names",
622
+ up: () => {
623
+ const config = loadConfig();
624
+ let configChanged = false;
625
+ const originalPlatform = config.platform;
626
+ for (const platformKey of ["claude-code" /* ClaudeCode */, "opencode" /* OpenCode */]) {
627
+ if (!config.platforms[platformKey]) continue;
628
+ config.platform = platformKey;
629
+ const trackedTools = getPlatformTools(config);
630
+ const skillNames = Object.keys(trackedTools);
631
+ for (const skillName of skillNames) {
632
+ if (!skillName.startsWith("droid-") || skillName === "droid") {
633
+ continue;
634
+ }
635
+ const unprefixedName = skillName.replace(/^droid-/, "");
636
+ if (!trackedTools[unprefixedName]) {
637
+ trackedTools[unprefixedName] = trackedTools[skillName];
638
+ delete trackedTools[skillName];
639
+ configChanged = true;
640
+ }
641
+ }
642
+ if (configChanged) {
643
+ setPlatformTools(config, trackedTools);
644
+ }
645
+ }
646
+ config.platform = originalPlatform;
647
+ if (configChanged) {
648
+ saveConfig(config);
649
+ }
650
+ }
651
+ };
652
+ }
653
+ var PACKAGE_MIGRATIONS = [
654
+ createPlatformSyncMigration("0.25.0"),
655
+ createConfigSkillNameMigration("0.27.0")
656
+ ];
616
657
  var TOOL_MIGRATIONS = {
617
658
  brain: [createConfigDirMigration("droid-brain", "0.2.3")],
618
659
  comments: [createConfigDirMigration("droid-comments", "0.2.6")],
619
660
  project: [createConfigDirMigration("droid-project", "0.1.5")],
620
- coach: [createConfigDirMigration("droid-coach", "0.1.3")],
621
- // Global migration for the droid meta-tool
622
- droid: [createPlatformSyncMigration("0.25.0")]
661
+ coach: [createConfigDirMigration("droid-coach", "0.1.3")]
623
662
  };
624
663
  function getToolMigrations(toolName) {
625
664
  return TOOL_MIGRATIONS[toolName] ?? [];
626
665
  }
627
666
  function getLastMigratedVersion(toolName) {
628
667
  const config = loadConfig();
629
- return config.migrations?.[toolName] ?? "0.0.0";
668
+ if (config.migrations?.tools?.[toolName]) {
669
+ return config.migrations.tools[toolName];
670
+ }
671
+ if (config.migrations && typeof config.migrations[toolName] === "string") {
672
+ return config.migrations[toolName];
673
+ }
674
+ return "0.0.0";
630
675
  }
631
676
  function setLastMigratedVersion(toolName, version2) {
632
677
  const config = loadConfig();
633
678
  if (!config.migrations) {
634
679
  config.migrations = {};
635
680
  }
636
- config.migrations[toolName] = version2;
681
+ if (!config.migrations.tools) {
682
+ config.migrations.tools = {};
683
+ }
684
+ config.migrations.tools[toolName] = version2;
685
+ if (typeof config.migrations[toolName] === "string") {
686
+ delete config.migrations[toolName];
687
+ }
637
688
  saveConfig(config);
638
689
  }
639
690
  function runMigrations(toolName, fromVersion, toVersion) {
@@ -677,6 +728,48 @@ function runToolMigrations(toolName, installedVersion) {
677
728
  }
678
729
  return runMigrations(toolName, lastMigrated, installedVersion);
679
730
  }
731
+ function runPackageMigrations(packageVersion) {
732
+ const config = loadConfig();
733
+ const lastMigrated = config.migrations?.package ?? "0.0.0";
734
+ if (compareSemver(packageVersion, lastMigrated) <= 0) {
735
+ return { success: true };
736
+ }
737
+ const pendingMigrations = PACKAGE_MIGRATIONS.filter((m) => {
738
+ const afterFrom = compareSemver(m.version, lastMigrated) > 0;
739
+ const beforeOrAtTo = compareSemver(m.version, packageVersion) <= 0;
740
+ return afterFrom && beforeOrAtTo;
741
+ });
742
+ if (pendingMigrations.length === 0) {
743
+ config.migrations = config.migrations || {};
744
+ config.migrations.package = packageVersion;
745
+ saveConfig(config);
746
+ return { success: true };
747
+ }
748
+ const configDir = getConfigDir();
749
+ for (const migration of pendingMigrations) {
750
+ try {
751
+ migration.up(configDir);
752
+ logMigration("package", lastMigrated, migration.version, "OK");
753
+ } catch (error) {
754
+ const errorMessage = error instanceof Error ? error.message : String(error);
755
+ logMigration(
756
+ "package",
757
+ lastMigrated,
758
+ migration.version,
759
+ "FAILED",
760
+ errorMessage
761
+ );
762
+ return {
763
+ success: false,
764
+ error: `Package migration ${migration.version} failed: ${errorMessage}`
765
+ };
766
+ }
767
+ }
768
+ config.migrations = config.migrations || {};
769
+ config.migrations.package = packageVersion;
770
+ saveConfig(config);
771
+ return { success: true };
772
+ }
680
773
 
681
774
  // src/lib/skills.ts
682
775
  var DROID_SKILLS_START = "<!-- droid-skills-start -->";
@@ -861,6 +954,13 @@ function installSkill(skillName) {
861
954
  message: `Invalid skill manifest for '${skillName}'`
862
955
  };
863
956
  }
957
+ const toolManifest = loadToolManifest(toolDir);
958
+ if (!toolManifest) {
959
+ return {
960
+ success: false,
961
+ message: `Invalid tool manifest for tool containing '${skillName}'`
962
+ };
963
+ }
864
964
  if (manifest.dependencies) {
865
965
  for (const dep of manifest.dependencies) {
866
966
  if (!isToolInstalled(dep)) {
@@ -875,31 +975,39 @@ function installSkill(skillName) {
875
975
  const targetSkillDir = join7(skillsPath, skillName);
876
976
  const commandsPath = getCommandsInstallPath(config.platform);
877
977
  const tools = getPlatformTools(config);
878
- if (skillName.startsWith("droid-")) {
879
- const oldSkillName2 = skillName.replace(/^droid-/, "");
880
- const oldSkillDir = join7(skillsPath, oldSkillName2);
881
- if (existsSync5(oldSkillDir)) {
978
+ const renamedSkills = [
979
+ "comments",
980
+ "brain",
981
+ "project",
982
+ "coach",
983
+ "code-review",
984
+ "codex",
985
+ "tech-design",
986
+ "brain-obsidian"
987
+ ];
988
+ if (renamedSkills.includes(skillName)) {
989
+ const droidPrefixedName = `droid-${skillName}`;
990
+ const droidPrefixedDir = join7(skillsPath, droidPrefixedName);
991
+ if (existsSync5(droidPrefixedDir)) {
882
992
  try {
883
- rmSync2(oldSkillDir, { recursive: true });
993
+ rmSync2(droidPrefixedDir, { recursive: true });
884
994
  } catch (error) {
885
995
  console.warn(
886
- `Warning: Could not remove old skill directory ${oldSkillDir}: ${error}`
996
+ `Warning: Could not remove old skill directory ${droidPrefixedDir}: ${error}`
887
997
  );
888
998
  }
889
999
  }
890
- if (tools[oldSkillName2]) {
891
- delete tools[oldSkillName2];
1000
+ if (tools[droidPrefixedName]) {
1001
+ delete tools[droidPrefixedName];
892
1002
  setPlatformTools(config, tools);
893
1003
  saveConfig(config);
894
1004
  }
895
1005
  }
896
1006
  const commandsSource = join7(toolDir, "commands");
897
1007
  const agentsSource = join7(toolDir, "agents");
898
- const oldSkillName = skillName.startsWith("droid-") ? skillName.replace(/^droid-/, "") : null;
899
- const isAlreadyInstalled = tools[skillName] || oldSkillName && tools[oldSkillName];
1008
+ const isAlreadyInstalled = tools[skillName];
900
1009
  if (!isAlreadyInstalled) {
901
1010
  const toolName2 = basename(toolDir);
902
- const normalizedToolName = toolName2.replace(/^droid-/, "");
903
1011
  if (existsSync5(commandsSource)) {
904
1012
  const commandFiles = readdirSync4(commandsSource).filter(
905
1013
  (f) => f.endsWith(".md") && f.toLowerCase() !== "readme.md"
@@ -908,7 +1016,7 @@ function installSkill(skillName) {
908
1016
  const targetCommandPath = join7(commandsPath, file);
909
1017
  if (existsSync5(targetCommandPath)) {
910
1018
  const commandName = file.replace(".md", "");
911
- if (commandName === toolName2 || commandName === normalizedToolName) {
1019
+ if (commandName === toolName2) {
912
1020
  continue;
913
1021
  }
914
1022
  return {
@@ -982,10 +1090,18 @@ function installSkill(skillName) {
982
1090
  (f) => f.endsWith(".md") && f.toLowerCase() !== "readme.md"
983
1091
  );
984
1092
  for (const file of commandFiles) {
985
- const sourcePath = join7(commandsSource, file);
986
- const targetPath = join7(commandsPath, file);
987
- const content = readFileSync5(sourcePath, "utf-8");
988
- writeFileSync3(targetPath, content);
1093
+ const commandName = file.replace(".md", "");
1094
+ const commandMeta = toolManifest.includes.commands.find(
1095
+ (cmd) => (typeof cmd === "string" ? cmd : cmd.name) === commandName
1096
+ );
1097
+ const isAlias = typeof commandMeta === "object" && commandMeta.is_alias;
1098
+ const shouldInstall = config.platform === "opencode" /* OpenCode */ || isAlias;
1099
+ if (shouldInstall) {
1100
+ const sourcePath = join7(commandsSource, file);
1101
+ const targetPath = join7(commandsPath, file);
1102
+ const content = readFileSync5(sourcePath, "utf-8");
1103
+ writeFileSync3(targetPath, content);
1104
+ }
989
1105
  }
990
1106
  }
991
1107
  const installedAgents = [];
@@ -2985,8 +3101,8 @@ function App() {
2985
3101
  }
2986
3102
  });
2987
3103
  useEffect(() => {
2988
- const droidVersion = getVersion();
2989
- runToolMigrations("droid", droidVersion);
3104
+ const packageVersion = getVersion();
3105
+ runPackageMigrations(packageVersion);
2990
3106
  }, []);
2991
3107
  useEffect(() => {
2992
3108
  const autoUpdateConfig = getAutoUpdateConfig();