@linchpinagency/skills 0.1.5 → 0.1.7
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/README.md
CHANGED
|
@@ -12,7 +12,7 @@ GitHub Copilot, and other compatible coding agents.
|
|
|
12
12
|

|
|
13
13
|
|
|
14
14
|
<!-- x-release-please-start-version -->
|
|
15
|
-
### Latest release: 0.1.
|
|
15
|
+
### Latest release: 0.1.7
|
|
16
16
|
<!-- x-release-please-end -->
|
|
17
17
|
|
|
18
18
|
| Release | Skill standard | Install |
|
|
@@ -81,6 +81,7 @@ The fastest way to understand the library is to run one loop end to end:
|
|
|
81
81
|
| Understand a repo you just cloned | "what am I working with here?" | `project-context` |
|
|
82
82
|
| Find out why something's broken | "the hero image 404s on mobile" | `investigate` |
|
|
83
83
|
| Test a site like a user, and fix what's found | "QA the checkout flow" | `web-qa` |
|
|
84
|
+
| File work for later | "create an issue for the broken footer link" | `task-tracking` |
|
|
84
85
|
| Check it's ready to commit | "is this ready to commit?" | `quality-gates` |
|
|
85
86
|
| Commit and open the PR properly | "commit this and open a PR" | `commit-and-release` + `task-tracking` |
|
|
86
87
|
| Handle a client support ticket | "the client says their contact form isn't sending" | `support-triage` |
|
|
@@ -232,7 +233,7 @@ A project that wants skills in more than one agent's directory should run
|
|
|
232
233
|
| `support-triage` | Project mgmt | Run a client support request end to end — clarify the real need, reproduce, judge urgency and scope, fix in the right layer, verify, and close the loop with the requester. |
|
|
233
234
|
| `dependency-updates` | Workflow | Handle the dependency work Renovate can't automerge — majors, breaking changes, failing or conflicted bot PRs, security advisories, `@wordpress/*` package sets. |
|
|
234
235
|
| `commit-and-release` | Workflow | Write commits, branches, and PR titles that satisfy the repo's own commitlint rules, and stay out of release-please's way (it owns versions and `CHANGELOG.md`). |
|
|
235
|
-
| `task-tracking` | Workflow | Tie every unit of work to a ClickUp task (or explicit `NO-TASK`) with minimal friction via the ClickUp MCP — resolve/search a task,
|
|
236
|
+
| `task-tracking` | Workflow | Tie every unit of work to a ClickUp task (or explicit `NO-TASK`) with minimal friction via the ClickUp MCP — resolve/search a task, create one on request ("create an issue" means ClickUp, not GitHub), update it when the work lands, and carry the task key in the conventional-commit scope. |
|
|
236
237
|
| `write-a-linchpin-skill` | Meta | The house standard for authoring skills in this library — placement test, tier model, required frontmatter, the section skeleton, and the four house rules. Enforced by `scripts/validate-skills.mjs`. |
|
|
237
238
|
|
|
238
239
|
_(More WordPress, React, Cloudflare Workers, marketing, and design skills to come.)_
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: task-tracking
|
|
3
|
-
description: Associate every unit of work with a task in Linchpin's task platform (currently ClickUp, via the ClickUp MCP) with the least
|
|
4
|
-
version: 1.
|
|
3
|
+
description: Associate every unit of work with a task in Linchpin's task platform (currently ClickUp, via the ClickUp MCP) with the least friction, update it when the work lands, and leave a handoff when stopping mid-flight. Use whenever starting work, creating a TODO, preparing to commit, finishing a change, or pausing work someone else may pick up — and whenever anyone says "create an issue", "create a task", "file a ticket", or "log a bug", all of which mean a ClickUp task unless they name GitHub. Resolve a task from an ID/custom-ID/URL or by searching; if none exists, confirm NO-TASK and keep working. The conventional-commit scope carries the task key (e.g. LINCHPIN-5113) or NO-TASK.
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Task tracking (ClickUp)
|
|
@@ -18,6 +18,8 @@ platform change.
|
|
|
18
18
|
## When to use
|
|
19
19
|
|
|
20
20
|
- Starting any unit of work, before cutting a branch.
|
|
21
|
+
- **Anyone asking for an issue, task, ticket, bug, or backlog item to be created** — in any
|
|
22
|
+
wording. See *"Create an issue" means ClickUp* below.
|
|
21
23
|
- Opening a local TODO that should exist in the task system too.
|
|
22
24
|
- Preparing to commit and needing the scope key.
|
|
23
25
|
- Finishing work — the task needs its status and a pointer to the PR.
|
|
@@ -32,6 +34,21 @@ Canonical for: resolving, creating, and updating the task; the **scope key** tha
|
|
|
32
34
|
commits; branch naming; and the PR ↔ task link. Everything about the commit message *other
|
|
33
35
|
than the scope* belongs to [`commit-and-release`](../commit-and-release/SKILL.md).
|
|
34
36
|
|
|
37
|
+
## "Create an issue" means ClickUp
|
|
38
|
+
|
|
39
|
+
**"Issue", "task", "ticket", "bug", "backlog item" — all of them mean a ClickUp task here.**
|
|
40
|
+
Asked to create one, run the creation flow in step 3. Being in a GitHub repo, reviewing a
|
|
41
|
+
PR, or reading `gh` output does not make "create an issue" mean a GitHub issue. Which space,
|
|
42
|
+
folder, and (for multi-site clients) which site it lands in is
|
|
43
|
+
[`engagement-types`](../engagement-types/SKILL.md)'s call.
|
|
44
|
+
|
|
45
|
+
**A GitHub issue only when GitHub is named** — "open a *GitHub* issue", "file it in the
|
|
46
|
+
repo's issues", "`gh issue create`". Open it with `gh issue create`; if it's work Linchpin
|
|
47
|
+
will do, create the ClickUp task too and cross-link them (issue body →
|
|
48
|
+
`app.clickup.com/t/<KEY>`; `clickup_create_comment` → issue URL). ClickUp stays the system
|
|
49
|
+
of record. For the genuinely ambiguous — a public repo where issues *are* the tracker — ask
|
|
50
|
+
once with `AskUserQuestion`, recommending ClickUp.
|
|
51
|
+
|
|
35
52
|
## Vocabulary
|
|
36
53
|
|
|
37
54
|
- **Task key / issue key** — ClickUp's *custom ID*, e.g. `LINCHPIN-5113`. Space-scoped, so
|
|
@@ -78,6 +95,10 @@ Don't ask repeatedly and don't nag — one prompt at commit time.
|
|
|
78
95
|
|
|
79
96
|
### 3. Creation flow (least friction)
|
|
80
97
|
|
|
98
|
+
Reached two ways: from step 2 (a NO-TASK change about to be committed), or directly, when
|
|
99
|
+
someone just says *"create an issue/task for X"* — that's a standalone request and doesn't
|
|
100
|
+
need a commit or a branch behind it.
|
|
101
|
+
|
|
81
102
|
`clickup_create_task` requires a `list_id` and `name`. Resolve the list with the cheapest
|
|
82
103
|
path that works:
|
|
83
104
|
|
|
@@ -192,6 +213,7 @@ Work happens on a dedicated branch opened as a PR against the base branch (usual
|
|
|
192
213
|
|
|
193
214
|
## Gotchas
|
|
194
215
|
|
|
216
|
+
- **"Issue" is not a GitHub word here.** Route it to ClickUp unless GitHub was named.
|
|
195
217
|
- **Search before creating** — avoid duplicate tasks; an open task often already exists.
|
|
196
218
|
- **Don't dump the hierarchy.** 36 spaces is overwhelming; always scope `space_ids` and go
|
|
197
219
|
only as deep as you need (`max_depth`).
|
|
@@ -216,11 +238,10 @@ Work happens on a dedicated branch opened as a PR against the base branch (usual
|
|
|
216
238
|
| Move the status | `clickup_update_task` (valid statuses come from the List) |
|
|
217
239
|
| Hand off mid-flight | `clickup_create_comment` with the five-line handoff block |
|
|
218
240
|
|
|
219
|
-
Where a *new* task belongs — which space, folder, and (on multi-site clients) which site —
|
|
220
|
-
is decided by [`engagement-types`](../engagement-types/SKILL.md).
|
|
221
|
-
|
|
222
241
|
## Guardrails
|
|
223
242
|
|
|
243
|
+
- **Never open a GitHub issue in place of a ClickUp task.** "Create an issue" means ClickUp;
|
|
244
|
+
`gh issue create` needs the user to have said *GitHub*.
|
|
224
245
|
- **Never invent a task key.** If you can't resolve one, `NO-TASK` is the correct answer.
|
|
225
246
|
- **Never block the user** waiting for a task decision — NO-TASK is always available.
|
|
226
247
|
- **Never mark a task complete** on your own judgment. An open PR is at most "in review";
|
|
@@ -233,6 +254,8 @@ is decided by [`engagement-types`](../engagement-types/SKILL.md).
|
|
|
233
254
|
|
|
234
255
|
## Done
|
|
235
256
|
|
|
257
|
+
- [ ] Any "create an issue/task/ticket" request produced a **ClickUp** task — or a GitHub
|
|
258
|
+
issue only because the user named GitHub, in which case the two are cross-linked.
|
|
236
259
|
- [ ] The unit of work has a resolved task key or an explicit, user-accepted `NO-TASK`.
|
|
237
260
|
- [ ] The branch name matches the key (`issue/<KEY>` or `no-task/<slug>`).
|
|
238
261
|
- [ ] Every commit on the branch carries the same scope.
|
|
@@ -2,42 +2,89 @@
|
|
|
2
2
|
|
|
3
3
|
Use after `search_patterns("faq questions accordion")` finds no good match.
|
|
4
4
|
|
|
5
|
-
## Preferred —
|
|
5
|
+
## Preferred — core/accordion (WordPress 6.9+)
|
|
6
6
|
|
|
7
|
-
Core
|
|
7
|
+
Core ships a real accordion: `core/accordion` wrapping `core/accordion-item`, each holding a
|
|
8
|
+
`core/accordion-heading` and a `core/accordion-panel`. Use it whenever the site is on 6.9 or
|
|
9
|
+
later — confirm with `list_registered_blocks`.
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
<!-- wp:group {"layout":{"type":"constrained"}} -->
|
|
11
|
-
<div class="wp-block-group">
|
|
12
|
-
<!-- wp:heading -->
|
|
13
|
-
<h2 class="wp-block-heading">Frequently asked questions</h2>
|
|
14
|
-
<!-- /wp:heading -->
|
|
11
|
+
Why it beats the alternatives for a multi-question FAQ:
|
|
15
12
|
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
- **`autoclose`** — only one answer open at a time, which is what most FAQ designs show.
|
|
14
|
+
- **`headingLevel` / `level`** — each question is a real heading, so the document outline and
|
|
15
|
+
screen-reader navigation are correct. `core/details` gives you a `<summary>`, which is not.
|
|
16
|
+
- **One styled container** — colour, spacing, border, shadow and typography supports sit on the
|
|
17
|
+
item, so every question shares styling instead of being restyled individually.
|
|
18
|
+
- Built on the Interactivity API, so no custom JS.
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<!-- wp:accordion {"autoclose":true,"iconPosition":"right","headingLevel":3} -->
|
|
22
|
+
<div class="wp-block-accordion">
|
|
23
|
+
<!-- wp:accordion-item {"openByDefault":true} -->
|
|
24
|
+
<div class="wp-block-accordion-item">
|
|
25
|
+
<!-- wp:accordion-heading {"level":3} -->
|
|
26
|
+
<h3 class="wp-block-accordion-heading">How does billing work?</h3>
|
|
27
|
+
<!-- /wp:accordion-heading -->
|
|
28
|
+
<!-- wp:accordion-panel -->
|
|
29
|
+
<div class="wp-block-accordion-panel">
|
|
18
30
|
<!-- wp:paragraph -->
|
|
19
31
|
<p>You're billed monthly and can cancel anytime.</p>
|
|
20
32
|
<!-- /wp:paragraph -->
|
|
21
|
-
</
|
|
22
|
-
<!-- /wp:
|
|
33
|
+
</div>
|
|
34
|
+
<!-- /wp:accordion-panel -->
|
|
35
|
+
</div>
|
|
36
|
+
<!-- /wp:accordion-item -->
|
|
23
37
|
|
|
24
|
-
<!-- wp:
|
|
25
|
-
<
|
|
38
|
+
<!-- wp:accordion-item -->
|
|
39
|
+
<div class="wp-block-accordion-item">
|
|
40
|
+
<!-- wp:accordion-heading {"level":3} -->
|
|
41
|
+
<h3 class="wp-block-accordion-heading">Do you offer support?</h3>
|
|
42
|
+
<!-- /wp:accordion-heading -->
|
|
43
|
+
<!-- wp:accordion-panel -->
|
|
44
|
+
<div class="wp-block-accordion-panel">
|
|
26
45
|
<!-- wp:paragraph -->
|
|
27
46
|
<p>Yes — email support on every plan.</p>
|
|
28
47
|
<!-- /wp:paragraph -->
|
|
48
|
+
</div>
|
|
49
|
+
<!-- /wp:accordion-panel -->
|
|
50
|
+
</div>
|
|
51
|
+
<!-- /wp:accordion-item -->
|
|
52
|
+
</div>
|
|
53
|
+
<!-- /wp:accordion -->
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`openByDefault` on an item renders it expanded. `showIcon: false` hides the indicator.
|
|
57
|
+
`iconPosition` takes `left` or `right`.
|
|
58
|
+
|
|
59
|
+
**Generate this markup, don't hand-write it.** Nested parent/child blocks with `allowedBlocks`
|
|
60
|
+
constraints are easy to get subtly wrong, and an invalid FAQ shows "Attempt block recovery" on
|
|
61
|
+
every insert. Build the tree with `createBlock` and `serialize` in the editor, then use the
|
|
62
|
+
serialized result — see "Verify before shipping".
|
|
63
|
+
|
|
64
|
+
Designs often draw the toggle as **+ / −**; core renders a chevron. That's a block style or a
|
|
65
|
+
CSS override on the heading icon, not a reason to pick a different block.
|
|
66
|
+
|
|
67
|
+
## Fallback — core/details (pre-6.9, or a genuinely independent set)
|
|
68
|
+
|
|
69
|
+
`wp:details` renders a native `<details>`. Reach for it when `core/accordion` isn't registered,
|
|
70
|
+
or when each item is standalone and single-open behaviour would be wrong.
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<!-- wp:details -->
|
|
74
|
+
<details class="wp-block-details"><summary>How does billing work?</summary>
|
|
75
|
+
<!-- wp:paragraph -->
|
|
76
|
+
<p>You're billed monthly and can cancel anytime.</p>
|
|
77
|
+
<!-- /wp:paragraph -->
|
|
29
78
|
</details>
|
|
30
79
|
<!-- /wp:details -->
|
|
31
|
-
</div>
|
|
32
|
-
<!-- /wp:group -->
|
|
33
80
|
```
|
|
34
81
|
|
|
35
|
-
Set `{"showContent":true}`
|
|
82
|
+
Set `{"showContent":true}` to render one open by default. Know the limits: no shared open/close
|
|
83
|
+
coordination, and the question is a `<summary>` rather than a heading.
|
|
36
84
|
|
|
37
|
-
##
|
|
85
|
+
## Last resort — heading + paragraph pairs (no interactivity)
|
|
38
86
|
|
|
39
|
-
If
|
|
40
|
-
flat list, alternate headings and paragraphs:
|
|
87
|
+
If neither block is registered, or the user explicitly wants a flat list:
|
|
41
88
|
|
|
42
89
|
```html
|
|
43
90
|
<!-- wp:heading {"level":3} -->
|
|
@@ -49,8 +96,25 @@ flat list, alternate headings and paragraphs:
|
|
|
49
96
|
<!-- /wp:paragraph -->
|
|
50
97
|
```
|
|
51
98
|
|
|
99
|
+
Don't ship this as "an FAQ accordion" — it collapses nothing. If the design shows
|
|
100
|
+
expand/collapse and you emit this, say so plainly rather than letting it pass as equivalent.
|
|
101
|
+
|
|
52
102
|
## Adapt
|
|
53
103
|
|
|
54
|
-
- Generate one
|
|
104
|
+
- Generate one accordion item per Q&A from the user's content; mark only the first
|
|
105
|
+
`openByDefault`.
|
|
55
106
|
- Don't reach for a third-party accordion block unless the user names one and
|
|
56
|
-
`list_registered_blocks` confirms it's installed
|
|
107
|
+
`list_registered_blocks` confirms it's installed. Core now covers this.
|
|
108
|
+
|
|
109
|
+
## Verify before shipping
|
|
110
|
+
|
|
111
|
+
Validate in the site's real editor rather than trusting it by eye:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
mcp__wordpress-studio__validate_blocks nameOrPath=<site> content=<the FAQ markup>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Expect every block valid. If a result looks wrong — for example attributes coming back as
|
|
118
|
+
defaults — confirm against the editor itself with `wp.blocks.parse( markup )[0]` and check
|
|
119
|
+
`isValid` plus the parsed attributes, because a validator running a stale block registration
|
|
120
|
+
can report a false failure.
|
|
@@ -31,8 +31,15 @@ Answer these before designing anything custom; each "yes" removes work:
|
|
|
31
31
|
|
|
32
32
|
1. **Does a core block or pattern do it?** Check the site's registered patterns and template
|
|
33
33
|
parts first — [`wordpress-blocks`](../wordpress-blocks/SKILL.md) covers reuse-before-build.
|
|
34
|
+
Check what core actually ships *on this version* rather than from memory: core has absorbed
|
|
35
|
+
a lot recently, and a block library that was the right answer two releases ago may now be
|
|
36
|
+
duplicating core. Accordions are the current example — `core/accordion` +
|
|
37
|
+
`accordion-item` / `accordion-heading` / `accordion-panel` landed in **6.9**, with
|
|
38
|
+
`autoclose`, real heading levels and the Interactivity API. On 6.9+ that beats both
|
|
39
|
+
`core/details` and any bundled accordion block. Verify with `list_registered_blocks`.
|
|
34
40
|
2. **Does the shared block library already have it?** `linchpin/linchpin-blocks` ships
|
|
35
|
-
accordion, tabs, cards, slider, counter, and more.
|
|
41
|
+
accordion, tabs, cards, slider, counter, and more. Prefer core when core has caught up —
|
|
42
|
+
a plugin dependency for something core does is a maintenance cost with no upside.
|
|
36
43
|
3. **Does a well-known plugin own this problem?** Ecommerce is WooCommerce; forms, SEO, and
|
|
37
44
|
membership all have mature answers. Building a lesser version is a liability you maintain
|
|
38
45
|
forever.
|