@simpleapps-com/augur-skills 2026.4.3 → 2026.4.5
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/package.json
CHANGED
|
@@ -29,128 +29,7 @@ This opens the browser for OAuth, user clicks "Allow", credentials are saved aut
|
|
|
29
29
|
|
|
30
30
|
The `basecamp` MCP server is bundled with this plugin and starts automatically. API reference: https://github.com/basecamp/bcx-api
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
| Tool | Description |
|
|
34
|
-
|------|-------------|
|
|
35
|
-
| `list_projects` | List projects. status: 'active', 'drafts', or 'archived' |
|
|
36
|
-
| `get_project` | Get project details by project_id |
|
|
37
|
-
| `create_project` | Create a new project (name, description) |
|
|
38
|
-
| `update_project` | Update project name/description |
|
|
39
|
-
| `archive_project` | Archive or unarchive a project (archive=False to reactivate) |
|
|
40
|
-
| `delete_project` | Delete a project permanently |
|
|
41
|
-
|
|
42
|
-
### People
|
|
43
|
-
| Tool | Description |
|
|
44
|
-
|------|-------------|
|
|
45
|
-
| `list_people` | List all people on the account |
|
|
46
|
-
| `get_person` | Get person details by person_id |
|
|
47
|
-
| `get_me` | Get the authenticated user's profile |
|
|
48
|
-
| `list_person_projects` | List projects accessible to a person |
|
|
49
|
-
| `delete_person` | Remove a person from the account (admin only) |
|
|
50
|
-
|
|
51
|
-
### Todos
|
|
52
|
-
| Tool | Description |
|
|
53
|
-
|------|-------------|
|
|
54
|
-
| `get_todo` | Get a single todo with comments and attachments (project_id, todo_id) |
|
|
55
|
-
| `list_todos` | List todos in a project. status: 'remaining', 'completed', or 'all' |
|
|
56
|
-
| `list_todos_due_since` | List todos due after a date (YYYY-MM-DD) |
|
|
57
|
-
| `list_my_todos` | List all open todos assigned to the current user (paginated) |
|
|
58
|
-
| `list_assigned_todos` | List open todos assigned to any person_id |
|
|
59
|
-
| `create_todo` | Create a todo in a todo list (project_id, todolist_id, content, assignee_id, due_date) |
|
|
60
|
-
| `update_todo` | Update a todo's content, due date, or assignee |
|
|
61
|
-
| `assign_todo` | Reassign a todo to a different person_id |
|
|
62
|
-
| `close_todo` | Mark a todo as completed/closed |
|
|
63
|
-
| `reopen_todo` | Reopen a completed todo |
|
|
64
|
-
| `delete_todo` | Delete a todo permanently |
|
|
65
|
-
|
|
66
|
-
### Comments
|
|
67
|
-
| Tool | Description |
|
|
68
|
-
|------|-------------|
|
|
69
|
-
| `create_comment` | Add a comment to a todo (plain text) |
|
|
70
|
-
| `delete_comment` | Delete a comment permanently |
|
|
71
|
-
|
|
72
|
-
### Todo Lists
|
|
73
|
-
| Tool | Description |
|
|
74
|
-
|------|-------------|
|
|
75
|
-
| `list_todolists` | List active todo lists in a project |
|
|
76
|
-
| `list_all_todolists` | List todo lists across all projects. status: 'active', 'completed', or 'trashed' |
|
|
77
|
-
| `get_todolist` | Get all todos in a specific todo list |
|
|
78
|
-
| `create_todolist` | Create a new todo list (project_id, name, description) |
|
|
79
|
-
| `update_todolist` | Update a todo list's name, description, or position |
|
|
80
|
-
| `delete_todolist` | Delete a todo list permanently |
|
|
81
|
-
|
|
82
|
-
### Messages
|
|
83
|
-
| Tool | Description |
|
|
84
|
-
|------|-------------|
|
|
85
|
-
| `list_messages` | List messages/discussions in a project (via topics) |
|
|
86
|
-
| `get_message` | Get a message with comments and attachments |
|
|
87
|
-
| `create_message` | Create a new discussion (project_id, subject, content) |
|
|
88
|
-
| `update_message` | Update a message's subject/content |
|
|
89
|
-
| `delete_message` | Delete a message permanently |
|
|
90
|
-
|
|
91
|
-
Note: Messages may not be available on all Basecamp plans.
|
|
92
|
-
|
|
93
|
-
### Documents
|
|
94
|
-
| Tool | Description |
|
|
95
|
-
|------|-------------|
|
|
96
|
-
| `list_documents` | List documents. project_id=0 for all projects |
|
|
97
|
-
| `get_document` | Get a single document (e.g., site-info) |
|
|
98
|
-
| `create_document` | Create a new document (title, content) |
|
|
99
|
-
| `update_document` | Update a document's title/content |
|
|
100
|
-
| `delete_document` | Delete a document permanently |
|
|
101
|
-
|
|
102
|
-
### Calendar Events
|
|
103
|
-
| Tool | Description |
|
|
104
|
-
|------|-------------|
|
|
105
|
-
| `list_calendars` | List all calendars |
|
|
106
|
-
| `list_calendar_events` | List events. Filter by project_id, start_date, end_date, past |
|
|
107
|
-
| `get_calendar_event` | Get a specific calendar event |
|
|
108
|
-
| `create_calendar_event` | Create an event (summary, starts_at, description, all_day, ends_at, remind_at) |
|
|
109
|
-
| `update_calendar_event` | Update an event's fields |
|
|
110
|
-
| `delete_calendar_event` | Delete a calendar event |
|
|
111
|
-
|
|
112
|
-
### Topics
|
|
113
|
-
| Tool | Description |
|
|
114
|
-
|------|-------------|
|
|
115
|
-
| `list_topics` | List topics. project_id=0 for all. archived=True for archived |
|
|
116
|
-
| `archive_topic` | Archive a topic |
|
|
117
|
-
| `activate_topic` | Reactivate an archived topic |
|
|
118
|
-
|
|
119
|
-
### Attachments & Uploads
|
|
120
|
-
| Tool | Description |
|
|
121
|
-
|------|-------------|
|
|
122
|
-
| `list_attachments` | List attachments. project_id=0 for all (paginated) |
|
|
123
|
-
| `get_attachment` | Get attachment metadata and download URL (project_id, attachment_id) |
|
|
124
|
-
| `download_attachment` | Download attachment to local file (project_id, attachment_id) |
|
|
125
|
-
| `get_upload` | Get an upload with comments |
|
|
126
|
-
| `create_upload` | Upload a local file to a project's Files section |
|
|
127
|
-
| `delete_upload` | Delete an upload (move to trash) |
|
|
128
|
-
|
|
129
|
-
### Activity
|
|
130
|
-
| Tool | Description |
|
|
131
|
-
|------|-------------|
|
|
132
|
-
| `list_events` | Activity log since a datetime. Filter by project_id or person_id |
|
|
133
|
-
|
|
134
|
-
### Access Management
|
|
135
|
-
| Tool | Description |
|
|
136
|
-
|------|-------------|
|
|
137
|
-
| `list_accesses` | List people with access to a project |
|
|
138
|
-
| `grant_access` | Grant team access (comma-separated ids and/or email_addresses) |
|
|
139
|
-
| `grant_client_access` | Grant client-level access (comma-separated ids and/or email_addresses) |
|
|
140
|
-
| `revoke_access` | Revoke a person's project access |
|
|
141
|
-
|
|
142
|
-
### Stars
|
|
143
|
-
| Tool | Description |
|
|
144
|
-
|------|-------------|
|
|
145
|
-
| `list_stars` | List starred/favorite projects |
|
|
146
|
-
| `star_project` | Star (bookmark) a project |
|
|
147
|
-
| `unstar_project` | Remove star from a project |
|
|
148
|
-
|
|
149
|
-
### Forwards
|
|
150
|
-
| Tool | Description |
|
|
151
|
-
|------|-------------|
|
|
152
|
-
| `list_forwards` | List email forwards. project_id=0 for all |
|
|
153
|
-
| `get_forward` | Get a specific email forward with comments |
|
|
32
|
+
All tools are available as `mcp__plugin_simpleapps_basecamp__*`. The tool names and parameters are self-documenting via the MCP schema — do not hardcode tool signatures. Key tool groups: projects, people, todos, comments, todo lists, messages, documents, calendar events, topics, attachments/uploads, activity, access management, stars, forwards.
|
|
154
33
|
|
|
155
34
|
**Note**: The BCX API does not have a search endpoint. To find content, use `list_topics(project_id)` to browse, or `list_messages(project_id)` for messages. For cross-project browsing, use `list_topics()` (no project_id) to get recent topics across all projects.
|
|
156
35
|
|
|
@@ -1,215 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fyxer
|
|
3
3
|
description: Fyxer AI meeting recording integration. Covers extraction, local caching, posting to Basecamp, and Fyxer Index management. Use when processing Fyxer recordings or meeting transcripts.
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- Read
|
|
6
|
-
- Write
|
|
7
|
-
- Glob
|
|
8
|
-
- Bash
|
|
9
|
-
- mcp__plugin_simpleapps_basecamp__*
|
|
10
|
-
- mcp__claude-in-chrome__*
|
|
11
4
|
---
|
|
12
5
|
|
|
13
6
|
# Fyxer
|
|
14
7
|
|
|
15
|
-
Fyxer AI records and summarizes meetings.
|
|
8
|
+
Fyxer AI records and summarizes meetings. Use the `/fyxer` command to process recordings end-to-end.
|
|
16
9
|
|
|
17
|
-
##
|
|
10
|
+
## Key Conventions
|
|
18
11
|
|
|
19
|
-
Recording
|
|
12
|
+
- **Recording URL**: `https://app.fyxer.com/call-recordings/<meeting-uuid>:<calendar-event-id>`
|
|
13
|
+
- **Cache location**: `~/.simpleapps/fyxer/<meeting-uuid>/` — contains `summary.txt`, `transcript.txt`, `message.txt`
|
|
14
|
+
- **Use only the meeting UUID** (before the colon) for cache folders, duplicate checks, and frontmatter
|
|
15
|
+
- **Fyxer Index**: a `Fyxer Index` document in each Basecamp project for duplicate detection. One line per posted meeting, newest first: `<meeting-uuid> | <date> | <message-id> | <subject>`
|
|
16
|
+
- **Post format**: plain text with YAML frontmatter (meeting, date, time, participants, topics, fyxer-id) followed by the full transcript
|
|
17
|
+
- **Subject format**: `Fyxer: YYYY-MM-DD`
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
- **Meeting UUID** (before colon): `52f0cf2b-fdb8-4e95-8b01-2afb6d367c69`
|
|
23
|
-
- **Calendar event ID** (after colon): `2fg5k3v3hffl91dnuqauc15suk_20260119T190000Z`
|
|
24
|
-
|
|
25
|
-
Use only the **meeting UUID** for cache folders, duplicate checks, and frontmatter.
|
|
26
|
-
|
|
27
|
-
Each recording has two tabs:
|
|
28
|
-
- **Summary** — AI-generated summary with section headings, participants, action items. Has "Copy summary" and "Download PDF" buttons.
|
|
29
|
-
- **Transcript** — Speaker-attributed, timestamped full transcript. Has "Copy transcript" and "Download transcript" buttons.
|
|
30
|
-
|
|
31
|
-
## Local Cache
|
|
32
|
-
|
|
33
|
-
All extracted data is cached at `~/.simpleapps/fyxer/<meeting-uuid>/`:
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
summary.txt - raw Fyxer summary (from Summary tab)
|
|
37
|
-
transcript.txt - raw Fyxer transcript (from Transcript tab)
|
|
38
|
-
message.txt - assembled output (generated by posting process)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Cache is populated via Chrome extraction (see below) and reused across processes.
|
|
42
|
-
|
|
43
|
-
## Chrome Extraction
|
|
44
|
-
|
|
45
|
-
Only needed when local cache files are missing.
|
|
46
|
-
|
|
47
|
-
### Extract transcript
|
|
48
|
-
|
|
49
|
-
Click the **Transcript** tab. Extraction methods (in order of preference):
|
|
50
|
-
|
|
51
|
-
1. **"Download transcript" button** (BEST) — Downloads a `.txt` file to `~/Downloads/`. Complete content, no truncation. Copy to cache dir, then delete the download.
|
|
52
|
-
2. **"Copy transcript" button** + `pbpaste` — Copies to system clipboard. Write to disk: `pbpaste > transcript.txt`. Reliable but requires clipboard access.
|
|
53
|
-
3. **`get_page_text`** — UNRELIABLE. Only captures visible/partial content. Missed most of a 30-minute transcript in testing. DO NOT USE for transcripts.
|
|
54
|
-
|
|
55
|
-
Save to `~/.simpleapps/fyxer/<meeting-uuid>/transcript.txt`.
|
|
56
|
-
|
|
57
|
-
### Extract summary
|
|
58
|
-
|
|
59
|
-
The Summary tab is the default view. Extraction methods (in order of preference):
|
|
60
|
-
|
|
61
|
-
1. **"Copy summary" button** + `pbpaste` (BEST) — Copies markdown to clipboard. Write to disk: `pbpaste > summary.txt`. Summaries are short (~1,700 chars) so this works well.
|
|
62
|
-
2. **`get_page_text`** — Works for short summaries but mixes in page chrome. Not recommended.
|
|
63
|
-
|
|
64
|
-
Save to `~/.simpleapps/fyxer/<meeting-uuid>/summary.txt`.
|
|
65
|
-
|
|
66
|
-
### Extract participants
|
|
67
|
-
|
|
68
|
-
Click the **participant count dropdown** (e.g. "3 participants") in the page header to reveal attendee names and emails. Take a screenshot to read them.
|
|
69
|
-
|
|
70
|
-
### Clipboard verification
|
|
71
|
-
|
|
72
|
-
To verify clipboard content is complete before writing to disk:
|
|
73
|
-
|
|
74
|
-
```javascript
|
|
75
|
-
(async () => {
|
|
76
|
-
const text = await navigator.clipboard.readText();
|
|
77
|
-
window.__temp = text;
|
|
78
|
-
return JSON.stringify({
|
|
79
|
-
length: text.length,
|
|
80
|
-
first50: text.substring(0, 50),
|
|
81
|
-
last100: text.substring(text.length - 100)
|
|
82
|
-
});
|
|
83
|
-
})()
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Then write and verify: `pbpaste > target.txt && wc -c target.txt`
|
|
87
|
-
|
|
88
|
-
**Note**: Do NOT try to read full clipboard content via JS — Chrome MCP truncates JS output at ~1,000 characters. Always use `pbpaste` to write to disk.
|
|
89
|
-
|
|
90
|
-
### Download cleanup
|
|
91
|
-
|
|
92
|
-
MUST clean up `~/Downloads/` after copying downloaded files to the cache directory. Fyxer names downloads like `transcript-SA_USCCO.txt`. Repeated downloads append `(1)`, `(2)`, etc.
|
|
93
|
-
|
|
94
|
-
## Posting to Basecamp
|
|
95
|
-
|
|
96
|
-
Post Fyxer meeting recordings as searchable Discussions in Basecamp projects.
|
|
97
|
-
|
|
98
|
-
**Inputs**: Fyxer recording URL + Basecamp project ID.
|
|
99
|
-
|
|
100
|
-
### 1. Check for duplicate
|
|
101
|
-
|
|
102
|
-
Extract the meeting UUID from the Fyxer URL. Find the **Fyxer Index** document in the project: `list_documents(project_id)` → scan for title `Fyxer Index`. If found, `get_document(project_id, document_id)` and search content for the meeting UUID. If found, the meeting has already been posted — inform the user and stop.
|
|
103
|
-
|
|
104
|
-
If no Fyxer Index document exists, there are no tracked meetings. Proceed with posting.
|
|
105
|
-
|
|
106
|
-
### 2. Check local cache
|
|
107
|
-
|
|
108
|
-
If `~/.simpleapps/fyxer/<meeting-uuid>/summary.txt` and `transcript.txt` both exist, skip to step 3. Otherwise, follow the Chrome extraction steps above.
|
|
109
|
-
|
|
110
|
-
### 3. Build message.txt
|
|
111
|
-
|
|
112
|
-
Parse `summary.txt` for frontmatter fields, extract participants, and combine with the full transcript:
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
---
|
|
116
|
-
meeting: SA/ClientName
|
|
117
|
-
date: YYYY-MM-DD
|
|
118
|
-
time: HH:MM-HH:MM
|
|
119
|
-
participants: Person A, Person B, Person C
|
|
120
|
-
topics: Topic One, Topic Two, Topic Three
|
|
121
|
-
fyxer-id: <meeting-uuid>
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
[contents of transcript.txt]
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
| Field | Source |
|
|
128
|
-
|-------|--------|
|
|
129
|
-
| meeting | Meeting title from the page header |
|
|
130
|
-
| date | Recording date |
|
|
131
|
-
| time | Recording time range |
|
|
132
|
-
| participants | Participant dropdown (click to reveal names) |
|
|
133
|
-
| topics | Section headings from the Summary |
|
|
134
|
-
| fyxer-id | Meeting UUID from the URL (before the colon) |
|
|
135
|
-
|
|
136
|
-
Save as `~/.simpleapps/fyxer/<meeting-uuid>/message.txt`.
|
|
137
|
-
|
|
138
|
-
### 4. Post to Basecamp
|
|
139
|
-
|
|
140
|
-
Use `create_message(project_id, subject, content)`:
|
|
141
|
-
|
|
142
|
-
- **Subject**: `Fyxer: YYYY-MM-DD`
|
|
143
|
-
- **Content**: contents of `message.txt`
|
|
144
|
-
|
|
145
|
-
Capture the **message_id** from the response.
|
|
146
|
-
|
|
147
|
-
### 5. Update Fyxer Index
|
|
148
|
-
|
|
149
|
-
After a successful post, update the Fyxer Index document:
|
|
150
|
-
|
|
151
|
-
1. If no Fyxer Index document exists, create one: `create_document(project_id, "Fyxer Index", "")`
|
|
152
|
-
2. Read current content: `get_document(project_id, document_id)`
|
|
153
|
-
3. Prepend a new line (newest first): `<meeting-uuid> | <date> | <message-id> | <subject>`
|
|
154
|
-
4. Update: `update_document(project_id, document_id, title="Fyxer Index", content=updated_content)`
|
|
155
|
-
|
|
156
|
-
If the index update fails after a successful post, warn the user. The message is posted but the index is stale. Run reconciliation later.
|
|
157
|
-
|
|
158
|
-
### Format rules
|
|
159
|
-
|
|
160
|
-
- **Plain text only** — Basecamp prefers plain text over HTML
|
|
161
|
-
- **YAML frontmatter** — machine-parseable so other Claude Code instances can search and parse meeting context
|
|
162
|
-
- **Transcript only in body** — summary and action items belong on relevant Basecamp todos, not in this message
|
|
163
|
-
- **Consistent title** — `Fyxer: YYYY-MM-DD` keeps messages uniform and sortable
|
|
164
|
-
|
|
165
|
-
## Fyxer Index
|
|
166
|
-
|
|
167
|
-
Each Basecamp project that receives Fyxer meeting transcripts MUST have a **Fyxer Index** document for duplicate detection and meeting history.
|
|
168
|
-
|
|
169
|
-
### Index format
|
|
170
|
-
|
|
171
|
-
- **Title**: `Fyxer Index`
|
|
172
|
-
- **Location**: Documents section of each Basecamp project
|
|
173
|
-
- **Content**: One line per posted meeting, newest first
|
|
174
|
-
|
|
175
|
-
```
|
|
176
|
-
<meeting-uuid> | <date> | <message-id> | <subject>
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
Example:
|
|
19
|
+
## Dependencies
|
|
180
20
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
a1b2c3d4-e5f6-7890-abcd-ef1234567890 | 2026-02-10 | 514801234 | Fyxer: 2026-02-10
|
|
184
|
-
```
|
|
21
|
+
- `simpleapps:basecamp` skill — MCP tools for posting and index management
|
|
22
|
+
- Chrome browser automation — for extraction when cache is empty
|
|
185
23
|
|
|
186
|
-
|
|
24
|
+
## Finding Posted Transcripts
|
|
187
25
|
|
|
188
|
-
- Check the index: `list_documents(project_id)`
|
|
26
|
+
- Check the index: `list_documents(project_id)` then find `Fyxer Index` then `get_document`
|
|
189
27
|
- View a specific transcript: `get_message(project_id, message_id)` using the message_id from the index
|
|
190
28
|
- Browse all messages: `list_messages(project_id)` — Fyxer posts use the title format `Fyxer: YYYY-MM-DD`
|
|
191
|
-
|
|
192
|
-
### Reconciliation — missing entries
|
|
193
|
-
|
|
194
|
-
The index MAY fall out of sync. To reconcile:
|
|
195
|
-
|
|
196
|
-
1. `list_messages(project_id)` → filter for `Fyxer:` titles
|
|
197
|
-
2. For each, `get_message` and extract `fyxer-id` from YAML frontmatter
|
|
198
|
-
3. Compare against the index — add any missing entries
|
|
199
|
-
4. Update the index document
|
|
200
|
-
|
|
201
|
-
Run reconciliation when the index is first created in a project with existing Fyxer messages, or when the user suspects the index is incomplete.
|
|
202
|
-
|
|
203
|
-
### Reconciliation — orphaned entries
|
|
204
|
-
|
|
205
|
-
If an index entry references a deleted message:
|
|
206
|
-
|
|
207
|
-
1. `get_message(project_id, message_id)` → if 404, remove entry from index
|
|
208
|
-
2. Update the index document
|
|
209
|
-
|
|
210
|
-
Only run orphan cleanup when explicitly requested by the user.
|
|
211
|
-
|
|
212
|
-
## Dependencies
|
|
213
|
-
|
|
214
|
-
- `simpleapps:basecamp` skill — MCP tools for posting and index management
|
|
215
|
-
- Chrome browser automation (for extraction when cache is empty)
|
|
@@ -55,23 +55,9 @@ Do not install or configure tools without the user's approval. Flag what's missi
|
|
|
55
55
|
- **No tests for changed code** — suggest vitest
|
|
56
56
|
- **No pre-commit hooks** — suggest lefthook
|
|
57
57
|
|
|
58
|
-
##
|
|
58
|
+
## Fix everything, hide nothing
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
## Resolve, never hide
|
|
63
|
-
|
|
64
|
-
When a check fails, the solution is ALWAYS to fix the underlying code. NEVER:
|
|
65
|
-
|
|
66
|
-
- Disable or weaken a lint rule (`eslint-disable`, rule removal, config changes)
|
|
67
|
-
- Skip or delete a failing test (`.skip`, `.only`, deleting the test)
|
|
68
|
-
- Silence type errors (`@ts-ignore`, `@ts-expect-error`, `type: any`)
|
|
69
|
-
- Suppress warnings, lower coverage thresholds, or modify quality configs
|
|
70
|
-
- Add `--no-verify`, `--force`, or flags that bypass checks
|
|
71
|
-
|
|
72
|
-
These actions hide problems — they do not fix them. A suppressed error is worse than a visible one because it will be forgotten and compound.
|
|
73
|
-
|
|
74
|
-
If a rule or test seems wrong, investigate why it exists before concluding it should change. Rules exist for reasons. If after investigation it genuinely does not apply, explain the reasoning to the user and let them decide — do not unilaterally disable it.
|
|
60
|
+
See work-habits: "Leave it better than you found it" and "Resolve, never hide." Both apply fully to quality checks. Fix every issue regardless of who introduced it. NEVER suppress checks — fix the code.
|
|
75
61
|
|
|
76
62
|
When reviewing code, scan for existing suppressions (`eslint-disable`, `@ts-ignore`, `.skip`, `noqa`, `phpcs:ignore`, etc.) and flag every instance to the user. These are hidden technical debt.
|
|
77
63
|
|
|
@@ -81,12 +67,6 @@ In pnpm workspace projects, the root `pnpm-lock.yaml` and site-level lockfiles M
|
|
|
81
67
|
|
|
82
68
|
After ANY `pnpm install`, `pnpm update`, or `pnpm add` in a workspace, run `pnpm install` at the repo root to regenerate the root lockfile. Commit both lockfiles together. If you forget, the next deploy will fail.
|
|
83
69
|
|
|
84
|
-
## Browser Error Overlays
|
|
85
|
-
|
|
86
|
-
When debugging in the browser (Chrome automation), Next.js and other frameworks show a **red error overlay** at the bottom of the page when there are runtime errors. This overlay contains the actual error message, stack trace, and usually the exact file and line number causing the problem.
|
|
87
|
-
|
|
88
|
-
MUST click on the error overlay and read the full error before attempting any fix. 95% of the time the answer is right there. Do not ignore it, do not guess at the problem, do not look elsewhere first — read the error overlay. If using Chrome automation tools, click the overlay element to expand it and read the details.
|
|
89
|
-
|
|
90
70
|
## Running quality checks
|
|
91
71
|
|
|
92
72
|
Use the `/quality` command to discover and run all configured checks. It handles the full cycle: discover, run, fix, repeat until clean.
|
|
@@ -46,9 +46,23 @@ Code that compiles is not code that works. After making changes, verify they act
|
|
|
46
46
|
|
|
47
47
|
YOU MUST NOT mark work complete without verification. Suggesting `/submit` or `/quality` before verifying the code works is backwards — broken code that passes lint is still broken code. Verify first, then let the user decide next steps.
|
|
48
48
|
|
|
49
|
-
##
|
|
49
|
+
## Leave it better than you found it
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
Every agent interaction should leave the codebase in a better state. If you encounter a broken test, a console error, an error overlay, a lint warning, or any other issue while working — fix it. This applies whether or not you caused it and whether or not it is related to your current task.
|
|
52
|
+
|
|
53
|
+
Do not classify issues as "pre-existing" to justify skipping them — context compaction erases your memory of changes made earlier in the session, so what looks pre-existing is often something you introduced. Even if you truly did not cause it, the goal is zero issues, not blame assignment. Fix it anyway. Do not argue with the user about whether an issue is yours to fix. It is.
|
|
54
|
+
|
|
55
|
+
## Resolve, never hide
|
|
56
|
+
|
|
57
|
+
When a check fails, the solution is ALWAYS to fix the underlying code. NEVER:
|
|
58
|
+
|
|
59
|
+
- Disable or weaken a lint rule (`eslint-disable`, rule removal, config changes)
|
|
60
|
+
- Skip or delete a failing test (`.skip`, `.only`, deleting the test)
|
|
61
|
+
- Silence type errors (`@ts-ignore`, `@ts-expect-error`, `type: any`)
|
|
62
|
+
- Suppress warnings, lower coverage thresholds, or modify quality configs
|
|
63
|
+
- Add `--no-verify`, `--force`, or flags that bypass checks
|
|
64
|
+
|
|
65
|
+
These actions hide problems — they do not fix them. If a rule or test seems wrong, investigate why it exists before concluding it should change. Rules exist for reasons. If after investigation it genuinely does not apply, explain the reasoning to the user and let them decide — do not unilaterally disable it.
|
|
52
66
|
|
|
53
67
|
## Track progress
|
|
54
68
|
|
|
@@ -68,10 +68,11 @@ Applies to JSON arrays, markdown bullet lists, table rows, and any unordered col
|
|
|
68
68
|
|
|
69
69
|
## Code Style
|
|
70
70
|
|
|
71
|
-
Use descriptive variable and function names. Abbreviations save keystrokes but cost readability — the human reviewing your output MUST be able to understand the code without deciphering names.
|
|
71
|
+
Use descriptive variable and function names. Abbreviations save keystrokes but cost readability — the human reviewing your output MUST be able to understand the code without deciphering names. Short names also collide with terminology in the surrounding conversation and confuse the reader (e.g. using `p` as a path variable while the discussion is about a payment path — the reader will read `p` as "payment", not "path").
|
|
72
72
|
|
|
73
|
-
- MUST use full words: `$groupQuantity` not `$gq`, `cartItem` not `ci`
|
|
74
|
-
-
|
|
73
|
+
- MUST use full words: `$groupQuantity` not `$gq`, `cartItem` not `ci`, `filePath` not `p`, `response` not `r`
|
|
74
|
+
- MUST NOT use single-letter variable names except loop counters (`i`, `j`, `k`)
|
|
75
|
+
- Well-known abbreviations (`id`, `url`, `db`) are fine
|
|
75
76
|
- Function names SHOULD describe what they do: `calculateShippingCost` not `calcShip`
|
|
76
77
|
|
|
77
78
|
## Claude Code Keywords
|