@anionzo/skill 1.4.0 → 1.7.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 (57) hide show
  1. package/CONTRIBUTING.md +2 -1
  2. package/README.md +82 -24
  3. package/docs/design-brief.md +17 -13
  4. package/docs/knowledge-spec.md +1 -0
  5. package/i18n/CONTRIBUTING.vi.md +2 -1
  6. package/i18n/README.vi.md +82 -24
  7. package/i18n/design-brief.vi.md +17 -13
  8. package/i18n/knowledge-spec.vi.md +1 -0
  9. package/knowledge/global/skill-triggering-rules.md +3 -2
  10. package/package.json +1 -1
  11. package/scripts/install-opencode-skills +197 -35
  12. package/skills/brainstorming/SKILL.md +176 -13
  13. package/skills/brainstorming/meta.yaml +18 -10
  14. package/skills/code-review/SKILL.md +214 -19
  15. package/skills/code-review/meta.yaml +21 -9
  16. package/skills/commit/SKILL.md +187 -0
  17. package/skills/commit/examples.md +62 -0
  18. package/skills/commit/meta.yaml +29 -0
  19. package/skills/commit/references/output-template.md +14 -0
  20. package/skills/debug/SKILL.md +252 -0
  21. package/skills/debug/examples.md +83 -0
  22. package/skills/debug/meta.yaml +39 -0
  23. package/skills/debug/references/output-template.md +16 -0
  24. package/skills/docs-writer/SKILL.md +85 -10
  25. package/skills/docs-writer/meta.yaml +18 -13
  26. package/skills/extract/SKILL.md +201 -0
  27. package/skills/extract/examples.md +47 -0
  28. package/skills/extract/meta.yaml +33 -0
  29. package/skills/extract/references/output-template.md +24 -0
  30. package/skills/feature-delivery/SKILL.md +12 -5
  31. package/skills/feature-delivery/meta.yaml +6 -1
  32. package/skills/planning/SKILL.md +146 -17
  33. package/skills/planning/meta.yaml +19 -7
  34. package/skills/refactor-safe/SKILL.md +10 -7
  35. package/skills/research/SKILL.md +130 -0
  36. package/skills/research/examples.md +79 -0
  37. package/skills/research/meta.yaml +31 -0
  38. package/skills/research/references/output-template.md +23 -0
  39. package/skills/test-driven-development/SKILL.md +194 -0
  40. package/skills/test-driven-development/examples.md +77 -0
  41. package/skills/test-driven-development/meta.yaml +31 -0
  42. package/skills/test-driven-development/references/.gitkeep +0 -0
  43. package/skills/test-driven-development/references/output-template.md +31 -0
  44. package/skills/using-skills/SKILL.md +33 -17
  45. package/skills/using-skills/examples.md +20 -5
  46. package/skills/using-skills/meta.yaml +7 -4
  47. package/skills/verification-before-completion/SKILL.md +127 -13
  48. package/skills/verification-before-completion/meta.yaml +23 -14
  49. package/templates/SKILL.md +8 -1
  50. package/skills/bug-triage/SKILL.md +0 -47
  51. package/skills/bug-triage/examples.md +0 -68
  52. package/skills/bug-triage/meta.yaml +0 -25
  53. package/skills/bug-triage/references/output-template.md +0 -26
  54. package/skills/repo-onboarding/SKILL.md +0 -52
  55. package/skills/repo-onboarding/examples.md +0 -115
  56. package/skills/repo-onboarding/meta.yaml +0 -23
  57. package/skills/repo-onboarding/references/output-template.md +0 -24
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # Install AI skills into agent-specific directories
4
4
  #
@@ -10,14 +10,20 @@
10
10
  # npm install @anionzo/skill # auto (postinstall)
11
11
  # bash scripts/install-opencode-skills [project-dir]
12
12
 
13
- set -eu
13
+ set -euo pipefail
14
14
 
15
15
  SCRIPT_PATH=$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || echo "$0")
16
16
  ROOT=$(CDPATH= cd -- "$(dirname "$SCRIPT_PATH")/.." && pwd)
17
17
 
18
- # Determine project root: explicit arg > INIT_CWD (set by npm) > current dir
18
+ # Determine project root:
19
+ # 1. explicit arg
20
+ # 2. npm_config_local_prefix during lifecycle scripts (correct for npm install --prefix)
21
+ # 3. INIT_CWD (npm invocation cwd)
22
+ # 4. current dir
19
23
  if [ -n "${1:-}" ]; then
20
24
  PROJECT="$1"
25
+ elif [ "${npm_lifecycle_event:-}" = "postinstall" ] && [ -n "${npm_config_local_prefix:-}" ]; then
26
+ PROJECT="$npm_config_local_prefix"
21
27
  elif [ -n "${INIT_CWD:-}" ]; then
22
28
  PROJECT="$INIT_CWD"
23
29
  else
@@ -135,8 +141,180 @@ copilot||.github/copilot-instructions.md|GitHub Copilot Instructions|GitHub Copi
135
141
  # --- Interactive mode detection ---
136
142
 
137
143
  is_interactive() {
138
- # postinstall (npm) sets INIT_CWD skip interactive
139
- [ -z "${INIT_CWD:-}" ] && [ -t 0 ]
144
+ [ "${npm_lifecycle_event:-}" != "postinstall" ] && [ -t 0 ] && [ -t 1 ]
145
+ }
146
+
147
+ # --- Interactive picker ---
148
+
149
+ MENU_LABELS=(
150
+ "OpenCode (.opencode/skills/ + OPENCODE.md)"
151
+ "Claude Code (.claude/skills/ + CLAUDE.md)"
152
+ "Agents (generic)(.agents/skills/ + AGENTS.md)"
153
+ "Gemini CLI (GEMINI.md)"
154
+ "GitHub Copilot (.github/copilot-instructions.md)"
155
+ "Update .gitignore with selected platform files"
156
+ )
157
+
158
+ read_key() {
159
+ local key rest final
160
+
161
+ IFS= read -rsn1 key || return 1
162
+
163
+ if [ "$key" = $'\x1b' ]; then
164
+ IFS= read -rsn1 -t 0.1 rest || true
165
+ if [ "$rest" = "[" ]; then
166
+ IFS= read -rsn1 -t 0.1 final || true
167
+ printf '\033[%s' "$final"
168
+ else
169
+ printf '\033%s' "$rest"
170
+ fi
171
+ return 0
172
+ fi
173
+
174
+ printf '%s' "$key"
175
+ }
176
+
177
+ render_menu() {
178
+ local cursor="$1"
179
+ shift
180
+ local -a state=("$@")
181
+ local i mark prefix
182
+
183
+ printf '\033[H\033[2J'
184
+ printf '\n'
185
+ printf ' @anionzo/skill -- AI Skill Library\n'
186
+ printf ' ==================================\n\n'
187
+ printf ' Use arrow keys to move, space to toggle, enter to install.\n'
188
+ printf ' Press a to toggle all platforms, q to cancel.\n\n'
189
+
190
+ for i in "${!MENU_LABELS[@]}"; do
191
+ [ "$i" -eq 5 ] && printf '\n'
192
+
193
+ if [ "${state[$i]}" -eq 1 ]; then
194
+ mark='[x]'
195
+ else
196
+ mark='[ ]'
197
+ fi
198
+
199
+ if [ "$i" -eq "$cursor" ]; then
200
+ prefix='>'
201
+ else
202
+ prefix=' '
203
+ fi
204
+
205
+ printf ' %s %s %s\n' "$prefix" "$mark" "${MENU_LABELS[$i]}"
206
+ done
207
+
208
+ printf '\n'
209
+ }
210
+
211
+ toggle_all_platforms() {
212
+ local -n state_ref=$1
213
+ local sum=0
214
+ local i next=1
215
+
216
+ for i in 0 1 2 3 4; do
217
+ sum=$((sum + state_ref[$i]))
218
+ done
219
+
220
+ [ "$sum" -eq 5 ] && next=0
221
+
222
+ for i in 0 1 2 3 4; do
223
+ state_ref[$i]=$next
224
+ done
225
+ }
226
+
227
+ interactive_select() {
228
+ local cursor=0
229
+ local key
230
+ local -a selected=(0 0 0 0 0 0)
231
+
232
+ while true; do
233
+ render_menu "$cursor" "${selected[@]}"
234
+ key=$(read_key) || exit 0
235
+
236
+ case "$key" in
237
+ $'\033[A')
238
+ if [ "$cursor" -eq 0 ]; then
239
+ cursor=$((${#MENU_LABELS[@]} - 1))
240
+ else
241
+ cursor=$((cursor - 1))
242
+ fi
243
+ ;;
244
+ $'\033[B')
245
+ if [ "$cursor" -eq $((${#MENU_LABELS[@]} - 1)) ]; then
246
+ cursor=0
247
+ else
248
+ cursor=$((cursor + 1))
249
+ fi
250
+ ;;
251
+ "")
252
+ break
253
+ ;;
254
+ " ")
255
+ if [ "${selected[$cursor]}" -eq 1 ]; then
256
+ selected[$cursor]=0
257
+ else
258
+ selected[$cursor]=1
259
+ fi
260
+ ;;
261
+ [aA])
262
+ toggle_all_platforms selected
263
+ ;;
264
+ [qQ])
265
+ printf '\n Cancelled.\n\n'
266
+ exit 0
267
+ ;;
268
+ esac
269
+ done
270
+
271
+ printf '%s\n' "${selected[@]}"
272
+ }
273
+
274
+ update_gitignore() {
275
+ local gitignore="$PROJECT/.gitignore"
276
+ local -a entries=()
277
+ local -a missing=()
278
+ local header_needed=0
279
+ local entry
280
+
281
+ [ "${do_opencode:-0}" -eq 1 ] && entries+=(".opencode/" "OPENCODE.md")
282
+ [ "${do_claude:-0}" -eq 1 ] && entries+=(".claude/" "CLAUDE.md")
283
+ [ "${do_agents:-0}" -eq 1 ] && entries+=(".agents/" "AGENTS.md")
284
+ [ "${do_gemini:-0}" -eq 1 ] && entries+=("GEMINI.md")
285
+ [ "${do_copilot:-0}" -eq 1 ] && entries+=(".github/copilot-instructions.md")
286
+
287
+ if [ "${#entries[@]}" -eq 0 ]; then
288
+ printf ' .gitignore: skipped (no platform files selected)\n'
289
+ return
290
+ fi
291
+
292
+ touch "$gitignore"
293
+
294
+ if ! grep -Fqx '# @anionzo/skill' "$gitignore" 2>/dev/null; then
295
+ header_needed=1
296
+ fi
297
+
298
+ for entry in "${entries[@]}"; do
299
+ if ! grep -Fqx "$entry" "$gitignore" 2>/dev/null; then
300
+ missing+=("$entry")
301
+ fi
302
+ done
303
+
304
+ if [ "${#missing[@]}" -eq 0 ]; then
305
+ printf ' .gitignore: already up to date -> %s\n' "$gitignore"
306
+ return
307
+ fi
308
+
309
+ if [ "$header_needed" -eq 1 ]; then
310
+ printf '\n# @anionzo/skill\n' >> "$gitignore"
311
+ fi
312
+
313
+ for entry in "${missing[@]}"; do
314
+ printf '%s\n' "$entry" >> "$gitignore"
315
+ done
316
+
317
+ printf ' .gitignore: added %d entries -> %s\n' "${#missing[@]}" "$gitignore"
140
318
  }
141
319
 
142
320
  # --- Main ---
@@ -146,36 +324,16 @@ printf ' @anionzo/skill — AI Skill Library\n'
146
324
  printf ' ==================================\n\n'
147
325
 
148
326
  if is_interactive; then
149
- # --- Interactive: let user pick platforms ---
150
-
151
- printf ' Which platforms do you want to install?\n\n'
152
- printf ' [1] OpenCode (.opencode/skills/ + OPENCODE.md)\n'
153
- printf ' [2] Claude Code (.claude/skills/ + CLAUDE.md)\n'
154
- printf ' [3] Agents (generic)(.agents/skills/ + AGENTS.md)\n'
155
- printf ' [4] Gemini CLI (GEMINI.md)\n'
156
- printf ' [5] GitHub Copilot (.github/copilot-instructions.md)\n'
157
- printf ' [a] All of the above\n\n'
158
-
159
- printf ' Enter choices (e.g. 1 2 3, or a for all): '
160
- read -r choices
161
-
162
- # Normalize
163
- case "$choices" in
164
- *[aA]*) choices="1 2 3 4 5" ;;
165
- esac
166
-
167
- # Parse choices into flags
168
- do_opencode=0; do_claude=0; do_agents=0; do_gemini=0; do_copilot=0
169
-
170
- for c in $choices; do
171
- case "$c" in
172
- 1) do_opencode=1 ;;
173
- 2) do_claude=1 ;;
174
- 3) do_agents=1 ;;
175
- 4) do_gemini=1 ;;
176
- 5) do_copilot=1 ;;
177
- esac
178
- done
327
+ # --- Interactive: let user pick platforms with arrows + space ---
328
+
329
+ mapfile -t selected < <(interactive_select)
330
+
331
+ do_opencode=${selected[0]}
332
+ do_claude=${selected[1]}
333
+ do_agents=${selected[2]}
334
+ do_gemini=${selected[3]}
335
+ do_copilot=${selected[4]}
336
+ do_gitignore=${selected[5]}
179
337
 
180
338
  # Check if anything was selected
181
339
  total=$((do_opencode + do_claude + do_agents + do_gemini + do_copilot))
@@ -213,6 +371,10 @@ if is_interactive; then
213
371
  printf ' -> .github/copilot-instructions.md\n'
214
372
  fi
215
373
 
374
+ if [ "$do_gitignore" -eq 1 ]; then
375
+ update_gitignore
376
+ fi
377
+
216
378
  else
217
379
  # --- Silent mode: postinstall — install all skill dirs, no agent files ---
218
380
 
@@ -2,7 +2,9 @@
2
2
 
3
3
  ## Purpose
4
4
 
5
- Refine a fuzzy request into a concrete direction that is clear enough to plan.
5
+ Refine a fuzzy request into a concrete direction, and when needed, lock decisions into a specification before implementation begins.
6
+
7
+ This skill combines idea exploration with spec-driven development: first clarify what to build, then optionally formalize it into a spec with locked decisions and acceptance criteria.
6
8
 
7
9
  ## When To Use
8
10
 
@@ -11,35 +13,196 @@ Load this skill when:
11
13
  - the user has an idea but not a settled approach
12
14
  - the scope or success criteria are still unclear
13
15
  - multiple reasonable options exist and the tradeoff matters
14
- - starting implementation immediately would force too many assumptions
16
+ - the user says "spec this", "define requirements", or "what should we build"
17
+ - planning a non-trivial feature that has ambiguous requirements
18
+ - multiple stakeholders need to agree on behavior before code is written
15
19
 
16
20
  Skip this skill and go directly to `planning` when the request is already specific: a named feature with clear scope, a known code path, or an explicit task with acceptance criteria.
17
21
 
18
- ## Workflow
22
+ ## Workflow Overview
23
+
24
+ **Phase 0: Explore** — clarify the idea, surface tradeoffs, extract decisions
25
+ **Phase 1: Lock Direction** — lock the recommended direction and scope boundary
26
+ **Phase 2: Write Spec** (optional) — formalize into a spec document with ACs
27
+ **Phase 3: Review** — get user approval before handoff
28
+
29
+ For simple clarifications, Phase 0 + Phase 1 is sufficient. For non-trivial features, continue through Phase 2 + Phase 3.
30
+
31
+ ## Phase 0: Explore
32
+
33
+ ### 0.1 Scope Assessment
34
+
35
+ Assess the request complexity:
36
+
37
+ - **Quick** — bounded, low ambiguity (rename a flag, tweak a label). Clarify and hand off to `planning`.
38
+ - **Standard** — normal feature with decisions to extract. Run full exploration.
39
+ - **Deep** — cross-cutting, strategic, or highly ambiguous. Run exploration with extra depth, then write a spec.
40
+
41
+ ### 0.2 Restate and Question
19
42
 
20
43
  1. Restate the request in plain language.
21
44
  2. Ask focused questions that reduce ambiguity quickly.
22
45
  3. Surface the most important tradeoffs, not every possible one.
23
- 4. Propose one or two viable directions with clear consequences.
24
- 5. Lock the current best direction, scope boundary, and open questions.
25
- 6. End with a handoff into `planning` when the request is concrete enough.
46
+
47
+ **HARD RULE: Ask ONE question at a time. Wait for the user's response before asking the next.**
48
+
49
+ Rules:
50
+
51
+ - One question per message — never bundled
52
+ - Single-select multiple choice preferred over open-ended
53
+ - Start broad (what/why/for whom) then narrow (constraints, edge cases)
54
+ - 3-4 questions per topic area, then checkpoint:
55
+ > "More questions about [area], or move on? (Remaining: [unvisited areas])"
56
+
57
+ ### 0.3 Gray Area Identification
58
+
59
+ Generate 2-4 gray areas — decisions that affect implementation but were not stated in the request. A gray area is a decision that would force the planner to make an assumption without it.
60
+
61
+ Quick codebase scout (grep, not deep analysis):
62
+
63
+ - check what already exists that is related
64
+ - annotate options with what the codebase already has
65
+
66
+ Filter OUT:
67
+
68
+ - technical implementation details (architecture, library choices) — that is `planning`'s job
69
+ - performance concerns
70
+ - scope expansion (new capabilities not requested)
71
+
72
+ ### 0.4 Decision Locking
73
+
74
+ After each gray area is resolved, lock the decision:
75
+
76
+ > "Lock decision D[N]: [summary]. Confirmed?"
77
+
78
+ Assign stable IDs: D1, D2, D3... These IDs carry forward into the spec.
79
+
80
+ **Scope creep response** — when the user suggests something outside scope:
81
+
82
+ > "[Feature X] is a new capability — noted as a separate work item. Back to [current area]: [question]"
83
+
84
+ ## Phase 1: Lock Direction
85
+
86
+ Summarize the exploration output. All three of the following must be written down explicitly:
87
+
88
+ 1. **Recommended direction** — the approach to take
89
+ 2. **At least one key constraint** — what limits or shapes the solution
90
+ 3. **Scope boundary** — what is in and what is out
91
+
92
+ Present viable options with consequences if multiple exist, but recommend one.
93
+
94
+ **For quick scope:** This is the final output. Hand off to `planning`.
95
+
96
+ **For standard/deep scope:** Continue to Phase 2.
97
+
98
+ ## Phase 2: Write Spec (For Standard/Deep Scope)
99
+
100
+ ### Spec Document Structure
101
+
102
+ ```markdown
103
+ ## Overview
104
+
105
+ Brief description of the feature and its purpose.
106
+
107
+ ## Locked Decisions
108
+
109
+ - D1: [Decision summary]
110
+ - D2: [Decision summary]
111
+
112
+ ## Requirements
113
+
114
+ ### Functional Requirements
115
+ - FR-1: [Requirement description]
116
+ - FR-2: [Requirement description]
117
+
118
+ ### Non-Functional Requirements
119
+ - NFR-1: [Performance, security, etc.]
120
+
121
+ ## Acceptance Criteria
122
+
123
+ - [ ] AC-1: [Testable criterion]
124
+ - [ ] AC-2: [Testable criterion]
125
+
126
+ ## Scenarios
127
+
128
+ ### Scenario 1: [Happy Path]
129
+ **Given** [context]
130
+ **When** [action]
131
+ **Then** [expected result]
132
+
133
+ ### Scenario 2: [Edge Case]
134
+ **Given** [context]
135
+ **When** [action]
136
+ **Then** [expected result]
137
+
138
+ ## Open Questions
139
+
140
+ - [ ] Question 1?
141
+ ```
142
+
143
+ ### Spec Quality Rules
144
+
145
+ - Requirements must be testable.
146
+ - Acceptance criteria must be observable outcomes, not vague goals.
147
+ - Scenarios should cover the happy path plus important edge cases.
148
+ - Open questions must stay explicit, not buried in prose.
149
+ - Keep the spec focused on WHAT, not HOW (implementation is `planning`'s job).
150
+
151
+ ## Phase 3: Review
152
+
153
+ Present the spec (or the locked direction for quick scope) and ask:
154
+
155
+ > Please review:
156
+ > - **Approve** if complete
157
+ > - **Edit** if you want to modify something
158
+ > - **Add more** if requirements are missing
159
+
160
+ Handle the response:
161
+
162
+ - **Approved** → hand off to next skill
163
+ - **Edit requested** → update, return to review
164
+ - **Add more** → gather additional requirements, update, return to review
26
165
 
27
166
  ## Output Format
28
167
 
29
- - clarified goal
30
- - constraints and assumptions
31
- - viable options considered
32
- - recommended direction
33
- - unresolved questions
34
- - next skill to invoke
168
+ Present results using the Shared Output Contract:
169
+
170
+ 1. **Goal/Result** the clarified direction, spec (if written), and approval status
171
+ 2. **Key Details:**
172
+ - locked decisions (D1, D2...)
173
+ - scope boundary (in/out)
174
+ - viable options considered with tradeoffs
175
+ - acceptance criteria (if spec written)
176
+ - open questions
177
+ 3. **Next Action** — after approval:
178
+ - to review each step: `planning` (with spec reference)
179
+ - to execute everything at once: `planning` in go mode (with spec reference)
180
+ - if requirements still unclear: state what decision is still needed
35
181
 
36
182
  ## Red Flags
37
183
 
38
184
  - diving into file-level implementation too early
39
185
  - asking many questions that do not change the decision
186
+ - batching multiple questions in one message (HARD RULE violation)
40
187
  - presenting vague options with no tradeoff explanation
41
188
  - pretending the problem is settled when key constraints are still unknown
189
+ - creating a spec without user input
190
+ - answering your own questions during exploration
191
+ - skipping the review step
192
+ - writing implementation notes instead of requirements
193
+ - leaving ambiguous acceptance criteria that cannot be verified
194
+
195
+ ## Checklist
196
+
197
+ - [ ] Scope assessed (quick/standard/deep)
198
+ - [ ] Request restated in plain language
199
+ - [ ] Gray areas identified and explored (one question at a time)
200
+ - [ ] Decisions locked with stable IDs (D1, D2...)
201
+ - [ ] Direction, constraint, and scope boundary documented
202
+ - [ ] Spec written (if standard/deep scope): overview, decisions, requirements, ACs, scenarios
203
+ - [ ] User reviewed and approved
204
+ - [ ] Next step communicated
42
205
 
43
206
  ## Done Criteria
44
207
 
45
- This skill is complete when all three of the following are written down explicitly: the recommended direction, at least one key constraint, and the scope boundary. At that point, `planning` can proceed without inventing missing requirements.
208
+ This skill is complete when the recommended direction, at least one key constraint, and the scope boundary are all written down explicitly. For standard/deep scope, the spec must be approved with acceptance criteria defined. If the spec is not approved, the skill is complete when the user has the information needed to make a decision.
@@ -1,23 +1,31 @@
1
1
  name: brainstorming
2
- version: 0.1.0
2
+ version: 0.2.0
3
3
  category: discovery
4
- summary: Turn a rough idea or underspecified request into a concrete, reviewable direction before planning begins.
5
- summary_vi: Biến ý tưởng thô hoặc request chưa rõ thành hướng đi cụ thể, có thể review, trước khi bắt đầu lập plan.
4
+ summary: Turn a rough idea into a concrete direction with locked decisions, optionally formalized into a spec with acceptance criteria.
5
+ summary_vi: "Biến ý tưởng thô thành hướng đi cụ thể với quyết định đã khóa, có thể formalize thành spec với acceptance criteria."
6
6
  triggers:
7
7
  - help me think this through
8
8
  - explore the approach first
9
9
  - the request is vague or underspecified
10
+ - spec this feature
11
+ - define requirements
12
+ - what should we build
13
+ - create a specification
10
14
  inputs:
11
- - rough idea
15
+ - rough idea or feature description
12
16
  - user goals and constraints
13
17
  outputs:
14
- - clarified goal
15
- - key decisions
16
- - open questions
17
- - handoff into planning
18
+ - clarified goal and direction
19
+ - locked decisions (D1, D2...)
20
+ - scope boundary
21
+ - optional spec with requirements and ACs
22
+ - approval status
18
23
  constraints:
19
- - avoid jumping into code or low-level implementation too early
20
- - keep the discussion concrete and decision-oriented
24
+ - ask one question at a time during exploration
25
+ - do not skip the review step
26
+ - keep focused on WHAT not HOW
21
27
  related_skills:
22
28
  - using-skills
23
29
  - planning
30
+ - research
31
+ - feature-delivery