@orderful/droid 0.37.0 → 0.39.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 (113) hide show
  1. package/.claude-plugin/marketplace.json +1 -118
  2. package/.claude-plugin/plugin.json +51 -0
  3. package/AGENTS.md +4 -0
  4. package/CHANGELOG.md +53 -0
  5. package/README.md +70 -39
  6. package/dist/bin/droid.js +658 -212
  7. package/dist/commands/auth.d.ts +3 -0
  8. package/dist/commands/auth.d.ts.map +1 -0
  9. package/dist/commands/setup.d.ts.map +1 -1
  10. package/dist/commands/tui/components/PlatformBadges.d.ts.map +1 -1
  11. package/dist/commands/tui/components/SettingsDetails.d.ts.map +1 -1
  12. package/dist/commands/tui/hooks/useAppUpdate.d.ts.map +1 -1
  13. package/dist/commands/tui/views/SetupScreen.d.ts.map +1 -1
  14. package/dist/commands/update.d.ts.map +1 -1
  15. package/dist/index.js +345 -186
  16. package/dist/lib/agents.d.ts +4 -2
  17. package/dist/lib/agents.d.ts.map +1 -1
  18. package/dist/lib/migrations.d.ts.map +1 -1
  19. package/dist/lib/platform.codex.d.ts +36 -0
  20. package/dist/lib/platform.codex.d.ts.map +1 -0
  21. package/dist/lib/platforms.d.ts +30 -24
  22. package/dist/lib/platforms.d.ts.map +1 -1
  23. package/dist/lib/secrets.d.ts +7 -0
  24. package/dist/lib/secrets.d.ts.map +1 -0
  25. package/dist/lib/skills.d.ts +4 -2
  26. package/dist/lib/skills.d.ts.map +1 -1
  27. package/dist/lib/types.d.ts +2 -1
  28. package/dist/lib/types.d.ts.map +1 -1
  29. package/dist/tools/brain/.claude-plugin/plugin.json +8 -1
  30. package/dist/tools/brain/TOOL.yaml +1 -1
  31. package/dist/tools/brain/skills/brain/SKILL.md +6 -3
  32. package/dist/tools/brain/skills/brain/references/workflows.md +9 -5
  33. package/dist/tools/brain/skills/brain-obsidian/SKILL.md +2 -0
  34. package/dist/tools/coach/.claude-plugin/plugin.json +6 -0
  35. package/dist/tools/coach/skills/coach/SKILL.md +3 -0
  36. package/dist/tools/code-review/.claude-plugin/plugin.json +12 -0
  37. package/dist/tools/code-review/skills/code-review/SKILL.md +2 -0
  38. package/dist/tools/codex/.claude-plugin/plugin.json +9 -0
  39. package/dist/tools/codex/skills/codex/SKILL.md +3 -0
  40. package/dist/tools/comments/.claude-plugin/plugin.json +6 -0
  41. package/dist/tools/comments/skills/comments/SKILL.md +5 -0
  42. package/dist/tools/droid/.claude-plugin/plugin.json +8 -1
  43. package/dist/tools/droid/TOOL.yaml +4 -2
  44. package/dist/tools/droid/commands/setup.md +125 -0
  45. package/dist/tools/droid/skills/droid/SKILL.md +117 -2
  46. package/dist/tools/plan/.claude-plugin/plugin.json +6 -0
  47. package/dist/tools/plan/skills/plan/SKILL.md +2 -0
  48. package/dist/tools/project/.claude-plugin/plugin.json +6 -0
  49. package/dist/tools/project/skills/project/SKILL.md +3 -0
  50. package/dist/tools/status-update/.claude-plugin/plugin.json +22 -0
  51. package/dist/tools/status-update/TOOL.yaml +21 -0
  52. package/dist/tools/status-update/commands/status-update.md +27 -0
  53. package/dist/tools/status-update/skills/status-update/SKILL.md +253 -0
  54. package/dist/tools/status-update/skills/status-update/references/formatting.md +203 -0
  55. package/dist/tools/tech-design/.claude-plugin/plugin.json +7 -1
  56. package/dist/tools/tech-design/TOOL.yaml +1 -1
  57. package/dist/tools/tech-design/commands/tech-design.md +2 -0
  58. package/dist/tools/tech-design/skills/tech-design/SKILL.md +39 -9
  59. package/dist/tools/tech-design/skills/tech-design/references/publish.md +272 -216
  60. package/dist/tools/tech-design/skills/tech-design/references/start.md +50 -20
  61. package/dist/tools/wrapup/.claude-plugin/plugin.json +6 -0
  62. package/dist/tools/wrapup/skills/wrapup/SKILL.md +2 -0
  63. package/package.json +1 -1
  64. package/scripts/build-plugins.ts +154 -6
  65. package/src/bin/droid.ts +35 -0
  66. package/src/commands/auth.ts +150 -0
  67. package/src/commands/setup.ts +107 -2
  68. package/src/commands/tui/components/PlatformBadges.tsx +1 -0
  69. package/src/commands/tui/components/SettingsDetails.tsx +1 -0
  70. package/src/commands/tui/hooks/useAppUpdate.ts +21 -1
  71. package/src/commands/tui/views/SetupScreen.tsx +10 -1
  72. package/src/commands/update.ts +21 -1
  73. package/src/lib/agents.ts +13 -2
  74. package/src/lib/migrations.ts +81 -9
  75. package/src/lib/platform.codex.ts +131 -0
  76. package/src/lib/platforms.ts +127 -6
  77. package/src/lib/secrets.ts +12 -0
  78. package/src/lib/skills.ts +53 -6
  79. package/src/lib/types.ts +1 -0
  80. package/src/tools/brain/.claude-plugin/plugin.json +8 -1
  81. package/src/tools/brain/TOOL.yaml +1 -1
  82. package/src/tools/brain/skills/brain/SKILL.md +6 -3
  83. package/src/tools/brain/skills/brain/references/workflows.md +9 -5
  84. package/src/tools/brain/skills/brain-obsidian/SKILL.md +2 -0
  85. package/src/tools/coach/.claude-plugin/plugin.json +6 -0
  86. package/src/tools/coach/skills/coach/SKILL.md +3 -0
  87. package/src/tools/code-review/.claude-plugin/plugin.json +12 -0
  88. package/src/tools/code-review/skills/code-review/SKILL.md +2 -0
  89. package/src/tools/codex/.claude-plugin/plugin.json +9 -0
  90. package/src/tools/codex/skills/codex/SKILL.md +3 -0
  91. package/src/tools/comments/.claude-plugin/plugin.json +6 -0
  92. package/src/tools/comments/skills/comments/SKILL.md +5 -0
  93. package/src/tools/droid/.claude-plugin/plugin.json +8 -1
  94. package/src/tools/droid/TOOL.yaml +4 -2
  95. package/src/tools/droid/commands/setup.md +125 -0
  96. package/src/tools/droid/skills/droid/SKILL.md +117 -2
  97. package/src/tools/plan/.claude-plugin/plugin.json +6 -0
  98. package/src/tools/plan/skills/plan/SKILL.md +2 -0
  99. package/src/tools/project/.claude-plugin/plugin.json +6 -0
  100. package/src/tools/project/skills/project/SKILL.md +3 -0
  101. package/src/tools/status-update/.claude-plugin/plugin.json +22 -0
  102. package/src/tools/status-update/TOOL.yaml +21 -0
  103. package/src/tools/status-update/commands/status-update.md +27 -0
  104. package/src/tools/status-update/skills/status-update/SKILL.md +253 -0
  105. package/src/tools/status-update/skills/status-update/references/formatting.md +203 -0
  106. package/src/tools/tech-design/.claude-plugin/plugin.json +7 -1
  107. package/src/tools/tech-design/TOOL.yaml +1 -1
  108. package/src/tools/tech-design/commands/tech-design.md +2 -0
  109. package/src/tools/tech-design/skills/tech-design/SKILL.md +39 -9
  110. package/src/tools/tech-design/skills/tech-design/references/publish.md +272 -216
  111. package/src/tools/tech-design/skills/tech-design/references/start.md +50 -20
  112. package/src/tools/wrapup/.claude-plugin/plugin.json +6 -0
  113. package/src/tools/wrapup/skills/wrapup/SKILL.md +2 -0
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: setup
3
+ description: "Configure Droid after marketplace installation"
4
+ argument-hint: ""
5
+ ---
6
+
7
+ # /setup
8
+
9
+ **User invoked:** `/setup`
10
+
11
+ **Your task:** Guide the user through initial Droid configuration.
12
+
13
+ ## When to Use
14
+
15
+ Run this command after installing Droid plugins via the marketplace (when `~/.droid/config.yaml` doesn't exist).
16
+
17
+ ## Configuration Flow
18
+
19
+ ### 1. Check Existing Configuration
20
+
21
+ ```bash
22
+ ls -la ~/.droid/config.yaml 2>/dev/null || echo "No config found"
23
+ ```
24
+
25
+ - If config exists: Ask "You already have a config. Reconfigure? [y/N]"
26
+ - If no config: Proceed with setup
27
+
28
+ ### 2. Create Config Directory
29
+
30
+ ```bash
31
+ mkdir -p ~/.droid
32
+ ```
33
+
34
+ ### 3. Detect Git Username
35
+
36
+ ```bash
37
+ git config user.name
38
+ ```
39
+
40
+ Store this for `git_username` in config.
41
+
42
+ ### 4. Gather Global Settings
43
+
44
+ Ask the user:
45
+
46
+ > **What handle should be used for @mentions in code comments?**
47
+ > (This is used by the comments tool for async collaboration)
48
+ > Default: `@droid`
49
+
50
+ ### 5. Detect Installed Tools
51
+
52
+ Check which Droid plugins are installed by looking for skill files:
53
+
54
+ ```bash
55
+ # Check Claude Code skills directory and plugin cache
56
+ ls ~/.claude/skills/ 2>/dev/null | grep -E '^(brain|project|codex|wrapup|code-review|tech-design|comments|coach|plan)-' || true
57
+ find ~/.claude/plugins/cache -name "SKILL.md" -path "*droid*" 2>/dev/null | head -20 || true
58
+ ```
59
+
60
+ ### 6. Configure Tools That Need Settings
61
+
62
+ For each detected tool that requires configuration:
63
+
64
+ **brain:**
65
+ > **Where should brain docs be stored?**
66
+ > Default: `~/brain`
67
+ > (This directory will be created if it doesn't exist)
68
+
69
+ **project:**
70
+ > **Where are your projects located?**
71
+ > Default: `~/Projects`
72
+ > (Used to find and link project-level context)
73
+
74
+ **codex:**
75
+ > **Where is your shared codex repository?**
76
+ > Default: `~/codex`
77
+ > (Leave blank to skip codex configuration)
78
+
79
+ ### 7. Write Configuration
80
+
81
+ Create `~/.droid/config.yaml` with the gathered settings:
82
+
83
+ ```yaml
84
+ # Droid global configuration
85
+ # Generated by /setup
86
+
87
+ user_mention: "@droid" # Or user's chosen handle
88
+ git_username: "detected-name"
89
+
90
+ # Tool-specific settings
91
+ brain:
92
+ brain_dir: "~/brain"
93
+
94
+ project:
95
+ projects_dir: "~/Projects"
96
+
97
+ codex:
98
+ codex_dir: "~/codex" # Only if provided
99
+ ```
100
+
101
+ ### 8. Confirm Success
102
+
103
+ Display a summary:
104
+
105
+ ```
106
+ Droid configured successfully!
107
+
108
+ Global settings:
109
+ - User mention: @droid
110
+ - Git username: Your Name
111
+
112
+ Tool settings:
113
+ - brain: ~/brain
114
+ - project: ~/Projects
115
+ - codex: ~/codex
116
+
117
+ You can edit these settings anytime at ~/.droid/config.yaml
118
+ ```
119
+
120
+ ## Notes
121
+
122
+ - All paths should be expanded (~ to full home directory) when written
123
+ - Only include tool sections for tools that are actually installed
124
+ - If a required directory doesn't exist, offer to create it
125
+ - Skip tools that aren't installed rather than configuring them
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: droid
3
- description: "Core droid meta-skill for updates, tool discovery, and usage help. Use when checking for droid updates, discovering available tools, or answering 'how do I...' questions about droid workflows. User prompts like 'any droid updates?', 'what tools do I have?', 'what tools do you have?', 'remind me what tools you have', 'hey droid what can you do', 'how do I add context?', 'remind me how to use codex', 'what's the best way to start a session?'."
4
- allowed-tools: [Bash]
3
+ description: "Core droid meta-skill for updates, tool discovery, usage help, and skill overrides. Use when checking for droid updates, discovering available tools, answering 'how do I...' questions about droid workflows, or customizing skill behaviour. User prompts like 'any droid updates?', 'what tools do I have?', 'what tools do you have?', 'remind me what tools you have', 'hey droid what can you do', 'how do I add context?', 'remind me how to use codex', 'what's the best way to start a session?', 'customize brain search', 'create an override for brain'."
4
+ allowed-tools: [Bash, Read, Write]
5
5
  ---
6
6
 
7
7
  # Droid
@@ -87,3 +87,118 @@ When answering "how do I..." questions:
87
87
  1. `/project search {name}` - Load working context
88
88
  2. `/codex search {topic}` - Find relevant org knowledge (if needed)
89
89
  3. Then start working with full context
90
+
91
+ ## Skill Overrides
92
+
93
+ Users can customize skill behaviour by creating override files in `~/.droid/skill_overrides/`.
94
+
95
+ **When:** User asks to customize a skill, use a different tool for a command, or mentions overrides.
96
+
97
+ ### Creating an Override
98
+
99
+ 1. **Explain** the override system:
100
+ - Override files live in `~/.droid/skill_overrides/{skill}.md`
101
+ - Use YAML frontmatter to declare which commands are overridden
102
+ - Template available at `~/.droid/skill_overrides/_template.md`
103
+
104
+ 2. **Create** the override file with proper structure:
105
+ ```markdown
106
+ ---
107
+ overrides: [command1, command2]
108
+ ---
109
+
110
+ ## command1
111
+
112
+ Custom instructions for this command...
113
+ ```
114
+
115
+ 3. **Register** the override in config:
116
+ ```bash
117
+ # Set override path (use tool name in config path, skill name for file)
118
+ droid config --set tools.{tool}.override.path="~/.droid/skill_overrides/{skill}.md"
119
+
120
+ # Set overridden commands (as JSON array)
121
+ droid config --set tools.{tool}.override.commands='["command1", "command2"]'
122
+
123
+ # Enable the override (can toggle off later)
124
+ droid config --set tools.{tool}.override.enabled=true
125
+ ```
126
+
127
+ Note: Config uses tool name (e.g., `tools.brain`), file uses skill name. Usually the same, but tools can contain multiple skills.
128
+
129
+ **Toggle off:** `droid config --set tools.{tool}.override.enabled=false` to disable without removing.
130
+
131
+ 4. **Confirm** the override is active
132
+
133
+ ### Registering an Existing Override
134
+
135
+ If user says "I added an override for {tool}" or "register my {tool} override":
136
+
137
+ 1. **Read** `~/.droid/skill_overrides/{skill}.md`
138
+ 2. **Parse** YAML frontmatter to extract `overrides: [...]` array
139
+ 3. **Register** using the config commands above (with tool name in config path)
140
+ 4. **Confirm** registration
141
+
142
+ ### Override Visibility
143
+
144
+ When an override is active, skills show:
145
+ ```
146
+ [override] brain/search → ~/.droid/skill_overrides/brain.md
147
+ ```
148
+
149
+ This helps users know customisation is being used and where to find it.
150
+
151
+ ### Example: qmd for Brain Search
152
+
153
+ User: "I want brain search to use qmd for semantic search"
154
+
155
+ Create `~/.droid/skill_overrides/brain.md`:
156
+ ```markdown
157
+ ---
158
+ overrides: [search]
159
+ ---
160
+
161
+ ## search
162
+
163
+ Use qmd for semantic search instead of filename matching.
164
+
165
+ **Prerequisites:** qmd installed, brain collection indexed (`qmd index brain -p {brain_dir}`)
166
+
167
+ **Workflow:**
168
+
169
+ 1. Check if qmd collection exists: `qmd ls brain`
170
+ 2. If exists, run: `qmd query "{query}" -c brain -n 10 --files`
171
+ 3. Parse CSV output (format: `docid,score,filepath,context`)
172
+ 4. Extract filepath (field 3) from each row
173
+ 5. Present matches sorted by score
174
+ 6. If qmd fails or collection doesn't exist, fall back to Glob: `{brain_dir}/**/*{query}*.md`
175
+ ```
176
+
177
+ Then register:
178
+ ```bash
179
+ droid config --set tools.brain.override.path="~/.droid/skill_overrides/brain.md"
180
+ droid config --set tools.brain.override.commands='["search"]'
181
+ droid config --set tools.brain.override.enabled=true
182
+ ```
183
+
184
+ ### Override Lookup (for all skills)
185
+
186
+ When executing any skill command, check for overrides:
187
+
188
+ 1. **Get tool config:** `droid config --get tools.{tool}`
189
+
190
+ 2. **Check if override applies:**
191
+ - Config has `override` section AND
192
+ - `override.enabled` is `true` (or not set) AND
193
+ - `override.commands` includes the current command
194
+
195
+ 3. **If override applies:**
196
+ - Show: `[override] {skill}/{command} → {override.path}`
197
+ - Read the override file at `override.path`
198
+ - Find the `## {command}` section
199
+ - Follow those instructions instead of default workflow
200
+ - If override fails or instructions unclear, fall back to default
201
+
202
+ 4. **If no override:** Use default skill behaviour
203
+
204
+ This lookup is the same for all skills - config is per-tool, but the lookup workflow is universal.
@@ -12,5 +12,11 @@
12
12
  "droid",
13
13
  "ai",
14
14
  "plan"
15
+ ],
16
+ "skills": [
17
+ "./skills/plan/SKILL.md"
18
+ ],
19
+ "commands": [
20
+ "./commands/plan.md"
15
21
  ]
16
22
  }
@@ -28,6 +28,8 @@ Uses config from dependencies:
28
28
  - `droid config --get tools.brain` → `brain_dir`, `inbox_folder`
29
29
  - `droid config --get user_mention` → `user_mention` (global config)
30
30
 
31
+ **Overrides:** This skill supports user-defined overrides. See `/droid` skill § Skill Overrides.
32
+
31
33
  ## Commands
32
34
 
33
35
  | Command | Action |
@@ -12,5 +12,11 @@
12
12
  "droid",
13
13
  "ai",
14
14
  "project"
15
+ ],
16
+ "skills": [
17
+ "./skills/project/SKILL.md"
18
+ ],
19
+ "commands": [
20
+ "./commands/project.md"
15
21
  ]
16
22
  }
@@ -32,6 +32,9 @@ Chat history disappears. Projects persist.
32
32
  | -------------- | ------------ | -------------------------------------------------- |
33
33
  | `projects_dir` | **required** | Where projects are stored (must be configured) |
34
34
  | `preset` | `markdown` | Output format: `markdown` or `obsidian` |
35
+ | `override` | (none) | User-defined behaviour overrides |
36
+
37
+ **Overrides:** This skill supports user-defined overrides. See `/droid` skill § Skill Overrides.
35
38
 
36
39
  If `projects_dir` is not configured, inform the user they need to set it up:
37
40
  ```bash
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "droid-status-update",
3
+ "version": "0.1.0",
4
+ "description": "Generate and post project status updates. Aggregates context from codex projects, Jira epics, and manual input. Posts to Slack or prints to terminal.",
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
+ "status-update"
15
+ ],
16
+ "skills": [
17
+ "./skills/status-update/SKILL.md"
18
+ ],
19
+ "commands": [
20
+ "./commands/status-update.md"
21
+ ]
22
+ }
@@ -0,0 +1,21 @@
1
+ name: status-update
2
+ description: "Generate and post project status updates. Aggregates context from codex projects, Jira epics, and manual input. Posts to Slack or prints to terminal."
3
+ version: 0.1.0
4
+ status: beta
5
+
6
+ includes:
7
+ skills:
8
+ - name: status-update
9
+ required: true
10
+ commands:
11
+ - name: status-update
12
+ is_alias: false
13
+ agents: []
14
+
15
+ dependencies: []
16
+
17
+ config_schema:
18
+ default_crosspost_channel:
19
+ type: string
20
+ description: Default channel for cross-posting updates (e.g., rnd-updates)
21
+ required: false
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: status-update
3
+ description: "Generate and post project status updates. Pulls from codex, Jira, and manual input. Posts to Slack or prints to terminal."
4
+ argument-hint: "[{project}]"
5
+ ---
6
+
7
+ # /status-update
8
+
9
+ **User invoked:** `/status-update $ARGUMENTS`
10
+
11
+ **Your task:** Invoke the **status-update skill** with these arguments.
12
+
13
+ ## Examples
14
+
15
+ - `/status-update` → Prompt for project or use active project
16
+ - `/status-update partnership-automation` → Generate update for specific project
17
+ - `/status-update --no-slack` → Generate update but print to terminal instead of posting
18
+
19
+ ## Quick Reference
20
+
21
+ ```
22
+ /status-update # Interactive - prompts for everything
23
+ /status-update {project} # Use codex project for metadata
24
+ /status-update --no-slack # Output to terminal instead of Slack
25
+ ```
26
+
27
+ See the **status-update skill** for complete documentation.
@@ -0,0 +1,253 @@
1
+ ---
2
+ name: status-update
3
+ description: "Generate and post project status updates. Aggregates context from codex projects, Jira epics, and manual input. Posts to Slack or prints to terminal."
4
+ argument-hint: "[{project}]"
5
+ allowed-tools:
6
+ [
7
+ Read,
8
+ Glob,
9
+ Grep,
10
+ Bash(git:*),
11
+ Bash(curl:*),
12
+ Bash(droid:*),
13
+ ]
14
+ ---
15
+
16
+ # Status Update Skill
17
+
18
+ Generate formatted project status updates from multiple sources and post to Slack (or print to terminal).
19
+
20
+ ## Data Sources (All Optional)
21
+
22
+ | Source | When available | What it provides |
23
+ |--------|----------------|------------------|
24
+ | **Codex project** | If project name matches a codex project | Metadata (slack, jira, links) + git history |
25
+ | **Jira MCP** | If jira.epic configured + MCP connected | Ticket status for in-flight/up-next drafts |
26
+ | **Manual input** | Always | User-provided status, phase, bullets |
27
+
28
+ ## Output Destinations
29
+
30
+ | Destination | When available | Fallback |
31
+ |-------------|----------------|----------|
32
+ | **Slack** | If slack.channel configured + SLACK_USER_TOKEN set | Print to terminal |
33
+
34
+ ## Procedure
35
+
36
+ ### 1. Resolve Project Context
37
+
38
+ **If project name provided:**
39
+
40
+ 1. Check if codex is configured:
41
+ ```bash
42
+ droid config --get tools.codex
43
+ ```
44
+
45
+ 2. If codex configured, look for matching project:
46
+ ```bash
47
+ ls {codex_repo}/projects/ | grep -i {project}
48
+ ```
49
+
50
+ 3. If found, read CONTEXT.md frontmatter:
51
+ - `title` - Project name
52
+ - `slack.channel` - Primary Slack channel
53
+ - `slack.crosspost_channel` - Optional crosspost channel
54
+ - `slack.canvas_id` - Optional canvas for update log
55
+ - `jira.epic` - Optional Jira epic key
56
+ - `links.prd`, `links.tech_design`, `links.figma` - Optional doc links
57
+
58
+ **If no project name provided:**
59
+
60
+ 1. Check for active project in conversation context
61
+ 2. If none, ask: "Which project is this update for?"
62
+ 3. If user provides a name, attempt to match to codex project
63
+ 4. If no match, continue without codex metadata (prompt for details manually)
64
+
65
+ **If no codex match:**
66
+
67
+ Prompt user for:
68
+ - Project name (for display)
69
+ - Slack channel (optional - skip to print to terminal)
70
+ - Jira epic key (optional)
71
+
72
+ ### 2. Generate Draft Content
73
+
74
+ Attempt to generate draft bullets from available sources.
75
+
76
+ #### Source A: Codex Git History (if codex project found)
77
+
78
+ ```bash
79
+ git -C {codex_repo} log --oneline --since="7 days ago" -- projects/{project}/
80
+ ```
81
+
82
+ Parse commits to understand recent activity:
83
+ - DECISIONS.md changes → decisions made
84
+ - New artifacts → meetings, documents produced
85
+ - CONTEXT.md changes → project evolution
86
+ - PRD.md/TECH-DESIGN.md changes → documentation progress
87
+
88
+ Generate human-readable draft bullets from the git history.
89
+
90
+ #### Source B: Jira MCP (if configured)
91
+
92
+ **Check MCP availability:**
93
+ ```
94
+ mcp__atlassian__getAccessibleAtlassianResources
95
+ ```
96
+
97
+ If available and `jira.epic` is set, run two JQL queries:
98
+
99
+ 1. **Recently completed + in progress:**
100
+ ```
101
+ parent = {jira.epic} AND (status changed to Done AFTER -7d OR statusCategory in ("In Progress"))
102
+ ```
103
+
104
+ 2. **Up next:**
105
+ ```
106
+ parent = {jira.epic} AND statusCategory = "To Do"
107
+ ```
108
+
109
+ Categorise tickets:
110
+
111
+ | Jira Status | Category |
112
+ |-------------|----------|
113
+ | Done (last 7 days) | In flight (completed) |
114
+ | In Progress, In Review, In QA | In flight (active) |
115
+ | To Do, Backlog | Up next |
116
+
117
+ #### Combine Sources
118
+
119
+ If multiple sources available:
120
+ - Deduplicate where codex change and Jira ticket describe the same work
121
+ - Prefer Jira summaries for ticket-tracked work
122
+ - Include codex-only changes (decisions, meetings) not in Jira
123
+
124
+ **Present draft to user** for review/editing before finalising.
125
+
126
+ ### 3. Gather Update Content
127
+
128
+ Ask user for (pre-fill from drafts where available):
129
+
130
+ 1. **Status** - One of:
131
+ - `on_track` (green) - Everything proceeding as planned
132
+ - `at_risk` (yellow) - Some concerns or blockers emerging
133
+ - `blocked` (red) - Cannot proceed without resolution
134
+
135
+ 2. **Current phase** - One of:
136
+ - `discovery` - Research and requirements gathering
137
+ - `post_discovery_feedback` - Incorporating discovery feedback
138
+ - `design` - Prototype and design work
139
+ - `post_design_feedback` - Incorporating design feedback
140
+ - `prd` - Writing PRD
141
+ - `tech_design` - Writing Tech Design
142
+ - `development` - Active implementation
143
+ - `qa` - QA & Testing
144
+ - `release` - Released to production
145
+
146
+ 3. **In flight this week** - Bullet points (from draft or manual)
147
+
148
+ 4. **Up next** - Bullet points (from draft or manual)
149
+
150
+ ### 4. Format Message
151
+
152
+ See `references/formatting.md` for detailed formatting rules.
153
+
154
+ **Structure:**
155
+ ```
156
+ *Status:* {status_emoji} *{status_text}*
157
+
158
+ *Where we're at*
159
+ {phase_checklist}
160
+
161
+ *In flight this week*
162
+ • {bullet 1}
163
+ • {bullet 2}
164
+
165
+ *Up next*
166
+ • {bullet 1}
167
+ • {bullet 2}
168
+
169
+ {links_footer if configured}
170
+
171
+ Posted with help from :droid:
172
+ ```
173
+
174
+ Add ` & :codex:` to footer if codex project was used.
175
+
176
+ ### 5. Output
177
+
178
+ #### If Slack configured (channel + SLACK_USER_TOKEN):
179
+
180
+ **Post to primary channel:**
181
+ ```bash
182
+ curl -s -X POST https://slack.com/api/chat.postMessage \
183
+ -H "Authorization: Bearer $SLACK_USER_TOKEN" \
184
+ -H "Content-Type: application/json; charset=utf-8" \
185
+ -d '{
186
+ "channel": "{slack.channel}",
187
+ "text": "{formatted_message}",
188
+ "unfurl_links": false
189
+ }'
190
+ ```
191
+
192
+ Check response for `"ok": true`. Save `ts` and `channel` from response.
193
+
194
+ **Crosspost (if crosspost_channel configured):**
195
+
196
+ Post summary version with link to full update:
197
+ ```
198
+ *{project_title}*
199
+
200
+ {status_line}
201
+ {current_phase_only}
202
+
203
+ {in_flight_section}
204
+
205
+ :link: <{message_url}|View full update>
206
+ ```
207
+
208
+ Message URL format: `https://orderful.slack.com/archives/{channel_id}/p{ts_without_dot}`
209
+
210
+ **Update canvas log (if canvas_id configured):**
211
+ ```bash
212
+ curl -s -X POST https://slack.com/api/canvases.edit \
213
+ -H "Authorization: Bearer $SLACK_USER_TOKEN" \
214
+ -H "Content-Type: application/json; charset=utf-8" \
215
+ -d '{
216
+ "canvas_id": "{slack.canvas_id}",
217
+ "changes": [{
218
+ "operation": "insert_at_start",
219
+ "document_content": {
220
+ "type": "markdown",
221
+ "markdown": "### {date}\n{status} · {current_phase}\n[View update]({message_url})\n\n---"
222
+ }
223
+ }]
224
+ }'
225
+ ```
226
+
227
+ **Confirm to user:**
228
+ - "Posted update to #{channel}"
229
+ - "Cross-posted to #{crosspost_channel}" (if applicable)
230
+ - "Added to canvas log" (if applicable)
231
+
232
+ #### If Slack NOT configured:
233
+
234
+ Print the formatted message to terminal.
235
+
236
+ Tell user: "Slack not configured. To post updates directly, add `slack.channel` to your project's CONTEXT.md and set `SLACK_USER_TOKEN` in your environment."
237
+
238
+ ### Error Handling
239
+
240
+ | Error | Action |
241
+ |-------|--------|
242
+ | No SLACK_USER_TOKEN | Print to terminal, suggest setup |
243
+ | Slack API error | Show error, offer to print instead |
244
+ | Jira MCP not available | Skip Jira, continue with other sources |
245
+ | No codex project found | Continue with manual input |
246
+
247
+ ## Configuration
248
+
249
+ No required configuration. Optional settings via `droid config`:
250
+
251
+ | Setting | Description |
252
+ |---------|-------------|
253
+ | `default_crosspost_channel` | Default channel for cross-posts if not in project metadata |