@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.
- package/.claude-plugin/marketplace.json +7 -7
- package/AGENTS.md +36 -32
- package/CHANGELOG.md +46 -0
- package/dist/bin/droid.js +140 -24
- package/dist/index.js +97 -25
- package/dist/lib/migrations.d.ts +8 -0
- package/dist/lib/migrations.d.ts.map +1 -1
- package/dist/lib/skills.d.ts.map +1 -1
- package/dist/lib/tools.d.ts.map +1 -1
- package/dist/lib/types.d.ts +10 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/tools/brain/.claude-plugin/plugin.json +1 -1
- package/dist/tools/brain/TOOL.yaml +7 -5
- package/dist/tools/brain/commands/brain.md +17 -49
- package/dist/tools/brain/commands/scratchpad.md +13 -50
- package/{src/tools/brain/skills/droid-brain → dist/tools/brain/skills/brain}/SKILL.md +5 -5
- package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/SKILL.md +8 -8
- package/dist/tools/coach/.claude-plugin/plugin.json +1 -1
- package/dist/tools/coach/TOOL.yaml +4 -3
- package/dist/tools/coach/commands/coach.md +14 -54
- package/{src/tools/coach/skills/droid-coach → dist/tools/coach/skills/coach}/SKILL.md +4 -3
- package/dist/tools/code-review/.claude-plugin/plugin.json +1 -1
- package/dist/tools/code-review/TOOL.yaml +4 -3
- package/dist/tools/code-review/commands/code-review.md +18 -102
- package/dist/tools/code-review/skills/code-review/SKILL.md +154 -0
- package/dist/tools/codex/.claude-plugin/plugin.json +1 -1
- package/dist/tools/codex/TOOL.yaml +4 -3
- package/dist/tools/codex/commands/codex.md +18 -65
- package/dist/tools/codex/skills/{droid-codex → codex}/SKILL.md +64 -45
- package/{src/tools/codex/skills/droid-codex → dist/tools/codex/skills/codex}/references/loading.md +94 -55
- package/dist/tools/codex/skills/codex/scripts/git-finish-write.d.ts.map +1 -0
- package/dist/tools/codex/skills/codex/scripts/git-preamble.d.ts.map +1 -0
- package/dist/tools/codex/skills/codex/scripts/git-start-write.d.ts.map +1 -0
- package/dist/tools/comments/.claude-plugin/plugin.json +1 -1
- package/dist/tools/comments/TOOL.yaml +4 -3
- package/dist/tools/comments/commands/comments.md +12 -14
- package/{src/tools/comments/skills/droid-comments → dist/tools/comments/skills/comments}/SKILL.md +3 -1
- package/dist/tools/project/.claude-plugin/plugin.json +1 -1
- package/dist/tools/project/TOOL.yaml +4 -3
- package/dist/tools/project/commands/project.md +12 -27
- package/dist/tools/project/skills/{droid-project → project}/SKILL.md +12 -11
- package/dist/tools/tech-design/.claude-plugin/plugin.json +1 -1
- package/dist/tools/tech-design/TOOL.yaml +4 -3
- package/dist/tools/tech-design/commands/tech-design.md +18 -80
- package/{src/tools/tech-design/skills/droid-tech-design → dist/tools/tech-design/skills/tech-design}/SKILL.md +1 -1
- package/package.json +1 -1
- package/src/commands/tui/components/Badge.test.tsx +10 -4
- package/src/commands/tui.tsx +4 -4
- package/src/lib/migrations.ts +154 -4
- package/src/lib/skills.test.ts +199 -74
- package/src/lib/skills.ts +55 -54
- package/src/lib/tools.ts +19 -12
- package/src/lib/types.ts +20 -5
- package/src/tools/brain/.claude-plugin/plugin.json +1 -1
- package/src/tools/brain/TOOL.yaml +7 -5
- package/src/tools/brain/commands/brain.md +17 -49
- package/src/tools/brain/commands/scratchpad.md +13 -50
- package/{dist/tools/brain/skills/droid-brain → src/tools/brain/skills/brain}/SKILL.md +5 -5
- package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/SKILL.md +8 -8
- package/src/tools/coach/.claude-plugin/plugin.json +1 -1
- package/src/tools/coach/TOOL.yaml +4 -3
- package/src/tools/coach/commands/coach.md +14 -54
- package/{dist/tools/coach/skills/droid-coach → src/tools/coach/skills/coach}/SKILL.md +4 -3
- package/src/tools/code-review/.claude-plugin/plugin.json +1 -1
- package/src/tools/code-review/TOOL.yaml +4 -3
- package/src/tools/code-review/commands/code-review.md +18 -102
- package/src/tools/code-review/skills/code-review/SKILL.md +154 -0
- package/src/tools/codex/.claude-plugin/plugin.json +1 -1
- package/src/tools/codex/TOOL.yaml +4 -3
- package/src/tools/codex/commands/codex.md +18 -65
- package/src/tools/codex/skills/{droid-codex → codex}/SKILL.md +64 -45
- package/{dist/tools/codex/skills/droid-codex → src/tools/codex/skills/codex}/references/loading.md +94 -55
- package/src/tools/comments/.claude-plugin/plugin.json +1 -1
- package/src/tools/comments/TOOL.yaml +4 -3
- package/src/tools/comments/commands/comments.md +12 -14
- package/{dist/tools/comments/skills/droid-comments → src/tools/comments/skills/comments}/SKILL.md +3 -1
- package/src/tools/project/.claude-plugin/plugin.json +1 -1
- package/src/tools/project/TOOL.yaml +4 -3
- package/src/tools/project/commands/project.md +12 -27
- package/src/tools/project/skills/{droid-project → project}/SKILL.md +12 -11
- package/src/tools/tech-design/.claude-plugin/plugin.json +1 -1
- package/src/tools/tech-design/TOOL.yaml +4 -3
- package/src/tools/tech-design/commands/tech-design.md +18 -80
- package/{dist/tools/tech-design/skills/droid-tech-design → src/tools/tech-design/skills/tech-design}/SKILL.md +1 -1
- package/dist/tools/code-review/skills/droid-code-review/SKILL.md +0 -55
- package/dist/tools/codex/skills/droid-codex/scripts/git-finish-write.d.ts.map +0 -1
- package/dist/tools/codex/skills/droid-codex/scripts/git-preamble.d.ts.map +0 -1
- package/dist/tools/codex/skills/droid-codex/scripts/git-start-write.d.ts.map +0 -1
- package/src/tools/code-review/skills/droid-code-review/SKILL.md +0 -55
- /package/dist/tools/brain/skills/{droid-brain → brain}/references/metadata.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain → brain}/references/naming.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain → brain}/references/templates.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain → brain}/references/workflows.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/templates.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/workflows.md +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/references/creating.md +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/references/decisions.md +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/references/topics.md +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.d.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.d.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-scripts.test.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.d.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.ts +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/changelog.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/creating.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/loading.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/templates.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/updating.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/versioning.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/draft.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/gaps.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/publish.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/research-doc-template.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/rollup-template.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/start.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/think.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/thought-doc-template.md +0 -0
- /package/src/tools/brain/skills/{droid-brain → brain}/references/metadata.md +0 -0
- /package/src/tools/brain/skills/{droid-brain → brain}/references/naming.md +0 -0
- /package/src/tools/brain/skills/{droid-brain → brain}/references/templates.md +0 -0
- /package/src/tools/brain/skills/{droid-brain → brain}/references/workflows.md +0 -0
- /package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/templates.md +0 -0
- /package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/workflows.md +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/references/creating.md +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/references/decisions.md +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/references/topics.md +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.ts +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.ts +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-scripts.test.ts +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.ts +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/changelog.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/creating.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/loading.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/templates.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/updating.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/versioning.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/draft.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/gaps.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/publish.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/research-doc-template.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/rollup-template.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/start.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/think.md +0 -0
- /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:
|
|
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
|
|
37
|
-
|
|
36
|
+
| Setting | Default | Description |
|
|
37
|
+
| -------------- | ----------- | ------------------------------------------------- |
|
|
38
38
|
| `projects_dir` | (see below) | Where projects are stored (use ONE location only) |
|
|
39
|
-
| `preset`
|
|
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
|
|
48
|
-
|
|
49
|
-
| `/project`
|
|
50
|
-
| `/project {keywords}`
|
|
51
|
-
| `/project create {name}`
|
|
52
|
-
| `/project create --from codex:{name}` | Create project seeded with codex context
|
|
53
|
-
| `/project update`
|
|
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.
|
|
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.
|
|
3
|
+
version: 0.2.0
|
|
4
4
|
status: beta
|
|
5
5
|
|
|
6
6
|
includes:
|
|
7
7
|
skills:
|
|
8
|
-
- name:
|
|
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
|
-
|
|
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
|
-
|
|
9
|
+
**User invoked:** `/tech-design $ARGUMENTS`
|
|
10
10
|
|
|
11
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
@@ -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(
|
|
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: {
|
|
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
|
};
|
package/src/commands/tui.tsx
CHANGED
|
@@ -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 {
|
|
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
|
|
75
|
+
// Run droid package migrations on startup (sync installed tools across platforms)
|
|
76
76
|
useEffect(() => {
|
|
77
|
-
const
|
|
78
|
-
|
|
77
|
+
const packageVersion = getVersion();
|
|
78
|
+
runPackageMigrations(packageVersion);
|
|
79
79
|
}, []);
|
|
80
80
|
|
|
81
81
|
// Auto-update app if enabled and update available
|
package/src/lib/migrations.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
+
}
|