You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .cursor/rules/typescript-standards.mdc
+11Lines changed: 11 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -119,6 +119,17 @@ Exception: Empty handlers are acceptable ONLY when the rejection is an expected
119
119
✅ `const impact = div(sub(from, to), from, 8)`
120
120
</standard>
121
121
122
+
<standard id="memoize-derived-collections">When deriving arrays or objects from props/state (e.g. `Object.values()`, `Object.keys()`, `.filter()`, `.map()`), wrap in `React.useMemo` if the result is used in a dependency array or passed as a prop. Bare derivations create new references every render.
123
+
❌ `const wallets = Object.values(currencyWallets)` (used in effect deps)
<standard id="guard-on-success-not-existence">When guarding against re-fetching with nullable map lookups, check for the success payload specifically — not just entry existence. Storing error results as non-null entries permanently blocks retry if the guard only checks `== null`.
✅ `if (resultMap[id]?.data == null) fetchData(id)` (only skip when data is present)
130
+
Exception: Auto-load effects where infinite retry on persistent failure is undesirable — keep `== null` there and allow retry only via explicit user action.
131
+
</standard>
132
+
122
133
</standards>
123
134
124
135
<lint-fix-patterns description="Common ESLint fix recipes for this project's config. Apply directly — do not search node_modules for types. The `rule` attribute maps to ESLint rule IDs for automatic matching by `lint-warnings.sh`.">
Copy file name to clipboardExpand all lines: .cursor/skills/asana-task-update/SKILL.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
---
2
2
name: asana-task-update
3
3
description: Update Asana tasks via one reusable workflow (attach PRs, assign/unassign, set status, and update task fields). Use when any skill needs to modify Asana task state.
4
-
compatibility: Requires jq. ASANA_TOKEN for Asana API updates. ASANA_GITHUB_SECRET for PR attach operations (obtain via https://github.integrations.asana.plus/auth?domainId=ghactions).
4
+
compatibility: Requires jq. ASANA_TOKEN for Asana API updates. ASANA_GITHUB_SECRET for PR attach operations.
5
5
metadata:
6
6
author: j0ntz
7
7
---
@@ -11,7 +11,7 @@ metadata:
11
11
<rulesdescription="Non-negotiable constraints.">
12
12
<ruleid="use-companion-script">Use `~/.cursor/skills/asana-task-update/scripts/asana-task-update.sh` for all Asana task mutations. Do not call raw Asana APIs directly from skills that can delegate here.</rule>
<ruleid="attach-requires-secret">`--attach-pr` requires `ASANA_GITHUB_SECRET` (obtain via OAuth: https://github.integrations.asana.plus/auth?domainId=ghactions). Other operations require `ASANA_TOKEN`.</rule>
14
+
<ruleid="attach-requires-secret">`--attach-pr` requires `ASANA_GITHUB_SECRET`. Other operations require `ASANA_TOKEN`.</rule>
15
15
<ruleid="prompt-codes">If the script exits code 2 with `PROMPT_REVIEWER` or `PROMPT_IMPLEMENTOR`, ask the user and re-run with explicit `--reviewer` or `--implementor`.</rule>
16
16
<ruleid="script-timeouts">Asana updates can take time. Use `block_until_ms: 120000` for script calls.</rule>
Copy file name to clipboardExpand all lines: .cursor/skills/convention-sync/SKILL.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@ metadata:
10
10
11
11
<rules>
12
12
<ruleid="local-is-canonical">`~/.cursor/` is the canonical source. Edits happen locally; the repo is the distribution copy. Default direction is `user-to-repo`. Use `--repo-to-user` only for onboarding or pulling changes authored by others. The script does not detect bidirectional conflicts — whichever direction you run overwrites the other side.</rule>
13
-
<ruleid="use-companion-script">Use `scripts/convention-sync.sh` for diffing and syncing. Do NOT manually diff or copy files.</rule>
13
+
<ruleid="use-companion-script">Use `~/.cursor/skills/convention-sync/scripts/convention-sync.sh` for diffing and syncing. Do NOT manually diff or copy files.</rule>
14
14
<ruleid="dry-run-first">Always run without `--stage` first to show the summary. Only stage/commit after user confirms.</rule>
15
15
<ruleid="no-script-bypass">If the script fails, report the error and STOP.</rule>
16
16
<ruleid="readme-is-source">`.cursor/README.md` is the source of truth for documentation. The script mirrors it to the PR description automatically.</rule>
@@ -23,7 +23,7 @@ Determine the repo directory — default to the current working directory if it
The `fetch-pr-body` call writes the current PR body to `/tmp/pr-body.md`. This file is available for editing throughout the session. If you need to update the PR body (e.g. to revise the description after addressing feedback), edit `/tmp/pr-body.md` via the Write tool and push it back:
46
54
47
55
```bash
@@ -89,6 +97,16 @@ git push
89
97
After fixing, reply to every processed comment — addressed or rejected — then resolve it.
90
98
91
99
<sub-stepname="Inline threads (reply → resolve)">
100
+
If a later fix may affect an already-addressed inline thread, inspect the thread first:
Use the returned history to decide whether the existing reply still fully reflects the latest fix. If it does not, add one new factual follow-up reply. Multiple replies in the same thread are acceptable when they capture materially new fixes.
@@ -120,6 +138,8 @@ These have no native resolution mechanism. Post a top-level comment with a machi
120
138
```
121
139
122
140
The script appends `<!-- addressed:review:ID -->` or `<!-- addressed:comment:ID -->` to the body. Subsequent `fetch` calls detect these markers and exclude already-addressed items.
141
+
142
+
**Skip bot-only no-op items**: If a review body or top-level comment is from a bot user (e.g., `cursor`, `chatgpt-codex-connector`) AND contains no inline threads with actionable suggestions — only a summary or status message — do NOT post a `mark-addressed` comment. Human reviewer items must always be addressed or rejected, even terse ones like "This needs work".
123
143
</sub-step>
124
144
125
145
<sub-stepname="Reply guidelines">
@@ -175,4 +195,5 @@ Propose modifications to `~/.cursor/rules/typescript-standards.mdc` to prevent s
175
195
<casename="No unresolved feedback">Report "No unresolved comments on this PR" and STOP.</case>
176
196
<casename="External human reviewer comments">Do NOT autosquash when `hasHumanReviewers` is true. Leave fixup commits for the external reviewer to verify, then squash on merge.</case>
177
197
<casename="Comment already addressed in code">If the current code already handles the feedback (e.g., from a previous fixup), still reply explaining this and resolve/mark the comment. Do not leave it unresolved.</case>
198
+
<casename="Already resolved thread needs follow-up">Fetch the thread history first. If the prior reply no longer reflects the latest fix, post one additional factual follow-up reply. Do not edit or delete prior replies in this workflow.</case>
0 commit comments