@orderful/droid 0.31.1 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.claude-plugin/marketplace.json +17 -4
  2. package/AGENTS.md +16 -0
  3. package/CHANGELOG.md +90 -0
  4. package/dist/bin/droid.js +515 -434
  5. package/dist/commands/setup.d.ts +1 -0
  6. package/dist/commands/setup.d.ts.map +1 -1
  7. package/dist/commands/tui/components/PlatformBadges.d.ts +6 -0
  8. package/dist/commands/tui/components/PlatformBadges.d.ts.map +1 -0
  9. package/dist/commands/tui/components/SettingsDetails.d.ts +4 -1
  10. package/dist/commands/tui/components/SettingsDetails.d.ts.map +1 -1
  11. package/dist/commands/tui/types.d.ts +1 -1
  12. package/dist/commands/tui/types.d.ts.map +1 -1
  13. package/dist/commands/tui/views/SetupScreen.d.ts +3 -2
  14. package/dist/commands/tui/views/SetupScreen.d.ts.map +1 -1
  15. package/dist/commands/tui.d.ts.map +1 -1
  16. package/dist/index.js +138 -86
  17. package/dist/lib/agents.d.ts +7 -2
  18. package/dist/lib/agents.d.ts.map +1 -1
  19. package/dist/lib/platforms.d.ts +10 -1
  20. package/dist/lib/platforms.d.ts.map +1 -1
  21. package/dist/lib/skills.d.ts.map +1 -1
  22. package/dist/lib/types.d.ts +5 -0
  23. package/dist/lib/types.d.ts.map +1 -1
  24. package/dist/tools/brain/.claude-plugin/plugin.json +1 -1
  25. package/dist/tools/brain/TOOL.yaml +1 -1
  26. package/dist/tools/brain/commands/brain.md +13 -11
  27. package/dist/tools/brain/commands/scratchpad.md +4 -6
  28. package/dist/tools/brain/skills/brain/SKILL.md +62 -105
  29. package/dist/tools/brain/skills/brain/references/templates.md +37 -5
  30. package/dist/tools/brain/skills/brain/references/workflows.md +27 -16
  31. package/dist/tools/brain/skills/brain-obsidian/references/workflows.md +1 -1
  32. package/dist/tools/codex/.claude-plugin/plugin.json +1 -1
  33. package/dist/tools/codex/TOOL.yaml +1 -1
  34. package/dist/tools/codex/commands/codex.md +15 -12
  35. package/dist/tools/codex/skills/codex/SKILL.md +30 -63
  36. package/dist/tools/codex/skills/codex/references/creating.md +2 -2
  37. package/dist/tools/codex/skills/codex/references/decisions.md +1 -1
  38. package/dist/tools/droid/.claude-plugin/plugin.json +1 -1
  39. package/dist/tools/droid/TOOL.yaml +1 -1
  40. package/dist/tools/droid/skills/droid/SKILL.md +48 -409
  41. package/dist/tools/project/.claude-plugin/plugin.json +1 -1
  42. package/dist/tools/project/TOOL.yaml +1 -1
  43. package/dist/tools/project/commands/project.md +12 -12
  44. package/dist/tools/project/skills/project/SKILL.md +12 -4
  45. package/dist/tools/project/skills/project/references/creating.md +2 -2
  46. package/dist/tools/project/skills/project/references/loading.md +17 -3
  47. package/dist/tools/tech-design/skills/tech-design/references/think.md +1 -1
  48. package/dist/tools/wrapup/.claude-plugin/plugin.json +16 -0
  49. package/dist/tools/wrapup/TOOL.yaml +16 -0
  50. package/dist/tools/wrapup/commands/wrapup.md +21 -0
  51. package/dist/tools/wrapup/skills/wrapup/SKILL.md +86 -0
  52. package/dist/tools/wrapup/skills/wrapup/references/output-schema.md +93 -0
  53. package/dist/tools/wrapup/skills/wrapup/references/subagent-prompts.md +87 -0
  54. package/package.json +1 -1
  55. package/src/commands/setup.ts +67 -61
  56. package/src/commands/tui/components/PlatformBadges.tsx +36 -0
  57. package/src/commands/tui/components/SettingsDetails.tsx +16 -4
  58. package/src/commands/tui/types.ts +1 -1
  59. package/src/commands/tui/views/SetupScreen.tsx +26 -49
  60. package/src/commands/tui.tsx +21 -9
  61. package/src/lib/agents.ts +23 -7
  62. package/src/lib/platforms.ts +44 -1
  63. package/src/lib/skills.ts +79 -40
  64. package/src/lib/types.ts +11 -0
  65. package/src/tools/brain/.claude-plugin/plugin.json +1 -1
  66. package/src/tools/brain/TOOL.yaml +1 -1
  67. package/src/tools/brain/commands/brain.md +13 -11
  68. package/src/tools/brain/commands/scratchpad.md +4 -6
  69. package/src/tools/brain/skills/brain/SKILL.md +62 -105
  70. package/src/tools/brain/skills/brain/references/templates.md +37 -5
  71. package/src/tools/brain/skills/brain/references/workflows.md +27 -16
  72. package/src/tools/brain/skills/brain-obsidian/references/workflows.md +1 -1
  73. package/src/tools/codex/.claude-plugin/plugin.json +1 -1
  74. package/src/tools/codex/TOOL.yaml +1 -1
  75. package/src/tools/codex/commands/codex.md +15 -12
  76. package/src/tools/codex/skills/codex/SKILL.md +30 -63
  77. package/src/tools/codex/skills/codex/references/creating.md +2 -2
  78. package/src/tools/codex/skills/codex/references/decisions.md +1 -1
  79. package/src/tools/droid/.claude-plugin/plugin.json +1 -1
  80. package/src/tools/droid/TOOL.yaml +1 -1
  81. package/src/tools/droid/skills/droid/SKILL.md +48 -409
  82. package/src/tools/project/.claude-plugin/plugin.json +1 -1
  83. package/src/tools/project/TOOL.yaml +1 -1
  84. package/src/tools/project/commands/project.md +12 -12
  85. package/src/tools/project/skills/project/SKILL.md +12 -4
  86. package/src/tools/project/skills/project/references/creating.md +2 -2
  87. package/src/tools/project/skills/project/references/loading.md +17 -3
  88. package/src/tools/tech-design/skills/tech-design/references/think.md +1 -1
  89. package/src/tools/wrapup/.claude-plugin/plugin.json +16 -0
  90. package/src/tools/wrapup/TOOL.yaml +16 -0
  91. package/src/tools/wrapup/commands/wrapup.md +21 -0
  92. package/src/tools/wrapup/skills/wrapup/SKILL.md +86 -0
  93. package/src/tools/wrapup/skills/wrapup/references/output-schema.md +93 -0
  94. package/src/tools/wrapup/skills/wrapup/references/subagent-prompts.md +87 -0
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: project
3
3
  description: "Manage project context files for persistent AI memory across sessions"
4
- argument-hint: "[{keywords} | update | create {name}]"
4
+ argument-hint: "[search {keywords} | update | create {name}]"
5
5
  ---
6
6
 
7
7
  # /project
@@ -10,21 +10,21 @@ argument-hint: "[{keywords} | update | create {name}]"
10
10
 
11
11
  **Your task:** Invoke the **project skill** with these arguments.
12
12
 
13
- ## Example
13
+ ## Examples
14
14
 
15
- If user typed `/project droid`, you should interpret this as: "Search for and load a project matching 'droid'"
16
-
17
- If user typed `/project create new-feature`, interpret as: "Create a new project named 'new-feature'"
15
+ - `/project search droid` Search for and load project matching "droid"
16
+ - `/project search platform -- show changelog` → Search, load, then show changelog
17
+ - `/project update` Update from conversation context
18
+ - `/project create new-feature` → Create a new project
18
19
 
19
20
  ## Quick Reference
20
21
 
21
22
  ```
22
- /project # List and select a project
23
- /project {keywords} # SEARCH for existing project (default action)
24
- /project update # Update from conversation context
25
- /project create {name} # CREATE new project
23
+ /project # List and select a project
24
+ /project search {keywords} # Search for existing project
25
+ /project search {keywords} -- {q} # Search, load, then execute follow-up
26
+ /project update # Update from conversation context
27
+ /project create {name} # Create new project
26
28
  ```
27
29
 
28
- **Default behavior:** When given keywords, SEARCH first (don't create unless "create" keyword is present).
29
-
30
- See the **project skill** for complete documentation and procedures.
30
+ See the **project skill** for complete documentation.
@@ -46,19 +46,27 @@ Default `projects_dir` by AI tool (only if overrides.yaml is missing or lacks `p
46
46
  | Command | Action |
47
47
  | ------------------------------------- | ------------------------------------------------------ |
48
48
  | `/project` | List and select a project |
49
- | `/project {keywords}` | **Search** for existing project (fuzzy-match and load) |
49
+ | `/project search {keywords}` | Search for existing project (fuzzy-match and load) |
50
+ | `/project search {keywords} -- {instruction}` | Search, load, then execute follow-up instruction |
50
51
  | `/project create {name}` | Create new project (requires `create` keyword) |
51
52
  | `/project create --from codex:{name}` | Create project seeded with codex context |
52
53
  | `/project update` | Update from conversation context |
53
54
 
54
- **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.
55
+ **IMPORTANT:** Use `/project search {keywords}` to find and load existing projects. Only use `/project create {name}` when the user explicitly wants to create a new project.
55
56
 
56
57
  ## Loading a Project
57
58
 
58
- **Trigger:** `/project {keywords}` or user asks to load/open a project
59
+ **Trigger:** `/project search {keywords}` or user asks to load/open a project
59
60
 
60
61
  **TLDR:** Search for and load an existing project. Fuzzy-match keywords against project folders, read PROJECT.md, summarize context.
61
62
 
63
+ **Follow-up instructions:** Use `--` to add an instruction to execute after loading:
64
+ ```bash
65
+ /project search droid -- show the changelog
66
+ /project search platform -- what's the current status?
67
+ ```
68
+ Parse args by splitting on ` -- `. First part = search terms, second part = instruction to execute after loading.
69
+
62
70
  Full procedure: `references/loading.md`
63
71
 
64
72
  ## Updating a Project
@@ -86,7 +94,7 @@ Templates: `references/templates.md`
86
94
 
87
95
  Projects work best in a cycle:
88
96
 
89
- 1. **Load** - `/project {name}` gives Claude full context
97
+ 1. **Load** - `/project search {name}` gives Claude full context
90
98
  2. **Research/Plan** - Explore the problem, consider approaches
91
99
  3. **Document** - Capture decisions in PROJECT.md before implementing
92
100
  4. **Implement** - Build with full context of why decisions were made
@@ -123,7 +123,7 @@ Bridge shared organizational knowledge (codex) to personal working memory (proje
123
123
  - Technical details from tech design
124
124
 
125
125
  Full codex docs remain at: {codex_repo}/projects/{name}/
126
- Use `/codex {name}` to load the complete shared context.
126
+ Use `/codex search {name}` to load the complete shared context.
127
127
  ```
128
128
 
129
129
  ### Error Handling
@@ -144,7 +144,7 @@ Try: /project create --from codex:partnership-automation
144
144
  A project named "{name}" already exists at {path}.
145
145
 
146
146
  Options:
147
- - Load existing: /project {name}
147
+ - Load existing: /project search {name}
148
148
  - Use different name: /project create other-name --from codex:{codex-name}
149
149
  ```
150
150
 
@@ -1,8 +1,8 @@
1
1
  # Loading a Project
2
2
 
3
- **Trigger:** `/project {keywords}` or user asks to load/open a project
3
+ **Trigger:** `/project search {keywords}` or `/project search {keywords} -- {instruction}`
4
4
 
5
- **IMPORTANT:** This is a SEARCH operation. When keywords are provided, search for existing projects - do NOT create a new project. Creating requires the explicit `/project create {name}` command.
5
+ **IMPORTANT:** This is a SEARCH operation. The `search` keyword is required. Creating requires the explicit `/project create {name}` command.
6
6
 
7
7
  ## Procedure
8
8
 
@@ -33,10 +33,12 @@
33
33
  - Summarize key context (2-3 sentences)
34
34
  - Use project contents for all subsequent work in the session
35
35
 
36
+ 7. **If `-- {instruction}` provided:** Execute the follow-up instruction against the loaded project
37
+
36
38
  ## Example
37
39
 
38
40
  ```
39
- User: /project transaction templates
41
+ User: /project search transaction templates
40
42
 
41
43
  Claude: Found project "transaction-templates". Loading...
42
44
 
@@ -46,3 +48,15 @@ This project covers Handlebars templates for EDI transaction generation.
46
48
  Key focus areas: template rendering service, permission controls, and
47
49
  the upcoming UI for template management.
48
50
  ```
51
+
52
+ **With follow-up instruction:**
53
+
54
+ ```
55
+ User: /project search droid -- show changelog
56
+
57
+ Claude: Found project "droid". Loading...
58
+ [project context]
59
+
60
+ Here's the recent changelog:
61
+ [changelog content]
62
+ ```
@@ -227,7 +227,7 @@ Which would you prefer?
227
227
  **If option 3 (create comment):**
228
228
 
229
229
  ```bash
230
- # Read user_mention from ~/.droid/config.yaml
230
+ # Get user_mention from: droid config tech-design
231
231
  # Add comment to thought doc:
232
232
 
233
233
  > @{user} Explored events vs polling for status updates
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "droid-wrapup",
3
+ "version": "0.1.0",
4
+ "description": "Session wrap-up that captures decisions, learnings, and open items to persistent docs.",
5
+ "author": {
6
+ "name": "Orderful",
7
+ "url": "https://github.com/orderful"
8
+ },
9
+ "repository": "https://github.com/orderful/droid",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "droid",
13
+ "ai",
14
+ "wrapup"
15
+ ]
16
+ }
@@ -0,0 +1,16 @@
1
+ name: wrapup
2
+ description: "Session wrap-up that captures decisions, learnings, and open items to persistent docs."
3
+ version: 0.1.0
4
+ status: alpha
5
+
6
+ includes:
7
+ skills:
8
+ - name: wrapup
9
+ required: true
10
+ commands:
11
+ - name: wrapup
12
+ is_alias: false
13
+
14
+ dependencies: []
15
+
16
+ config_schema: {}
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: wrapup
3
+ description: "Session wrap-up that captures decisions, learnings, and open items"
4
+ argument-hint: ""
5
+ ---
6
+
7
+ # /wrapup
8
+
9
+ **User invoked:** `/wrapup $ARGUMENTS`
10
+
11
+ **Your task:** Invoke the **wrapup skill** with these arguments.
12
+
13
+ ## Quick Reference
14
+
15
+ Wrap up the current session using the context lifeboat pattern:
16
+ 1. Quickly extract session context to temp file (you do this)
17
+ 2. Spawn subagents to analyse artifacts (fresh context)
18
+ 3. Synthesise findings and confirm with user
19
+ 4. Write to brain docs, project files, or codex on approval
20
+
21
+ See the **wrapup skill** for complete documentation.
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: wrapup
3
+ description: "Session wrap-up that captures decisions, learnings, and open items to persistent docs. Use when ending a session to persist context. User prompts like 'let's wrap up', 'end of session', 'capture what we did'."
4
+ allowed-tools: [Read, Edit, Write, Glob, Grep, Bash, Task]
5
+ ---
6
+
7
+ # Wrapup Skill
8
+
9
+ Session wrap-up that captures decisions, learnings, and open items before closing.
10
+
11
+ ## Context Lifeboat Pattern
12
+
13
+ This skill runs at the END of sessions when context pressure is highest.
14
+ To avoid triggering compaction mid-wrapup, offload heavy lifting to fresh-context subagents.
15
+
16
+ ## Phase 1: Quick Context Extraction
17
+
18
+ You have the conversation history. Quickly extract and write to `/tmp/wrapup-session-brief.md`:
19
+
20
+ ```markdown
21
+ # Session Brief
22
+
23
+ ## User Goals
24
+ - {what the user was trying to accomplish}
25
+
26
+ ## Decisions Made
27
+ - {explicit choices, design decisions, why}
28
+
29
+ ## Key Learnings
30
+ - {discoveries, aha moments, findings}
31
+
32
+ ## Open Items
33
+ - {unresolved questions, blockers, WIP state}
34
+
35
+ ## Files Touched
36
+ - {files discussed/modified and why}
37
+
38
+ ## Mentioned But Not Done
39
+ - {bugs to file, docs to update, future work}
40
+ ```
41
+
42
+ Do this IMMEDIATELY. Don't analyse deeply—just dump what you know.
43
+
44
+ ## Phase 2: Artifact Analysis
45
+
46
+ Spawn subagents **in parallel** to analyse artifacts. Each reads your session brief and analyses one area.
47
+
48
+ | Subagent | Type | Analyses |
49
+ |----------|------|----------|
50
+ | Git state | Bash | Uncommitted changes, branch status |
51
+ | Project file | Explore | ~/.droid/project.md staleness |
52
+ | Brain docs | Explore | Recently modified docs needing updates |
53
+ | Codex gaps | Explore | Knowledge worth codifying |
54
+
55
+ See `references/subagent-prompts.md` for detailed prompts.
56
+
57
+ ## Phase 3: Synthesise and Present
58
+
59
+ Combine subagent findings into a summary:
60
+
61
+ ```markdown
62
+ ## Wrapup Summary
63
+
64
+ **Session:** {brief description}
65
+
66
+ **Uncommitted Work:**
67
+ {from git subagent}
68
+
69
+ **Proposed Updates:**
70
+ 1. **{destination}** ({type})
71
+ - {item}
72
+
73
+ **Suggested Actions:**
74
+ - {action}: {description}
75
+ ```
76
+
77
+ See `references/output-schema.md` for structured output format.
78
+
79
+ ## Phase 4: Confirm and Write
80
+
81
+ Present options using AskUserQuestion:
82
+ - **"Yes, update all"** → Write to all destinations
83
+ - **"Let me review first"** → Show detailed diff for each
84
+ - **"Skip"** → Close without updating
85
+
86
+ On approval, write updates using appropriate format for each destination.
@@ -0,0 +1,93 @@
1
+ # Output Schema
2
+
3
+ Structured format for subagent findings. Main agent uses this to synthesise the wrapup summary.
4
+
5
+ ## Schema
6
+
7
+ ```json
8
+ {
9
+ "active_contexts": [
10
+ {
11
+ "type": "brain | project | codex | git",
12
+ "name": "human-readable name",
13
+ "path": "file path (if applicable)",
14
+ "status": "active | stale | clean"
15
+ }
16
+ ],
17
+ "proposed_updates": [
18
+ {
19
+ "destination": "filename or identifier",
20
+ "destination_type": "brain | project | codex",
21
+ "items": [
22
+ {
23
+ "category": "decision | learning | open_item | next_step",
24
+ "content": "text to add"
25
+ }
26
+ ]
27
+ }
28
+ ],
29
+ "suggested_actions": [
30
+ {
31
+ "type": "commit | codex_topic | file_bug | update_docs",
32
+ "content": "description of suggested action",
33
+ "priority": "high | medium | low"
34
+ }
35
+ ]
36
+ }
37
+ ```
38
+
39
+ ## Field Descriptions
40
+
41
+ ### active_contexts
42
+
43
+ What's currently "open" or relevant:
44
+ - **brain**: Active planning/research docs
45
+ - **project**: ~/.droid/project.md if it exists
46
+ - **codex**: Relevant codex entries touched
47
+ - **git**: Current branch and uncommitted state
48
+
49
+ ### proposed_updates
50
+
51
+ Concrete changes to write on approval:
52
+ - **destination**: Where to write (filename)
53
+ - **destination_type**: Which system (brain, project, codex)
54
+ - **items**: List of things to add, categorised
55
+
56
+ Item categories:
57
+ - `decision`: Explicit choice made during session
58
+ - `learning`: Discovery, insight, or finding
59
+ - `open_item`: Unresolved question or blocker
60
+ - `next_step`: Identified future work
61
+
62
+ ### suggested_actions
63
+
64
+ Actions that need user judgment:
65
+ - `commit`: Git changes ready to commit
66
+ - `codex_topic`: Knowledge worth codifying
67
+ - `file_bug`: Bug discovered but not filed
68
+ - `update_docs`: Documentation that needs updating
69
+
70
+ ## Example
71
+
72
+ ```json
73
+ {
74
+ "active_contexts": [
75
+ {"type": "brain", "name": "plan-wrapup-tool", "path": "1-Projects/droid/plans/plan-wrapup-tool.md", "status": "active"},
76
+ {"type": "git", "name": "tf/wrapup-tool", "path": null, "status": "uncommitted"}
77
+ ],
78
+ "proposed_updates": [
79
+ {
80
+ "destination": "plan-wrapup-tool.md",
81
+ "destination_type": "brain",
82
+ "items": [
83
+ {"category": "decision", "content": "Using context lifeboat pattern - main agent extracts, subagents analyse"},
84
+ {"category": "next_step", "content": "Test with real session, iterate on prompts"}
85
+ ]
86
+ }
87
+ ],
88
+ "suggested_actions": [
89
+ {"type": "commit", "content": "4 files ready: TOOL.yaml, SKILL.md, wrapup.md, changeset", "priority": "high"},
90
+ {"type": "codex_topic", "content": "Context lifeboat pattern for end-of-session tooling", "priority": "medium"}
91
+ ]
92
+ }
93
+ ```
@@ -0,0 +1,87 @@
1
+ # Subagent Prompts
2
+
3
+ Detailed prompts for Phase 2 artifact analysis. Spawn these in parallel using the Task tool.
4
+
5
+ ## Git State Analysis
6
+
7
+ **Subagent type:** Bash
8
+
9
+ ```
10
+ Analyse git status and git diff in the current working directory. Categorise changes:
11
+
12
+ 1. **Ready to commit** - Complete, coherent changes that could be committed now
13
+ 2. **WIP** - Partial changes, incomplete features, or messy state
14
+ 3. **Untracked files** - New files that might need to be added or ignored
15
+
16
+ For each category, list the files and briefly describe what changed.
17
+
18
+ Output format:
19
+ - Status: clean | uncommitted | wip
20
+ - Branch: {current branch name}
21
+ - Summary of uncommitted work (if any)
22
+ - Recommendation: commit now, stash, or leave as-is
23
+ ```
24
+
25
+ ## Project File Check
26
+
27
+ **Subagent type:** Explore
28
+
29
+ ```
30
+ Read /tmp/wrapup-session-brief.md for session context.
31
+
32
+ Check if ~/.droid/project.md exists. If it does:
33
+ 1. Read the current project file
34
+ 2. Compare against session brief
35
+ 3. Identify:
36
+ - Stale entries that should be updated or removed
37
+ - New items from the session to add (decisions, blockers, next steps)
38
+ - Status changes (completed items, new blockers)
39
+
40
+ Output specific proposed updates with exact text to add/change.
41
+ If no project file exists, note that and skip.
42
+ ```
43
+
44
+ ## Brain Doc Check
45
+
46
+ **Subagent type:** Explore
47
+
48
+ ```
49
+ Read /tmp/wrapup-session-brief.md for session context.
50
+
51
+ First, check ~/.droid/skills/brain/overrides.yaml for the brain_dir setting.
52
+ If not configured, skip brain doc analysis.
53
+
54
+ If configured:
55
+ 1. Search the brain directory for recently modified .md files (last 24 hours)
56
+ 2. Read any that seem related to the session topics
57
+ 3. Check if they need updates based on session decisions/learnings
58
+ 4. Look for @droid comments that were addressed
59
+
60
+ Output:
61
+ - Active brain docs found (if any)
62
+ - Proposed additions for each relevant doc
63
+ - Any resolved @droid comments to mark done
64
+ ```
65
+
66
+ ## Codex Gap Analysis
67
+
68
+ **Subagent type:** Explore
69
+
70
+ ```
71
+ Read /tmp/wrapup-session-brief.md for session context.
72
+
73
+ Check if the codex skill is installed (~/.droid/skills/codex/overrides.yaml).
74
+ If not configured, skip codex analysis.
75
+
76
+ If the session involved:
77
+ - Deep research on a topic
78
+ - Discovering patterns or best practices
79
+ - Solving a non-trivial problem with reusable insights
80
+
81
+ Then suggest potential codex topics:
82
+ - Topic name
83
+ - Brief description of what to capture
84
+ - Why it's worth codifying (reusable, non-obvious, hard-won knowledge)
85
+
86
+ Output: List of suggested codex topics, or "No codex suggestions" if session was routine.
87
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderful/droid",
3
- "version": "0.31.1",
3
+ "version": "0.32.0",
4
4
  "description": "AI workflow toolkit for sharing skills, commands, and agents across the team",
5
5
  "type": "module",
6
6
  "bin": {
@@ -7,6 +7,16 @@ import { homedir } from 'os';
7
7
  import { loadConfig, saveConfig, configExists } from '../lib/config';
8
8
  import { getBundledSkills } from '../lib/skills';
9
9
  import { Platform, BuiltInOutput, type DroidConfig, type OutputPreference } from '../lib/types';
10
+ import { detectAllPlatforms } from '../lib/platforms';
11
+
12
+ // Re-export for external use
13
+ export { detectAllPlatforms, getActivePlatforms } from '../lib/platforms';
14
+
15
+ const PLATFORM_LABELS: Record<Platform, string> = {
16
+ [Platform.ClaudeCode]: 'Claude Code',
17
+ [Platform.Cursor]: 'Cursor',
18
+ [Platform.OpenCode]: 'OpenCode',
19
+ };
10
20
 
11
21
  /**
12
22
  * Permissions droid needs to operate without constant prompts
@@ -19,34 +29,6 @@ const DROID_PERMISSIONS = [
19
29
  'Grep(~/.droid/**)',
20
30
  ];
21
31
 
22
- /**
23
- * Detect which platform is installed
24
- * Priority: Claude Code > Cursor > OpenCode (Claude Code is most common)
25
- */
26
- function detectPlatform(): Platform | null {
27
- try {
28
- execSync('claude --version', { stdio: 'ignore' });
29
- return Platform.ClaudeCode;
30
- } catch {
31
- // Claude Code not found
32
- }
33
-
34
- // Check for Cursor - it's an app, check if .cursor directory exists
35
- const cursorDir = join(homedir(), '.cursor');
36
- if (existsSync(cursorDir)) {
37
- return Platform.Cursor;
38
- }
39
-
40
- try {
41
- execSync('opencode --version', { stdio: 'ignore' });
42
- return Platform.OpenCode;
43
- } catch {
44
- // OpenCode not found
45
- }
46
-
47
- return null;
48
- }
49
-
50
32
  /**
51
33
  * Try to get git username
52
34
  */
@@ -189,12 +171,19 @@ export async function setupCommand(): Promise<void> {
189
171
  }
190
172
  }
191
173
 
192
- // Detect platform
193
- const detectedPlatform = detectPlatform();
194
- if (detectedPlatform) {
195
- console.log(chalk.green(`✓ Detected ${detectedPlatform}\n`));
174
+ // Detect ALL platforms
175
+ const detectedPlatforms = detectAllPlatforms();
176
+
177
+ if (detectedPlatforms.length === 0) {
178
+ console.log(chalk.yellow('⚠ No platforms detected (Claude Code, Cursor, or OpenCode)\n'));
179
+ } else if (detectedPlatforms.length === 1) {
180
+ console.log(chalk.green(`✓ Detected ${PLATFORM_LABELS[detectedPlatforms[0]]}\n`));
196
181
  } else {
197
- console.log(chalk.yellow('⚠ No platform detected (Claude Code or OpenCode)\n'));
182
+ console.log(chalk.green(`✓ Detected ${detectedPlatforms.length} platforms:`));
183
+ for (const p of detectedPlatforms) {
184
+ console.log(chalk.gray(` • ${PLATFORM_LABELS[p]}`));
185
+ }
186
+ console.log('');
198
187
  }
199
188
 
200
189
  // Detect git username
@@ -203,23 +192,29 @@ export async function setupCommand(): Promise<void> {
203
192
  // Get dynamic output options
204
193
  const outputOptions = getOutputOptions();
205
194
 
195
+ // Ask which platforms to ignore if multiple detected
196
+ let ignoredPlatformsAnswer: Platform[] = [];
197
+ if (detectedPlatforms.length > 1) {
198
+ const { ignored_platforms } = await inquirer.prompt<{ ignored_platforms: Platform[] }>([
199
+ {
200
+ type: 'checkbox',
201
+ name: 'ignored_platforms',
202
+ message: 'Which platforms should be ignored? (commands/agents won\'t be installed)',
203
+ choices: detectedPlatforms.map(p => ({
204
+ name: PLATFORM_LABELS[p],
205
+ value: p,
206
+ checked: false,
207
+ })),
208
+ },
209
+ ]);
210
+ ignoredPlatformsAnswer = ignored_platforms;
211
+ }
212
+
206
213
  const answers = await inquirer.prompt<{
207
- platform: Platform;
208
214
  user_mention: string;
209
215
  output_preference: OutputPreference;
210
216
  git_username: string;
211
217
  }>([
212
- {
213
- type: 'list',
214
- name: 'platform',
215
- message: 'Which platform are you using?',
216
- choices: [
217
- { name: 'Claude Code', value: Platform.ClaudeCode },
218
- { name: 'Cursor', value: Platform.Cursor },
219
- { name: 'OpenCode', value: Platform.OpenCode },
220
- ],
221
- default: detectedPlatform || Platform.ClaudeCode,
222
- },
223
218
  {
224
219
  type: 'input',
225
220
  name: 'user_mention',
@@ -245,35 +240,46 @@ export async function setupCommand(): Promise<void> {
245
240
  },
246
241
  ]);
247
242
 
243
+ // Determine primary platform (first detected that isn't ignored)
244
+ const ignoredPlatforms = ignoredPlatformsAnswer;
245
+ const activePlatforms = detectedPlatforms.filter(p => !ignoredPlatforms.includes(p));
246
+ const primaryPlatform = activePlatforms.length > 0
247
+ ? activePlatforms[0]
248
+ : (detectedPlatforms[0] ?? Platform.ClaudeCode);
249
+
248
250
  const existingConfig = loadConfig();
249
251
  const config: DroidConfig = {
250
252
  ...existingConfig,
251
- platform: answers.platform,
253
+ platform: primaryPlatform,
252
254
  user_mention: answers.user_mention,
253
255
  output_preference: answers.output_preference,
254
256
  git_username: answers.git_username,
257
+ ...(ignoredPlatforms.length > 0 && { ignored_platforms: ignoredPlatforms }),
255
258
  };
256
259
 
257
260
  saveConfig(config);
258
261
 
259
262
  console.log(chalk.green('\n✓ Config saved to ~/.droid/config.yaml'));
260
263
 
261
- // Configure platform permissions/plugins
262
- const { added, alreadyPresent, error } = configurePlatformPermissions(answers.platform);
263
- if (error) {
264
- console.log(chalk.red(`✗ ${error}`));
265
- console.log(chalk.yellow(' You may need to manually configure your platform'));
266
- } else if (answers.platform === Platform.ClaudeCode) {
267
- if (added.length > 0) {
268
- console.log(chalk.green('✓ Added droid permissions to Claude Code settings'));
269
- } else if (alreadyPresent) {
270
- console.log(chalk.gray(' Droid permissions already configured in Claude Code'));
264
+ // Configure permissions for ALL active platforms
265
+ for (const platform of activePlatforms) {
266
+ const { added, alreadyPresent, error } = configurePlatformPermissions(platform);
267
+ if (error) {
268
+ console.log(chalk.red(`✗ ${PLATFORM_LABELS[platform]}: ${error}`));
269
+ } else if (platform === Platform.ClaudeCode) {
270
+ if (added.length > 0) {
271
+ console.log(chalk.green(`✓ Added droid permissions to ${PLATFORM_LABELS[platform]} settings`));
272
+ } else if (alreadyPresent) {
273
+ console.log(chalk.gray(` ${PLATFORM_LABELS[platform]} permissions already configured`));
274
+ }
275
+ } else {
276
+ console.log(chalk.gray(` ${PLATFORM_LABELS[platform]} directories ready`));
271
277
  }
272
- } else if (answers.platform === Platform.OpenCode) {
273
- console.log(chalk.gray(' Skills installed to ~/.claude/skills/ (works with Claude Code, OpenCode, and Cursor)'));
274
- } else if (answers.platform === Platform.Cursor) {
275
- console.log(chalk.gray(' Skills installed to ~/.claude/skills/ (Cursor reads from this location)'));
276
- console.log(chalk.gray(' Note: Cursor requires nightly channel for Agent Skills support'));
278
+ }
279
+
280
+ // Show summary if multiple platforms
281
+ if (activePlatforms.length > 1) {
282
+ console.log(chalk.green(`\n✓ Will install to ${activePlatforms.length} platforms: ${activePlatforms.map(p => PLATFORM_LABELS[p]).join(', ')}`));
277
283
  }
278
284
 
279
285
  console.log(chalk.gray('\nRun `droid skills` to browse and install skills.'));